+ // TODO: are we sure we shouldn't check for frames labeled with negative + // numbers ? this case is already tested in swfdec/test/trace/gotoframe.swf.
eg. x = "-2"; GotoAndStop(x); x will be converted a NAN when calling "frame_spec.to_number()", then if there is a frame labeled as "-2", it will be found. On 4/5/07, Sandro Santilli <[EMAIL PROTECTED]> wrote:
CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/04/05 11:16:11 Modified files: . : ChangeLog server : sprite_instance.cpp sprite_instance.h server/vm : ASHandlers.cpp testsuite/swfdec: PASSING Log message: * server/sprite_instance.{cpp,h} (get_frame_number): Changed signature to report invalid frame specifications; simplified and clened implementation of Zou Lunkai. * server/vm/ASHandlers.cpp: updated calls to get_frame_number. * testsuite/swfdec/PASSING: gotoframe.swf now passes. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2789&r2=1.2790 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.222&r2=1.223 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.87&r2=1.88 http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.80&r2=1.81 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/swfdec/PASSING?cvsroot=gnash&r1=1.13&r2=1.14 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.2789 retrieving revision 1.2790 diff -u -b -r1.2789 -r1.2790 --- ChangeLog 5 Apr 2007 08:52:46 -0000 1.2789 +++ ChangeLog 5 Apr 2007 11:16:11 -0000 1.2790 @@ -1,5 +1,13 @@ 2007-04-05 Sandro Santilli <[EMAIL PROTECTED]> + * server/sprite_instance.{cpp,h} (get_frame_number): + Changed signature to report invalid frame specifications; + simplified and clened implementation of Zou Lunkai. + * server/vm/ASHandlers.cpp: updated calls to get_frame_number. + * testsuite/swfdec/PASSING: gotoframe.swf now passes. + +2007-04-05 Sandro Santilli <[EMAIL PROTECTED]> + * testsuite/misc-ming.all/Makefile.am: enabled run of reverse_execute_PlaceObject2_test2runner and action_execution_order_test6runner. Index: server/sprite_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v retrieving revision 1.222 retrieving revision 1.223 diff -u -b -r1.222 -r1.223 --- server/sprite_instance.cpp 4 Apr 2007 20:30:45 -0000 1.222 +++ server/sprite_instance.cpp 5 Apr 2007 11:16:11 -0000 1.223 @@ -1706,27 +1706,28 @@ testInvariant(); } -size_t -sprite_instance::get_frame_number(const as_value& frame_spec) const +bool +sprite_instance::get_frame_number(const as_value& frame_spec, size_t& frameno) const { + //GNASH_REPORT_FUNCTION; size_t frame_number; - // Figure out what frame to call. - if (frame_spec.is_string()) - { - if (m_def->get_labeled_frame(frame_spec.to_string(), &frame_number) == false) - { - // Try converting to integer. - frame_number = (size_t)frame_spec.to_number(); - } - } - else + as_environment* env = const_cast<as_environment*>(&m_as_environment); + + double num = frame_spec.to_number(env); + + // TODO: check if a frame labeled "0" or "-3" or "Infinite" + // takes precedence over the numerical value. + if ( isnan(num) ) { - // convert from 1-based to 0-based - frame_number = (size_t) frame_spec.to_number() - 1; + return m_def->get_labeled_frame(frame_spec.to_string(env), &frameno); } - return frame_number; + // TODO: are we sure we shouldn't check for frames labeled with negative numbers ? + if ( num < 1 ) return false; + + frameno = iclamp(num, 1, m_def->get_frame_count())-1; + return true; } /// Execute the actions for the specified frame. @@ -1735,13 +1736,12 @@ /// void sprite_instance::call_frame_actions(const as_value& frame_spec) { - size_t frame_number = get_frame_number(frame_spec); - - if (frame_number >= m_def->get_frame_count()) + size_t frame_number; + if ( ! get_frame_number(frame_spec, frame_number) ) { // No dice. IF_VERBOSE_ASCODING_ERRORS( - log_aserror("call_frame('%s') -- unknown frame", frame_spec.to_string()); + log_aserror("call_frame('%s') -- invalid frame", frame_spec.to_debug_string().c_str()); ); return; } Index: server/sprite_instance.h =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.h,v retrieving revision 1.87 retrieving revision 1.88 diff -u -b -r1.87 -r1.88 --- server/sprite_instance.h 3 Apr 2007 13:43:32 -0000 1.87 +++ server/sprite_instance.h 5 Apr 2007 11:16:11 -0000 1.88 @@ -17,7 +17,7 @@ // // -/* $Id: sprite_instance.h,v 1.87 2007/04/03 13:43:32 strk Exp $ */ +/* $Id: sprite_instance.h,v 1.88 2007/04/05 11:16:11 strk Exp $ */ // Stateful live Sprite instance @@ -277,11 +277,27 @@ /// void goto_frame(size_t target_frame_number); - /// \brief - /// Parse frame spec and return frame number. - /// Frame spec can either be a number of a string (label) + /// Parse frame spec and return a 0-based frame number. + // + /// If frame spec cannot be converted to !NAN number + /// it will be converted to a string and considered a + /// frame label (returns false if referring to an + /// unknwown label). + /// + /// If frame spec can be converted to a non-zero positive + /// integer it will be "clamped" to the valid range. + /// + /// @param frame_spec + /// The frame specification. + /// + /// @param frameno + /// The evaluated frame number (0-based) + /// + /// @return + /// True if the frame_spec could be resolved to a frame number. + /// False if the frame_spec was invalid. /// - size_t get_frame_number(const as_value& frame_spec) const; + bool get_frame_number(const as_value& frame_spec, size_t& frameno) const; /// Look up the labeled frame, and jump to it. Index: server/vm/ASHandlers.cpp =================================================================== RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v retrieving revision 1.80 retrieving revision 1.81 diff -u -b -r1.80 -r1.81 --- server/vm/ASHandlers.cpp 3 Apr 2007 16:33:14 -0000 1.80 +++ server/vm/ASHandlers.cpp 5 Apr 2007 11:16:11 -0000 1.81 @@ -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: ASHandlers.cpp,v 1.80 2007/04/03 16:33:14 strk Exp $ */ +/* $Id: ASHandlers.cpp,v 1.81 2007/04/05 11:16:11 strk Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1438,7 +1438,7 @@ // env.top(0) contains frame specification, // evaluated as for ActionGotoExpression - as_value& framespec = env.top(0); + as_value framespec = env.pop(); character* target = env.get_target(); sprite_instance* target_sprite = target->to_movie(); @@ -1446,11 +1446,20 @@ { log_error("environment target is not a sprite_instance " "while executing ActionWaitForFrameExpression"); - env.drop(1); return; } - size_t framenum = target_sprite->get_frame_number(framespec); + size_t framenum; + if ( ! target_sprite->get_frame_number(framespec, framenum) ) + { + IF_VERBOSE_ASCODING_ERRORS( + log_aserror("Frame spec found on stack " + "at ActionWaitForFrame doesn't evaluate " + "to a valid frame: %s", + framespec.to_debug_string().c_str()); + ); + return; + } #ifdef REALLY_WAIT_ON_WAIT_FOR_FRAME target_sprite->get_movie_definition()->ensure_frame_loaded(framenum); @@ -1465,8 +1474,6 @@ thread.skip_actions(skip); } - env.drop(1); - //dbglogfile << __PRETTY_FUNCTION__ << ": testing" << endl; } @@ -1999,7 +2006,18 @@ as_value expression = env.pop(); - size_t frame_number = target->get_frame_number(expression); + size_t frame_number; + if ( ! target->get_frame_number(expression, frame_number) ) + { + IF_VERBOSE_ASCODING_ERRORS( + log_aserror("Frame spec found on stack " + "at ActionGotoExpression doesn't evaluate " + "to a valid frame: %s", + expression.to_debug_string().c_str()); + ); + return; + } + target->goto_frame(frame_number); target->set_play_state(state); Index: testsuite/swfdec/PASSING =================================================================== RCS file: /sources/gnash/gnash/testsuite/swfdec/PASSING,v retrieving revision 1.13 retrieving revision 1.14 diff -u -b -r1.13 -r1.14 --- testsuite/swfdec/PASSING 29 Mar 2007 08:58:59 -0000 1.13 +++ testsuite/swfdec/PASSING 5 Apr 2007 11:16:11 -0000 1.14 @@ -15,6 +15,7 @@ goto3.swf goto4.swf goto5.swf +gotoframe.swf names.swf array.swf DoInitAction-once.swf _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit
_______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit