gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/ActionExec.cpp server/Mo...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/ActionExec.cpp server/Mo...
Date: Fri, 07 Jul 2006 01:01:12 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/07/07 01:01:12

Modified files:
        .              : ChangeLog 
        server         : ActionExec.cpp MovieClipLoader.cpp 
                         as_environment.cpp as_environment.h 
                         character.cpp character.h sprite_instance.cpp 
                         sprite_instance.h 
        server/swf     : ASHandlers.cpp 

Log message:
        Changed as_environment's target to be a character rather
        then a sprite_instance (it seems buttons are valid targets);
        Handled invalid values for sprite_instance members
        _xscale and _yscale.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.474&r2=1.475
http://cvs.savannah.gnu.org/viewcvs/gnash/server/ActionExec.cpp?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/MovieClipLoader.cpp?cvsroot=gnash&r1=1.27&r2=1.28
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.cpp?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.cpp?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/ASHandlers.cpp?cvsroot=gnash&r1=1.31&r2=1.32

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.474
retrieving revision 1.475
diff -u -b -r1.474 -r1.475
--- ChangeLog   6 Jul 2006 21:56:47 -0000       1.474
+++ ChangeLog   7 Jul 2006 01:01:11 -0000       1.475
@@ -1,5 +1,13 @@
 2006-07-07 Sandro Santilli <address@hidden>
 
+       * server/ActionExec.cpp, server/MovieClipLoader.cpp,
+       server/as_environment.cpp, server/as_environment.h,
+       server/character.cpp, server/character.h, server/sprite_instance.cpp,
+       server/sprite_instance.h, server/swf/ASHandlers.cpp:
+       Changed as_environment's target to be a character rather
+       then a sprite_instance (it seems buttons are valid targets);
+       Handled invalid values for sprite_instance members
+       _xscale and _yscale.
        * server/action_buffer.cpp, server/swf/ASHandlers.cpp:
        removed -pedantic compiler warnings, fixed a bug in
        fix_stack_underrun pushing more undefined values then

Index: server/ActionExec.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/ActionExec.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/ActionExec.cpp       5 Jul 2006 23:56:08 -0000       1.12
+++ server/ActionExec.cpp       7 Jul 2006 01:01:11 -0000       1.13
@@ -126,7 +126,7 @@
     }
 #endif
                
-    sprite_instance* original_target = env.get_target();
+    character* original_target = env.get_target();
     //UNUSED(original_target);         // Avoid warnings.
 
 #if DEBUG_STACK

Index: server/MovieClipLoader.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/MovieClipLoader.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -b -r1.27 -r1.28
--- server/MovieClipLoader.cpp  5 Jul 2006 17:10:39 -0000       1.27
+++ server/MovieClipLoader.cpp  7 Jul 2006 01:01:11 -0000       1.28
@@ -71,6 +71,7 @@
 #include "URL.h"
 #include "GnashException.h"
 #include "sprite_instance.h"
+#include "character.h"
 #include "fn_call.h"
 
 #include <string>
@@ -232,7 +233,7 @@
        }
 
        tu_string tu_url = fn.arg(0).to_string(); 
-       sprite_instance* target = fn.env->find_target(fn.arg(1));
+       character* target = fn.env->find_target(fn.arg(1));
        if ( ! target )
        {
                log_error("Could not find target %s", fn.arg(1).to_string());
@@ -348,7 +349,7 @@
 
        save_extern_movie(extern_movie);
 
-       character* tar = (character*)target;
+       character* tar = target;
        const char* name = tar->get_name().c_str();
        uint16_t depth = tar->get_depth();
        bool use_cxform = false;
@@ -358,12 +359,12 @@
        float ratio = tar->get_ratio();
        uint16_t clip_depth = tar->get_clip_depth();
 
-       movie* new_movie = static_cast<movie*>(extern_movie)->get_root_movie();
+       character* new_movie = extern_movie->get_root_movie();
 
-       ((character*)new_movie)->set_parent(parent);
+       new_movie->set_parent(parent);
 
        parent->replace_display_object(
-                       (character*) new_movie,
+                          new_movie,
                           name,
                           depth,
                           use_cxform,

Index: server/as_environment.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/as_environment.cpp   5 Jul 2006 23:56:08 -0000       1.10
+++ server/as_environment.cpp   7 Jul 2006 01:01:11 -0000       1.11
@@ -40,6 +40,7 @@
 
 #include "as_environment.h"
 #include "sprite_instance.h"
+#include "character.h"
 #include "as_value.h"
 #include "log.h"
 #include "with_stack_entry.h"
@@ -51,10 +52,11 @@
 
 // Return the value of the given var, if it's defined.
 as_value
-as_environment::get_variable(const tu_string& varname, const 
std::vector<with_stack_entry>& with_stack) const
+as_environment::get_variable(const tu_string& varname,
+               const std::vector<with_stack_entry>& with_stack) const
 {
     // Path lookup rigamarole.
-    sprite_instance*   target = m_target;
+    character* target = m_target;
     tu_string  path;
     tu_string  var;
     if (parse_path(varname, &path, &var)) {
@@ -113,7 +115,7 @@
        return val;
     }
 
-    // Check sprite_instance members.
+    // Check target members.
     if (m_target->get_member(varname, &val)) {
        return val;
     }
@@ -155,7 +157,7 @@
               varname.c_str(), val.to_string());
 
     // Path lookup rigamarole.
-    sprite_instance*   target = m_target;
+    character* target = m_target;
     tu_string  path;
     tu_string  var;
     if (parse_path(varname, &path, &var)) {
@@ -382,14 +384,14 @@
     return true;
 }
 
-sprite_instance*
+character*
 as_environment::find_target(const as_value& val) const
 {
        if (val.get_type() == as_value::OBJECT)
        {
                as_object* obj = val.to_object();
                assert (obj);
-               sprite_instance* s=dynamic_cast<sprite_instance*>(obj);
+               character* s=dynamic_cast<character*>(obj);
                return s; // might be NULL
        }
        else if (val.get_type() == as_value::STRING)
@@ -421,7 +423,7 @@
 }
 
 // Find the sprite/movie referenced by the given path.
-sprite_instance*
+character*
 as_environment::find_target(const tu_string& path) const
 {
     if (path.length() <= 0) {
@@ -431,7 +433,7 @@
     // we'd have returned m_target in this case
     //assert(path.length() > 0);
     
-    sprite_instance* env = m_target;
+    character* env = m_target;
     assert(env);
     
     const char*        p = path.c_str();
@@ -440,7 +442,6 @@
     if (*p == '/') {
        // Absolute path.  Start at the root.
        env = env->get_root_movie();
-       //env = env->get_relative_target("_level0");
        p++;
     }
     
@@ -474,7 +475,7 @@
 int
 as_environment::get_version() const
 {
-       sprite_instance* si=m_target;
+       sprite_instance* si=m_target->get_root_movie();
        movie_definition* md=si->get_movie_definition();
        return md->get_version();
 }

Index: server/as_environment.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/as_environment.h     5 Jul 2006 23:56:08 -0000       1.12
+++ server/as_environment.h     7 Jul 2006 01:01:11 -0000       1.13
@@ -58,7 +58,7 @@
 namespace gnash {
 
 // Forward declarations
-class sprite_instance;
+class character;
 struct with_stack_entry;
 
 /// ActionScript "environment", essentially VM state?
@@ -98,8 +98,8 @@
        {
        }
 
-       sprite_instance*        get_target() { return m_target; }
-       void    set_target(sprite_instance* target) { m_target = target; }
+       character* get_target() { return m_target; }
+       void set_target(character* target) { m_target = target; }
 
        // stack access/manipulation
        // @@ TODO do more checking on these
@@ -234,14 +234,14 @@
        }
 
        /// Find the sprite/movie referenced by the given path.
-       sprite_instance*        find_target(const tu_string& path) const;
+       character* find_target(const tu_string& path) const;
 
        /// \brief
        /// Find the sprite/movie represented by the given value.
        //
        /// The value might be a reference to the object itself, or a
        /// string giving a relative path name to the object.
-       sprite_instance*        find_target(const as_value& val) const;
+       character* find_target(const as_value& val) const;
 
        /// Dump content of the stack to a std::ostream
        void dump_stack(std::ostream& out=std::cerr)
@@ -296,7 +296,7 @@
        std::vector<as_value>   m_local_register;
 
        /// Movie target. 
-       sprite_instance*        m_target;
+       character* m_target;
 
        int find_local(const tu_string& varname) const;
 

Index: server/character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/character.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- server/character.cpp        28 Jun 2006 23:27:44 -0000      1.2
+++ server/character.cpp        7 Jul 2006 01:01:11 -0000       1.3
@@ -141,6 +141,27 @@
        get_parent()->get_mouse_state(x, y, buttons);
 }
 
+character*
+character::get_relative_target_common(const tu_string& name)
+{
+       if (name == "." || name == "this")
+       {
+           return this;
+       }
+       else if (name == "..")
+       {
+               // this is possibly NULL, it seems
+               return get_parent();
+       }
+       else if (name == "_level0"
+            || name == "_root")
+       {
+               return get_root_movie();
+       }
+
+       return NULL;
+}
+
 } // namespace gnash
 
 // Local Variables:

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- server/character.h  1 Jul 2006 20:44:10 -0000       1.7
+++ server/character.h  7 Jul 2006 01:01:11 -0000       1.8
@@ -90,6 +90,9 @@
        /// Implement mouse-dragging for this movie.
        void do_mouse_drag();
 
+       /// look for '.', '..', '_level0' and '_root'
+       character* get_relative_target_common(const tu_string& name);
+
 public:
 
     character(character* parent, int id)
@@ -180,6 +183,30 @@
     virtual float      get_width() { return 0; }
 
     virtual sprite_instance* get_root_movie();
+
+       /// Find the character which is one degree removed from us,
+       /// given the relative pathname.
+       ///
+       /// If the pathname is "..", then return our parent.
+       /// If the pathname is ".", then return ourself.  If
+       /// the pathname is "_level0" or "_root", then return
+       /// the root movie.
+       ///
+       /// Otherwise, the name should refer to one our our
+       /// named characters, so we return it.
+       ///
+       /// NOTE: In ActionScript 2.0, top level names (like
+       /// "_root" and "_level0") are CASE SENSITIVE.
+       /// Character names in a display list are CASE
+       /// SENSITIVE. Member names are CASE INSENSITIVE.  Gah.
+       ///
+       /// In ActionScript 1.0, everything seems to be CASE
+       /// INSENSITIVE.
+       virtual character* get_relative_target(const tu_string& name)
+       {
+               return get_relative_target_common(name);
+       }
+
     virtual int        get_current_frame() const { assert(0); return 0; }
     virtual bool       has_looped() const { assert(0); return false; }
     virtual void       restart() { /*assert(0);*/ }

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- server/sprite_instance.cpp  5 Jul 2006 17:10:39 -0000       1.18
+++ server/sprite_instance.cpp  7 Jul 2006 01:01:11 -0000       1.19
@@ -50,6 +50,7 @@
 
 #include <vector>
 #include <string>
+#include <cmath>
 
 #include "log.h" 
 //#include "action.h" 
@@ -91,7 +92,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
        sprite->set_play_state(movie_interface::PLAY);
@@ -103,7 +104,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite =  fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
        sprite->set_play_state(movie_interface::STOP);
@@ -115,7 +116,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -138,7 +139,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -161,7 +162,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -180,7 +181,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -198,7 +199,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -211,7 +212,7 @@
        sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
        if (sprite == NULL)
        {
-           sprite = fn.env->get_target();
+           sprite = dynamic_cast<sprite_instance*>(fn.env->get_target());
        }
        assert(sprite);
 
@@ -855,34 +856,18 @@
            return called;
 }
 
-sprite_instance*
+character*
 sprite_instance::get_relative_target(const tu_string& name)
 {
-       if (name == "." || name == "this")
-       {
-           return this;
-       }
-       else if (name == "..")
-       {
-               character* parent = get_parent();
-               assert(dynamic_cast<sprite_instance*>(parent));
-               return static_cast<sprite_instance*>(parent);
-           //return get_parent();
-       }
-       else if (name == "_level0"
-            || name == "_root")
-       {
-               //we must return the _root movie as a sprite_instance
-               return get_root_movie();
-       }
+       character* ch = get_relative_target_common(name);
 
-       // See if we have a match on the display list.
-       character* ch = m_display_list.get_character_by_name(name);
-       if ( ch )
+       if ( ! ch )
        {
-               return dynamic_cast<sprite_instance*>(ch);
+               // See if we have a match on the display list.
+               return m_display_list.get_character_by_name(name);
        }
-       return NULL;
+
+       return ch; // possibly NULL
 }
 
 void sprite_instance::set_member(const tu_stringi& name,
@@ -921,8 +906,33 @@
                {
                    matrix      m = get_matrix();
 
+                    double scale_percent = val.to_number();
+
+                    // Handle bogus values
+                    if (isnan(scale_percent))
+                    {
+                       log_warning("Attempt to set _xscale to %g, refused",
+                            scale_percent);
+                        return;
+                    }
+                    else if (scale_percent < 0 )
+                    {
+                       log_warning("Attempt to set _xscale to %g, use 0",
+                            scale_percent);
+                        scale_percent = 0;
+                    }
+                    else if (scale_percent > 100 )
+                    {
+                       log_warning("Attempt to set _xscale to %g, use 100",
+                            scale_percent);
+                        scale_percent = 100;
+                    }
+
+                    // input is in percent
+                   float scale = (float)scale_percent/100.f;
+
                    // Decompose matrix and insert the desired value.
-                   float       x_scale = (float) val.to_number() / 100.f;      
// input is in percent
+                   float       x_scale = scale;
                    float       y_scale = m.get_y_scale();
                    float       rotation = m.get_rotation();
                    m.set_scale_rotation(x_scale, y_scale, rotation);
@@ -936,9 +946,34 @@
                {
                    matrix      m = get_matrix();
 
+                    double scale_percent = val.to_number();
+
+                    // Handle bogus values
+                    if (isnan(scale_percent))
+                    {
+                       log_warning("Attempt to set _yscale to %g, refused",
+                            scale_percent);
+                        return;
+                    }
+                    else if (scale_percent < 0 )
+                    {
+                       log_warning("Attempt to set _yscale to %g, use 0",
+                            scale_percent);
+                        scale_percent = 0;
+                    }
+                    else if (scale_percent > 100 )
+                    {
+                       log_warning("Attempt to set _yscale to %g, use 100",
+                            scale_percent);
+                        scale_percent = 100;
+                    }
+
+                    // input is in percent
+                   float scale = (float)scale_percent/100.f;
+
                    // Decompose matrix and insert the desired value.
                    float       x_scale = m.get_x_scale();
-                   float       y_scale = (float) val.to_number() / 100.f;      
// input is in percent
+                   float       y_scale = scale;
                    float       rotation = m.get_rotation();
                    m.set_scale_rotation(x_scale, y_scale, rotation);
 
@@ -1050,22 +1085,6 @@
                                ch->set_text_value(text);
                                return;
                        }
-#if 0 // avoid use of DisplayList method taking indexes (moved to private)
-                   bool        success = false;
-                   for (int i = 0, n = m_display_list.get_character_count(); i 
< n; i++)
-                       {
-                           character*  ch = m_display_list.get_character(i);
-                           // CASE INSENSITIVE compare.  In ActionScript 2.0, 
this
-                           // changes to CASE SENSITIVE!!!
-                           if (name == ch->get_text_name())
-                               {
-                                   const char* text = val.to_string();
-                                   ch->set_text_value(text);
-                                   success = true;
-                               }
-                       }
-                   if (success) return;
-#endif // 0
        }
 
        // If that didn't work, set a variable within this environment.

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/sprite_instance.h    1 Jul 2006 20:44:10 -0000       1.10
+++ server/sprite_instance.h    7 Jul 2006 01:01:11 -0000       1.11
@@ -338,27 +338,8 @@
        virtual void set_member(const tu_stringi& name,
                const as_value& val);
 
-
-       /// Find the movie which is one degree removed from us,
-       /// given the relative pathname.
-       ///
-       /// If the pathname is "..", then return our parent.
-       /// If the pathname is ".", then return ourself.  If
-       /// the pathname is "_level0" or "_root", then return
-       /// the root movie.
-       ///
-       /// Otherwise, the name should refer to one our our
-       /// named characters, so we return it.
-       ///
-       /// NOTE: In ActionScript 2.0, top level names (like
-       /// "_root" and "_level0") are CASE SENSITIVE.
-       /// Character names in a display list are CASE
-       /// SENSITIVE. Member names are CASE INSENSITIVE.  Gah.
-       ///
-       /// In ActionScript 1.0, everything seems to be CASE
-       /// INSENSITIVE.
-       virtual sprite_instance* get_relative_target(const tu_string& name);
-
+       /// Overridden to look in DisplayList for a match
+       virtual character* get_relative_target(const tu_string& name);
 
        /// Execute the actions for the specified frame. 
        //

Index: server/swf/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/ASHandlers.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- server/swf/ASHandlers.cpp   6 Jul 2006 21:56:48 -0000       1.31
+++ server/swf/ASHandlers.cpp   7 Jul 2006 01:01:11 -0000       1.32
@@ -592,7 +592,7 @@
 //             log_error("get url: target=%s, url=%s\n", target, url);
                      
                tu_string tu_target = target;
-               sprite_instance* target_movie = env.find_target(tu_target);
+               character* target_movie = env.find_target(tu_target);
                if (target_movie != NULL)
                {
                        sprite_instance* root_movie = 
env.get_target()->get_root_movie();
@@ -658,9 +658,11 @@
        const action_buffer& code = thread.code;
        size_t pc = thread.pc;
 
+       assert(code[pc] == SWF::ACTION_SETTARGET); // 0x8B
+
        // Change the movie we're working on.
        const char* target_name = code.read_string(pc+3);
-       sprite_instance *new_target;
+       character *new_target;
                  
        // if the string is blank, we set target to the root movie
        // TODO - double check this is correct?
@@ -693,8 +695,16 @@
        const action_buffer& code = thread.code;
 
        const char* frame_label = code.read_string(thread.pc+3);
-       sprite_instance *target = env.get_target();
+       character *target = env.get_target();
+       sprite_instance *target_sprite = dynamic_cast<sprite_instance*>(target);
+       if ( ! target_sprite )
+       {
+               log_error("environment target is not a sprite_instance while 
executing ActionGotoLabel");
+       }
+       else
+       {
        target->goto_labeled_frame(frame_label);
+       }
 }
 
 void
@@ -906,7 +916,7 @@
        tu_string target_name = env.top(0).to_string();
        env.drop(1); // pop the target name off the stack
 
-       sprite_instance *new_target;
+       character *new_target;
     
        // if the string is blank, we set target to the root movie
        // TODO - double check this is correct?
@@ -954,7 +964,7 @@
 
     ensure_stack(env, 2); // prop num, target
 
-       sprite_instance *target = env.find_target(env.top(1));
+       character *target = env.find_target(env.top(1));
        unsigned int prop_number = (unsigned int)env.top(0).to_number();
        if (target)
        {
@@ -987,7 +997,7 @@
     
     ensure_stack(env, 3); // prop val, prop num, target
 
-    sprite_instance *target = env.find_target(env.top(2));
+    character *target = env.find_target(env.top(2));
     unsigned int prop_number = (unsigned int)env.top(1).to_number();
     as_value prop_val = env.top(0);
     
@@ -1014,10 +1024,18 @@
 
     ensure_stack(env, 3); 
 
-    env.get_target()->clone_display_object(
+       sprite_instance* si = dynamic_cast<sprite_instance*>(env.get_target());
+       if ( ! si )
+       {
+               log_error("environment target is not a sprite_instance while 
executing ActionDuplicateClip");
+       }
+       else
+       {
+               si->clone_display_object(
         env.top(2).to_tu_string(),
         env.top(1).to_tu_string(),
         (int) env.top(0).to_number());
+       }
     env.drop(3);
 }
 
@@ -1426,7 +1444,7 @@
 #ifdef EXTERN_MOVIE
 //             log_error("get url2: target=%s, url=%s\n", target, url);
                      
-               sprite_instance* target_movie = env.find_target(env.top(0));
+               character* target_movie = env.find_target(env.top(0));
                if (target_movie != NULL)
                {
                        sprite_instance* root_movie = 
env.get_target()->get_root_movie();
@@ -1519,7 +1537,14 @@
        unsigned char play_flag = code[pc + 3];
        movie::play_state state = play_flag ? movie::PLAY : movie::STOP;
                  
-       sprite_instance* target = env.get_target();
+       sprite_instance* target = 
dynamic_cast<sprite_instance*>(env.get_target());
+       if ( ! target )
+       {
+               log_error("environment target is not a sprite_instance while 
executing ActionGotoExpression");
+               env.drop(1);
+               return;
+       }
+
        bool success = false;
                  
        if (env.top(0).get_type() == as_value::UNDEFINED)




reply via email to

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