gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...
Date: Thu, 26 Apr 2007 10:17:56 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/04/26 10:17:56

Modified files:
        .              : ChangeLog 
        server         : as_value.cpp as_value.h 
        testsuite/actionscript.all: Function.as 

Log message:
                * server/as_value.{cpp,h}: to_primitive() made private, and had
                  calling any user-defined valueOf for objects; (equals): only
                  return false when to_primitive() returns the same type we were
                  already.
                * testsuite/actionscript.all/Function.as: two more successes.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2999&r2=1.3000
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.h?cvsroot=gnash&r1=1.49&r2=1.50
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Function.as?cvsroot=gnash&r1=1.41&r2=1.42

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2999
retrieving revision 1.3000
diff -u -b -r1.2999 -r1.3000
--- ChangeLog   26 Apr 2007 09:53:00 -0000      1.2999
+++ ChangeLog   26 Apr 2007 10:17:56 -0000      1.3000
@@ -1,5 +1,13 @@
 2007-04-26 Sandro Santilli <address@hidden>
 
+       * server/as_value.{cpp,h}: to_primitive() made private, and had
+         calling any user-defined valueOf for objects; (equals): only
+         return false when to_primitive() returns the same type we were 
+         already.
+       * testsuite/actionscript.all/Function.as: two more successes.
+
+2007-04-26 Sandro Santilli <address@hidden>
+
        * server/as_value.cpp (equals): don't abort on object==movieclip !
        * testsuite/actionscript.all/Function.as: add more tests 'this'
          reference in 'with' and 'function' scope (see bug #19704).

Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- server/as_value.cpp 26 Apr 2007 09:53:01 -0000      1.45
+++ server/as_value.cpp 26 Apr 2007 10:17:56 -0000      1.46
@@ -228,19 +228,25 @@
 
 // Conversion to primitive value.
 as_value
-as_value::to_primitive() const
+as_value::to_primitive(as_environment& env) const
 {
-       switch (m_type)
+       if ( m_type == OBJECT || m_type == AS_FUNCTION )
+       {
+               as_object* obj = m_object_value;
+               std::string methodname = "valueOf";
+               lowercase_if_needed(methodname);
+               as_value method;
+               if ( obj->get_member(methodname, &method) )
+               {
+                       return call_method0(method, &env, obj);
+               }
+               else
+               {
+                       log_msg(_("get_member(%s) returned false"), 
methodname.c_str());
+               }
+       }
+       else
        {
-               case OBJECT:
-               case AS_FUNCTION:
-                       return m_object_value->get_primitive_value();
-               case UNDEFINED:
-               case NULLTYPE:
-               case BOOLEAN:
-               case STRING:
-               case NUMBER:
-               default:
                        return *this;
        }
 
@@ -659,38 +665,27 @@
        return m_boolean_value == v.to_bool();
     }
 
-    else if (m_type == MOVIECLIP || v.m_type == MOVIECLIP)
-    {
-        // if both are movieclips they should be compared by same value
-       // (see top of this function).
-       // In any other case we always return false.
-       // TODO: check if it's allowed that the primitive value
-       //       of an object is a movieclip (maybe with an ActionScript 
hack...)
-        return false;
-    }
-
-    else if (is_object())
+    else if (m_type == OBJECT || m_type == AS_FUNCTION)
     {
-       assert ( ! v.is_object() );
+       assert ( ! (v.m_type == OBJECT || v.m_type == AS_FUNCTION) );
        // convert this value to a primitive and recurse
-       as_value v2 = to_primitive(); // TODO: should forward environment ?
-       if ( v2.is_object() ) return false;
+       if ( ! env ) return false;
+       as_value v2 = to_primitive(*env); // TODO: should forward environment ?
+       if ( v2.m_type == m_type ) return false; // no conversion 
        else return v2.equals(v, env);
     }
 
-    else if (v.is_object())
+    else if (v.m_type == OBJECT || v.m_type == AS_FUNCTION)
     {
-       assert ( ! is_object() );
+       assert ( ! (m_type == OBJECT || m_type == AS_FUNCTION) );
        // convert this value to a primitive and recurse
-       as_value v2 = v.to_primitive(); // TODO: should forward environment ?
-       if ( v2.is_object() ) return false;
+       if ( ! env ) return false;
+       as_value v2 = v.to_primitive(*env); // TODO: should forward environment 
?
+       if ( v2.m_type == v.m_type ) return false; // no conversion 
        else return equals(v2, env);
     }
 
-    else
-    {
-       assert(0);
-    }
+    return false;
 }
        
 // Sets *this to this string plus the given string.

Index: server/as_value.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.h,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- server/as_value.h   19 Apr 2007 14:25:40 -0000      1.49
+++ server/as_value.h   26 Apr 2007 10:17:56 -0000      1.50
@@ -14,7 +14,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: as_value.h,v 1.49 2007/04/19 14:25:40 martinwguy Exp $ */
+/* $Id: as_value.h,v 1.50 2007/04/26 10:17:56 strk Exp $ */
 
 #ifndef GNASH_AS_VALUE_H
 #define GNASH_AS_VALUE_H
@@ -358,12 +358,6 @@
        ///
        bool    to_bool_v5() const;
 
-       /// Return value as a primitive type
-       //
-       /// Primitive types are: undefined, null, boolean, string, number.
-       /// See ECMA-2.6.2 (section 4.3.2).
-       as_value to_primitive() const;
-
        /// Return value as an object, converting primitive values as needed.
        //
        /// Make sure you don't break the intrusive_ptr chain
@@ -529,6 +523,16 @@
 
 private:
 
+       /// Return value as a primitive type
+       //
+       /// Primitive types are: undefined, null, boolean, string, number.
+       /// See ECMA-2.6.2 (section 4.3.2).
+       ///
+       /// @param env
+       ///     The environment to use for calling the valueOf method.
+       ///
+       as_value to_primitive(as_environment& env) const;
+
        /// Compare values of the same type
        //
        /// NOTE: will abort if values are not of the same type!

Index: testsuite/actionscript.all/Function.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Function.as,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- testsuite/actionscript.all/Function.as      26 Apr 2007 09:55:56 -0000      
1.41
+++ testsuite/actionscript.all/Function.as      26 Apr 2007 10:17:56 -0000      
1.42
@@ -20,7 +20,7 @@
 // compile this test case with Ming makeswf, and then
 // execute it like this gnash -1 -r 0 -v out.swf
 
-rcsid="$Id: Function.as,v 1.41 2007/04/26 09:55:56 strk Exp $";
+rcsid="$Id: Function.as,v 1.42 2007/04/26 10:17:56 strk Exp $";
 
 #include "check.as"
 
@@ -642,4 +642,5 @@
 
 // Quick test to verify that a movieclip is never equal to an object, despite 
it's primitive value
 o = new Object(); o.valueOf = function() { return _root; };
-xcheck_equals(_root, o);
+check_equals(_root, o);
+check_equals(o, _root);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]