CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/11/17 08:33:54
Modified files: . : ChangeLog server : as_value.cpp Log message: (SpriteProxy:find_sprite_by_target): Optimize implementation based on the assumption that a sprite target is always in "dot" syntax. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4883&r2=1.4884 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.94&r2=1.95 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4883 retrieving revision 1.4884 diff -u -b -r1.4883 -r1.4884 --- ChangeLog 16 Nov 2007 21:28:53 -0000 1.4883 +++ ChangeLog 17 Nov 2007 08:33:53 -0000 1.4884 @@ -1,3 +1,9 @@ +2007-11-17 Sandro Santilli <[EMAIL PROTECTED]> + + * server/as_value.cpp (SpriteProxy:find_sprite_by_target): + Make a more optimized implementation based on the assumption + that a sprite target is always in "dot" syntax. + 2007-11-16 Sandro Santilli <[EMAIL PROTECTED]> * server/: as_object.h, character.h: add virtual to_character() Index: server/as_value.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_value.cpp,v retrieving revision 1.94 retrieving revision 1.95 diff -u -b -r1.94 -r1.95 --- server/as_value.cpp 15 Nov 2007 19:41:34 -0000 1.94 +++ server/as_value.cpp 17 Nov 2007 08:33:54 -0000 1.95 @@ -1426,11 +1426,29 @@ { if ( tgtstr.empty() ) return NULL; - 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(); + VM& vm = VM::get(); + string_table& st = vm.getStringTable(); + as_object* o = vm.getRoot().get_root_movie(); + + // TODO: for another optimization we may cache + // the string_table::key for each element + // as the SpriteProxy target (instead of + // the full string, to be parsed everytime) + + string::size_type size = tgtstr.size(); + string::size_type from = 0; + while ( string::size_type to=tgtstr.find_first_of('.', from) ) + { + string part(tgtstr, from, to-from); + o = o->get_path_element(st.find(part)); + if ( ! o ) { + log_debug("Target path element %s not found", part.c_str()); + return NULL; + } + if ( to == string::npos ) break; + from = to+1; + } + return o->to_movie(); } void _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit