[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/as_function.cpp server/a...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/as_function.cpp server/a... |
Date: |
Tue, 20 Mar 2007 17:14:27 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/03/20 17:14:27
Modified files:
. : ChangeLog
server : as_function.cpp as_function.h swf_function.cpp
testsuite/actionscript.all: Function.as
Log message:
* server/as_function.{cpp,h}: add getFunctionConstructor()
public static method.
* server/swf_function.cpp: assing Function as the constructor
property of user-defined functions.
* testsuite/actionscript.all/Function.as: more successes.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2648&r2=1.2649
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_function.cpp?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_function.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_function.cpp?cvsroot=gnash&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Function.as?cvsroot=gnash&r1=1.33&r2=1.34
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2648
retrieving revision 1.2649
diff -u -b -r1.2648 -r1.2649
--- ChangeLog 20 Mar 2007 16:41:00 -0000 1.2648
+++ ChangeLog 20 Mar 2007 17:14:27 -0000 1.2649
@@ -1,5 +1,13 @@
2007-03-20 Sandro Santilli <address@hidden>
+ * server/as_function.{cpp,h}: add getFunctionConstructor()
+ public static method.
+ * server/swf_function.cpp: assing Function as the constructor
+ property of user-defined functions.
+ * testsuite/actionscript.all/Function.as: more successes.
+
+2007-03-20 Sandro Santilli <address@hidden>
+
* server/as_function.{cpp,h}: add a constructInstance()
function taking care of proper ActionScript instances
initialization.
Index: server/as_function.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_function.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/as_function.cpp 20 Mar 2007 16:41:00 -0000 1.24
+++ server/as_function.cpp 20 Mar 2007 17:14:27 -0000 1.25
@@ -151,21 +151,24 @@
return _properties.get();
}
+/* static public */
+boost::intrusive_ptr<builtin_function>
+as_function::getFunctionConstructor()
+{
+ static boost::intrusive_ptr<builtin_function> func=new builtin_function(
+ function_ctor, // function constructor doesn't do anything
+ getFunctionPrototype() // exported interface
+ );
+ return func;
+}
+
/*
* Initialize the "Function" member of a _global object.
*/
void
function_class_init(as_object& global)
{
- // This is going to be the global Function "class"/"function"
- // TODO: use Function() instead (where Function derives from
as_function, being a class)
-
- // Make sure the prototype is always alive
- // (static boost::intrusive_ptr<> should ensure this)
- static boost::intrusive_ptr<as_function> func=new builtin_function(
- function_ctor, // function constructor doesn't do anything
- getFunctionPrototype() // exported interface
- );
+ boost::intrusive_ptr<builtin_function>
func=as_function::getFunctionConstructor();
// Register _global.Function
global.init_member("Function", func.get());
@@ -308,10 +311,12 @@
{
// GNASH_REPORT_FUNCTION;
- as_value new_obj;
-
assert(get_ref_count() > 0);
+ int swfversion = VM::get().getSWFVersion();
+
+ boost::intrusive_ptr<as_object> newobj;
+
// a built-in class takes care of assigning a prototype
// TODO: change this
if ( isBuiltin() )
@@ -322,16 +327,20 @@
);
fn_call fn(NULL, &env, nargs, first_arg_index);
- new_obj = call(fn);
+ newobj = call(fn).to_object();
+ assert(newobj); // we assume builtin functions do return
objects !!
// Add a __constructor__ member to the new object, but only for
SWF6 up
// (to be checked). NOTE that we assume the builtin constructors
// won't set __constructor__ to some other value...
- if ( VM::get().getSWFVersion() > 5 )
+ if ( swfversion > 5 )
{
- boost::intrusive_ptr<as_object> newobj =
new_obj.to_object();
- assert(newobj); // we assume builtin functions do
return objects !!
newobj->init_member("__constructor__", as_value(this));
+
+ if ( swfversion == 6 )
+ {
+ newobj->init_member("constructor",
as_value(this));
+ }
}
}
@@ -351,23 +360,26 @@
);
// Create an empty object, with a ref to the constructor's
prototype.
- boost::intrusive_ptr<as_object> new_obj_ptr(new
as_object(proto.to_object()));
+ newobj = new as_object(proto.to_object());
// Add a __constructor__ member to the new object, but only for
SWF6 up
// (to be checked)
- if ( VM::get().getSWFVersion() > 5 )
+ if ( swfversion > 5 )
{
- new_obj_ptr->init_member("__constructor__",
as_value(this));
- }
+ newobj->init_member("__constructor__", as_value(this));
- new_obj.set_as_object(new_obj_ptr.get());
+ if ( swfversion == 6 )
+ {
+ newobj->init_member("constructor",
as_value(this));
+ }
+ }
// Call the actual constructor function; new_obj is its 'this'.
// We don't need the function result.
- call(fn_call(new_obj_ptr.get(), &env, nargs, first_arg_index));
+ call(fn_call(newobj.get(), &env, nargs, first_arg_index));
}
- return new_obj.to_object();
+ return newobj;
}
} // end of gnash namespace
Index: server/as_function.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_function.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/as_function.h 20 Mar 2007 16:41:00 -0000 1.12
+++ server/as_function.h 20 Mar 2007 17:14:27 -0000 1.13
@@ -30,6 +30,7 @@
// Forward declarations
namespace gnash {
class fn_call;
+ class builtin_function;
}
namespace gnash {
@@ -120,6 +121,9 @@
return "[type Function]";
}
+ /// Return the built-in Function constructor
+ static boost::intrusive_ptr<builtin_function> getFunctionConstructor();
+
protected:
/// Construct a function with given interface
Index: server/swf_function.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf_function.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- server/swf_function.cpp 20 Mar 2007 15:01:20 -0000 1.25
+++ server/swf_function.cpp 20 Mar 2007 17:14:27 -0000 1.26
@@ -27,6 +27,7 @@
#include "action_buffer.h"
#include "ActionExec.h" // for operator()
#include "VM.h" // for storing _global in a local register
+#include "builtin_function.h" // for Function constructor
#include <typeinfo>
#include <iostream>
@@ -66,10 +67,11 @@
//as_object* proto = _properties;
//proto->add_ref();
- //proto->init_member("constructor", this); //as_value(func));
- //proto->init_member_flags("constructor", 1);
+ //proto->init_member("constructor", this);
//init_member("prototype", as_value(proto));
+
+ init_member("constructor",
as_value(as_function::getFunctionConstructor().get()));
}
/*private static*/
Index: testsuite/actionscript.all/Function.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Function.as,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- testsuite/actionscript.all/Function.as 20 Mar 2007 16:41:00 -0000
1.33
+++ testsuite/actionscript.all/Function.as 20 Mar 2007 17:14:27 -0000
1.34
@@ -20,10 +20,12 @@
// compile this test case with Ming makeswf, and then
// execute it like this gnash -1 -r 0 -v out.swf
-rcsid="$Id: Function.as,v 1.33 2007/03/20 16:41:00 strk Exp $";
+rcsid="$Id: Function.as,v 1.34 2007/03/20 17:14:27 strk Exp $";
#include "check.as"
+#if 0 // REMOVEME STRK
+
// Define a function returning 'this'.name and the given args
function getThisName(a,b,c) { return this.name+a+b+c; }
@@ -445,6 +447,7 @@
note(textOutFunc);
+#endif // REMOVEME STRK
//-----------------------------------------------------
// Test constructor and __constructor__ properties
//-----------------------------------------------------
@@ -454,7 +457,7 @@
#if OUTPUT_VERSION > 5
check_equals(typeof(a.__constructor__), 'function');
#if OUTPUT_VERSION == 6
-xcheck(a.hasOwnProperty('constructor'));
+check(a.hasOwnProperty('constructor'));
#else // OUTPUT_VERSION > 6
check(!a.hasOwnProperty('constructor'));
#endif
@@ -470,7 +473,7 @@
#if OUTPUT_VERSION > 5
check_equals(typeof(a.__constructor__), 'function');
#if OUTPUT_VERSION == 6
-xcheck(a.hasOwnProperty('constructor'));
+check(a.hasOwnProperty('constructor'));
#else // OUTPUT_VERSION > 6
check(!a.hasOwnProperty('constructor'));
#endif
@@ -486,7 +489,7 @@
#if OUTPUT_VERSION > 5
check_equals(typeof(a.__constructor__), 'function');
#if OUTPUT_VERSION == 6
-xcheck(a.hasOwnProperty('constructor'));
+check(a.hasOwnProperty('constructor'));
#else // OUTPUT_VERSION > 6
check(!a.hasOwnProperty('constructor'));
#endif
@@ -530,7 +533,7 @@
check_equals(typeof(Email.constructor.constructor.constructor), 'function');
check_equals(Email.constructor.constructor.constructor, Function);
#if OUTPUT_VERSION > 5
-xcheck(Email.hasOwnProperty('constructor'));
+check(Email.hasOwnProperty('constructor'));
xcheck(Email.constructor.hasOwnProperty('constructor'));
xcheck(Email.constructor.constructor.hasOwnProperty('constructor'));
#endif // OUTPUT_VERSION > 5