gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...
Date: Thu, 10 May 2007 08:18:48 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/05/10 08:18:48

Modified files:
        .              : ChangeLog 
        server         : as_value.cpp as_value.h 

Log message:
                * server/as_value.{cpp,h}: encoding of movieclip values
                  by target path made optional, to help future attempts
                  at changing it, due to conceptual bug found in it running
                  the displaylist_depths_test2.swf testcase. The default is
                  no change. Undefine MOVIECLIP_AS_SOFTREF to keep them by
                  pointer (still fails some testcases so not enabled).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3147&r2=1.3148
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.51&r2=1.52
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.h?cvsroot=gnash&r1=1.51&r2=1.52

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3147
retrieving revision 1.3148
diff -u -b -r1.3147 -r1.3148
--- ChangeLog   10 May 2007 08:08:43 -0000      1.3147
+++ ChangeLog   10 May 2007 08:18:48 -0000      1.3148
@@ -1,3 +1,12 @@
+2007-05-10 Sandro Santilli <address@hidden>
+
+       * server/as_value.{cpp,h}: encoding of movieclip values
+         by target path made optional, to help future attempts
+         at changing it, due to conceptual bug found in it running
+         the displaylist_depths_test2.swf testcase. The default is
+         no change. Undefine MOVIECLIP_AS_SOFTREF to keep them by
+         pointer (still fails some testcases so not enabled).
+
 2007-05-10 Martin Guy <address@hidden>
 
        * configure.ac: Don't warn about ffmpeg/mad absence during tests;

Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- server/as_value.cpp 2 May 2007 09:42:41 -0000       1.51
+++ server/as_value.cpp 10 May 2007 08:18:48 -0000      1.52
@@ -41,6 +41,10 @@
 #      define snprintf _snprintf
 #endif
 
+// Undefine this to keep MOVIECLIP values by pointer
+// rather then by "target" ref.
+#define MOVIECLIP_AS_SOFTREF
+
 namespace gnash {
 
 //
@@ -464,18 +468,40 @@
        }
 }
 
+/* static private */
+sprite_instance*
+as_value::find_sprite_by_target(const std::string& tgtstr)
+{
+       // Evaluate target everytime an attempt is made 
+       // to fetch a movieclip value.
+       sprite_instance* root = VM::get().getRoot().get_root_movie();
+       as_environment& env = root->get_environment();
+       character* target = env.find_target(tgtstr);
+       if ( ! target ) return NULL;
+       return target->to_movie();
+}
+
 sprite_instance*
 as_value::to_sprite() const
 {
        if ( m_type != MOVIECLIP ) return NULL;
 
+#ifndef MOVIECLIP_AS_SOFTREF
+       sprite_instance* sp = m_object_value->to_movie();
+       if ( ! sp ) return NULL;
+       if ( sp->isUnloaded() )
+       {
+               log_error(_("MovieClip value is a dangling reference: "
+                               "target %s was unloaded (should set to NULL?)"),
+                               sp->getTarget().c_str());
+               return NULL; 
+       }
+       return sp;
+#else
        // Evaluate target everytime an attempt is made 
        // to fetch a movieclip value.
-       sprite_instance* root = VM::get().getRoot().get_root_movie();
-       as_environment& env = root->get_environment();
-       // TODO: simplify next statement when m_string_value will become a 
std::string
-       character* target = 
env.find_target(std::string(m_string_value.c_str()));
-       if ( ! target )
+       sprite_instance* sp = find_sprite_by_target(m_string_value);
+       if ( ! sp )
        {
                log_error(_("MovieClip value is a dangling reference: "
                                "target '%s' not found (should set to NULL?)"),
@@ -484,8 +510,9 @@
        }
        else
        {
-               return target->to_movie();
+               return sp;
        }
+#endif
 }
 
 void
@@ -493,8 +520,11 @@
 {
        drop_refs();
        m_type = MOVIECLIP;
-       // TODO: simplify next statement when m_string_value will become a 
std::string
+#ifndef MOVIECLIP_AS_SOFTREF
+       m_object_value = const_cast<sprite_instance*>(&sprite);
+#else
        m_string_value = sprite.get_text_value();
+#endif
 }
 
 void
@@ -502,8 +532,14 @@
 {
        drop_refs();
        m_type = MOVIECLIP;
+#ifndef MOVIECLIP_AS_SOFTREF
+       sprite_instance* sp = find_sprite_by_target(path);
+       if ( ! sp ) set_null();
+       else set_sprite(*sp);
+#else
        // TODO: simplify next statement when m_string_value will become a 
std::string
        m_string_value = path.c_str();
+#endif
 }
 
 // Return value as an ActionScript function.  Returns NULL if value is
@@ -809,8 +845,14 @@
        else if (v.m_type == NUMBER) set_double(v.m_number_value);
        else if (v.m_type == OBJECT) set_as_object(v.m_object_value);
 
-       //TODO: don't use c_str() when m_string_value will be a std::string
-       else if (v.m_type == MOVIECLIP) set_sprite(v.m_string_value.c_str());
+       else if (v.m_type == MOVIECLIP)
+       {
+#ifndef MOVIECLIP_AS_SOFTREF
+               set_sprite(*(v.to_sprite()));
+#else
+               set_sprite(v.m_string_value);
+#endif
+       }
 
        else if (v.m_type == AS_FUNCTION) 
set_as_function(v.m_object_value->to_function());
        else assert(0);

Index: server/as_value.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- server/as_value.h   27 Apr 2007 08:46:46 -0000      1.51
+++ server/as_value.h   10 May 2007 08:18:48 -0000      1.52
@@ -14,7 +14,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: as_value.h,v 1.51 2007/04/27 08:46:46 strk Exp $ */
+/* $Id: as_value.h,v 1.52 2007/05/10 08:18:48 strk Exp $ */
 
 #ifndef GNASH_AS_VALUE_H
 #define GNASH_AS_VALUE_H
@@ -457,8 +457,6 @@
           m_boolean_value = val;
         }
 
-       void    set_sprite(const std::string& path);
-
        void    set_sprite(const sprite_instance& sp);
 
        void    set_int(int val) { set_double(val); }
@@ -532,6 +530,11 @@
 
 private:
 
+       static sprite_instance* find_sprite_by_target(const std::string& 
target);
+
+       void    set_sprite(const std::string& path);
+
+
        /// Return value as a primitive type
        //
        /// Primitive types are: undefined, null, boolean, string, number.




reply via email to

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