gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] /srv/bzr/gnash/trunk r12266: Various compatibility improv


From: Benjamin Wolsey
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r12266: Various compatibility improvements. Simplify and correct equality tests
Date: Mon, 21 Jun 2010 13:38:06 +0200
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 12266 [merge]
committer: Benjamin Wolsey <address@hidden>
branch nick: trunk
timestamp: Mon 2010-06-21 13:38:06 +0200
message:
  Various compatibility improvements. Simplify and correct equality tests
  (new passes in swfdec testsuite and actionscript.all). The as_value::equals
  function is now almost readable, which is an added benefit.
  
  Simplify and correct Function.call (passes in swfdec testsuite and
  actionscript.all).
  
  Corrections to ColorTransform, implement ColorTransform.concat. Passes in
  the swfdec testsuite.
modified:
  libcore/as_function.cpp
  libcore/as_value.cpp
  libcore/asobj/flash/geom/ColorTransform_as.cpp
  libcore/asobj/flash/geom/ColorTransform_as.h
  libcore/asobj/flash/geom/Matrix_as.cpp
  testsuite/actionscript.all/Function.as
  testsuite/actionscript.all/Instance.as
  testsuite/actionscript.all/Object.as
  testsuite/actionscript.all/XMLNode.as
  testsuite/swfdec/PASSING
=== modified file 'libcore/as_function.cpp'
--- a/libcore/as_function.cpp   2010-03-22 23:46:33 +0000
+++ b/libcore/as_function.cpp   2010-06-21 06:02:24 +0000
@@ -321,44 +321,16 @@
        // the copy only if needed
        fn_call new_fn_call(fn);
 
-       if (!fn.nargs) {
-               new_fn_call.nargs = 0;
-       }
-       else {
-               // Get the object to use as 'this' reference
-               as_value this_val = fn.arg(0);
-               as_object* this_ptr = this_val.to_object(getGlobal(fn));
-
-               if (!this_ptr) {
-                       // If the first argument is not an object, we should
-                       // not pass an object to the function, which I believe
-                       // should be allowed (but gnash code is not ready).
-                       // Anyway, the 'this' label inside the function should 
-                       // then be a strange object in that typeof() would 
return
-                       // 'object' but when compared to undefined matches !!
-                       // See actionscript.all/Function.as
-                       IF_VERBOSE_ASCODING_ERRORS(
-                       log_aserror(_("First argument to Function.call(%s) 
doesn't "
-                "cast to object. "
-                               "Gnash will keep the current 'this' pointer as 
it is, "
-                               "but this is known to not be the correct way to 
handle "
-                               "such a malformed call."), this_val);
-                       );
-               }
-               else {
-                       new_fn_call.this_ptr = this_ptr;
-            // Note: do not override fn_call::super by creating a super
-            // object, as it may not be needed. Doing so can have a very
-            // detrimental effect on memory usage!
-            // Normal supers will be created when needed in the function
-            // call.
-
-            // TODO: it seems pointless to copy the old fn_call and
-            // then change almost everything...
-            new_fn_call.super = 0;
-               }
-               new_fn_call.drop_bottom();
-       }
+    as_object* tp;
+
+    if (!fn.nargs || fn.arg(0).is_undefined() || fn.arg(0).is_null()) {
+        tp = new as_object(getGlobal(fn));
+    }
+    else tp = fn.arg(0).to_object(getGlobal(fn));
+
+    new_fn_call.this_ptr = tp;
+    new_fn_call.super = 0;
+    if (fn.nargs) new_fn_call.drop_bottom();
 
        // Call the function 
        return function_obj->call(new_fn_call);

=== modified file 'libcore/as_value.cpp'
--- a/libcore/as_value.cpp      2010-05-18 08:01:01 +0000
+++ b/libcore/as_value.cpp      2010-06-21 11:02:50 +0000
@@ -63,29 +63,14 @@
 namespace gnash {
 
 namespace {
-
-/// Returns a member only if it is an object.
-inline bool
-findMethod(as_object& obj, string_table::key m, as_value& ret)
-{
-    return obj.get_member(m, &ret) && ret.is_object();
-}
-
-/// Truncates a double to a 32-bit unsigned int.
-//
-/// In fact, it is a 32-bit unsigned int with an additional sign, cast
-/// to an unsigned int. Not sure what the sense is, but that's how it works:
-//
-/// 0xffffffff is interpreted as -1, -0xffffffff as 1.
-boost::int32_t
-truncateToInt(double d)
-{
-    if (d < 0) {   
-        return - static_cast<boost::uint32_t>(std::fmod(-d, 4294967296.0));
-    }
-    
-    return static_cast<boost::uint32_t>(std::fmod(d, 4294967296.0));
-}
+    bool objectEqualsPrimitive(const as_value& obj, const as_value& prim);
+    bool stringEqualsNumber(const as_value& str, const as_value& num);
+    bool compareBoolean(const as_value& boolean, const as_value& other);
+    inline bool findMethod(as_object& obj, string_table::key m, as_value& ret);
+    boost::int32_t truncateToInt(double d);
+}
+
+namespace {
 
 enum Base
 {
@@ -588,166 +573,54 @@
 bool
 as_value::equals(const as_value& v) const
 {
-    // Comments starting with numbers refer to the ECMA-262 document
-
-    int SWFVersion = VM::get().getSWFVersion();
-
-    bool this_nulltype = (_type == UNDEFINED || _type == NULLTYPE);
-    bool v_nulltype = (v._type == UNDEFINED || v._type == NULLTYPE);
-
-    // It seems like functions are considered the same as a NULL type
-    // in SWF5 (and I hope below, didn't check)
-    if (SWFVersion < 6) {
-        if (is_function()) this_nulltype = true;
-        if (v.is_function()) v_nulltype = true;
-    }
-
-    if (this_nulltype || v_nulltype) {
-#ifdef GNASH_DEBUG_EQUALITY
-       log_debug(" one of the two things is undefined or null");
-#endif
-        return this_nulltype == v_nulltype;
-    }
-
-    bool obj_or_func = (_type == OBJECT);
-    bool v_obj_or_func = (v._type == OBJECT);
-
-    /// Compare to same type
-    if (obj_or_func && v_obj_or_func) {
-        return boost::get<as_object*>(_value) ==
-            boost::get<as_object*>(v._value); 
-    }
-
+
+    // First compare values of the same type.
     if (_type == v._type) return equalsSameType(v);
-
-    // 16. If Type(x) is Number and Type(y) is String,
-    //    return the result of the comparison x == ToNumber(y).
-    if (_type == NUMBER && v._type == STRING) {
-        const double n = v.to_number();
-        if (!isFinite(n)) return false;
-        return equalsSameType(n);
-    }
-
-    // 17. If Type(x) is String and Type(y) is Number,
-    //     return the result of the comparison ToNumber(x) == y.
-    if (v._type == NUMBER && _type == STRING) {
-        const double n = to_number();
-        if (!isFinite(n)) return false;
-        return v.equalsSameType(n); 
-    }
-
-    // 18. If Type(x) is Boolean, return the result of the comparison 
ToNumber(x) == y.
-    if (_type == BOOLEAN) {
-        return as_value(to_number()).equals(v); 
-    }
-
-    // 19. If Type(y) is Boolean, return the result of the comparison x == 
ToNumber(y).
-    if (v._type == BOOLEAN) {
-        return as_value(v.to_number()).equals(*this); 
-    }
-
-    // 20. If Type(x) is either String or Number and Type(y) is Object,
-    //     return the result of the comparison x == ToPrimitive(y).
-    if ((_type == STRING || _type == NUMBER) && (v._type == OBJECT))
-    {
-        // convert this value to a primitive and recurse
-        try {
-            as_value v2 = v.to_primitive(v.defaultPrimitive(SWFVersion)); 
-            if (v.strictly_equals(v2)) return false;
-#ifdef GNASH_DEBUG_EQUALITY
-            log_debug(" 20: convertion to primitive : %s -> %s", v, v2);
-#endif
-            return equals(v2);
-        }
-        catch (ActionTypeError& e) {
-#ifdef GNASH_DEBUG_EQUALITY
-            log_debug(" %s.to_primitive() threw an ActionTypeError %s", v,
-                    e.what());
-#endif
-            return false; 
-        }
-    }
-
-    // 21. If Type(x) is Object and Type(y) is either String or Number,
-    //    return the result of the comparison ToPrimitive(x) == y.
-    if ((v._type == STRING || v._type == NUMBER) && (_type == OBJECT)) {
-        // convert this value to a primitive and recurse
-        try {
-            // Date objects default to primitive type STRING from SWF6 up,
-            // but we always prefer valueOf to toString in this case.
-            as_value v2 = to_primitive(NUMBER); 
-            if (strictly_equals(v2)) return false;
-#ifdef GNASH_DEBUG_EQUALITY
-            log_debug(" 21: convertion to primitive : %s -> %s", *this, v2);
-#endif
-            return v2.equals(v);
-        }
-        catch (ActionTypeError& e) {
-#ifdef GNASH_DEBUG_EQUALITY
-            log_debug(" %s.to_primitive() threw an ActionTypeError %s",
-                    *this, e.what());
-#endif
-            return false; 
-        }
-    }
-
-#ifdef GNASH_DEBUG_EQUALITY
-    // Both operands are objects (OBJECT,DISPLAYOBJECT)
-    if (!is_object() || !v.is_object()) {
-        log_debug("Equals(%s,%s)", *this, v);
-    }
-#endif
-
-    // If any of the two converts to a primitive, we recurse
-
+    
+    // Then compare booleans.
+    if (is_bool()) return compareBoolean(*this, v);
+    if (v.is_bool()) return compareBoolean(v, *this);
+
+    // Then compare any other primitive, including null and undefined, with
+    // an object.
+    if (!is_object() && v.is_object()) {
+        return objectEqualsPrimitive(v, *this);
+    }
+
+    if (is_object() && !v.is_object()) {
+        return objectEqualsPrimitive(*this, v);
+    }
+
+    // Remaining null or undefined values only equate to other null or
+    // undefined values.
+    const bool null = (is_undefined() || is_null());
+    const bool v_null = (v.is_undefined() || v.is_null());
+    if (null || v_null) return null == v_null;
+
+    // Now compare a number with a string.
+    if (is_number() && v.is_string()) return stringEqualsNumber(v, *this);
+    if (is_string() && v.is_number()) return stringEqualsNumber(*this, v);
+    
+    // Finally compare non-identical objects.
     as_value p = *this;
     as_value vp = v;
 
-    bool converted(false);
-
-    try {
-        p = to_primitive(p.defaultPrimitive(SWFVersion)); 
-        if (!strictly_equals(p)) converted = true;
-#ifdef GNASH_DEBUG_EQUALITY
-        log_debug(" conversion to primitive (this): %s -> %s", *this, p);
-#endif
-    }
-    catch (ActionTypeError& e) {
-#ifdef GNASH_DEBUG_CONVERSION_TO_PRIMITIVE 
-        log_debug(" %s.to_primitive() threw an ActionTypeError %s",
-            *this, e.what());
-#endif
-    }
-
-    try {
-        vp = v.to_primitive(v.defaultPrimitive(SWFVersion)); 
-        if (!v.strictly_equals(vp)) converted = true;
-#ifdef GNASH_DEBUG_EQUALITY
-        log_debug(" conversion to primitive (that): %s -> %s", v, vp);
-#endif
-    }
-    catch (ActionTypeError& e) {
-#ifdef GNASH_DEBUG_CONVERSION_TO_PRIMITIVE 
-        log_debug(" %s.to_primitive() threw an ActionTypeError %s",
-            v, e.what());
-#endif
-    }
-
-    if (converted)
-    {
-#ifdef GNASH_DEBUG_EQUALITY
-        log_debug(" some conversion took place, recursing");
-#endif
-        return p.equals(vp);
-    }
-    else {
-#ifdef GNASH_DEBUG_EQUALITY
-        log_debug(" no conversion took place, returning false");
-#endif
+    try {
+        p = to_primitive(NUMBER); 
+    }
+    catch (ActionTypeError& e) {}
+
+    try {
+        vp = v.to_primitive(NUMBER); 
+    }
+    catch (ActionTypeError& e) {}
+
+    // No conversion took place; the result is false
+    if (strictly_equals(p) && v.strictly_equals(vp)) {
         return false;
     }
-
-
+    
+    return p.equals(vp);
 }
     
 const char*
@@ -1224,6 +1097,76 @@
     return v;
 }
 
+namespace {
+
+/// Checks for equality between an object value and a primitive value
+//
+/// @param obj      An as_value of object type. Callers must ensure this
+///                 condition is met.
+/// @param prim     An as_value of primitive type. Callers must ensure this
+///                 condition is met.
+//
+/// This is a function try-block.
+bool
+objectEqualsPrimitive(const as_value& obj, const as_value& prim)
+try {
+
+    assert(obj.is_object());
+    assert(!prim.is_object());
+
+    as_value tmp = obj.to_primitive(as_value::NUMBER);
+    if (obj.strictly_equals(tmp)) return false;
+    return tmp.equals(prim);
+}
+catch (const ActionTypeError&) {
+    return false;
+}
+
+/// @param boolean      A boolean as_value
+/// @param other        An as_value of any type.
+bool
+compareBoolean(const as_value& boolean, const as_value& other)
+{
+    assert(boolean.is_bool());
+    return as_value(boolean.to_number()).equals(other); 
+}
+
+bool
+stringEqualsNumber(const as_value& str, const as_value& num) {
+    assert(num.is_number());
+    assert(str.is_string());
+    const double n = str.to_number();
+    if (!isFinite(n)) return false;
+    return num.strictly_equals(n);
+}
+
+
+/// Returns a member only if it is an object.
+inline bool
+findMethod(as_object& obj, string_table::key m, as_value& ret)
+{
+    return obj.get_member(m, &ret) && ret.is_object();
+}
+
+/// Truncates a double to a 32-bit unsigned int.
+//
+/// In fact, it is a 32-bit unsigned int with an additional sign, cast
+/// to an unsigned int. Not sure what the sense is, but that's how it works:
+//
+/// 0xffffffff is interpreted as -1, -0xffffffff as 1.
+boost::int32_t
+truncateToInt(double d)
+{
+    if (d < 0) {   
+        return - static_cast<boost::uint32_t>(std::fmod(-d, 4294967296.0));
+    }
+    
+    return static_cast<boost::uint32_t>(std::fmod(d, 4294967296.0));
+}
+
+} // unnamed namespace
+
+
 } // namespace gnash
 
 

=== modified file 'libcore/asobj/flash/geom/ColorTransform_as.cpp'
--- a/libcore/asobj/flash/geom/ColorTransform_as.cpp    2010-01-25 18:52:20 
+0000
+++ b/libcore/asobj/flash/geom/ColorTransform_as.cpp    2010-06-21 04:51:52 
+0000
@@ -71,6 +71,20 @@
 {
 }
 
+void
+ColorTransform_as::concat(const ColorTransform_as& other)
+{
+    _redOffset += _redMultiplier * other.getRedOffset();
+    _greenOffset += _greenMultiplier * other.getGreenOffset();
+    _blueOffset += _blueMultiplier * other.getBlueOffset();
+    _alphaOffset += _alphaMultiplier * other.getAlphaOffset();
+
+    _redMultiplier *= other.getRedMultiplier();
+    _greenMultiplier *= other.getGreenMultiplier();
+    _blueMultiplier *= other.getBlueMultiplier();
+    _alphaMultiplier *= other.getAlphaMultiplier();
+}
+
 // extern 
 void
 colortransform_class_init(as_object& where, const ObjectURI& uri)
@@ -103,12 +117,12 @@
 void
 attachColorTransformInterface(as_object& o)
 {
-    const int flags = 0;
     
     /// These have no flags:
+    const int flags = 0;
     VM& vm = getVM(o);
+    Global_as& gl = getGlobal(o);
     o.init_member("concat", vm.getNative(1105, 1), flags);
-    Global_as& gl = getGlobal(o);
     o.init_member("toString", gl.createFunction(colortransform_toString),
             flags);
 
@@ -242,8 +256,19 @@
 colortransform_concat(const fn_call& fn)
 {
        ColorTransform_as* relay = ensure<ThisIsNative<ColorTransform_as> >(fn);
-       UNUSED(relay);
-       LOG_ONCE( log_unimpl (__FUNCTION__) );
+
+    if (!fn.nargs) {
+        // Log error
+        return as_value();
+    }
+    as_object* o = fn.arg(0).to_object(getGlobal(fn));
+    ColorTransform_as* tr;
+    if (!isNativeType(o, tr)) {
+        return as_value();
+    }
+    
+    relay->concat(*tr);
+
        return as_value();
 }
 
@@ -264,20 +289,27 @@
     const as_value& rm = ptr->getMember(st.find("redMultiplier"));
     const as_value& ro = ptr->getMember(st.find("redOffset"));
    
-    std::ostringstream ss;
-    
-    const int version = getSWFVersion(fn);
-
-    ss << "(redMultiplier=" << rm.to_string(version) << ", "
-       << "greenMultiplier=" << gm.to_string(version) << ", "
-       << "blueMultiplier=" << bm.to_string(version) << ", "
-       << "alphaMultiplier=" << am.to_string(version) << ", "
-       << "redOffset=" << ro.to_string(version) << ", "
-       << "greenOffset=" << go.to_string(version) << ", "
-       << "blueOffset=" << bo.to_string(version) << ", "
-       << "alphaOffset=" << ao.to_string(version) << ")";
-       
-    return as_value(ss.str());
+    VM& vm = getVM(fn);
+
+    as_value ret("(redMultiplier=");
+    newAdd(ret, rm, vm);
+    newAdd(ret, ", greenMultiplier=", vm);
+    newAdd(ret, gm, vm);
+    newAdd(ret, ", blueMultiplier=", vm);
+    newAdd(ret, bm, vm);
+    newAdd(ret, ", alphaMultiplier=", vm);
+    newAdd(ret, am, vm);
+    newAdd(ret, ", redOffset=", vm);
+    newAdd(ret, ro, vm);
+    newAdd(ret, ", greenOffset=", vm);
+    newAdd(ret, go, vm);
+    newAdd(ret, ", blueOffset=", vm);
+    newAdd(ret, bo, vm);
+    newAdd(ret, ", alphaOffset=", vm);
+    newAdd(ret, ao, vm);
+    newAdd(ret, ")", vm);
+
+    return ret;
 
 }
 

=== modified file 'libcore/asobj/flash/geom/ColorTransform_as.h'
--- a/libcore/asobj/flash/geom/ColorTransform_as.h      2010-06-05 09:29:30 
+0000
+++ b/libcore/asobj/flash/geom/ColorTransform_as.h      2010-06-21 04:51:52 
+0000
@@ -66,6 +66,7 @@
     double getBlueOffset() const { return _blueOffset; }
     double getGreenOffset() const { return _greenOffset; }
 
+    void concat(const ColorTransform_as& other);
 
 private:
 

=== modified file 'libcore/asobj/flash/geom/Matrix_as.cpp'
--- a/libcore/asobj/flash/geom/Matrix_as.cpp    2010-06-19 08:40:55 +0000
+++ b/libcore/asobj/flash/geom/Matrix_as.cpp    2010-06-21 04:04:29 +0000
@@ -682,18 +682,6 @@
 
     return ret;
     
-    std::ostringstream ss;
-    
-    const int version = getSWFVersion(fn);
-
-    ss << "(a=" << a.to_string(version) << ", "
-          "b="<< b.to_string(version) << ", "
-          "c="<< c.to_string(version) << ", "
-          "d="<< d.to_string(version) << ", "
-          "tx="<< tx.to_string(version) << ", "
-          "ty="<< ty.to_string(version) << ")";
-    
-    return as_value(ss.str());
 }
 
 as_value

=== modified file 'testsuite/actionscript.all/Function.as'
--- a/testsuite/actionscript.all/Function.as    2010-01-11 06:41:38 +0000
+++ b/testsuite/actionscript.all/Function.as    2010-06-21 06:55:40 +0000
@@ -158,8 +158,8 @@
 check_equals(c, 1);
 ret = getThis.call(null);
 check_equals(c, 2);
-xcheck_equals(typeof(ret), 'object');
-xcheck_equals(ret, undefined); // an object type which returns 'undefined' as 
primitive value ?
+check_equals(typeof(ret), 'object');
+check_equals(ret, undefined); // an object type which returns 'undefined' as 
primitive value ?
 check( ! (ret === undefined) ); // an object type which returns 'undefined' as 
primitive value ?
 check( ! (ret === null) ); // an object type which returns 'undefined' as 
primitive value ?
 

=== modified file 'testsuite/actionscript.all/Instance.as'
--- a/testsuite/actionscript.all/Instance.as    2010-01-11 06:41:38 +0000
+++ b/testsuite/actionscript.all/Instance.as    2010-06-21 07:40:06 +0000
@@ -123,7 +123,7 @@
 #if OUTPUT_VERSION == 5
 check_equals(s, undefined);
 #else
-xcheck_equals(s, undefined);
+check_equals(s, undefined);
 #endif
 check_equals(s.__proto__, 8);
 check_equals(typeof(s), "object");
@@ -133,7 +133,7 @@
 #if OUTPUT_VERSION == 5
 check_equals(s, undefined);
 #else
-xcheck_equals(s, undefined);
+check_equals(s, undefined);
 #endif
 
 Cl = function() {};

=== modified file 'testsuite/actionscript.all/Object.as'
--- a/testsuite/actionscript.all/Object.as      2010-01-11 06:41:38 +0000
+++ b/testsuite/actionscript.all/Object.as      2010-06-21 06:55:40 +0000
@@ -293,7 +293,7 @@
 obj3.__proto__ = undefined;
 check_equals(typeof(obj3), "object");
 check_equals(typeof(obj3.__proto__), 'undefined');
-xcheck_equals(obj3, undefined);
+check_equals(obj3, undefined);
 
 // Use name of an existing property
 

=== modified file 'testsuite/actionscript.all/XMLNode.as'
--- a/testsuite/actionscript.all/XMLNode.as     2010-01-11 06:41:38 +0000
+++ b/testsuite/actionscript.all/XMLNode.as     2010-06-21 06:55:40 +0000
@@ -198,7 +198,7 @@
 
 // FIXME: This is how it is now.
 #if OUTPUT_VERSION > 5
-xcheck_equals(node2.attributes, undefined);
+check_equals(node2.attributes, undefined);
 #else
 check_equals(node2.attributes, undefined);
 #endif

=== modified file 'testsuite/swfdec/PASSING'
--- a/testsuite/swfdec/PASSING  2010-06-19 14:37:18 +0000
+++ b/testsuite/swfdec/PASSING  2010-06-21 07:40:45 +0000
@@ -174,6 +174,9 @@
 button-properties-7.swf:44605cb6a7b2649c18d155434cc57b83
 button-properties-8.swf:794f9c47e03aa3b0c75eeff87ba8a140
 call-arguments-5.swf:422c391a2abd3e864eb8ed8a1e05ad31
+call-arguments-6.swf:532961cf29bb6575dad3d597f9c1e662
+call-arguments-7.swf:b0e2b0cf2c1cdd4b742b7f41ff3f5d21
+call-arguments-8.swf:4d3b4133f9cf98bac32518f6462582ac
 callfunction-stack.swf:21d0c957f4caf0eb0ccd0dcadaf17500
 callmethod-undefined-this-5.swf:affed3be009b851c05f72b8429f13b2d
 callmethod-undefined-this-6.swf:c1695e653464da8c9b58b3e08c0d3325
@@ -230,6 +233,7 @@
 color-transform-concat-5.swf:92f467ed0cee02fbc9618a17c382ef3b
 color-transform-concat-6.swf:10677612a1795de193f9a8a7b99eaaa5
 color-transform-concat-7.swf:df14e747698a6513f73990f6726944b0
+color-transform-concat-8.swf:661a4bc180477ae2b75cc650d97e4688
 color-transform-construct-6.swf:ce54eb919f4069cd3ab70f84bfd31670
 color-transform-construct-7.swf:7c50d7d221a731c2296789f434b718e4
 color-transform-construct-8.swf:d68ee06d60eb6612648365ab75f6b794
@@ -241,6 +245,8 @@
 color-transform-properties-6.swf:3946bb0de3a610f1a690b43b1fe48f70
 color-transform-properties-7.swf:f1e3056a0a679136529e317550797e63
 color-transform-properties-8.swf:23fff32f746e8267cf86d464e52727df
+color-transform-rgb-6.swf:7e40f9477cdd8036a25cb4e48acf6437
+color-transform-rgb-7.swf:915b6105e107e378d2b610ffff3486ce
 comparisons-4.swf:e0bb89e492f3f35e51b1beb190935a14
 comparisons-5.swf:d4dfeb4ec80ec1f5a7390eb699e269ee
 comparisons-6.swf:5a7bf1ffb3a4dd23828d6e180f1871b0
@@ -496,6 +502,10 @@
 enumerate-6.swf:85f81c4443f6137238d4fa5561579812
 enumerate-7.swf:35e50f33fd5b00821d709ce06dc3bcad
 enumerate-8.swf:6c30f609bf36664ce15a7a63ea2857cf
+equality-5.swf:1961f6c2aea96fde599af58ffe7ef17c
+equality-6.swf:7f4bb7a399447fefabe9389ad5ffd5e1
+equality-7.swf:574f127c02753bd51cc6aaed994a3b1d
+equality-8.swf:3442b5a8f5a42a95b07dc3f243a8fb53
 equality-old-5.swf:7e7bb8e312a001c579c1e3677ef896c4
 equality-old-6.swf:57bfbb9065a0e63cd77bf6c584bcf347
 equality-old-7.swf:6eecbe10ad56bad25f0f4eaf61e441dc
@@ -1432,6 +1442,7 @@
 totalframes.swf:cdc0d5e2017d293438ef80fa136c44e8
 transform2.swf:95d19c9ed6592c459d7f6836a0365df2
 transform-color-transform-5.swf:1b03afaa179024037f5d167556b3f7a9
+transform-color-transform-8.swf:e399d3c5e18ac09728653808ba14af89
 Transform-matrix-5.swf:ae65136f5adbcd6dfec68760f7d1d7b4
 Transform-matrix-6.swf:45c037253c5fbac0a80753a5d194f60c
 Transform-matrix-7.swf:c4110453b8151dd87efff882e5b312ca


reply via email to

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