gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash server/array.cpp testsuite/actionscript.a...


From: Sandro Santilli
Subject: [Gnash-commit] gnash server/array.cpp testsuite/actionscript.a...
Date: Wed, 04 Apr 2007 09:49:43 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/04/04 09:49:43

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

Log message:
                * server/array.cpp: use a getter/setter for the 'length' 
property.
                * testsuite/actionscript.all/array.as: another success.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.cpp?cvsroot=gnash&r1=1.55&r2=1.56
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/array.as?cvsroot=gnash&r1=1.16&r2=1.17

Patches:
Index: server/array.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/array.cpp,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -b -r1.55 -r1.56
--- server/array.cpp    28 Mar 2007 14:58:30 -0000      1.55
+++ server/array.cpp    4 Apr 2007 09:49:43 -0000       1.56
@@ -47,6 +47,8 @@
 namespace gnash {
 
 static as_object* getArrayInterface();
+static void attachArrayProperties(as_object& proto);
+static void attachArrayInterface(as_object& proto);
 
 // Default as_value strict weak comparator (string based)
 class AsValueLessThen
@@ -144,6 +146,7 @@
        elements(0)
 {
     //log_action("%s : %p\n", __FUNCTION__, (void*)this);
+       attachArrayProperties(*this);
 }
 
 as_array_object::as_array_object(const as_array_object& other)
@@ -362,12 +365,6 @@
 bool
 as_array_object::get_member(const std::string& name, as_value *val)
 {
-       if ( name == "length" ) 
-       {
-               val->set_double((double)size());
-               return true;
-       }
-
        // an index has been requested
        int index = index_requested(name);
        if ( index >= 0 && (unsigned int)index < elements.size() )
@@ -390,13 +387,6 @@
 as_array_object::set_member(const std::string& name,
                const as_value& val )
 {
-       if ( name == "length" ) 
-       {
-               //log_warning("Attempt to assign to Array.length - ignored");
-               resize(unsigned(val.to_number()));
-               return;
-       }
-
        int index = index_requested(name);
 
        // if we were sent a valid array index and not a normal member
@@ -824,6 +814,22 @@
 
 }
 
+static as_value
+array_length(const fn_call& fn)
+{
+       boost::intrusive_ptr<as_array_object> array = 
ensureType<as_array_object>(fn.this_ptr);
+
+       if ( fn.nargs ) // setter
+       {
+               array->resize(unsigned(fn.arg(0).to_number(&(fn.env()))));
+               return as_value();
+       }
+       else // getter
+       {
+               return as_value(array->size());
+       }
+}
+
 as_value
 array_new(const fn_call& fn)
 {
@@ -831,8 +837,7 @@
                log_action("array_new called, nargs = %d", fn.nargs);
        );
 
-       //boost::intrusive_ptr<as_array_object> ao = new as_array_object;
-       as_array_object* ao = new as_array_object;
+       boost::intrusive_ptr<as_array_object>   ao = new as_array_object;
 
        if (fn.nargs == 0)
        {
@@ -862,20 +867,25 @@
        }
 
        IF_VERBOSE_ACTION (
-               log_action("array_new setting object %p in result", (void*)ao);
+               log_action("array_new setting object %p in result", 
(void*)ao.get());
        );
 
-       //return as_value(ao.get());
-       return as_value(ao);
+       return as_value(ao.get());
+       //return as_value(ao);
+}
+
+static void
+attachArrayProperties(as_object& proto)
+{
+       boost::intrusive_ptr<builtin_function> gettersetter;
+
+       gettersetter = new builtin_function(&array_length, NULL);
+       proto.init_property("length", *gettersetter, *gettersetter);
 }
 
 static void
 attachArrayInterface(as_object& proto)
 {
-       // we don't need an explicit member here,
-       // we will be handling 'length' requests
-       // within overridden get_member()
-       //proto->init_member("length", &array_length);
 
        proto.init_member("join", new builtin_function(array_join));
        proto.init_member("concat", new builtin_function(array_concat));

Index: testsuite/actionscript.all/array.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/array.as,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- testsuite/actionscript.all/array.as 4 Apr 2007 09:22:30 -0000       1.16
+++ testsuite/actionscript.all/array.as 4 Apr 2007 09:49:43 -0000       1.17
@@ -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.16 2007/04/04 09:22:30 strk Exp $";
+rcsid="$Id: array.as,v 1.17 2007/04/04 09:49:43 strk Exp $";
 
 #include "check.as"
 
@@ -48,7 +48,7 @@
 check (a instanceOf Array);
 check_equals(a.length, 3);
 #if OUTPUT_VERSION >= 6
-xcheck(a.hasOwnProperty('length'));
+check(a.hasOwnProperty('length'));
 #endif
 
 b=[];
@@ -290,6 +290,11 @@
 check_equals(c[8], undefined);
 
 // $Log: array.as,v $
+// Revision 1.17  2007/04/04 09:49:43  strk
+//
+//         * server/array.cpp: use a getter/setter for the 'length' property.
+//         * testsuite/actionscript.all/array.as: another success.
+//
 // Revision 1.16  2007/04/04 09:22:30  strk
 // * testsuite/actionscript.all/array.as: more tests added.
 //




reply via email to

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