gnash-commit
[Top][All Lists]
Advanced

[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);




reply via email to

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