CVSROOT: /sources/gnash Module name: gnash Changes by: Chad Musick <cmusick> 07/11/20 01:32:34
Modified files: . : ChangeLog server : as_object.cpp swf_function.cpp swf_function.h Log message: Moving swf_function::getSuper to as_object::get_super CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4895&r2=1.4896 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.80&r2=1.81 http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_function.cpp?cvsroot=gnash&r1=1.39&r2=1.40 http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_function.h?cvsroot=gnash&r1=1.17&r2=1.18 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4895 retrieving revision 1.4896 diff -u -b -r1.4895 -r1.4896 --- ChangeLog 20 Nov 2007 00:44:02 -0000 1.4895 +++ ChangeLog 20 Nov 2007 01:32:33 -0000 1.4896 @@ -1,5 +1,10 @@ 2007-10-20 Chad Musick <[EMAIL PROTECTED]> + * server/swf_function.h,.cpp: Remove getSuper function + * server/as_object.cpp: Implement get_super function. + +2007-10-20 Chad Musick <[EMAIL PROTECTED]> + * server/array.cpp as_value.cpp as_value.h character.cpp edit_text_character.cpp sprite_instance.cpp timers.cpp: Remove as_environment from value conversions. Index: server/as_object.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_object.cpp,v retrieving revision 1.80 retrieving revision 1.81 diff -u -b -r1.80 -r1.81 --- server/as_object.cpp 16 Nov 2007 07:43:52 -0000 1.80 +++ server/as_object.cpp 20 Nov 2007 01:32:34 -0000 1.81 @@ -138,8 +138,27 @@ as_object* as_object::get_super() { - // TODO: Implement + // Super is this.__proto__.__constructor__.prototype + as_object *proto = get_prototype().get(); + if (!proto) + return NULL; + + as_value ctor; + bool ret = proto->get_member(NSV::PROP_uuCONSTRUCTORuu, &ctor); + if (!ret) + return NULL; + + as_object *ctor_obj = ctor.to_object().get(); + if (!ctor_obj) + return NULL; + + as_value ctor_proto; + ret = ctor_obj->get_member(NSV::PROP_PROTOTYPE, &ctor_proto); + if (!ret) return NULL; + + as_object *super = ctor_proto.to_object().get(); + return super; } as_function* Index: server/swf_function.cpp =================================================================== RCS file: /sources/gnash/gnash/server/swf_function.cpp,v retrieving revision 1.39 retrieving revision 1.40 diff -u -b -r1.39 -r1.40 --- server/swf_function.cpp 12 Oct 2007 08:01:10 -0000 1.39 +++ server/swf_function.cpp 20 Nov 2007 01:32:34 -0000 1.40 @@ -70,75 +70,6 @@ } /*private static*/ -boost::intrusive_ptr<as_object> -swf_function::getSuper(as_object& obj) -{ -//#define GNASH_DEBUG_GETSUPER - // Super class prototype is : obj.__proto__.__constructor__.prototype - boost::intrusive_ptr<as_object> proto = obj.get_prototype(); - if ( ! proto ) - { -#ifdef GNASH_DEBUG_GETSUPER - log_msg("Object %p doesn't have a __proto__", &obj); -#endif - return NULL; - } - - // TODO: add a getConstructor() method to as_object - // returning an as_function ? - // - as_value ctor; - bool ret = proto->get_member(NSV::PROP_uuCONSTRUCTORuu, &ctor); - if ( ! ret ) - { -#ifdef GNASH_DEBUG_GETSUPER - log_msg("Object.__proto__ %p doesn't have a __constructor__", (void*)proto.get()); -#endif - return NULL; - } - - // TODO: if we cast ctor to an as_function and call getPrototype on it, - // it is possible that the returned object is NOT the current - // 'prototype' member, as as_function caches it ? - // - boost::intrusive_ptr<as_object> ctor_obj = ctor.to_object(); - if ( ! ctor_obj ) - { -#ifdef GNASH_DEBUG_GETSUPER - log_msg("Object.__proto__.__constructor__ doesn't cast to an object"); -#endif - return NULL; - } - -#ifdef GNASH_DEBUG_GETSUPER - log_msg("ctor_obj is %p", ctor_obj.get()); -#endif - - as_value ctor_proto; - ret = ctor_obj->get_member(NSV::PROP_PROTOTYPE, &ctor_proto); - if ( ! ret ) - - { -#ifdef GNASH_DEBUG_GETSUPER - log_msg("Object.__proto__.constructor %p doesn't have a prototype", ctor_obj.get()); -#endif - return NULL; - } - - boost::intrusive_ptr<as_object> super = ctor_proto.to_object(); - if ( ! super ) - { -#ifdef GNASH_DEBUG_GETSUPER - log_msg("Object.__proto__.constructor.prototype doesn't cast to an object"); -#endif - return NULL; - } - - return super; // FIXME: return the intrusive_ptr directly !! - -} - -/*private static*/ as_array_object* swf_function::getArguments(swf_function& callee, const fn_call& fn) { @@ -181,6 +112,9 @@ log_msg(" first_arg_bottom_index: %d\n", fn.first_arg_bottom_index); #endif + assert(fn.this_ptr); + as_object *super = fn.this_ptr->get_super(); + // Some features are version-dependant unsigned swfversion = VM::get().getSWFVersion(); @@ -206,7 +140,6 @@ // Add 'super' (SWF6+ only) if ( swfversion > 5 ) { - boost::intrusive_ptr<as_object> super = getSuper(*(fn.this_ptr)); our_env->set_local("super", as_value(super)); } @@ -285,7 +218,7 @@ if ( (m_function2_flags & PRELOAD_SUPER) && swfversion > 5) { // Put 'super' in a register (SWF6+ only). - our_env->local_register(current_reg).set_as_object(getSuper(*(fn.this_ptr))); + our_env->local_register(current_reg).set_as_object(super); current_reg++; } @@ -296,7 +229,7 @@ else if ( swfversion > 5 ) { // Put 'super' in a local var (SWF6+ only) - our_env->add_local("super", as_value(getSuper(*(fn.this_ptr)))); + our_env->add_local("super", as_value(super)); } if (m_function2_flags & PRELOAD_ROOT) Index: server/swf_function.h =================================================================== RCS file: /sources/gnash/gnash/server/swf_function.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -b -r1.17 -r1.18 --- server/swf_function.h 28 Aug 2007 09:38:02 -0000 1.17 +++ server/swf_function.h 20 Nov 2007 01:32:34 -0000 1.18 @@ -84,17 +84,6 @@ /// See http://sswf.sourceforge.net/SWFalexref.html#action_declare_function2 uint16_t m_function2_flags; - /// Return a pointer to the given object's superclass interface - // - /// Super class prototype is : obj.__proto__.constructor.prototype - /// If any of the above element is undefined NULL is returned. - /// - /// TODO: cleanup and optimize this function, probably delegating - /// parts of it to the as_object class - /// (getConstructor, for example) - /// - static boost::intrusive_ptr<as_object> getSuper(as_object& obj); - /// Return an 'arguments' object. // /// The 'arguments' variable is an array with an additional _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit