gnash-commit
[Top][All Lists]
Advanced

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

Re: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...


From: zou lunkai
Subject: Re: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Mon, 9 Apr 2007 09:41:40 +0800

+     // 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 <address@hidden> 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 <address@hidden>

+       * 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 <address@hidden>
+
       * 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
address@hidden
http://lists.gnu.org/mailman/listinfo/gnash-commit





reply via email to

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