[Top][All Lists]
[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