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 testsuite/a...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_value.cpp testsuite/a...
Date: Thu, 02 Aug 2007 20:11:35 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/08/02 20:11:35

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

Log message:
                * server/as_value.cpp (equals): yet another pass at
                  abstract equality operator. We're still not there, but
                  getting closer.
                * testsuite/actionscript.all/ops.as: xcheck -> check.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3920&r2=1.3921
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.62&r2=1.63
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/ops.as?cvsroot=gnash&r1=1.7&r2=1.8

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3920
retrieving revision 1.3921
diff -u -b -r1.3920 -r1.3921
--- ChangeLog   2 Aug 2007 19:10:51 -0000       1.3920
+++ ChangeLog   2 Aug 2007 20:11:35 -0000       1.3921
@@ -1,5 +1,12 @@
 2007-08-02 Sandro Santilli <address@hidden>
 
+       * server/as_value.cpp (equals): yet another pass at
+         abstract equality operator. We're still not there, but
+         getting closer.
+       * testsuite/actionscript.all/ops.as: xcheck -> check.
+
+2007-08-02 Sandro Santilli <address@hidden>
+
        * testsuite/actionscript.all/: Function.as, ops.as:
          Moved tests for equality operator against MovieClip where
          it belongs.

Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -b -r1.62 -r1.63
--- server/as_value.cpp 2 Aug 2007 18:28:42 -0000       1.62
+++ server/as_value.cpp 2 Aug 2007 20:11:35 -0000       1.63
@@ -46,6 +46,9 @@
 // rather then by "target" ref.
 #define MOVIECLIP_AS_SOFTREF
 
+// Define the macro below to make abstract equality operator verbose
+//#define GNASH_DEBUG_EQUALITY
+
 namespace gnash {
 
 //
@@ -632,7 +635,12 @@
 bool
 as_value::equals(const as_value& v, as_environment& env) const
 {
-    //log_msg("equals(%s, %s) called", to_debug_string().c_str(), 
v.to_debug_string().c_str());
+    // Comments starting with numbers refer to the ECMA-262 document
+
+#ifdef GNASH_DEBUG_EQUALITY
+    static int count=0;
+    log_debug("equals(%s, %s) called [%d]", to_debug_string().c_str(), 
v.to_debug_string().c_str(), count++);
+#endif
 
     bool this_nulltype = (m_type == UNDEFINED || m_type == NULLTYPE);
     bool v_nulltype = (v.get_type() == UNDEFINED || v.get_type() == NULLTYPE);
@@ -648,46 +656,82 @@
     if ( obj_or_func && v_obj_or_func ) return m_object_value == 
v.m_object_value;
     if ( m_type == v.m_type ) return equalsSameType(v);
 
+    // 16. If Type(x) is Number and Type(y) is String,
+    //    return the result of the comparison x == ToNumber(y).
     else if (m_type == NUMBER && v.m_type == STRING)
     {
        return equalsSameType(v.to_number(&env)); 
     }
+
+    // 17. If Type(x) is String and Type(y) is Number,
+    //     return the result of the comparison ToNumber(x) == y.
     else if (v.m_type == NUMBER && m_type == STRING)
     {
        return v.equalsSameType(to_number(&env)); 
     }
-    else if (m_type == STRING)
-    {
-       return m_string_value == v.to_string(&env);
-    }
+
+    // 18. If Type(x) is Boolean, return the result of the comparison 
ToNumber(x) == y.
     else if (m_type == BOOLEAN)
     {
        return as_value(to_number(&env)).equals(v, env); // m_boolean_value == 
v.to_bool();
     }
+
+    // 19. If Type(y) is Boolean, return the result of the comparison x == 
ToNumber(y).
     else if (v.m_type == BOOLEAN)
     {
        return as_value(v.to_number(&env)).equals(*this, env); 
     }
 
-    else if (m_type == OBJECT || m_type == AS_FUNCTION)
+    // 20. If Type(x) is either String or Number and Type(y) is Object,
+    //     return the result of the comparison x == ToPrimitive(y).
+    else if ( (m_type == STRING || m_type == NUMBER ) && ( v.is_object() ) ) 
// v.m_type == OBJECT || v.m_type == AS_FUNCTION ) )
+    {
+        // convert this value to a primitive and recurse
+        as_value v2 = v.to_primitive(env); 
+#ifdef GNASH_DEBUG_EQUALITY
+       log_debug(" convertion to primitive : %s -> %s", 
v.to_debug_string().c_str(), v2.to_debug_string().c_str());
+#endif
+        if ( v.strictly_equals(v2) ) // returned self ?
+        {
+            return false; // no valid conversion  
+        }
+        else return equals(v2, env);
+    }
+
+    // 21. If Type(x) is Object and Type(y) is either String or Number,
+    //    return the result of the comparison ToPrimitive(x) == y.
+    else if ( (v.m_type == STRING || v.m_type == NUMBER ) && ( is_object() ) ) 
// m_type == OBJECT || m_type == AS_FUNCTION ) )
     {
-       assert ( ! (v.m_type == OBJECT || v.m_type == AS_FUNCTION) );
        // convert this value to a primitive and recurse
        as_value v2 = to_primitive(env); 
-       if ( v2.m_type == OBJECT || v2.m_type == AS_FUNCTION ) return false; // 
no valid conversion 
+#ifdef GNASH_DEBUG_EQUALITY
+       log_debug(" convertion to primitive : %s -> %s", 
to_debug_string().c_str(), v2.to_debug_string().c_str());
+#endif
+        if ( strictly_equals(v2) ) // returned self ?
+        {
+            return false; // no valid conversion 
+        }
        else return v2.equals(v, env);
     }
 
-    else if (v.m_type == OBJECT || v.m_type == AS_FUNCTION)
+    // Both operands are objects (OBJECT,AS_FUNCTION,MOVIECLIP)
+    assert(is_object() && v.is_object());
+
+    // If any of the two converts to a primitive, we recurse
+
+    as_value p = to_primitive(env); 
+    as_value vp = v.to_primitive(env); 
+#ifdef GNASH_DEBUG_EQUALITY
+    log_debug(" convertion to primitive (this): %s -> %s", 
to_debug_string().c_str(), p.to_debug_string().c_str());
+    log_debug(" convertion to primitive (that): %s -> %s", 
v.to_debug_string().c_str(), vp.to_debug_string().c_str());
+#endif
+    if ( strictly_equals(p) && v.strictly_equals(vp) ) // both returned self ?
     {
-       assert ( ! (m_type == OBJECT || m_type == AS_FUNCTION) );
-       // convert this value to a primitive and recurse
-       as_value v2 = v.to_primitive(env); 
-       if ( v2.m_type == OBJECT || v2.m_type == AS_FUNCTION ) return false; // 
no valid conversion 
-       else return equals(v2, env);
+            return false; // no valid conversion 
     }
 
-    return false;
+    return p.equals(vp, env);
+
 }
        
 // Sets *this to this string plus the given string.

Index: testsuite/actionscript.all/ops.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/ops.as,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- testsuite/actionscript.all/ops.as   2 Aug 2007 19:10:51 -0000       1.7
+++ testsuite/actionscript.all/ops.as   2 Aug 2007 20:11:35 -0000       1.8
@@ -20,7 +20,7 @@
  *  Test binary predicates (equal, less_then, greater_then, logical and 
bitwise ops)
  */
 
-rcsid="$Id: ops.as,v 1.7 2007/08/02 19:10:51 strk Exp $";
+rcsid="$Id: ops.as,v 1.8 2007/08/02 20:11:35 strk Exp $";
 
 #include "check.as"
 
@@ -56,7 +56,7 @@
 ary2 = [1,2,3];
 check( ! (ary1 == ary2) ); // two different objects
 check( ! (ary1 == "1,2,3") ); // the array doesn't get converted to a string
-xcheck( ! ("1,2,3" == ary1) ); // the array doesn't get converted to a string
+check( ! ("1,2,3" == ary1) ); // the array doesn't get converted to a string
 
 // for String
 str1 = new String("hello");




reply via email to

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