gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/as_environment.cpp serve...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_environment.cpp serve...
Date: Fri, 26 Oct 2007 13:03:57 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/10/26 13:03:57

Modified files:
        .              : ChangeLog 
        server         : as_environment.cpp as_object.cpp as_object.h 
                         button_character_instance.cpp 
                         button_character_instance.h character.cpp 
                         character.h sprite_instance.cpp 
                         sprite_instance.h 
        testsuite/actionscript.all: targetPath.as with.as 

Log message:
                * server/as_object.{cpp,h}: expose a get_path_element method
                  being the semantically equivalent to the replaced
                  character::find_relative_target
                * server/character.{cpp,h}, 
server/button_character_instance.{cpp,h},
                  server/sprite_instance.{cpp,h}:
                  Adapt find_relative_target to the new get_path_element.
                * server/as_environment.cpp (find_target): use the new
                  get_path_element for paths resolution.
                * testsuite/actionscript.all/: targetPath.as, with.as: some 
successes.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4718&r2=1.4719
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.cpp?cvsroot=gnash&r1=1.104&r2=1.105
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.70&r2=1.71
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.h?cvsroot=gnash&r1=1.77&r2=1.78
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.h?cvsroot=gnash&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.cpp?cvsroot=gnash&r1=1.58&r2=1.59
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.101&r2=1.102
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.372&r2=1.373
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.145&r2=1.146
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/targetPath.as?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/with.as?cvsroot=gnash&r1=1.36&r2=1.37

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4718
retrieving revision 1.4719
diff -u -b -r1.4718 -r1.4719
--- ChangeLog   26 Oct 2007 08:36:21 -0000      1.4718
+++ ChangeLog   26 Oct 2007 13:03:55 -0000      1.4719
@@ -1,5 +1,17 @@
 2007-10-26 Sandro Santilli <address@hidden>
 
+       * server/as_object.{cpp,h}: expose a get_path_element method
+         being the semantically equivalent to the replaced
+         character::find_relative_target
+       * server/character.{cpp,h}, server/button_character_instance.{cpp,h},
+         server/sprite_instance.{cpp,h}:
+         Adapt find_relative_target to the new get_path_element.
+       * server/as_environment.cpp (find_target): use the new
+         get_path_element for paths resolution.
+       * testsuite/actionscript.all/: targetPath.as, with.as: some successes.
+
+2007-10-26 Sandro Santilli <address@hidden>
+
        * testsuite/actionscript.all/with.as: test that '..' is
          a legal path component in a setTarget call.
 

Index: server/as_environment.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.cpp,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -b -r1.104 -r1.105
--- server/as_environment.cpp   25 Oct 2007 10:47:49 -0000      1.104
+++ server/as_environment.cpp   26 Oct 2007 13:03:56 -0000      1.105
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: as_environment.cpp,v 1.104 2007/10/25 10:47:49 strk Exp $ */
+/* $Id: as_environment.cpp,v 1.105 2007/10/26 13:03:56 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -36,6 +36,7 @@
 
 #include <string>
 #include <utility> // for std::pair
+#include <boost/algorithm/string/case_conv.hpp>
 
 // Define this to have find_target() calls trigger debugging output
 //#define DEBUG_TARGET_FINDING 1
@@ -517,13 +518,13 @@
 // Supports both /slash/syntax and dot.syntax
 //
 character*
-as_environment::find_target(const std::string& path) const
+as_environment::find_target(const std::string& path_in) const
 {
 #ifdef DEBUG_TARGET_FINDING 
-       log_msg(_("find_target(%s) called"), path.c_str());
+       log_msg(_("find_target(%s) called"), path_in.c_str());
 #endif
 
-    if (path.empty())
+    if (path_in.empty())
     {
 #ifdef DEBUG_TARGET_FINDING 
        log_msg(_("Returning m_target (empty path)"));
@@ -531,38 +532,55 @@
        return m_target; // or should we return the *original* path ?
     }
     
-    character* env = m_target; 
+    string path = path_in;
+    VM& vm = VM::get();
+    string_table& st = vm.getStringTable();
+    int swfVersion = vm.getSWFVersion(); 
+
+    // Convert to lower case if needed
+    if ( swfVersion < 7 ) boost::to_lower(path);
+
+    as_object* env = m_target; 
     assert(env);
     
     const char*        p = path.c_str();
-
     if (*p == '/') {
        // Absolute path.  Start at the root.
-       env = env->get_root_movie();
+       env = m_target->get_root_movie();
 #ifdef DEBUG_TARGET_FINDING 
        log_msg(_("Absolute path, start at the root (%p)"), (void*)env);
 #endif
        p++;
     }
+#ifdef DEBUG_TARGET_FINDING 
+    else
+    {
+       log_msg(_("Relative path, start at (%s)"), 
m_target->getTarget().c_str());
+    }
+#endif
     
     if (*p == '\0') {
 #ifdef DEBUG_TARGET_FINDING 
        log_msg(_("Null path, returning m_target"));
 #endif
-       return env;
+       return m_target;
     }
 
     std::string        subpart;
-    while (env) {
+    while (env)
+    {
        const char*     next_slash = next_slash_or_dot(p);
        subpart = p;
-       if (next_slash == p) {
+       if (next_slash == p)
+       {
             IF_VERBOSE_ASCODING_ERRORS(
            log_aserror(_("invalid path '%s'"), path.c_str());
            );
            return NULL;
            //break;
-       } else if (next_slash) {
+       }
+       else if (next_slash)
+       {
            // Cut off the slash and everything after it.
            subpart.resize(next_slash - p);
            // Remove any column in the subpart
@@ -580,18 +598,29 @@
        }
 
 #ifdef DEBUG_TARGET_FINDING 
-       log_msg(_("Invoking get_relative_target(%s) on object %p (%s)"), 
subpart.c_str(), (void *)env, env->get_name().c_str());
+       log_msg(_("Invoking get_path_element(%s) on object %p (%s)"), 
subpart.c_str(), (void *)env, env->get_text_value().c_str());
+#endif
+
+       as_object* element = env->get_path_element(st.find(subpart));
+        if ( ! element )
+       {
+#ifdef DEBUG_TARGET_FINDING 
+               log_msg(_("Path element %s not found in object %p"), 
subpart.c_str(), (void *)env);
 #endif
-       env = env->get_relative_target(subpart);
+               return NULL;
+       }
+       env = element;
+
        //@@   _level0 --> root, .. --> parent, . --> this, other == character
        
-       if (env == NULL || next_slash == NULL) {
+       if (next_slash == NULL)
+       {
            break;
        }
        
        p = next_slash + 1;
     }
-    return env;
+    return env->to_movie(); // can be NULL (not a movie)...
 }
 
 as_object*

Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -b -r1.70 -r1.71
--- server/as_object.cpp        24 Oct 2007 07:58:14 -0000      1.70
+++ server/as_object.cpp        26 Oct 2007 13:03:56 -0000      1.71
@@ -930,4 +930,32 @@
        return ret;
 }
 
+as_object*
+as_object::get_path_element(string_table::key key)
+{
+//#define DEBUG_TARGET_FINDING 1
+
+       as_value tmp;
+       if ( ! get_member(key, &tmp ) )
+       {
+#ifdef DEBUG_TARGET_FINDING 
+               log_debug("Member %s not found in object %p",
+                       _vm.getStringTable().value(key).c_str(),
+                       (void*)this);
+#endif
+               return NULL;
+       }
+       if ( ! tmp.is_object() )
+       {
+#ifdef DEBUG_TARGET_FINDING 
+               log_debug("Member %s of object %p is not an object (%s)",
+                       _vm.getStringTable().value(key).c_str(), (void*)this,
+                       tmp.to_debug_string().c_str());
+#endif
+               return NULL;
+       }
+
+       return tmp.to_object().get();
+}
+
 } // end of gnash namespace

Index: server/as_object.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.h,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -b -r1.77 -r1.78
--- server/as_object.h  26 Oct 2007 07:39:47 -0000      1.77
+++ server/as_object.h  26 Oct 2007 13:03:56 -0000      1.78
@@ -463,6 +463,17 @@
                return get_member_default(name, val, nsname);
        }
 
+       /// Resolve the given relative path component
+       //
+       /// Path components are only objects, if the given string
+       /// points to a non-object member, NULL is returned.
+       ///
+       /// Main use if for getvariable and settarget resolution,
+       /// currently implemented in as_environment.
+       ///
+       ///
+       virtual as_object* get_path_element(string_table::key key);
+
        /// Chad: Document
        bool isQName() const { return false; /* TODO: Implement */ }
        bool isXML() const { return false; /* TODO */ }

Index: server/button_character_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- server/button_character_instance.cpp        25 Sep 2007 08:53:54 -0000      
1.60
+++ server/button_character_instance.cpp        26 Oct 2007 13:03:56 -0000      
1.61
@@ -779,19 +779,21 @@
        return false; // no shape
 }
 
-character*
-button_character_instance::get_relative_target(const std::string& name)
+as_object*
+button_character_instance::get_path_element(string_table::key key)
 {
-       character* ch = get_relative_target_common(name);
+       as_object* ch = get_path_element_character(key);
 
        if ( ! ch )
        {
+               string name = _vm.getStringTable().value(key);
                size_t size = m_record_character.size();
                
                // See if we have a match on the button records list
                // TODO: Should we scan only currently visible characters 
                // (get_active_characters) ?? 
-               for (size_t i=0; i<size; i++) {
+               for (size_t i=0; i<size; i++)
+               {
                        character* child = m_record_character[i].get();
                        if (child->get_name() == name)
                                return child;

Index: server/button_character_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/button_character_instance.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- server/button_character_instance.h  21 Sep 2007 08:29:02 -0000      1.26
+++ server/button_character_instance.h  26 Oct 2007 13:03:56 -0000      1.27
@@ -21,7 +21,7 @@
 
 // SWF buttons.  Mouse-sensitive update/display, actions, etc.
 
-/* $Id: button_character_instance.h,v 1.26 2007/09/21 08:29:02 strk Exp $ */
+/* $Id: button_character_instance.h,v 1.27 2007/10/26 13:03:56 strk Exp $ */
 
 #ifndef GNASH_BUTTON_CHARACTER_INSTANCE_H
 #define GNASH_BUTTON_CHARACTER_INSTANCE_H
@@ -126,7 +126,7 @@
        }
        
        /// Overridden to look in button records for a match
-       virtual character* get_relative_target(const std::string& name);
+       virtual as_object* get_path_element(string_table::key key);
 
        virtual void    on_button_event(const event_id& event);
 

Index: server/character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/character.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- server/character.cpp        4 Oct 2007 09:47:36 -0000       1.58
+++ server/character.cpp        26 Oct 2007 13:03:56 -0000      1.59
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-/* $Id: character.cpp,v 1.58 2007/10/04 09:47:36 strk Exp $ */
+/* $Id: character.cpp,v 1.59 2007/10/26 13:03:56 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -151,10 +151,10 @@
        get_parent()->get_mouse_state(x, y, buttons);
 }
 
-character*
-character::get_relative_target_common(const std::string& name_orig)
+as_object*
+character::get_path_element_character(string_table::key key)
 {
-       string name = PROPNAME(name_orig); // convert name to lowercase in SWF<6
+       std::string name = _vm.getStringTable().value(key);
        if (name == "." || name == "this")
        {
            return this;
@@ -171,12 +171,9 @@
                                " a nonexistent parent with '..' "
                                " (a nonexistent parent probably only "
                                "occurs in the root MovieClip)."
-                               " Returning a reference to top parent "
-                               "(probably the root clip)."));
+                               " Returning NULL. "));
                        );
-                       //parent = this;
-                       assert(this == get_root_movie());
-                       return this;
+                       return NULL;
                }
                return parent;
        }
@@ -187,7 +184,7 @@
        else if (name.compare(0, 6, "_level") == 0 && 
name.find_first_not_of("0123456789", 7) == string::npos )
        {
                unsigned int levelno = atoi(name.c_str()+6);
-               return VM::get().getRoot().getLevel(levelno).get();
+               return _vm.getRoot().getLevel(levelno).get();
        }
 
        return NULL;

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -b -r1.101 -r1.102
--- server/character.h  18 Oct 2007 14:13:03 -0000      1.101
+++ server/character.h  26 Oct 2007 13:03:56 -0000      1.102
@@ -19,7 +19,7 @@
 //
 //
 
-/* $Id: character.h,v 1.101 2007/10/18 14:13:03 strk Exp $ */
+/* $Id: character.h,v 1.102 2007/10/26 13:03:56 strk Exp $ */
 
 #ifndef GNASH_CHARACTER_H
 #define GNASH_CHARACTER_H
@@ -219,7 +219,7 @@
        //
        /// NOTE: case insensitive up to SWF6, sensitive from SWF7 up
        ///
-       character* get_relative_target_common(const std::string& name);
+       as_object* get_path_element_character(string_table::key key);
 
        /// \brief
        /// Set when the visual aspect of this particular character or movie
@@ -696,7 +696,7 @@
                return get_parent()->get_root();
        }
 
-       /// Find the character which is one degree removed from us,
+       /// Find the object which is one degree removed from us,
        /// given the relative pathname.
        ///
        /// If the pathname is "..", then return our parent.
@@ -715,9 +715,9 @@
        /// In ActionScript 1.0, everything seems to be CASE
        /// INSENSITIVE.
        ///
-       virtual character* get_relative_target(const std::string& name)
+       virtual as_object* get_path_element(string_table::key key)
        {
-               return get_relative_target_common(name);
+               return get_path_element_character(key);
        }
 
        /// Restart the character

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.372
retrieving revision 1.373
diff -u -b -r1.372 -r1.373
--- server/sprite_instance.cpp  25 Oct 2007 09:37:35 -0000      1.372
+++ server/sprite_instance.cpp  26 Oct 2007 13:03:56 -0000      1.373
@@ -1768,7 +1768,7 @@
        // FIXME: use addProperty interface for these !!
        // TODO: or at least have a character:: protected method take
        //       care of these ?
-       //       Duplicates code in character::get_relative_target_common too..
+       //       Duplicates code in character::get_path_element_character too..
        //
        if (name == "_root" )
        {
@@ -2188,13 +2188,20 @@
        return called;
 }
 
-character*
-sprite_instance::get_relative_target(const std::string& name)
+as_object*
+sprite_instance::get_path_element(string_table::key key)
 {
-       character* ch = get_relative_target_common(name);
-       if ( ch ) return ch;
+       //log_debug("%s.get_path_element(%s) called", getTarget().c_str(), 
_vm.getStringTable().value(key).c_str());
+       as_object* obj = get_path_element_character(key);
+       if ( obj )
+       {
+               return obj;
+       }
+
+       string name = _vm.getStringTable().value(key);
 
        // See if we have a match on the display list.
+       character* ch;
        if ( _vm.getSWFVersion() >= 7 ) ch =  
m_display_list.get_character_by_name(name);
        else ch = m_display_list.get_character_by_name_i(name);
 
@@ -2207,7 +2214,24 @@
                else return this;
        }
 
+       // See if it's a member
+
+       // NOTE: direct use of get_member_default avoids
+       //       triggering a call to sprite_instance::get_member
+       //       which would scan the child characters again
+       //       w/out a need for it
+       //return as_object::get_path_element(key);
+
+       as_value tmp;
+       if ( ! get_member_default(key, &tmp, 0) )
+       {
+               return NULL;
+       }
+       if ( ! tmp.is_object() )
+       {
        return NULL;
+       }
+       return tmp.to_object().get();
 }
 
 void sprite_instance::set_member(string_table::key name,

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -b -r1.145 -r1.146
--- server/sprite_instance.h    18 Oct 2007 11:47:55 -0000      1.145
+++ server/sprite_instance.h    26 Oct 2007 13:03:56 -0000      1.146
@@ -549,7 +549,7 @@
                string_table::key nsname = 0);
 
        /// Overridden to look in DisplayList for a match
-       virtual character* get_relative_target(const std::string& name);
+       as_object* get_path_element(string_table::key key);
 
        /// Execute the actions for the specified frame. 
        //

Index: testsuite/actionscript.all/targetPath.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/targetPath.as,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- testsuite/actionscript.all/targetPath.as    25 Oct 2007 17:53:56 -0000      
1.5
+++ testsuite/actionscript.all/targetPath.as    26 Oct 2007 13:03:56 -0000      
1.6
@@ -20,7 +20,7 @@
  *  Test targetPath tags (0x45)
  */
 
-rcsid="$Id: targetPath.as,v 1.5 2007/10/25 17:53:56 strk Exp $";
+rcsid="$Id: targetPath.as,v 1.6 2007/10/26 13:03:56 strk Exp $";
 
 #include "check.as"
 
@@ -96,7 +96,7 @@
 setTarget("");
 
 setTarget('...:mc');
-xcheck_equals(_target, '/');
+check_equals(_target, '/');
 setTarget("");
 
 #endif

Index: testsuite/actionscript.all/with.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/with.as,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- testsuite/actionscript.all/with.as  26 Oct 2007 08:47:39 -0000      1.36
+++ testsuite/actionscript.all/with.as  26 Oct 2007 13:03:56 -0000      1.37
@@ -21,7 +21,7 @@
 // compile this test case with Ming makeswf, and then
 // execute it like this gnash -1 -r 0 -v out.swf
 
-rcsid="$Id: with.as,v 1.36 2007/10/26 08:47:39 strk Exp $";
+rcsid="$Id: with.as,v 1.37 2007/10/26 13:03:56 strk Exp $";
 
 #include "check.as"
 
@@ -350,7 +350,7 @@
 
 var o = {}; o.t = _root.clip1;
 setTarget('o.t');
-xcheck_equals(_target, "/clip1");
+check_equals(_target, "/clip1");
 setTarget("");
 
 setTarget('o:t');
@@ -368,7 +368,7 @@
 setTarget("");
 
 setTarget('o2.o.t'); 
-xcheck_equals(_target, "/clip1");
+check_equals(_target, "/clip1");
 setTarget("");
 
 o2['o.p'] = o;
@@ -376,6 +376,11 @@
 check_equals(_target, "/");
 setTarget("");
 
+o2.__proto__.inh = o;
+setTarget('o2.inh.t');  // inherited members are scanned 
+check_equals(_target, "/clip1");
+setTarget("");
+
 with (o2)
 {
        setTarget('o:t'); 
@@ -533,5 +538,5 @@
 #if OUTPUT_VERSION < 6
  check_totals(41);
 #else
- check_totals(98);
+ check_totals(99);
 #endif




reply via email to

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