[Top][All Lists]
[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
- [Gnash-commit] gnash ChangeLog server/array.cpp server/array.h...,
Sandro Santilli <=