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 server/array.h...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/array.cpp server/array.h...
Date: Fri, 03 Aug 2007 21:10:19 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/08/03 21:10:19

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

Log message:
        Patch #6134 by Ivor Blockley <address@hidden>:
        
                * server/array.{cpp,h}: fixes previously identified issues with
                  array.cpp involving functions that needed to be environment 
and
                  SWF-version aware (mainly functions involved in sorting).
                * testsuite/actionscript.all/array.as: xcheck->check, few more
                  tests.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3939&r2=1.3940
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.cpp?cvsroot=gnash&r1=1.70&r2=1.71
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.h?cvsroot=gnash&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/array.as?cvsroot=gnash&r1=1.27&r2=1.28

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3939
retrieving revision 1.3940
diff -u -b -r1.3939 -r1.3940
--- ChangeLog   3 Aug 2007 20:54:47 -0000       1.3939
+++ ChangeLog   3 Aug 2007 21:10:18 -0000       1.3940
@@ -1,39 +1,47 @@
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Ivor Blockley <address@hidden>
+
+       * server/array.{cpp,h}: fixes previously identified issues with
+         array.cpp involving functions that needed to be environment and
+         SWF-version aware (mainly functions involved in sorting). 
+       * testsuite/actionscript.all/array.as: xcheck->check, few more
+         tests.
+
+2007-08-03 Sandro Santilli <address@hidden>
 
        * server/asobj/NetStream.{cpp,h}: mark associated as_environment
          as reachable (but I think there are ownership problem there,
          the as_environment might be deleted before the NetStream object
          is, in which case we'd access random memory).
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * configure.ac: make sure PKG_CONFIG is defined before calling 
          GNAH_PATH_XXX. Made the notice clearer about GNASH_PATH_XX
          need to be put after it.
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * configure.ac: move GTK detection code *after* the cross-compiling
          section, so that $incllist is properly set. Add notice about
          the fact that any GNASH_PATH_XX must be invoked after that one.
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * Makefile.am: only descend in doc/ subdir if DOCBOOK is enabled.
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * configure.ac: check GTK dependencies only if $build_gtk=yes.
          print a WARNING and set $build_gtk=no if deps are not met.
          All of this is done *before* NSAPI is checked, so it would
          correctly be built or not depending on $build_gtk only.
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * configure.ac: fix automatic kparts/nsapi plugin build
          based on gui availability.
 
-2007-08-02 Sandro Santilli <address@hidden>
+2007-08-03 Sandro Santilli <address@hidden>
 
        * configure.ac: fix misleading warning about KDE/GTK gui 
          not being built while KPARTS/NSAPI plugin is when instead

Index: server/array.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/array.cpp,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -b -r1.70 -r1.71
--- server/array.cpp    3 Aug 2007 18:04:09 -0000       1.70
+++ server/array.cpp    3 Aug 2007 21:10:19 -0000       1.71
@@ -41,7 +41,7 @@
 
 namespace gnash {
 
-typedef bool (* as_cmp_fn) (const as_value&, const as_value&);
+typedef boost::function2<bool, const as_value&, const as_value&> as_cmp_fn;
 
 static as_object* getArrayInterface();
 static void attachArrayProperties(as_object& proto);
@@ -57,211 +57,269 @@
        return a > 0;
 }
 
-// simple as_value strict-weak-ordering comparison functions:
-inline static bool
-as_value_lt (const as_value& a, const as_value& b)
+// simple as_value strict-weak-ordering comparison functors:
+struct as_value_lt
 {
-       // TODO: pass env, use versioned (to_string)
-       return a.to_string().compare(b.to_string()) < 0;
-}
+       as_environment* _env;
+       int _sv;
 
-inline static bool
-as_value_gt (const as_value& a, const as_value& b)
-{
-       // TODO: pass env, use versioned (to_string)
-       return a.to_string().compare(b.to_string()) > 0;
-}
+       as_value_lt(as_environment* env)
+               : _env(env)
+       {
+               _sv = VM::get().getSWFVersion();
+       }
 
-inline static bool
-as_value_eq (const as_value& a, const as_value& b)
-{
-       // TODO: pass env, use versioned (to_string)
-       return a.to_string().compare(b.to_string()) == 0;
-}
+       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));
+       }
 
-inline static int
-as_value_StrNoCaseCmp (const as_value& a, const as_value& b)
-{
+       inline int str_nocase_cmp(const as_value& a, const as_value& b)
+       {
        using namespace boost::algorithm;
 
-       // TODO: pass env, use versioned (to_string)
-       std::string strA = to_upper_copy(a.to_string());
-       std::string strB = to_upper_copy(b.to_string());
-
-       return strA.compare(strB);
-}
-
-inline static bool
-as_value_nocase_lt (const as_value& a, const as_value& b)
-{
-       return as_value_StrNoCaseCmp(a, b) < 0;
-}
-
-inline static bool
-as_value_nocase_gt (const as_value& a, const as_value& b)
-{
-       return as_value_StrNoCaseCmp(a, b) > 0;
-}
-
-inline static bool
-as_value_nocase_eq (const as_value& a, const as_value& b)
-{
-       return as_value_StrNoCaseCmp(a, b) == 0;
-}
+               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);
+       }
 
-inline static bool
-as_value_numLT (const as_value& a, const as_value& b)
-{
+       inline bool as_value_numLT (const as_value& a, const as_value& b)
+       {
        if (a.is_undefined()) return false;
        if (b.is_undefined()) return true;
        if (a.is_null()) return false;
        if (b.is_null()) return true;
-       double aval = a.to_number();
-       double bval = b.to_number();
+               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;
-}
+       }
 
-inline static bool
-as_value_numGT (const as_value& a, const as_value& b)
-{
+       inline bool as_value_numGT (const as_value& a, const as_value& b)
+       {
        if (b.is_undefined()) return false;
        if (a.is_undefined()) return true;
        if (b.is_null()) return false;
        if (a.is_null()) return true;
-       double aval = a.to_number();
-       double bval = b.to_number();
+               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;
-}
+       }
 
-inline static bool
-as_value_numEQ (const as_value& a, const as_value& b)
-{
+       inline bool as_value_numEQ (const as_value& a, const as_value& b)
+       {
        if (a.is_undefined() && b.is_undefined()) return true;
        if (a.is_null() && b.is_null()) return true;
-       double aval = a.to_number();
-       double bval = b.to_number();
+               double aval = a.to_number(_env);
+               double bval = b.to_number(_env);
        if (isnan(aval) && isnan(bval)) return true;
        return aval == bval;
-}
+       }
+
+       bool operator() (const as_value& a, const as_value& b)
+       {
+               return str_cmp(a, b) < 0;
+       }
+};
+
+struct as_value_gt : public as_value_lt
+{
+       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;
+       }
+};
+
+struct as_value_eq : public as_value_lt
+{
+       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;
+       }
+};
 
-inline static bool
-as_value_num_lt (const as_value& a, const as_value& b)
+struct as_value_nocase_lt : public as_value_lt
 {
+       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;
+       }
+};
+
+struct as_value_nocase_gt : public as_value_lt
+{
+       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;
+       }
+};
+
+struct as_value_nocase_eq : public as_value_lt
+{
+       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;
+       }
+};
+
+struct as_value_num_lt : public as_value_lt
+{
+       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())
-               return as_value_lt(a, b);
+                       return str_cmp(a, b) < 0;
        return as_value_numLT(a, b);
-}
+       }
+};
 
-inline static bool
-as_value_num_gt (const as_value& a, const as_value& b)
+struct as_value_num_gt : public as_value_lt
 {
+       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())
-               return as_value_gt(a, b);
+                       return str_cmp(a, b) > 0;
        return as_value_numGT(a, b);
-}
+       }
+};
 
-inline static bool
-as_value_num_eq (const as_value& a, const as_value& b)
+struct as_value_num_eq : public as_value_lt
 {
+       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())
-               return as_value_eq(a, b);
+                       return str_cmp(a, b) == 0;
        return as_value_numEQ(a, b);
-}
+       }
+};
 
-inline static bool
-as_value_num_nocase_lt (const as_value& a, const as_value& b)
+struct as_value_num_nocase_lt : public as_value_lt
 {
+       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())
-               return as_value_nocase_lt(a, b);
+                       return str_nocase_cmp(a, b) < 0;
        return as_value_numLT(a, b);
-}
+       }
+};
 
-inline static bool
-as_value_num_nocase_gt (const as_value& a, const as_value& b)
+struct as_value_num_nocase_gt : public as_value_lt
 {
+       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())
-               return as_value_nocase_gt(a, b);
+                       return str_nocase_cmp(a, b) > 0;
        return as_value_numGT(a, b);
-}
+       }
+};
 
-inline static bool
-as_value_num_nocase_eq (const as_value& a, const as_value& b)
+struct as_value_num_nocase_eq : public as_value_lt
 {
+       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())
-               return as_value_nocase_eq(a, b);
+                       return str_nocase_cmp(a, b) == 0;
        return as_value_numEQ(a, b);
-}
+       }
+};
 
-// Return basic as_value comparison function for corresponding sort flag
+// Return basic as_value comparison functor for corresponding sort flag
 // Note:
 // fUniqueSort and fReturnIndexedArray must first be stripped from the flag
-static as_cmp_fn
-get_basic_cmp(uint8_t flags)
+as_cmp_fn
+get_basic_cmp(uint8_t flags, as_environment* env)
 {
+       as_cmp_fn f;
+
        switch ( flags )
        {
-               case 0: 
-                       return &as_value_lt;
+               case 0: // default string comparison
+                       f = as_value_lt(env);
+                       return f;
 
                case as_array_object::fDescending:
-                       return &as_value_gt;
+                       f = as_value_gt(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive: 
-                       return &as_value_nocase_lt;
+                       f = as_value_nocase_lt(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive | 
                                as_array_object::fDescending:
-                       return &as_value_nocase_gt;
+                       f = as_value_nocase_gt(env);
+                       return f;
 
                case as_array_object::fNumeric: 
-                       return &as_value_num_lt;
+                       f = as_value_num_lt(env);
+                       return f;
 
                case as_array_object::fNumeric | as_array_object::fDescending:
-                       return &as_value_num_gt;
+                       f = as_value_num_gt(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive | 
                                as_array_object::fNumeric:
-                       return &as_value_num_nocase_lt;
+                       f = as_value_num_nocase_lt(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive | 
                                as_array_object::fNumeric |
                                as_array_object::fDescending:
-                       return &as_value_num_nocase_gt;
+                       f = as_value_num_nocase_gt(env);
+                       return f;
 
                default:
                        log_error(_("Unhandled sort flags: %d (0x%X)"), flags, 
flags);
-                       return &as_value_lt;
+                       f = as_value_lt(env);
+                       return f;
        }
 }
 
 // Return basic as_value equality function for corresponding sort flag
 // Note:
 // fUniqueSort and fReturnIndexedArray must first be stripped from the flag
-static as_cmp_fn
-get_basic_eq(uint8_t flags)
+as_cmp_fn
+get_basic_eq(uint8_t flags, as_environment* env)
 {
+       as_cmp_fn f;
        flags &= ~(as_array_object::fDescending);
+
        switch ( flags )
        {
                case 0: // default string comparison
-                       return &as_value_eq;
+                       f = as_value_eq(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive: 
-                       return &as_value_nocase_eq;
+                       f = as_value_nocase_eq(env);
+                       return f;
 
                case as_array_object::fNumeric: 
-                       return &as_value_num_eq;
+                       f = as_value_num_eq(env);
+                       return f;
 
                case as_array_object::fCaseInsensitive | 
                                as_array_object::fNumeric:
-                       return &as_value_num_nocase_eq;
+                       f = as_value_num_nocase_eq(env);
 
                default:
-                       return &as_value_eq;
+                       f = as_value_eq(env);
+                       return f;
        }
 }
 
@@ -319,11 +377,10 @@
                
                ao->get_member(_prop, &av);
                bo->get_member(_prop, &bv);
-               return (*_comp)(av, bv);
+               return _comp(av, bv);
        }
 };
 
-
 // Comparator for sorting on multiple array properties
 class as_value_multiprop
 {
@@ -820,11 +877,12 @@
 {
        boost::intrusive_ptr<as_array_object> array = 
                ensureType<as_array_object>(fn.this_ptr);
+       as_environment* env = &(fn.env());
        uint8_t flags = 0;
 
        if ( fn.nargs == 0 )
        {
-               array->sort(&as_value_lt);
+               array->sort(as_value_lt(env));
                return as_value((boost::intrusive_ptr<as_object>)array);
        }
        else if ( fn.nargs == 1 && fn.arg(0).is_number() )
@@ -847,8 +905,8 @@
                        as_value_custom(*as_func, icmp, fn.this_ptr);
 
                if ( (flags & as_array_object::fReturnIndexedArray) )
-                       return as_value(array->sort_indexed(&avc));
-               array->sort(&avc);
+                       return as_value(array->sort_indexed(avc));
+               array->sort(avc);
                return as_value((boost::intrusive_ptr<as_object>)array);
                // note: custom AS function sorting apparently ignores the 
                // UniqueSort flag which is why it is also ignored here
@@ -862,12 +920,12 @@
        }
        bool do_unique, do_index;
        flags = flag_preprocess(flags, &do_unique, &do_index);
-       as_cmp_fn comp = get_basic_cmp(flags);
+       as_cmp_fn comp = get_basic_cmp(flags, env);
 
        if (do_unique)
        {
                as_cmp_fn eq =
-                       get_basic_eq(flags);
+                       get_basic_eq(flags, env);
                if (do_index) return array->sort_indexed(comp, eq);
                return array->sort(comp, eq);
        }
@@ -881,42 +939,37 @@
 {
        boost::intrusive_ptr<as_array_object> array = 
                ensureType<as_array_object>(fn.this_ptr);
+       as_environment* env = &(fn.env());
+       bool do_unique = false, do_index = false;
+       uint8_t flags = 0;
+       int sv = VM::get().getSWFVersion();
 
-       // case: sortOn("prop")
-       if ( fn.nargs == 1 && fn.arg(0).is_string() )
+       // cases: sortOn("prop) and sortOn("prop", Array.FLAG)
+       if ( fn.nargs > 0 && fn.arg(0).is_string() )
        {
-               std::string propField = PROPNAME(fn.arg(0).to_string()); // 
TODO: pass env, use versioned 
-               as_value_prop avc = as_value_prop(propField, &as_value_lt);
-               array->sort(&avc);
-               return as_value((boost::intrusive_ptr<as_object>)array);
-       }
+               std::string propField = 
+                       PROPNAME(fn.arg(0).to_string_versioned(sv, env));
 
-       // case: sortOn("prop", Array.FLAG)
-       bool do_unique = false, do_index = false;
-       if ( fn.nargs == 2 && fn.arg(0).is_string() )
+               if ( fn.nargs > 1 && fn.arg(1).is_number() )
        {
-               std::string propField = PROPNAME(fn.arg(0).to_string()); // 
TODO: pass env, use versioned
-               if ( fn.arg(1).is_number() )
-               {
-                       uint8_t flags = 
-                               static_cast<uint8_t>(fn.arg(1).to_number());
+                       flags = static_cast<uint8_t>(fn.arg(1).to_number());
                        flags = flag_preprocess(flags, &do_unique, &do_index);
+               }
                        as_value_prop avc = as_value_prop(propField, 
-                                               get_basic_cmp(flags));
+                                       get_basic_cmp(flags, env));
                        if (do_unique)
                        {
                                as_value_prop ave = as_value_prop(propField, 
-                                       get_basic_eq(flags));
+                               get_basic_eq(flags, env));
                                if (do_index)
-                                       return array->sort_indexed(&avc, &ave);
-                               return array->sort(&avc, &ave);
+                               return array->sort_indexed(avc, ave);
+                       return array->sort(avc, ave);
                        }
                        if (do_index)
-                               return as_value(array->sort_indexed(&avc));
-                       array->sort(&avc);
+                       return as_value(array->sort_indexed(avc));
+               array->sort(avc);
                        return as_value((boost::intrusive_ptr<as_object>)array);
                }
-       }
 
        // case: sortOn(["prop1", "prop2"] ...)
        if (fn.nargs > 0 && fn.arg(0).is_object() ) 
@@ -931,15 +984,18 @@
                for (std::deque<as_value>::const_iterator it = props->begin();
                        it != props->end(); ++it)
                {
-                       std::string s = PROPNAME((*it).to_string()); // TODO: 
pass env, use versioned
+                       std::string s = 
+                               PROPNAME((*it).to_string_versioned(sv, env));
                        prp.push_back(s);
                }
                
                // case: sortOn(["prop1", "prop2"])
                if (fn.nargs == 1)
-               {       // assign each cmp function to the standard cmp fn
+               {
+                       // assign each cmp function to the standard cmp fn
+                       as_cmp_fn c = get_basic_cmp(0, env);
                        for (unsigned int i = 0; i < optnum; i++)
-                               cmp[i] = &as_value_lt;
+                               cmp[i] = c;
                }
                // case: sortOn(["prop1", "prop2"], [Array.FLAG1, Array.FLAG2])
                else if ( fn.arg(1).is_object() )
@@ -957,18 +1013,19 @@
                                        &do_unique, &do_index);
 
                                for (unsigned int i = 0; i < optnum; i++)
-                                       cmp[i] = get_basic_cmp(flgs[i]);
+                                       cmp[i] = get_basic_cmp(flgs[i], env);
 
                                if (do_unique)
                                {
                                        for (unsigned int i = 0; i < optnum; 
i++)
-                                               eq[i] = get_basic_eq(flgs[i]);
+                                               eq[i] = get_basic_eq(flgs[i], 
env);
                                }
                        }
                        else
                        {
+                               as_cmp_fn c = get_basic_cmp(0, env);
                                for (unsigned int i = 0; i < optnum; i++)
-                                       cmp[i] = &as_value_lt;
+                                       cmp[i] = c;
                        }
                }
                // case: sortOn(["prop1", "prop2"], Array.FLAG)
@@ -977,14 +1034,14 @@
                        uint8_t flags = 
                                static_cast<uint8_t>(fn.arg(1).to_number());
                        flag_preprocess(flags, &do_unique, &do_index);
-                       as_cmp_fn c = get_basic_cmp(flags);
+                       as_cmp_fn c = get_basic_cmp(flags, env);
 
                        for (unsigned int i = 0; i < optnum; i++)
                                cmp[i] = c;
                        
                        if (do_unique)
                        {
-                               as_cmp_fn e = get_basic_eq(flags);
+                               as_cmp_fn e = get_basic_eq(flags, env);
                                for (unsigned int i = 0; i < optnum; i++)
                                        eq[i] = e;
                        }
@@ -998,19 +1055,22 @@
                        as_value_multiprop_eq ave = 
                                as_value_multiprop_eq(prp, eq);
                        if (do_index)
-                               return array->sort_indexed(&avc, &ave);
-                       return array->sort(&avc, &ave);
+                               return array->sort_indexed(avc, ave);
+                       return array->sort(avc, ave);
                }
                if (do_index)
-                       return as_value(array->sort_indexed(&avc));
-               array->sort(&avc);
+                       return as_value(array->sort_indexed(avc));
+               array->sort(avc);
                return as_value((boost::intrusive_ptr<as_object>)array);
 
        }
        IF_VERBOSE_ASCODING_ERRORS(
        log_aserror(_("SortOn called with invalid arguments."));
        )
+       if (fn.nargs == 0 )
        return as_value();
+
+       return as_value((boost::intrusive_ptr<as_object>)array);
 }
 
 // Callback to push values to the back of an array
@@ -1101,11 +1161,13 @@
        boost::intrusive_ptr<as_array_object> array = 
ensureType<as_array_object>(fn.this_ptr);
 
        std::string separator = ",";
+       int swfversion = VM::get().getSWFVersion();
+       as_environment* env = &(fn.env());
 
        if (fn.nargs > 0)
-               separator = fn.arg(0).to_string(); // TODO: pass env, use 
versioned
+               separator = fn.arg(0).to_string_versioned(swfversion, env);
 
-       std::string ret = array->join(separator, &(fn.env()));
+       std::string ret = array->join(separator, env);
 
        return as_value(ret.c_str());
 }
@@ -1265,13 +1327,14 @@
                // Create an empty array with the given number of undefined 
elements.
                //
                as_value index_number, undef_value;
+               int sv = VM::get().getSWFVersion();
+               as_environment* env = &(fn.env());
 
                undef_value.set_undefined();
                for (int i = 0; i < int(fn.arg(0).to_number()); i++)
                {
                        index_number.set_int(i);
-                       // TODO: pass env, use versioned (to_string)
-                       ao->set_member(index_number.to_string().c_str(), 
undef_value);
+                       ao->set_member(index_number.to_string_versioned(sv, 
env).c_str(), undef_value);
                }
        }
        else

Index: server/array.h
===================================================================
RCS file: /sources/gnash/gnash/server/array.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- server/array.h      29 Jul 2007 12:57:01 -0000      1.31
+++ server/array.h      3 Aug 2007 21:10:19 -0000       1.32
@@ -181,9 +181,9 @@
        ///     boolean functor or function comparing two as_value& objects
        ///
        template <class AVCMP>
-       void sort(AVCMP* avc)
+       void sort(AVCMP avc)
        {
-               std::sort(elements.begin(), elements.end(), *avc);
+               std::sort(elements.begin(), elements.end(), avc);
        }
 
        /// \brief
@@ -201,12 +201,12 @@
        ///     used to determine equality
        ///
        template <class AVCMP, class AVEQ>
-       as_value sort(AVCMP* avc, AVEQ* ave)
+       as_value sort(AVCMP avc, AVEQ ave)
        {
                std::deque<as_value> nelem = std::deque<as_value>(elements);
 
-               std::sort(nelem.begin(), nelem.end(), *avc);
-               if (adjacent_find(nelem.begin(), nelem.end(), *ave) != 
nelem.end() )
+               std::sort(nelem.begin(), nelem.end(), avc);
+               if (adjacent_find(nelem.begin(), nelem.end(), ave) != 
nelem.end() )
                        return as_value(0);
 
                elements = nelem;
@@ -220,10 +220,10 @@
        ///     boolean functor or function comparing two as_value& objects
        ///
        template <class AVCMP>
-       as_array_object* sort_indexed(AVCMP* avc)
+       as_array_object* sort_indexed(AVCMP avc)
        {
                std::deque<indexed_as_value> ielem = get_indexed_elements();
-               std::sort(ielem.begin(), ielem.end(), *avc);
+               std::sort(ielem.begin(), ielem.end(), avc);
                return get_indices(ielem);
        }
 
@@ -241,13 +241,13 @@
        ///     used to determine equality
        ///
        template <class AVCMP, class AVEQ>
-       as_value sort_indexed(AVCMP* avc, AVEQ* ave)
+       as_value sort_indexed(AVCMP avc, AVEQ ave)
        {
                std::deque<indexed_as_value> ielem = get_indexed_elements();
 
-               std::sort(ielem.begin(), ielem.end(), *avc);
+               std::sort(ielem.begin(), ielem.end(), avc);
 
-               if (adjacent_find(ielem.begin(), ielem.end(), *ave) != 
ielem.end() )
+               if (adjacent_find(ielem.begin(), ielem.end(), ave) != 
ielem.end() )
                        return as_value(0);
 
                return get_indices(ielem);

Index: testsuite/actionscript.all/array.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/array.as,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -b -r1.27 -r1.28
--- testsuite/actionscript.all/array.as 2 Aug 2007 18:16:18 -0000       1.27
+++ testsuite/actionscript.all/array.as 3 Aug 2007 21:10:19 -0000       1.28
@@ -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.27 2007/08/02 18:16:18 strk Exp $";
+rcsid="$Id: array.as,v 1.28 2007/08/03 21:10:19 strk Exp $";
 
 #include "check.as"
 
@@ -467,12 +467,12 @@
 check_equals( e.toString(), "singleton" );
 
 r = f.sort();
-xcheck_equals( r.toString(), "Name,Name,Year" );
-xcheck_equals( f.toString(), "Name,Name,Year" );
+check_equals( r.toString(), "Name,Name,Year" );
+check_equals( f.toString(), "Name,Name,Year" );
 r = f.sort( Array.UNIQUESORT );
 check_equals( r.toString(), "0" );
 f.sort( Array.DESCENDING | Array.CASEINSENSITIVE );
-xcheck_equals( f.toString(), "Year,Name,Name" );
+check_equals( f.toString(), "Year,Name,Name" );
 
 trace(" -- Return Indexed Array Tests -- ");
 
@@ -507,7 +507,7 @@
 check_equals( r.toString(), "0" );
 
 trace(" -- Custom AS function tests -- ");
-r = a.sort( cmp_fn, Array.UNIQUE );
+r = a.sort( cmp_fn, Array.UNIQUESORT );
 check_equals( r.toString(), ",vi,ed,nano,emacs,Jedit" );
 check_equals( a.toString(), ",vi,ed,nano,emacs,Jedit" );
 r = a.sort( something_undefined );
@@ -574,13 +574,13 @@
 check_equals( r.toString(), "0" );
 r = c.sort( Array.UNIQUESORT | Array.NUMERIC | Array.DESCENDING | 
Array.RETURNINDEXEDARRAY );
 check_equals( r.toString(), "0" );
-r = a.sort( cmp_fn, Array.UNIQUE | Array.CASEINSENSITIVE );
+r = a.sort( cmp_fn, Array.UNIQUESORT | Array.CASEINSENSITIVE );
 check_equals( tolen(r), "[0, 2, 2, 2, 4, 5, 5]" );
 check_equals( tolen(a), "[0, 2, 2, 2, 4, 5, 5]" );
-r = a.sort( cmp_fn, Array.UNIQUE | Array.CASEINSENSITIVE | 
Array.RETURNINDEXEDARRAY );
-check_equals( r.toString(), "0,1,2,3,4,5,6" );  // gnash fails in SWF7,8 but 
succeeds in SWF5,6
-r = a.sort( cmp_fn, Array.UNIQUE | Array.CASEINSENSITIVE | 
Array.RETURNINDEXEDARRAY | Array.DESCENDING );
-check_equals( r.toString(), "6,5,4,3,2,1,0" ); // gnash fails in SWF7,8 but 
succeeds in SWF5,6
+r = a.sort( cmp_fn, Array.UNIQUESORT | Array.CASEINSENSITIVE | 
Array.RETURNINDEXEDARRAY );
+check_equals( r.toString(), "0,1,2,3,4,5,6" ); 
+r = a.sort( cmp_fn, Array.UNIQUESORT | Array.CASEINSENSITIVE | 
Array.RETURNINDEXEDARRAY | Array.DESCENDING );
+check_equals( r.toString(), "6,5,4,3,2,1,0" );
 
 trace(" -- Array with null value  -- ");
 c.push(null);
@@ -642,13 +642,17 @@
 a.push({Name: "Colossus", Year: 1943, Electronic: true});
 a.push({Name: "ENIAC", Year: 1944, Electronic: true});
 
+b = [];
+b.push({Name: id, Year: yr, Electronic: yr});
+b.push({Name: yr, Year: id, Electronic: yr});
+
 function tostr(x)
 {
        var i;
        str = "";
        for(i = 0; i < x.length; i++)
        {
-               y = a[i];
+               y = x[i];
                str += (y.Name + "," + y.Year + "," + y.Electronic );
                if (i != x.length - 1) str += " | ";
        }
@@ -773,6 +777,48 @@
 check_equals( tostr(r), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
 check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
 
+trace("sortOn using an object implementing/over-riding the toString() method 
as the property argument");
+
+a.sortOn( id );
+check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
+
+a.sortOn( id, Array.CASEINSENSITIVE | Array.DESCENDING );
+check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
+
+a.sortOn( [id], 0 );
+check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
+
+a.sortOn( [yr, id], [Array.NUMERIC, Array.DESCENDING] );
+check_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | ENIAC,1944,true" );
+
+trace("sortOn with properties that are objects implementing the toString() 
method");
+
+r = b.sortOn( "Name" );
+check_equals( tostr(r), "Name,Year,Year | Year,Name,Year");
+check_equals( tostr(b), "Name,Year,Year | Year,Name,Year");
+b.sortOn( "Year" );
+check_equals( tostr(b), "Year,Name,Year | Name,Year,Year");
+b.sortOn( ["Year", "Name"], [Array.NUMERIC | Array.DESCENDING, 0] );
+check_equals( tostr(b), "Name,Year,Year | Year,Name,Year");
+
+trace("sortOn invalid calls");
+r = a.sortOn();
+check( r == undefined );
+check_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | ENIAC,1944,true" );
+
+r = a.sortOn(undefined);
+check_equals( typeof(r) , 'object' );
+check( r instanceof Array );
+check_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | ENIAC,1944,true" );
+
+#if OUTPUT_VERSION < 7
+trace("sortOn property name case-mismatch");
+a.sortOn( "name" );
+check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
+a.sortOn( ["year", "name"], Array.NUMERIC );
+check_equals( tostr(a), "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
+#endif // OUTPUT_VERSION < 7
+
 #if OUTPUT_VERSION > 6
 trace("sortOn with some properties undefined");
 a.push({Name: "Harvard Mark I", Year: 1944, Mass: 4500});
@@ -803,60 +849,4 @@
 check_equals( r.toString(), "0,3,1,2,4");
 #endif // OUTPUT_VERSION > 6
 
-#if OUTPUT_VERSION < 7
-trace("sortOn property name case-mismatch");
-a.sortOn( "name" );
-check_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
-a.sortOn( ["year", "name"], Array.NUMERIC );
-check_equals( tostr(a), "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
-#endif // OUTPUT_VERSION < 7
-
-trace("sortOn invalid calls");
-r = a.sortOn();
-check( r == undefined );
-#if OUTPUT_VERSION < 7
-check_equals( tostr(a), "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
-#else // OUTPUT_VERSION >= 7
-check_equals( tostr(a), "Zuse Z3,1941,false | Colossus,1943,true | 
ENIAC,1944,true | Atanasoff-Berry,1941,true | Harvard Mark I,1944,undefined" );
-#endif // OUTPUT_VERSION >= 7
-
-r = a.sortOn(undefined);
-xcheck_equals( typeof(r) , 'object' );
-xcheck( r instanceof Array );
-#if OUTPUT_VERSION < 7
-xcheck_equals( tostr(r) , "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
-#else // OUTPUT_VERSION >= 7
-xcheck_equals( tostr(r) , "Zuse Z3,1941,false | Colossus,1943,true | 
ENIAC,1944,true | Atanasoff-Berry,1941,true | Harvard Mark I,1944,undefined" );
-#endif // OUTPUT_VERSION >= 7
-
-trace("sortOn using an object implementing/over-riding the toString() method 
as the property argument");
-
-r = a.sortOn( id );
-#if OUTPUT_VERSION < 7
-check_equals( tostr(a), "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
-#else // OUTPUT_VERSION >= 7
-check_equals( tostr(a), "Zuse Z3,1941,false | Colossus,1943,true | 
ENIAC,1944,true | Atanasoff-Berry,1941,true | Harvard Mark I,1944,undefined" );
-#endif // OUTPUT_VERSION >= 7
-
-a.sortOn( id, Array.CASEINSENSITIVE | Array.DESCENDING );
-#if OUTPUT_VERSION < 7
-check_equals( tostr(a), "Atanasoff-Berry,1941,true | Zuse Z3,1941,false | 
Colossus,1943,true | ENIAC,1944,true" );
-#else // OUTPUT_VERSION >= 7
-check_equals( tostr(a), "Zuse Z3,1941,false | Colossus,1943,true | 
ENIAC,1944,true | Atanasoff-Berry,1941,true | Harvard Mark I,1944,undefined");
-#endif // OUTPUT_VERSION >= 7
-
-
-r = a.sortOn( [id], 0 );
-#if OUTPUT_VERSION < 7
-xcheck_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Zuse Z3,1941,false" );
-#else // OUTPUT_VERSION >= 7
-xcheck_equals( tostr(a), "Atanasoff-Berry,1941,true | Colossus,1943,true | 
ENIAC,1944,true | Harvard Mark I,1944,undefined | Zuse Z3,1941,false" );
-#endif // OUTPUT_VERSION >= 7
-
-r = a.sortOn( [yr, id], [Array.NUMERIC, Array.DESCENDING] );
-#if OUTPUT_VERSION < 7
-xcheck_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | ENIAC,1944,true" );
-#else // OUTPUT_VERSION >= 7
-xcheck_equals( tostr(a), "Zuse Z3,1941,false | Atanasoff-Berry,1941,true | 
Colossus,1943,true | Harvard Mark I,1944,undefined | ENIAC,1944,true" );
-#endif // OUTPUT_VERSION >= 7
 




reply via email to

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