gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Thu, 11 Jan 2007 17:03:54 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/01/11 17:03:54

Modified files:
        .              : ChangeLog 
        server         : sprite_instance.cpp sprite_instance.h 
        server/asobj   : Object.cpp 
        server/parser  : sprite_definition.cpp sprite_definition.h 

Log message:
                * server/sprite_instance.{cpp,h}: (ctor) optionally take
                  an additional argument for giving the instance an arbitrary
                  interface (rather then MovieClip).
                * server/parser/sprite_definition.{cpp,h}: add registerClass()
                  method to request all subsequent instances of the sprite
                  get a specified interface.
                * server/asobj/Object.cpp: complete registerClass() [ testing ].

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2086&r2=1.2087
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.121&r2=1.122
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.54&r2=1.55
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Object.cpp?cvsroot=gnash&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.cpp?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&r1=1.12&r2=1.13

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2086
retrieving revision 1.2087
diff -u -b -r1.2086 -r1.2087
--- ChangeLog   11 Jan 2007 14:53:02 -0000      1.2086
+++ ChangeLog   11 Jan 2007 17:03:54 -0000      1.2087
@@ -1,5 +1,15 @@
 2007-01-11 Sandro Santilli <address@hidden>
 
+       * server/sprite_instance.{cpp,h}: (ctor) optionally take
+         an additional argument for giving the instance an arbitrary
+         interface (rather then MovieClip).
+       * server/parser/sprite_definition.{cpp,h}: add registerClass()
+         method to request all subsequent instances of the sprite 
+         get a specified interface.
+       * server/asobj/Object.cpp: complete registerClass() [ testing ].
+
+2007-01-11 Sandro Santilli <address@hidden>
+
        * server/as_environment.cpp (get_variable): use 'with' stack when
          finding path component of a path.to.variable (seems to fix
          a use case in player2.swf).

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -b -r1.121 -r1.122
--- server/sprite_instance.cpp  10 Jan 2007 11:21:50 -0000      1.121
+++ server/sprite_instance.cpp  11 Jan 2007 17:03:54 -0000      1.122
@@ -1146,7 +1146,7 @@
 
 sprite_instance::sprite_instance(
                movie_definition* def, movie_instance* r,
-               character* parent, int id)
+               character* parent, int id, as_function* registerClass)
        :
        character(parent, id),
        m_mouse_state(UP),
@@ -1171,7 +1171,18 @@
        assert(m_def != NULL);
        assert(m_root != NULL);
 
+       if ( registerClass )
+       {
+               // TODO: store in intrusive_ptr ?
+               // TODO: call the constructor ?
+               as_object* proto = attachedClass->getPrototype();
+               log_msg("registerClass prototype : %p", proto);
+               set_prototype(proto);
+       }
+       else
+       {
        set_prototype(getMovieClipInterface());
+       }
                        
        //m_root->add_ref();    // @@ circular!
        m_as_environment.set_target(this);

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -b -r1.54 -r1.55
--- server/sprite_instance.h    10 Jan 2007 11:21:50 -0000      1.54
+++ server/sprite_instance.h    11 Jan 2007 17:03:54 -0000      1.55
@@ -17,7 +17,7 @@
 // 
 //
 
-/* $Id: sprite_instance.h,v 1.54 2007/01/10 11:21:50 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.55 2007/01/11 17:03:54 strk Exp $ */
 
 // Stateful live Sprite instance
 
@@ -76,8 +76,15 @@
        ///     movie accessible trought the VM, in case this sprite
        ///     was defined in an externally loaded movie.
        ///
+       /// @param registerClass
+       ///     A constructor to register as this instance
+       ///     interface. If NULL this instance will get 
+       ///     the MovieClip interface.
+       ///     
+       ///
        sprite_instance(movie_definition* def,
-               movie_instance* root, character* parent, int id);
+               movie_instance* root, character* parent, int id,
+               as_function* registerClass=NULL);
 
        virtual ~sprite_instance();
 

Index: server/asobj/Object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Object.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- server/asobj/Object.cpp     4 Jan 2007 23:12:08 -0000       1.9
+++ server/asobj/Object.cpp     11 Jan 2007 17:03:54 -0000      1.10
@@ -18,7 +18,7 @@
 //
 //
 
-/* $Id: Object.cpp,v 1.9 2007/01/04 23:12:08 strk Exp $ */
+/* $Id: Object.cpp,v 1.10 2007/01/11 17:03:54 strk Exp $ */
 
 // Implementation of ActionScript Object class.
 
@@ -28,6 +28,10 @@
 #include "fn_call.h"
 #include "as_object.h" // for inheritance
 #include "builtin_function.h" // need builtin_function
+#include "movie_definition.h" // for Object.registerClass 
(get_exported_resource)
+#include "character.h" // for Object.registerClass  (get_root_movie)
+#include "sprite_instance.h" // for Object.registerClass  
(get_movie_definition)
+#include "sprite_definition.h" // for Object.registerClass  
(get_movie_definition)
 
 #include "log.h"
 
@@ -225,12 +229,46 @@
                return;
        }
 
-       // TODO: do something with these values:
-       //       - resolve the symbolid to obtain a movie_definition 
-       //       - call movie_definition::registerClass(as_function)
-       //
-       //
-       log_warning("Object.registerClass() only stubbed (FIXME!)");
+       // Find the exported resource
+
+       // TODO: check to *which* definition should we ask the export
+       //       this code uses the *relative* root of current environment's 
target
+       movie_definition* def = 
fn.env->get_target()->get_root_movie()->get_movie_definition();
+       boost::intrusive_ptr<resource> exp_res = 
def->get_exported_resource(symbolid.c_str());
+       if ( ! exp_res )
+       {
+               log_warning("Object.registerClass(%s, %s): "
+                       "can't find exported symbol",
+                       symbolid.c_str(), 
+                       typeid(theclass).name());
+               fn.result->set_bool(false);
+       }
+
+       // Check that the exported resource is a sprite_definition
+       // (we're looking for a MovieClip symbol)
+
+       boost::intrusive_ptr<sprite_definition> exp_clipdef = 
+               
boost::intrusive_ptr<sprite_definition>(dynamic_cast<sprite_definition*>(exp_res.get()));
+
+
+       if ( ! exp_clipdef )
+       {
+               log_warning("Object.registerClass(%s, %s): "
+                       "exported symbol is not a MovieClip symbol "
+                       "(sprite_definition), but a %s",
+                       symbolid.c_str(), 
+                       typeid(theclass).name(),
+                       typeid(*exp_res).name());
+               fn.result->set_bool(false);
+       }
+
+       exp_clipdef->registerClass(theclass);
+       
+
+       log_warning("Object.registerClass(%s, %s [%p]) TESTING)",
+                       symbolid.c_str(),
+                       typeid(theclass).name(),
+                       (void*)theclass);
        fn.result->set_bool(false);
 }
   

Index: server/parser/sprite_definition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- server/parser/sprite_definition.cpp 7 Dec 2006 17:24:40 -0000       1.7
+++ server/parser/sprite_definition.cpp 11 Jan 2007 17:03:54 -0000      1.8
@@ -31,6 +31,7 @@
 #include "sprite_instance.h"
 #include "sprite_definition.h"
 #include "execute_tag.h" // for dtor visibility
+#include "as_function.h" // for dtor visibility
 
 #include <vector>
 #include <string>
@@ -44,8 +45,11 @@
 sprite_definition::create_character_instance(character* parent,
                int id)
 {
+#ifdef DEBUG_REGISTER_CLASS
+       log_msg("Instanciating sprite_def %p", (void*)this);
+#endif
        sprite_instance* si = new sprite_instance(this,
-               parent->get_root(), parent, id);
+               parent->get_root(), parent, id, registeredClass.get());
        return si;
 }
 
@@ -178,7 +182,8 @@
        _tag_loaders(SWF::TagLoadersTable::getInstance()), 
        m_movie_def(m),
        m_frame_count(0),
-       m_loading_frame(0)
+       m_loading_frame(0),
+       registeredClass(0)
 {
        // create empty sprite_definition (it is used for 
createEmptyMovieClip() method)
        if (m_movie_def == NULL && in == NULL)
@@ -196,6 +201,22 @@
        }
 }
 
+/*
+ * This function is not inlined to avoid having to include as_function.h
+ * from sprite_definition.h. We need as_function.h for visibility of
+ * as_function destructor by boost::intrusive_ptr
+ */
+void
+sprite_definition::registerClass(as_function* the_class)
+{
+       registeredClass = the_class;
+#ifdef DEBUG_REGISTER_CLASS
+       log_msg("Registered class %p for sprite_def %p", 
(void*)registeredClass.get(), (void*)this);
+       as_object* proto = registeredClass->getPrototype();
+       log_msg(" Exported interface: ");
+       proto->dump_members();
+#endif
+}
 
 
 } // namespace gnash

Index: server/parser/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/parser/sprite_definition.h   4 Dec 2006 17:05:38 -0000       1.12
+++ server/parser/sprite_definition.h   11 Jan 2007 17:03:54 -0000      1.13
@@ -63,6 +63,18 @@
        /// Destructor, releases playlist data
        ~sprite_definition();
 
+       /// Register a class to this definition.
+       //
+       /// New instances of this symbol will get the given class
+       /// interface. 
+       ///
+       /// @param the_class
+       ///     The class constructor to associate with
+       ///     new instances of this character. If NULL
+       ///     new instances will get the MovieClip interface.
+       ///
+       void registerClass(as_function* the_class);
+
 private:
 
        void read(stream* in);
@@ -359,6 +371,15 @@
                return unused;
   }
                        
+       /// \brief
+       /// The constructor to use for setting up the interface
+       /// for new instances of this sprite
+       //
+       /// If NULL, new instances will have the default MovieClip
+       /// interface.
+       ///
+       boost::intrusive_ptr<as_function> registeredClass;
+                       
 };
 
 




reply via email to

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