CVSROOT: /sources/gnash Module name: gnash Changes by: Chad Musick <cmusick> 07/11/21 09:21:50
Modified files: . : ChangeLog server : Property.cpp Property.h as_environment.cpp as_environment.h as_object.cpp as_value.cpp namedStrings.cpp namedStrings.h swf_function.cpp server/vm : ActionExec.cpp testsuite/actionscript.all: LoadVars.as Log message: Making call stack static, fix unitialized value in as_environment, be more careful about values in boost variants. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4906&r2=1.4907 http://cvs.savannah.gnu.org/viewcvs/gnash/server/Property.cpp?cvsroot=gnash&r1=1.3&r2=1.4 http://cvs.savannah.gnu.org/viewcvs/gnash/server/Property.h?cvsroot=gnash&r1=1.14&r2=1.15 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.cpp?cvsroot=gnash&r1=1.109&r2=1.110 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.h?cvsroot=gnash&r1=1.63&r2=1.64 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.83&r2=1.84 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.97&r2=1.98 http://cvs.savannah.gnu.org/viewcvs/gnash/server/namedStrings.cpp?cvsroot=gnash&r1=1.5&r2=1.6 http://cvs.savannah.gnu.org/viewcvs/gnash/server/namedStrings.h?cvsroot=gnash&r1=1.7&r2=1.8 http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_function.cpp?cvsroot=gnash&r1=1.40&r2=1.41 http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ActionExec.cpp?cvsroot=gnash&r1=1.58&r2=1.59 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/LoadVars.as?cvsroot=gnash&r1=1.15&r2=1.16 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4906 retrieving revision 1.4907 diff -u -b -r1.4906 -r1.4907 --- ChangeLog 21 Nov 2007 08:29:40 -0000 1.4906 +++ ChangeLog 21 Nov 2007 09:21:48 -0000 1.4907 @@ -1,3 +1,17 @@ +2007-11-21 Chad Musick <[EMAIL PROTECTED]> + + * server/as_environment.h,.cpp: Initialize _original_target, as this + absence was causing segfaults. Convert the call stack to a static + one. + * server/swf_function.cpp: Use a class for ensuring the call stack, + rather than doing so manually. + * server/Property.h,.cpp: Initialize differently. + * server/as_value.cpp: Be more careful about return values. + * testsuite/actionscript.all/LoadVars.as: Clean up debugging code. + * server/namedStrings.h,.cpp: Add 'super' to known strings. + * server/vm/ActionExec.cpp: No need to check call stack, as it is + guaranteed correct through use of FrameGuard class. + 2007-11-21 Zou Lunkai <[EMAIL PROTECTED]> * server/as_value.cpp: to_number() convert invalid float literal Index: server/Property.cpp =================================================================== RCS file: /sources/gnash/gnash/server/Property.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- server/Property.cpp 30 Oct 2007 18:55:42 -0000 1.3 +++ server/Property.cpp 21 Nov 2007 09:21:49 -0000 1.4 @@ -98,8 +98,10 @@ case 0: // Blank, nothing to do. break; case 1: // Simple property, value + { boost::get<as_value>(mBound).setReachable(); break; + } case 2: // Getter/setter { const as_accessors& a = boost::get<as_accessors>(mBound); Index: server/Property.h =================================================================== RCS file: /sources/gnash/gnash/server/Property.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -b -r1.14 -r1.15 --- server/Property.h 9 Nov 2007 00:35:01 -0000 1.14 +++ server/Property.h 21 Nov 2007 09:21:49 -0000 1.15 @@ -15,7 +15,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: Property.h,v 1.14 2007/11/09 00:35:01 nihilus Exp $ */ +/* $Id: Property.h,v 1.15 2007/11/21 09:21:49 cmusick Exp $ */ #ifndef GNASH_PROPERTY_H #define GNASH_PROPERTY_H @@ -82,7 +82,7 @@ public: /// Default constructor Property(string_table::key name = 0, string_table::key nsId = 0) : - mName(name), mNamespace(nsId) + mBound(as_value()), mName(name), mNamespace(nsId) {/**/} /// Copy constructor Index: server/as_environment.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_environment.cpp,v retrieving revision 1.109 retrieving revision 1.110 diff -u -b -r1.109 -r1.110 --- server/as_environment.cpp 16 Nov 2007 21:28:54 -0000 1.109 +++ server/as_environment.cpp 21 Nov 2007 09:21:49 -0000 1.110 @@ -17,7 +17,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: as_environment.cpp,v 1.109 2007/11/16 21:28:54 strk Exp $ */ +/* $Id: as_environment.cpp,v 1.110 2007/11/21 09:21:49 cmusick Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -46,6 +46,8 @@ namespace gnash { +as_environment::CallStack as_environment::_localFrames = as_environment::CallStack(); + // Return the value of the given var, if it's defined. as_value as_environment::get_variable(const std::string& varname, @@ -880,6 +882,7 @@ { i->setReachable(); } + if (locals) locals->setReachable(); } Index: server/as_environment.h =================================================================== RCS file: /sources/gnash/gnash/server/as_environment.h,v retrieving revision 1.63 retrieving revision 1.64 diff -u -b -r1.63 -r1.64 --- server/as_environment.h 14 Nov 2007 22:16:05 -0000 1.63 +++ server/as_environment.h 21 Nov 2007 09:21:49 -0000 1.64 @@ -51,7 +51,9 @@ as_environment() : - m_target(0) + m_stack(), + m_target(0), + _original_target(0) { } @@ -436,6 +438,10 @@ { CallFrame(as_function* funcPtr); + CallFrame(const CallFrame& other) : locals(other.locals), + registers(other.registers), func(other.func) + {/**/} + /// function use this LocalVars locals; @@ -489,12 +495,13 @@ { return _localFrames.size(); } - +/* /// Clear the call stack void clearCallFrames() { _localFrames.clear(); } +*/ private: @@ -502,7 +509,7 @@ typedef std::vector<CallFrame> CallStack; - CallStack _localFrames; + static CallStack _localFrames; as_value m_global_register[numGlobalRegisters]; Index: server/as_object.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_object.cpp,v retrieving revision 1.83 retrieving revision 1.84 diff -u -b -r1.83 -r1.84 --- server/as_object.cpp 20 Nov 2007 22:14:48 -0000 1.83 +++ server/as_object.cpp 21 Nov 2007 09:21:49 -0000 1.84 @@ -102,7 +102,8 @@ assert(val); Property* prop = findProperty(name, nsname); - if ( ! prop ) return false; + if (!prop) + return false; try { @@ -212,7 +213,7 @@ as_object **owner) { // don't enter an infinite loop looking for __proto__ ... - if (key == NSV::PROP_uuPROTOuu) + if (key == NSV::PROP_uuPROTOuu && !nsname) { if (owner != NULL) *owner = this; Index: server/as_value.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_value.cpp,v retrieving revision 1.97 retrieving revision 1.98 diff -u -b -r1.97 -r1.98 --- server/as_value.cpp 21 Nov 2007 08:29:40 -0000 1.97 +++ server/as_value.cpp 21 Nov 2007 09:21:49 -0000 1.98 @@ -1250,17 +1250,25 @@ switch (m_type) { case OBJECT: - getObj()->setReachable(); + { + as_value::AsObjPtr op = getObj(); + if (op) + op->setReachable(); break; - + } case AS_FUNCTION: - getFun()->setReachable(); + { + as_value::AsFunPtr fp = getFun(); + if (fp) + fp->setReachable(); break; - + } case MOVIECLIP: - getSpriteProxy().setReachable(); + { + as_value::SpriteProxy sp = getSpriteProxy(); + sp.setReachable(); break; - + } default: break; } #endif // GNASH_USE_GC Index: server/namedStrings.cpp =================================================================== RCS file: /sources/gnash/gnash/server/namedStrings.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- server/namedStrings.cpp 29 Oct 2007 21:07:34 -0000 1.5 +++ server/namedStrings.cpp 21 Nov 2007 09:21:49 -0000 1.6 @@ -73,6 +73,7 @@ { "splice", NSV::PROP_SPLICE }, { "Stage", NSV::PROP_iSTAGE }, { "status", NSV::PROP_STATUS }, + { "super", NSV::PROP_SUPER }, { "_target", NSV::PROP_uTARGET }, { "text", NSV::PROP_TEXT }, { "textColor", NSV::PROP_TEXT_COLOR }, Index: server/namedStrings.h =================================================================== RCS file: /sources/gnash/gnash/server/namedStrings.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -b -r1.7 -r1.8 --- server/namedStrings.h 29 Oct 2007 21:07:33 -0000 1.7 +++ server/namedStrings.h 21 Nov 2007 09:21:49 -0000 1.8 @@ -93,6 +93,7 @@ PROP_SIZE, PROP_uSOUNDBUFTIME, PROP_SPLICE, + PROP_SUPER, PROP_iSTAGE, CLASS_STAGE = PROP_iSTAGE, PROP_STATUS, Index: server/swf_function.cpp =================================================================== RCS file: /sources/gnash/gnash/server/swf_function.cpp,v retrieving revision 1.40 retrieving revision 1.41 diff -u -b -r1.40 -r1.41 --- server/swf_function.cpp 20 Nov 2007 01:32:34 -0000 1.40 +++ server/swf_function.cpp 21 Nov 2007 09:21:49 -0000 1.41 @@ -40,7 +40,6 @@ namespace gnash { - swf_function::~swf_function() { #ifndef GNASH_USE_GC @@ -92,6 +91,24 @@ } +namespace { +class FrameGuard +{ +public: + FrameGuard(as_environment& env, swf_function *func) : mEnv(env) + { + env.pushCallFrame(func); + } + + ~FrameGuard() + { + mEnv.popCallFrame(); + } + + as_environment& mEnv; +}; +} // end of anonymous namespace + // Dispatch. as_value swf_function::operator()(const fn_call& fn) @@ -119,7 +136,8 @@ unsigned swfversion = VM::get().getSWFVersion(); // Set up local stack frame, for parameters and locals. - our_env->pushCallFrame(this); + FrameGuard guard(*our_env, this); +// our_env->pushCallFrame(this); if (m_is_function2 == false) { @@ -272,23 +290,19 @@ catch (ActionLimitException& ale) // expected and sane { //log_debug("ActionLimitException got from swf_function execution: %s", ale.what()); - our_env->popCallFrame(); throw; } catch (std::exception& ex) // unexpected but we can tell what it is { log_debug("Unexpected exception from swf_function execution: %s", ex.what()); - our_env->popCallFrame(); throw; } catch (...) // unexpected, unknown, but why not cleaning up... { log_debug("Unknown exception got from swf_function execution"); - our_env->popCallFrame(); throw; } - our_env->popCallFrame(); return result; } Index: server/vm/ActionExec.cpp =================================================================== RCS file: /sources/gnash/gnash/server/vm/ActionExec.cpp,v retrieving revision 1.58 retrieving revision 1.59 diff -u -b -r1.58 -r1.59 --- server/vm/ActionExec.cpp 16 Nov 2007 13:24:30 -0000 1.58 +++ server/vm/ActionExec.cpp 21 Nov 2007 09:21:49 -0000 1.59 @@ -17,7 +17,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: ActionExec.cpp,v 1.58 2007/11/16 13:24:30 strk Exp $ */ +/* $Id: ActionExec.cpp,v 1.59 2007/11/21 09:21:49 cmusick Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -445,36 +445,6 @@ env.set_target(_original_target); _original_target = NULL; - // Check the call stack depth to be the same as the one we started with - // TODO: should this check be switched off based on GNASH_TRUST_SWF_INPUT ? - size_t currCallStackDepth = env.callStackDepth(); - if ( currCallStackDepth != _initialCallStackDepth ) - { - if ( currCallStackDepth > _initialCallStackDepth ) - { - if ( ! expectInconsistencies ) - { - // TODO: try to produce this error hitting script limits - log_error(_("Call stack at end of ActionScript execution " - "(" SIZET_FMT ") exceeds call stack depth at start " - "of it (" SIZET_FMT ") - limits hit ?"), - currCallStackDepth, _initialCallStackDepth); - } - size_t diff = currCallStackDepth-_initialCallStackDepth; - // TODO: implement dropCallFrames(diff) ? - while (diff--) env.popCallFrame(); - assert(env.callStackDepth() == _initialCallStackDepth); - } - else - { - // TODO: make this an assertion ? - log_error(_("Call stack at end of ActionScript execution " - "(" SIZET_FMT ") less then call stack depth at start " - "of it (" SIZET_FMT ") - bad bug !"), - currCallStackDepth, _initialCallStackDepth); - } - } - // check if the stack was smashed if ( _initial_stack_size > env.stack_size() ) { log_error(_("Stack smashed (ActionScript compiler bug?)." Index: testsuite/actionscript.all/LoadVars.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/LoadVars.as,v retrieving revision 1.15 retrieving revision 1.16 diff -u -b -r1.15 -r1.16 --- testsuite/actionscript.all/LoadVars.as 29 Sep 2007 16:22:57 -0000 1.15 +++ testsuite/actionscript.all/LoadVars.as 21 Nov 2007 09:21:50 -0000 1.16 @@ -21,7 +21,7 @@ // compile this test case with Ming makeswf, and then // execute it like this gnash -1 -r 0 -v out.swf -rcsid="$Id: LoadVars.as,v 1.15 2007/09/29 16:22:57 strk Exp $"; +rcsid="$Id: LoadVars.as,v 1.16 2007/11/21 09:21:50 cmusick Exp $"; #include "check.as" @@ -60,8 +60,6 @@ // test the LoadVars::tostring method check_equals (typeof(loadvarsObj.toString), 'function'); -var loadvarsObj = new LoadVars; // STRK REMOVEME - //-------------------------------------------------------------------------- // Test LoadVars::load() //-------------------------------------------------------------------------- _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit