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