CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/09/19 23:24:45
Modified files: . : ChangeLog server : sprite_instance.cpp server/parser : movie_def_impl.cpp movie_def_impl.h Log message: * server/sprite_instance.cpp (goto_frame): fix blind jump to target frame when > frame count. We still want to ensure_frame_loaded instead. * server/parser/movie_def_impl.{cpp,h}: mutex-protect access to named frames map. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4354&r2=1.4355 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.347&r2=1.348 http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.cpp?cvsroot=gnash&r1=1.82&r2=1.83 http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.h?cvsroot=gnash&r1=1.54&r2=1.55 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4354 retrieving revision 1.4355 diff -u -b -r1.4354 -r1.4355 --- ChangeLog 19 Sep 2007 21:33:38 -0000 1.4354 +++ ChangeLog 19 Sep 2007 23:24:44 -0000 1.4355 @@ -1,5 +1,13 @@ 2007-09-19 Sandro Santilli <[EMAIL PROTECTED]> + * server/sprite_instance.cpp (goto_frame): fix blind jump to target + frame when > frame count. We still want to ensure_frame_loaded + instead. + * server/parser/movie_def_impl.{cpp,h}: mutex-protect access to named + frames map. + +2007-09-19 Sandro Santilli <[EMAIL PROTECTED]> + * extensions/mysql/mysql_db.cpp: use init_member, not set_member, when initializing symbols (should fix use in SWF6 or lower versions - untested but pretty sure). Index: server/sprite_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v retrieving revision 1.347 retrieving revision 1.348 diff -u -b -r1.347 -r1.348 --- server/sprite_instance.cpp 19 Sep 2007 14:20:49 -0000 1.347 +++ server/sprite_instance.cpp 19 Sep 2007 23:24:44 -0000 1.348 @@ -1848,14 +1848,19 @@ //GNASH_REPORT_FUNCTION; as_environment* env = const_cast<as_environment*>(&m_as_environment); + std::string fspecStr = frame_spec.to_string(env); - as_value str(frame_spec.to_string(env)); + as_value str(fspecStr); double num = str.to_number(env); + //log_debug("get_frame_number(%s), num: %g", frame_spec.to_debug_string().c_str(), num); + if ( ! isfinite(num) || int(num) != num ) { - return m_def->get_labeled_frame(frame_spec.to_string(env), frameno); + bool ret = m_def->get_labeled_frame(fspecStr, frameno); + //log_debug("get_labeled_frame(%s) returned %d, frameno is %d", fspecStr.c_str(), ret, frameno); + return ret; } // TODO: are we sure we shouldn't check for frames labeled with negative numbers ? @@ -2459,14 +2464,14 @@ // and stop at that frame. set_play_state(STOP); - if(target_frame_number == m_current_frame) + if(target_frame_number > m_def->get_frame_count() - 1) { - // don't push actions - return; + // TODO: should we assert this is never the case ? + target_frame_number = m_def->get_frame_count() - 1; } - if(target_frame_number > m_def->get_frame_count() - 1) + + if(target_frame_number == m_current_frame) { - m_current_frame = m_def->get_frame_count() - 1; // don't push actions return; } @@ -2496,7 +2501,12 @@ loaded_frames); ); - m_def->ensure_frame_loaded(target_frame_number+1); + if ( ! m_def->ensure_frame_loaded(target_frame_number+1) ) + { + log_error("Target frame of a gotoFrame(%d) was never loaded, altought frame count in header (%d) said we would have found it", + target_frame_number+1, m_def->get_frame_count()+1); + return; // ... I guess, or not ? + } } Index: server/parser/movie_def_impl.cpp =================================================================== RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.cpp,v retrieving revision 1.82 retrieving revision 1.83 diff -u -b -r1.82 -r1.83 --- server/parser/movie_def_impl.cpp 17 Sep 2007 23:33:18 -0000 1.82 +++ server/parser/movie_def_impl.cpp 19 Sep 2007 23:24:45 -0000 1.83 @@ -1125,17 +1125,17 @@ void movie_def_impl::add_frame_name(const std::string& n) { - //log_msg(_("labelframe: frame %d, name %s"), _frames_loaded, name); - //why do we care about m_frame_count here ? - //assert(_frames_loaded < m_frame_count); - m_named_frames[n] = _frames_loaded; + boost::mutex::scoped_lock lock(_namedFramesMutex); + //log_debug(_("labelframe: frame %d, name %s"), _frames_loaded, n.c_str()); + _namedFrames[n] = _frames_loaded; } bool movie_def_impl::get_labeled_frame(const std::string& label, size_t& frame_number) { - NamedFrameMap::iterator it = m_named_frames.find(label); - if ( it == m_named_frames.end() ) return false; + boost::mutex::scoped_lock lock(_namedFramesMutex); + NamedFrameMap::iterator it = _namedFrames.find(label); + if ( it == _namedFrames.end() ) return false; frame_number = it->second; return true; } Index: server/parser/movie_def_impl.h =================================================================== RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.h,v retrieving revision 1.54 retrieving revision 1.55 diff -u -b -r1.54 -r1.55 --- server/parser/movie_def_impl.h 17 Sep 2007 23:33:18 -0000 1.54 +++ server/parser/movie_def_impl.h 19 Sep 2007 23:24:45 -0000 1.55 @@ -220,7 +220,10 @@ /// 0-based frame #'s typedef std::map<std::string, size_t> NamedFrameMap; - NamedFrameMap m_named_frames; + NamedFrameMap _namedFrames; + + // Mutex protecting access to _namedFrames + mutable boost::mutex _namedFramesMutex; typedef std::map<std::string, boost::intrusive_ptr<resource> > ExportMap; ExportMap m_exports; @@ -452,6 +455,8 @@ // See dox in movie_definition // + // locks _namedFramesMutex + // bool get_labeled_frame(const std::string& label, size_t& frame_number); void add_font(int font_id, font* f); @@ -488,6 +493,9 @@ void add_init_action(execute_tag* e, int cid); // See dox in movie_definition.h + // + // locks _namedFramesMutex + // void add_frame_name(const std::string& name); /// Set an input object for later loading DefineBits _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit