[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/as_object.cpp server/as_...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/as_object.cpp server/as_... |
Date: |
Fri, 24 Nov 2006 13:33:21 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 06/11/24 13:33:21
Modified files:
. : ChangeLog
server : as_object.cpp as_object.h sprite_instance.cpp
sprite_instance.h
server/asobj : Global.cpp
testsuite/actionscript.all: MovieClip.as
Log message:
* server/as_object.{cpp,h}: off-lined constructors and
destructor, with constructor asserting the presence
of an unitialized VM; made set_prototype() a protected member
to allow sprite_instance to attach a MovieClip prototype.
* server/sprite_instance.{cpp,h}: conform to the ActionScript
classes API, wipe the as_builtins crap; assert the presence
of an initialized VM in constructor.
* server/asobj/Global.cpp: invoke movieclip_class_init()
* testsuite/actionscript.all/MovieClip.as: added check
for MovieClip class.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.1740&r2=1.1741
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.h?cvsroot=gnash&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.86&r2=1.87
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.42&r2=1.43
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Global.cpp?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/MovieClip.as?cvsroot=gnash&r1=1.12&r2=1.13
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.1740
retrieving revision 1.1741
diff -u -b -r1.1740 -r1.1741
--- ChangeLog 24 Nov 2006 11:52:18 -0000 1.1740
+++ ChangeLog 24 Nov 2006 13:33:20 -0000 1.1741
@@ -1,5 +1,15 @@
2006-11-24 Sandro Santilli <address@hidden>
+ * server/as_object.{cpp,h}: off-lined constructors and
+ destructor, with constructor asserting the presence
+ of an unitialized VM; made set_prototype() a protected member
+ to allow sprite_instance to attach a MovieClip prototype.
+ * server/sprite_instance.{cpp,h}: conform to the ActionScript
+ classes API, wipe the as_builtins crap; assert the presence
+ of an initialized VM in constructor.
+ * server/asobj/Global.cpp: invoke movieclip_class_init()
+ * testsuite/actionscript.all/MovieClip.as: added check
+ for MovieClip class.
* gui/: Makefile.am, Player.cpp:
use the new VM interface for initialization.
* server/impl.cpp: deprecate set_current_root(), implement
Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- server/as_object.cpp 29 Oct 2006 18:34:11 -0000 1.15
+++ server/as_object.cpp 24 Nov 2006 13:33:21 -0000 1.16
@@ -28,6 +28,7 @@
#include "as_function.h"
#include "as_environment.h" // for enumerateProperties
#include "Property.h" // for findGetterSetter
+#include "VM.h"
#include <set>
@@ -124,6 +125,7 @@
return set_member_default(name, val);
}
+/*protected*/
void
as_object::set_prototype(as_object* proto)
{
@@ -305,5 +307,37 @@
if ( obj ) log_warning("prototype loop during Enumeration");
}
+as_object::as_object()
+ :
+ _members(),
+ m_prototype(NULL)
+{
+ assert(VM::get().getSWFVersion());
+}
+
+as_object::as_object(as_object* proto)
+ :
+ _members(),
+ m_prototype(proto)
+{
+ assert(VM::get().getSWFVersion());
+ if (m_prototype) m_prototype->add_ref();
+}
+
+as_object::as_object(const as_object& other)
+ :
+ ref_counted(),
+ _members(other._members),
+ m_prototype(other.m_prototype)
+{
+ assert(VM::get().getSWFVersion());
+ if (m_prototype) m_prototype->add_ref();
+}
+
+as_object::~as_object()
+{
+ if (m_prototype) m_prototype->drop_ref();
+}
+
} // end of gnash namespace
Index: server/as_object.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- server/as_object.h 21 Nov 2006 00:25:46 -0000 1.19
+++ server/as_object.h 24 Nov 2006 13:33:21 -0000 1.20
@@ -86,40 +86,23 @@
as_object* m_prototype;
/// Construct an ActionScript object with no prototype associated.
- as_object()
- :
- _members(),
- m_prototype(NULL)
- {
- }
+ as_object();
/// \brief
/// Construct an ActionScript object based on the given prototype.
/// Adds a reference to the prototype, if any.
- as_object(as_object* proto)
- :
- _members(),
- m_prototype(proto)
- {
- if (m_prototype) m_prototype->add_ref();
- }
+ as_object(as_object* proto);
- as_object(const as_object& other)
- :
- ref_counted(),
- _members(other._members),
- m_prototype(other.m_prototype)
- {
- if (m_prototype) m_prototype->add_ref();
- }
+ /// Copy an as_object
+ //
+ /// TODO: write more about this, is it allowed ? is it safe ?
+ ///
+ as_object(const as_object& other);
/// \brief
/// Default destructor for ActionScript objects.
/// Drops reference on prototype member, if any.
- virtual ~as_object()
- {
- if (m_prototype) m_prototype->drop_ref();
- }
+ virtual ~as_object();
/// Return a text representation for this object
virtual const char* get_text_value() const { return NULL; }
@@ -272,9 +255,12 @@
///
void set_member_default(const tu_stringi& name, const as_value& val);
-private:
-
/// Set this object's '__proto__' member
+ //
+ /// This is protected to allow character instances to set a prototype,
+ /// since character instances are NOT direct subclasses of as_object
+ /// ( as_object -> character -> specific_character ).
+ ///
void set_prototype(as_object* proto);
};
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -b -r1.86 -r1.87
--- server/sprite_instance.cpp 24 Nov 2006 11:52:18 -0000 1.86
+++ server/sprite_instance.cpp 24 Nov 2006 13:33:21 -0000 1.87
@@ -39,6 +39,8 @@
#include "swf_event.h"
#include "sprite_definition.h"
#include "ActionExec.h"
+#include "builtin_function.h"
+#include "smart_ptr.h"
#include "VM.h"
#include <vector>
@@ -739,6 +741,91 @@
fn.result->set_double(static_cast<double>(nextdepth));
}
+static void
+movieclip_ctor(const fn_call& fn)
+{
+ log_msg("User tried to invoke new MovieClip()");
+ fn.result->set_undefined();
+}
+
+static void
+attachMovieClipInterface(as_object& o)
+{
+ int target_version = VM::get().getSWFVersion();
+
+ o.set_member("play", &sprite_play);
+ o.set_member("stop", &sprite_stop);
+ o.set_member("gotoAndStop", &sprite_goto_and_stop);
+ o.set_member("gotoAndPlay", &sprite_goto_and_play);
+ o.set_member("nextFrame", &sprite_next_frame);
+ o.set_member("prevFrame", &sprite_prev_frame);
+ o.set_member("getBytesLoaded", &sprite_get_bytes_loaded);
+ o.set_member("getBytesTotal", &sprite_get_bytes_total);
+ o.set_member("loadMovie", &sprite_load_movie);
+ o.set_member("hitTest", &sprite_hit_test);
+ o.set_member("createTextField", &sprite_create_text_field);
+ o.set_member("duplicateMovieClip", &sprite_duplicate_movieclip);
+ o.set_member("swapDepths", &sprite_swap_depths);
+ o.set_member("getDepth", &sprite_get_depth);
+ o.set_member("createEmptyMovieClip", &sprite_create_empty_movieclip);
+ o.set_member("removeMovieClip", &sprite_remove_movieclip);
+
+ if ( target_version >= 5 )
+ {
+ o.set_member("attachMovie", &sprite_attach_movie);
+ }
+
+ // The following interfaces should only
+ // be available when target SWF version is equal
+ // or above 7
+ if ( target_version >= 7 )
+ {
+ o.set_member("getNextHighestDepth",
+ &sprite_getNextHighestDepth);
+ }
+
+ // @TODO
+ //o.set_member("startDrag", &sprite_start_drag);
+ //o.set_member("stopDrag", &sprite_stop_drag);
+ //o.set_member("getURL", &sprite_get_url);
+ // ... many more, see MovieClip class ...
+
+}
+
+static as_object*
+getMovieClipInterface()
+{
+ static boost::intrusive_ptr<as_object> proto;
+ if ( proto == NULL )
+ {
+ proto = new as_object();
+ attachMovieClipInterface(*proto);
+ proto->set_member("constructor", &movieclip_ctor);
+ proto->set_member_flags("constructor", 1);
+ }
+ return proto.get();
+}
+
+void
+movieclip_class_init(as_object& global)
+{
+ // This is going to be the global MovieClip "class"/"function"
+ static boost::intrusive_ptr<builtin_function> cl=NULL;
+
+ if ( cl == NULL )
+ {
+ cl=new builtin_function(&movieclip_ctor,
getMovieClipInterface());
+ // replicate all interface to class, to be able to access
+ // all methods as static functions
+ attachMovieClipInterface(*cl);
+
+ }
+
+ // Register _global.MovieClip
+ global.set_member("MovieClip", cl.get());
+}
+
+
//------------------------------------------------
// sprite_instance helper classes
//------------------------------------------------
@@ -803,8 +890,7 @@
assert(m_def != NULL);
assert(m_root != NULL);
- // A virtual machine must be initialized at this point
- assert(VM::get().getSWFVersion());
+ set_prototype(getMovieClipInterface());
//m_root->add_ref(); // @@ circular!
m_as_environment.set_target(this);
@@ -836,55 +922,6 @@
//m_root->drop_ref();
}
-//
-// Initialize the Sprite/MovieClip builtin class
-//
-as_object sprite_instance::as_builtins;
-void sprite_instance::init_builtins(int target_version)
-{
- static bool done=false;
- if ( done ) return;
-
- as_builtins.set_member("play", &sprite_play);
- as_builtins.set_member("stop", &sprite_stop);
- as_builtins.set_member("gotoAndStop", &sprite_goto_and_stop);
- as_builtins.set_member("gotoAndPlay", &sprite_goto_and_play);
- as_builtins.set_member("nextFrame", &sprite_next_frame);
- as_builtins.set_member("prevFrame", &sprite_prev_frame);
- as_builtins.set_member("getBytesLoaded", &sprite_get_bytes_loaded);
- as_builtins.set_member("getBytesTotal", &sprite_get_bytes_total);
- as_builtins.set_member("loadMovie", &sprite_load_movie);
- as_builtins.set_member("hitTest", &sprite_hit_test);
- as_builtins.set_member("createTextField", &sprite_create_text_field);
- as_builtins.set_member("duplicateMovieClip",
&sprite_duplicate_movieclip);
- as_builtins.set_member("swapDepths", &sprite_swap_depths);
- as_builtins.set_member("getDepth", &sprite_get_depth);
- as_builtins.set_member("createEmptyMovieClip",
&sprite_create_empty_movieclip);
- as_builtins.set_member("removeMovieClip", &sprite_remove_movieclip);
-
- if ( target_version >= 5 )
- {
- as_builtins.set_member("attachMovie", &sprite_attach_movie);
- }
-
- // The following interfaces should only
- // be available when target SWF version is equal
- // or above 7
- if ( target_version >= 7 )
- {
- as_builtins.set_member("getNextHighestDepth",
- &sprite_getNextHighestDepth);
- }
-
- // @TODO
- //as_builtins.set_member("startDrag", &sprite_start_drag);
- //as_builtins.set_member("stopDrag", &sprite_stop_drag);
- //as_builtins.set_member("getURL", &sprite_get_url);
- // ... many more, see MovieClip class ...
-
- done=true;
-}
-
character* sprite_instance::get_character_at_depth(int depth)
{
return m_display_list.get_character_at_depth(depth);
@@ -1136,12 +1173,6 @@
return true;
}
- // Try static builtin functions.
- if (as_builtins.get_member(name, val))
- {
- return true;
- }
-
// Try textfield variables
edit_text_character* etc = get_textfield_variable(name.c_str());
if ( etc )
@@ -1149,7 +1180,9 @@
val->set_string(etc->get_text_value());
}
- return false;
+ // Invoke the default get_member
+ return get_member_default(name, val);
+
}
// Take care of this frame's actions.
@@ -1598,6 +1631,14 @@
#endif
// Try textfield variables
+ //
+ // FIXME: Turn textfield variables into Getter/Setters (Properties)
+ // so that set_member_default will do this automatically.
+ // The problem is that setting a TextVariable named after
+ // a builtin property will prevent *any* setting for the
+ // property (ie: have a textfield use _x as variable name and
+ // be scared)
+ //
edit_text_character* etc = get_textfield_variable(name.c_str());
if ( etc )
{
@@ -1613,8 +1654,13 @@
}
#endif
+ // If that didn't work call the default set_member
+ set_member_default(name, val);
+
+
// If that didn't work, set a variable within this environment.
- m_as_environment.set_member(name.c_str(), val);
+ // TODO: check if we broke anything with this!
+ //if ( ! t ) m_as_environment.set_member(name.c_str(), val);
}
const char* sprite_instance::get_variable(const char* path_to_var) const
@@ -1798,8 +1844,6 @@
{
testInvariant();
- init_builtins(get_environment().get_version());
-
assert(frame < m_def->get_frame_count());
// Execute this frame's init actions, if necessary.
@@ -1839,8 +1883,6 @@
{
testInvariant();
- init_builtins(get_environment().get_version());
-
assert(frame < m_def->get_frame_count());
const PlayList& playlist = m_def->get_playlist(frame);
@@ -1856,8 +1898,6 @@
void sprite_instance::execute_remove_tags(int frame)
{
- init_builtins(get_environment().get_version());
-
assert(frame >= 0);
assert((size_t)frame < m_def->get_frame_count());
Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -b -r1.42 -r1.43
--- server/sprite_instance.h 24 Nov 2006 09:04:24 -0000 1.42
+++ server/sprite_instance.h 24 Nov 2006 13:33:21 -0000 1.43
@@ -17,7 +17,7 @@
//
//
-/* $Id: sprite_instance.h,v 1.42 2006/11/24 09:04:24 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.43 2006/11/24 13:33:21 strk Exp $ */
// Stateful live Sprite instance
@@ -552,22 +552,6 @@
/// This timeline's variable scope
as_environment m_as_environment;
- // For built-in sprite ActionScript methods.
- static as_object as_builtins;
-
- /// Initialize built-ins for target SWF version
- //
- /// Some interfaces might be unavailable in certaing
- /// versions.
- ///
- /// NOTE: if you call this multiple times with different
- /// target versions only the first invocation will
- /// have an effect.
- ///
- /// TODO: move to implementation file...
- ///
- static void init_builtins(int target_version);
-
/// Increment m_current_frame, and take care of looping.
void increment_frame_and_check_for_loop();
@@ -609,6 +593,9 @@
};
+/// Initialize the global MovieClip class
+void movieclip_class_init(as_object& global);
+
} // end of namespace gnash
Index: server/asobj/Global.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Global.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/asobj/Global.cpp 20 Nov 2006 21:44:24 -0000 1.22
+++ server/asobj/Global.cpp 24 Nov 2006 13:33:21 -0000 1.23
@@ -18,7 +18,7 @@
// Implementation of the Global ActionScript Object
-/* $Id: Global.cpp,v 1.22 2006/11/20 21:44:24 strk Exp $ */
+/* $Id: Global.cpp,v 1.23 2006/11/24 13:33:21 strk Exp $ */
#include "as_object.h"
#include "as_prop_flags.h"
@@ -428,6 +428,7 @@
// isFinite
set_member("isFinite", as_global_isfinite);
+ movieclip_class_init(*this);
textsnapshot_class_init(*this);
video_class_init(*this);
stage_class_init(*this);
Index: testsuite/actionscript.all/MovieClip.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/MovieClip.as,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- testsuite/actionscript.all/MovieClip.as 22 Nov 2006 10:33:03 -0000
1.12
+++ testsuite/actionscript.all/MovieClip.as 24 Nov 2006 13:33:21 -0000
1.13
@@ -22,7 +22,7 @@
// compile this test case with Ming makeswf, and then
// execute it like this gnash -1 -r 0 -v out.swf
-rcsid="$Id: MovieClip.as,v 1.12 2006/11/22 10:33:03 strk Exp $";
+rcsid="$Id: MovieClip.as,v 1.13 2006/11/24 13:33:21 strk Exp $";
#include "check.as"
@@ -37,7 +37,8 @@
check(_root == this);
// Check inheritance
-check(mc.__proto__ == MovieClip.prototype);
+check(MovieClip);
+check_equals(mc.__proto__, MovieClip.prototype);
// Check methods existance
xcheck(mc.attachAudio != undefined);
- [Gnash-commit] gnash ChangeLog server/as_object.cpp server/as_...,
Sandro Santilli <=