[Top][All Lists]
[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;
+
};
- [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...,
Sandro Santilli <=