gnash-commit
[Top][All Lists]
Advanced

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

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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Thu, 05 Apr 2007 11:16:12 +0000

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




reply via email to

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