gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/array.cpp testsuite/acti...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/array.cpp testsuite/acti...
Date: Sat, 04 Aug 2007 04:23:32 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/08/04 04:23:32

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

Log message:
        Patch #6136 by Ivor Blockley <address@hidden>:
        
                * server/array.cpp:
                  Pointers to the as_environment object in the as_value 
comparison
                  functors are now references.
                  Fix a bug caused by a missing return statement in the 
get_basic_eq
                  function.
                * testsuite/actionscript.all/array.as:
                  UNIQUE -> UNIQUESORT flag.
                  add some tests to see how AS objects implementing the valueOf 
method
                  interact with array class methods.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3945&r2=1.3946
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.cpp?cvsroot=gnash&r1=1.71&r2=1.72
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/array.as?cvsroot=gnash&r1=1.28&r2=1.29

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3945
retrieving revision 1.3946
diff -u -b -r1.3945 -r1.3946
--- ChangeLog   4 Aug 2007 04:19:28 -0000       1.3945
+++ ChangeLog   4 Aug 2007 04:23:31 -0000       1.3946
@@ -1,3 +1,15 @@
+2007-08-04 Ivor Blockley <address@hidden>
+
+       * server/array.cpp:
+         Pointers to the as_environment object in the as_value comparison
+         functors are now references.
+         Fix a bug caused by a missing return statement in the get_basic_eq
+         function.
+       * testsuite/actionscript.all/array.as:
+         UNIQUE -> UNIQUESORT flag.
+         add some tests to see how AS objects implementing the valueOf method
+         interact with array class methods.
+
 2007-08-04 Sandro Santilli <address@hidden>
 
        * server/asobj/xmlnode.{cpp,h}: mark reachable resources

Index: server/array.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/array.cpp,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -b -r1.71 -r1.72
--- server/array.cpp    3 Aug 2007 21:10:19 -0000       1.71
+++ server/array.cpp    4 Aug 2007 04:23:32 -0000       1.72
@@ -58,12 +58,14 @@
 }
 
 // simple as_value strict-weak-ordering comparison functors:
+
+// string comparison, ascending (default sort method)
 struct as_value_lt
 {
-       as_environment* _env;
+       as_environment& _env;
        int _sv;
 
-       as_value_lt(as_environment* env)
+       as_value_lt(as_environment& env)
                : _env(env)
        {
                _sv = VM::get().getSWFVersion();
@@ -71,16 +73,16 @@
 
        inline int str_cmp(const as_value& a, const as_value& b)
        {
-               std::string s = a.to_string_versioned(_sv, _env);
-               return s.compare(b.to_string_versioned(_sv, _env));
+               std::string s = a.to_string_versioned(_sv, &_env);
+               return s.compare(b.to_string_versioned(_sv,& _env));
        }
 
        inline int str_nocase_cmp(const as_value& a, const as_value& b)
        {
                using namespace boost::algorithm;
 
-               std::string c = to_upper_copy(a.to_string_versioned(_sv, _env));
-               std::string d = to_upper_copy(b.to_string_versioned(_sv, _env));
+               std::string c = to_upper_copy(a.to_string_versioned(_sv, 
&_env));
+               std::string d = to_upper_copy(b.to_string_versioned(_sv, 
&_env));
                return c.compare(d);
        }
 
@@ -90,8 +92,8 @@
                if (b.is_undefined()) return true;
                if (a.is_null()) return false;
                if (b.is_null()) return true;
-               double aval = a.to_number(_env);
-               double bval = b.to_number(_env);
+               double aval = a.to_number(&_env);
+               double bval = b.to_number(&_env);
                if (isnan(aval)) return false;
                if (isnan(bval)) return true;
                return aval < bval;
@@ -103,8 +105,8 @@
                if (a.is_undefined()) return true;
                if (b.is_null()) return false;
                if (a.is_null()) return true;
-               double aval = a.to_number(_env);
-               double bval = b.to_number(_env);
+               double aval = a.to_number(&_env);
+               double bval = b.to_number(&_env);
                if (isnan(bval)) return false;
                if (isnan(aval)) return true;
                return aval > bval;
@@ -114,8 +116,8 @@
        {
                if (a.is_undefined() && b.is_undefined()) return true;
                if (a.is_null() && b.is_null()) return true;
-               double aval = a.to_number(_env);
-               double bval = b.to_number(_env);
+               double aval = a.to_number(&_env);
+               double bval = b.to_number(&_env);
                if (isnan(aval) && isnan(bval)) return true;
                return aval == bval;
        }
@@ -126,54 +128,60 @@
        }
 };
 
+// string comparison, descending
 struct as_value_gt : public as_value_lt
 {
-       as_value_gt(as_environment* env) : as_value_lt(env) {}
+       as_value_gt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                return str_cmp(a, b) > 0;
        }
 };
 
+// string equality
 struct as_value_eq : public as_value_lt
 {
-       as_value_eq(as_environment* env) : as_value_lt(env) {}
+       as_value_eq(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                return str_cmp(a, b) == 0;
        }
 };
 
+// case-insensitive string comparison, ascending
 struct as_value_nocase_lt : public as_value_lt
 {
-       as_value_nocase_lt(as_environment* env) : as_value_lt(env) {}
+       as_value_nocase_lt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                return str_nocase_cmp(a, b) < 0;
        }
 };
 
+// case-insensitive string comparison, descending
 struct as_value_nocase_gt : public as_value_lt
 {
-       as_value_nocase_gt(as_environment* env) : as_value_lt(env) {}
+       as_value_nocase_gt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                return str_nocase_cmp(a, b) > 0;
        }
 };
 
+// case-insensitive string equality
 struct as_value_nocase_eq : public as_value_lt
 {
-       as_value_nocase_eq(as_environment* env) : as_value_lt(env) {}
+       as_value_nocase_eq(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                return str_nocase_cmp(a, b) == 0;
        }
 };
 
+// numeric comparison, ascending
 struct as_value_num_lt : public as_value_lt
 {
-       as_value_num_lt(as_environment* env) : as_value_lt(env) {}
+       as_value_num_lt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -182,9 +190,10 @@
        }
 };
 
+// numeric comparison, descending
 struct as_value_num_gt : public as_value_lt
 {
-       as_value_num_gt(as_environment* env) : as_value_lt(env) {}
+       as_value_num_gt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -193,9 +202,10 @@
        }
 };
 
+// numeric equality
 struct as_value_num_eq : public as_value_lt
 {
-       as_value_num_eq(as_environment* env) : as_value_lt(env) {}
+       as_value_num_eq(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -204,9 +214,10 @@
        }
 };
 
+// case-insensitive numeric comparison, ascending
 struct as_value_num_nocase_lt : public as_value_lt
 {
-       as_value_num_nocase_lt(as_environment* env) : as_value_lt(env) {}
+       as_value_num_nocase_lt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -215,9 +226,10 @@
        }
 };
 
+// case-insensitive numeric comparison, descending
 struct as_value_num_nocase_gt : public as_value_lt
 {
-       as_value_num_nocase_gt(as_environment* env) : as_value_lt(env) {}
+       as_value_num_nocase_gt(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -226,9 +238,10 @@
        }
 };
 
+// case-insensitive numeric equality
 struct as_value_num_nocase_eq : public as_value_lt
 {
-       as_value_num_nocase_eq(as_environment* env) : as_value_lt(env) {}
+       as_value_num_nocase_eq(as_environment& env) : as_value_lt(env) {}
        bool operator() (const as_value& a, const as_value& b)
        {
                if (a.is_string() || b.is_string())
@@ -241,7 +254,7 @@
 // Note:
 // fUniqueSort and fReturnIndexedArray must first be stripped from the flag
 as_cmp_fn
-get_basic_cmp(uint8_t flags, as_environment* env)
+get_basic_cmp(uint8_t flags, as_environment& env)
 {
        as_cmp_fn f;
 
@@ -290,11 +303,11 @@
        }
 }
 
-// Return basic as_value equality function for corresponding sort flag
+// Return basic as_value equality functor for corresponding sort flag
 // Note:
 // fUniqueSort and fReturnIndexedArray must first be stripped from the flag
 as_cmp_fn
-get_basic_eq(uint8_t flags, as_environment* env)
+get_basic_eq(uint8_t flags, as_environment& env)
 {
        as_cmp_fn f;
        flags &= ~(as_array_object::fDescending);
@@ -316,6 +329,7 @@
                case as_array_object::fCaseInsensitive | 
                                as_array_object::fNumeric:
                        f = as_value_num_nocase_eq(env);
+                       return f;
 
                default:
                        f = as_value_eq(env);
@@ -877,7 +891,7 @@
 {
        boost::intrusive_ptr<as_array_object> array = 
                ensureType<as_array_object>(fn.this_ptr);
-       as_environment* env = &(fn.env());
+       as_environment& env = fn.env();
        uint8_t flags = 0;
 
        if ( fn.nargs == 0 )
@@ -939,7 +953,7 @@
 {
        boost::intrusive_ptr<as_array_object> array = 
                ensureType<as_array_object>(fn.this_ptr);
-       as_environment* env = &(fn.env());
+       as_environment& env = fn.env();
        bool do_unique = false, do_index = false;
        uint8_t flags = 0;
        int sv = VM::get().getSWFVersion();
@@ -948,7 +962,7 @@
        if ( fn.nargs > 0 && fn.arg(0).is_string() )
        {
                std::string propField = 
-                       PROPNAME(fn.arg(0).to_string_versioned(sv, env));
+                       PROPNAME(fn.arg(0).to_string_versioned(sv, &env));
 
                if ( fn.nargs > 1 && fn.arg(1).is_number() )
                {
@@ -985,7 +999,7 @@
                        it != props->end(); ++it)
                {
                        std::string s = 
-                               PROPNAME((*it).to_string_versioned(sv, env));
+                               PROPNAME((*it).to_string_versioned(sv, &env));
                        prp.push_back(s);
                }
                

Index: testsuite/actionscript.all/array.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/array.as,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- testsuite/actionscript.all/array.as 3 Aug 2007 21:10:19 -0000       1.28
+++ testsuite/actionscript.all/array.as 4 Aug 2007 04:23:32 -0000       1.29
@@ -5,7 +5,7 @@
 // Updated with sort functions, and to use check() macro
 // by Mike Carlson Feb. 14th, 2006
 
-rcsid="$Id: array.as,v 1.28 2007/08/03 21:10:19 strk Exp $";
+rcsid="$Id: array.as,v 1.29 2007/08/04 04:23:32 strk Exp $";
 
 #include "check.as"
 
@@ -42,6 +42,19 @@
 check(!Array.prototype.hasOwnProperty('valueOf'));
 #endif // OUTPUT_VERSION >= 6
 
+neg = new Object();
+neg.valueOf = function () { return -1; };
+zero = new Object();
+zero.valueOf = function () { return 0; };
+pos = new Object();
+pos.valueOf = function () { return 1; };
+two = new Object();
+two.valueOf = function () { return 2; };
+numeric = new Object();
+numeric.valueOf = function () { return Array.NUMERIC; };
+numericRev = new Object();
+numericRev.valueOf = function () { return (Array.NUMERIC | Array.DESCENDING); 
};
+
 var a;
 var popped;
 a=[551,"asdf",12];
@@ -76,6 +89,9 @@
 check_equals ( tmp.toString(), "," );
 #endif
 
+tmp = new Array(two);
+check_equals ( tmp.length, 2 );
+
 check_equals ( a.length, 3 );
 check_equals ( a[2], 12 );
 popped=a.pop();
@@ -228,6 +244,10 @@
 portion = concatted.slice(18);
 check_equals ( portion.toString(), "");
 
+// using objects that implement valueOf as index positions
+portion = concatted.slice(zero, two);
+check_equals ( portion.toString(), "0,1");
+
 //-------------------------------
 // Test splice
 //-------------------------------
@@ -383,6 +403,13 @@
        return 0;
 }
 
+function cmp_fn_obj(x,y)
+{
+       if (x.length < y.length) { return neg; }
+       if (x.length > y.length) { return pos; }
+       return zero;
+}
+
 function tolen(x)
 {
        var i;
@@ -437,6 +464,13 @@
 r = b.sort( Array.DESCENDING | Array.NUMERIC );
 check_equals( r.toString(), "8,5,3,1,0,-2,-7,-9" );
 check_equals( b.toString(), "8,5,3,1,0,-2,-7,-9" );
+r = b.sort( zero );
+check_equals( r.toString(), "-2,-7,-9,0,1,3,5,8" );
+check_equals( b.toString(), "-2,-7,-9,0,1,3,5,8" );
+b.sort( numeric );
+check_equals( b.toString(), "-9,-7,-2,0,1,3,5,8" );
+b.sort( numericRev );
+check_equals( b.toString(), "8,5,3,1,0,-2,-7,-9" );
 
 r = c.sort();
 check_equals( r.toString(), "-0.5,-3.7,0,0.001,2,7.2,8.35,Infinity" );
@@ -531,6 +565,19 @@
 check_equals( r.toString(), "singleton" );
 check_equals( e.toString(), "singleton" );
 
+trace(" -- Custom AS function tests using an AS comparator that returns 
objects -- ");
+r = a.sort( cmp_fn_obj, Array.DESCENDING );
+check_equals( tolen(r), "[5, 5, 4, 2, 2, 0]" );
+check_equals( tolen(a), "[5, 5, 4, 2, 2, 0]" );
+a.sort( cmp_fn_obj, Array.CASEINSENSITIVE | Array.NUMERIC );
+check_equals( tolen(a), "[0, 2, 2, 4, 5, 5]" );
+r = a.sort( cmp_fn_obj, Array.RETURNINDEXEDARRAY );
+check_equals( r.toString(), "0,1,2,3,4,5" );
+r = a.sort( cmp_fn_obj, Array.RETURNINDEXEDARRAY | Array.DESCENDING );
+check_equals( r.toString(), "5,4,3,2,1,0" );
+e.sort( cmp_fn_obj, Array.UNIQUESORT | Array.CASEINSENSITIVE );
+check_equals( e.toString(), "singleton" );
+
 a.push("ED");
 b.push(3.0);
 c.push(9/0);
@@ -811,6 +858,10 @@
 check( r instanceof Array );
 check_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | ENIAC,1944,true" );
 
+trace("sortOn with flag as an object overriding the valueOf method");
+a.sortOn( ["Year", "Electronic", "Name"], numeric );
+check_equals( tostr(a), "ENIAC,1944,true | Colossus,1943,true | 
Atanasoff-Berry,1941,true | Zuse Z3,1941,false" );
+
 #if OUTPUT_VERSION < 7
 trace("sortOn property name case-mismatch");
 a.sortOn( "name" );
@@ -839,7 +890,7 @@
 a.sortOn( ["Mass", "Year", "Name"], [Array.NUMERIC | Array.DESCENDING, 
Array.NUMERIC | Array.DESCENDING | 0] );
 check_equals( tostr(a), "Atanasoff-Berry,1941,true | Harvard Mark 
I,1944,undefined | Zuse Z3,1941,false | Colossus,1943,true | ENIAC,1944,true" );
 
-a.sortOn( ["Mass", "Name"], [Array.UNIQUE, Array.DESCENDING] );
+a.sortOn( ["Mass", "Name"], [Array.UNIQUESORT, Array.DESCENDING] );
 check_equals( tostr(a), "Atanasoff-Berry,1941,true | Harvard Mark 
I,1944,undefined | Zuse Z3,1941,false | ENIAC,1944,true | Colossus,1943,true" );
 
 a.sortOn( ["Electronic", "Mass", "Name"], [0, Array.NUMERIC | 
Array.DESCENDING, 0] );




reply via email to

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