? .LOG.swp
? ASOBJSTRING.PATCH
? BROKEN
? ChangeLog-bogus
? ChangeLog-good
? ChangeLog.gen
? ERR
? LOG
? NativeMCprops.patch
? NativeProps2.patch
? NonFiniteAssert.patch
? P
? P2
? StringTableDebugging.patch
? TODO.STRK
? arrayTest.as
? cl
? config.h.in
? intllibs.patch
? libltdl
? loadDebugging.patch
? log
? movie_root.ConstructLiveChars.PATCH
? t
? libbase/ChangeLog
? libbase/png.cpp
? libbase/png.h
? plugin/ChildRequestParsing.patch
? server/edit_text_character.cpp-noTextFieldVars
? server/edit_text_character.h-noTextFieldVars
? server/sprite_instance.cpp-noTextFieldVars
? server/sprite_instance.h-noTextFieldVars
? server/asobj/System.Capabilities.txt
? testsuite/actionscript.all/ASnative.as
? testsuite/actionscript.all/MovieClipLoaderData.as
? testsuite/media/RMS.flv
? testsuite/misc-ming.all/P
? testsuite/misc-ming.all/isMaskTest.as
? testsuite/misc-ming.all/masks_test3.c
? testsuite/movies.all/gravity-embedded.flm
Index: server/Property.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/Property.cpp,v
retrieving revision 1.8
diff -u -r1.8 Property.cpp
--- server/Property.cpp	28 Feb 2008 07:26:42 -0000	1.8
+++ server/Property.cpp	6 Mar 2008 09:28:01 -0000
@@ -27,24 +27,11 @@
 {
 	const as_accessors* a = boost::get<const as_accessors>(&mBound);
 
-	// Don't recursively invoke a getter
-	//
-	// NOTE: it seems recursion protection is handled differently
-	//       when the SWF is targetted at player 7 or higher.
-	//       See actionscript.all/Object.as
-	//
-	as_accessors::ScopedLock lock(*a);
-	if ( ! lock.obtained() )
-	{
-		return a->underlyingValue;
-	}
-
 	as_environment env;
 	fn_call fn(const_cast<as_object*>(&this_ptr), &env, 0, 0);
 	if (mDestructive)
 	{
-		as_function *f = a->mGetter;
-		as_value ret = (*f)(fn);
+		as_value ret = a->get(fn);
 		// The getter might have called the setter, and we should not override.
 		if (mDestructive)
 		{
@@ -53,17 +40,8 @@
 		}
 		return ret;
 	}
-	return (*a->mGetter)(fn);
+	return a->get(fn);
 
-	as_value v;	
-	VM::get().getMachine()->immediateFunction(a->mGetter, 
-		const_cast<as_object*>(&this_ptr),	v, 0, 0);
-	if (mDestructive)
-	{
-		((boundType) mBound) = v;
-		mDestructive = false;
-	}
-	return v;
 }
 
 void
@@ -71,31 +49,11 @@
 {
 	as_accessors* a = boost::get<as_accessors>(&mBound);
 
-	// Don't recursively invoke a setter
-	//
-	// NOTE: it seems recursion protection is handled differently
-	//       when the SWF is targetted at player 7 or higher.
-	//       In particular, it is not avoided unless the setter
-	//       calls self.. See actionscript.all/Object.as
-	//
-	as_accessors::ScopedLock lock(*a);
-	if ( ! lock.obtained() )
-	{
-		a->underlyingValue = value;
-		return;
-	}
-
-
 	as_environment env;
-	env.push(value);
+	env.push(value); 
 	fn_call fn(&this_ptr, &env, 1, 0);
-	(*a->mSetter)(fn);
-
-	return;
+	a->set(fn);
 
-	// TODO: Push value
-	VM::get().getMachine()->immediateProcedure(a->mSetter,
-		const_cast<as_object*>(&this_ptr), 1, 0);
 }
 
 void
@@ -103,7 +61,8 @@
 {
 	if (isGetterSetter())
 	{
-		boost::get<as_accessors>(&mBound)->mSetter = func;
+		as_accessors* a = boost::get<as_accessors>(&mBound);
+		a->setSetter(func);
 	}
 	else
 		mBound = as_accessors(NULL, func);
@@ -114,7 +73,8 @@
 {
 	if (isGetterSetter())
 	{
-		boost::get<as_accessors>(&mBound)->mGetter = func;
+		as_accessors* a = boost::get<as_accessors>(&mBound);
+		a->setGetter(func);
 	}
 	else
 		mBound = as_accessors(func, NULL);
@@ -152,4 +112,32 @@
 	underlyingValue.setReachable();
 }
 
+as_value
+as_accessors::get(fn_call& fn) const
+{
+	ScopedLock lock(*this);
+	if ( ! lock.obtained() )
+	{
+		return underlyingValue;
+	}
+
+	if ( mGetter ) return (*mGetter)(fn);
+	else if ( cGetter ) return cGetter(fn);
+	else return as_value();
+}
+
+void
+as_accessors::set(fn_call& fn)
+{
+	ScopedLock lock(*this);
+	if ( ! lock.obtained() )
+	{
+		underlyingValue = fn.arg(0);
+		return;
+	}
+
+	if ( mSetter ) (*mSetter)(fn);
+	else if ( cSetter ) cSetter(fn);
+}
+
 } // namespace gnash
Index: server/Property.h
===================================================================
RCS file: /sources/gnash/gnash/server/Property.h,v
retrieving revision 1.21
diff -u -r1.21 Property.h
--- server/Property.h	5 Mar 2008 03:55:58 -0000	1.21
+++ server/Property.h	6 Mar 2008 09:28:01 -0000
@@ -33,6 +33,8 @@
 
 namespace gnash {
 
+typedef as_value (*as_c_function_ptr)(const fn_call& fn);
+
 class as_function;
 class PropertyList;
 
@@ -41,6 +43,42 @@
 {
 public:
 
+	/// Invoke the getter
+	as_value get(fn_call& fn) const;
+
+	/// Invoke the setter
+	void set(fn_call& fn);
+
+	/// Set a user-defined getter
+	void setGetter(as_function* fun)
+	{
+		mGetter = fun;
+		cGetter = 0;
+	}
+
+	/// Set a user-defined setter
+	void setSetter(as_function* fun)
+	{
+		mSetter = fun;
+		cSetter = 0;
+	}
+
+	bool isNative() const { return mGetter == 0; }
+
+	/// Construct a user-defined getter-setter
+	as_accessors(as_function* getter, as_function* setter) : mGetter(getter),
+		mSetter(setter), underlyingValue(), cGetter(0), cSetter(0), beingAccessed(false)
+	{/**/}
+
+	/// Construct a native getter-setter
+	as_accessors(as_c_function_ptr getter, as_c_function_ptr setter) : mGetter(0),
+		mSetter(0), underlyingValue(), cGetter(getter), cSetter(setter), beingAccessed(false)
+	{/**/}
+
+	void markReachableResources() const;
+
+private:
+
 	/// For SWF6 (not higher) a setter would not be invoked
 	/// while being set. This ScopedLock helps marking a
 	/// Getter-Setter as being invoked in an exception-safe
@@ -75,18 +113,15 @@
 
 	friend class ScopedLock;
 
+
 	as_function* mGetter;
 	as_function* mSetter;
 
 	as_value underlyingValue;
 
-	as_accessors(as_function* getter, as_function* setter) : mGetter(getter),
-		mSetter(setter), underlyingValue(), beingAccessed(false)
-	{/**/}
-
-	void markReachableResources() const;
+	as_c_function_ptr cGetter;
+	as_c_function_ptr cSetter;
 
-private:
 
 	mutable bool beingAccessed;
 
@@ -172,6 +207,19 @@
 		mOrderId(0)
 	{/**/}
 
+	Property(string_table::key name, string_table::key nsId,
+		as_c_function_ptr getter, as_c_function_ptr setter, bool destroy = false) :
+		_flags(), mBound(as_accessors(getter, setter)), mDestructive(destroy),
+		mName(name), mNamespace(nsId),
+		mOrderId(0)
+	{/**/}
+
+	/// Set a user-defined setter
+	void setSetter(as_function* fun);
+
+	/// Set a user-defined getter
+	void setGetter(as_function* fun);
+
 	/// accessor to the properties flags
 	const as_prop_flags& getFlags() const { return _flags; }
 	as_prop_flags& getFlags() { return _flags; }
@@ -254,6 +302,7 @@
 	/// Get the order id
 	int getOrder() const { return mOrderId; }
 
+#if 0
 	/// Set the setter
 	void setSetter(as_function*);
 	/// Get the setter, throws if not a getter/setter
@@ -265,6 +314,7 @@
 	/// Get the getter, throws if not a getter/setter
 	as_function *getGetter()
 	{ return boost::get<as_accessors>(mBound).mGetter; }
+#endif
 
 	/// is this a read-only member ?
 	bool isReadOnly() const { return _flags.get_read_only(); }
Index: server/PropertyList.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/PropertyList.cpp,v
retrieving revision 1.29
diff -u -r1.29 PropertyList.cpp
--- server/PropertyList.cpp	19 Feb 2008 19:20:52 -0000	1.29
+++ server/PropertyList.cpp	6 Mar 2008 09:28:01 -0000
@@ -364,6 +364,34 @@
 }
 
 bool
+PropertyList::addGetterSetter(string_table::key key, as_c_function_ptr getter,
+	as_c_function_ptr setter, string_table::key nsId)
+{
+	Property a(key, nsId, getter, setter);
+	a.setOrder(- ++mDefaultOrder - 1);
+
+	container::iterator found = iterator_find(_props, key, nsId);
+	if (found != _props.end())
+	{
+		// copy flags from previous member (even if it's a normal member ?)
+		as_prop_flags& f = a.getFlags();
+		f = found->getFlags();
+
+		_props.replace(found, a);
+		assert ( iterator_find(_props, key, nsId) != _props.end() );
+
+	}
+	else
+	{
+		_props.insert(a);
+        	assert ( iterator_find(_props, key, nsId) != _props.end() );
+	}
+
+
+	return true;
+}
+
+bool
 PropertyList::addDestructiveGetterSetter(string_table::key key,
 	as_function& getter, as_function& setter, string_table::key nsId)
 {
Index: server/PropertyList.h
===================================================================
RCS file: /sources/gnash/gnash/server/PropertyList.h,v
retrieving revision 1.24
diff -u -r1.24 PropertyList.h
--- server/PropertyList.h	6 Mar 2008 05:22:52 -0000	1.24
+++ server/PropertyList.h	6 Mar 2008 09:28:01 -0000
@@ -284,6 +284,27 @@
 		as_function& setter, string_table::key ns = 0);
 
 	/// \brief
+	/// Add a getter/setter property, if not already existing
+	/// (or should we allow override ?)
+	//
+	/// @param key
+	///	Name of the property. Search is case-*sensitive*
+	///
+	/// @param getter
+	///	A function to invoke when this property value is requested.
+	///	add_ref will be called on the function.
+	///
+	/// @param setter
+	///	A function to invoke when setting this property's value.
+	///	add_ref will be called on the function.
+	///
+	/// @return true if the property was successfully added, false
+	///         otherwise (property already existent?)
+	///
+	bool addGetterSetter(string_table::key key, as_c_function_ptr getter,
+		as_c_function_ptr setter, string_table::key ns = 0);
+
+	/// \brief
 	/// Add a destructive getter/setter property, if not already extant.
 	///
 	/// @param key
Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.99
diff -u -r1.99 as_object.cpp
--- server/as_object.cpp	19 Feb 2008 19:20:52 -0000	1.99
+++ server/as_object.cpp	6 Mar 2008 09:28:02 -0000
@@ -87,6 +87,14 @@
 	return _members.addGetterSetter(st.find(PROPNAME(name)), getter, setter);
 }
 
+bool
+as_object::add_property(const std::string& name, as_c_function_ptr getter,
+		as_c_function_ptr setter)
+{
+	string_table &st = _vm.getStringTable();
+	return _members.addGetterSetter(st.find(PROPNAME(name)), getter, setter);
+}
+
 /*protected*/
 bool
 as_object::get_member_default(string_table::key name, as_value* val,
@@ -455,7 +463,6 @@
 {
 	string_table::key k = _vm.getStringTable().find(PROPNAME(key));
 	init_property(k, getter, setter, flags, nsname);
-
 }
 
 void
@@ -475,6 +482,31 @@
 
 }
 
+void
+as_object::init_property(const std::string& key, as_c_function_ptr getter,
+		as_c_function_ptr setter, int flags, string_table::key nsname)
+{
+	string_table::key k = _vm.getStringTable().find(PROPNAME(key));
+	init_property(k, getter, setter, flags, nsname);
+}
+
+void
+as_object::init_property(string_table::key key, as_c_function_ptr getter,
+		as_c_function_ptr setter, int flags, string_table::key nsname)
+{
+	bool success;
+	success = _members.addGetterSetter(key, getter, setter, nsname);
+
+	// We shouldn't attempt to initialize a property twice, should we ?
+	assert(success);
+
+	//log_debug(_("Initialized property '%s'"), name.c_str());
+
+	// TODO: optimize this, don't scan again !
+	_members.setFlags(key, flags, nsname);
+
+}
+
 bool
 as_object::init_destructive_property(string_table::key key, as_function& getter,
 	as_function& setter, int flags, string_table::key nsname)
@@ -498,6 +530,17 @@
 	assert(_members.getProperty(k, nsname));
 }
 
+void
+as_object::init_readonly_property(const std::string& key, as_c_function_ptr getter,
+	int initflags, string_table::key nsname)
+{
+	string_table::key k = _vm.getStringTable().find(PROPNAME(key));
+
+	init_property(k, getter, getter, initflags | as_prop_flags::readOnly
+		| as_prop_flags::isProtected, nsname);
+	assert(_members.getProperty(k, nsname));
+}
+
 std::string
 as_object::asPropName(string_table::key name)
 {
Index: server/as_object.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.h,v
retrieving revision 1.93
diff -u -r1.93 as_object.h
--- server/as_object.h	19 Feb 2008 19:20:52 -0000	1.93
+++ server/as_object.h	6 Mar 2008 09:28:02 -0000
@@ -339,6 +339,36 @@
 		string_table::key nsname = 0);
 
 	/// \brief
+	/// Initialize a getter/setter property by name
+	//
+	/// This is just a wrapper around the other init_property method
+	/// used as a trampoline to avoid changing all classes to 
+	/// use string_table::key directly.
+	///
+	/// @param key
+	///     Name of the property.
+	///	Will be converted to lowercase if VM is initialized for SWF6 or lower.
+	///
+	/// @param getter
+	///	A function to invoke when this property value is requested.
+	///	add_ref will be called on the function.
+	///
+	/// @param setter
+	///	A function to invoke when setting this property's value.
+	///	add_ref will be called on the function.
+	///
+	/// @param flags
+	///     Flags for the new member. By default dontDelete and dontEnum.
+	///	See as_prop_flags::Flags.
+	///
+	/// @param nsname
+	/// The id of the namespace to which this member belongs. 0 is a wildcard
+	/// and will be matched by anything not asking for a specific namespace.
+	void init_property(const std::string& key, as_c_function_ptr getter,
+		as_c_function_ptr setter, int flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum,
+		string_table::key nsname = 0);
+
+	/// \brief
 	/// Initialize a getter/setter property by key
 	//
 	/// This method has to be used by built-in classes initialization
@@ -367,6 +397,35 @@
 		as_function& setter, int flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum,
 		string_table::key nsname = 0);
 
+	/// \brief
+	/// Initialize a getter/setter property by key
+	//
+	/// This method has to be used by built-in classes initialization
+	/// (VM initialization in general) as will avoid to scan the
+	/// inheritance chain.
+	///
+	/// @param key
+	///     Key of the property.
+	///
+	/// @param getter
+	///	A function to invoke when this property value is requested.
+	///	add_ref will be called on the function.
+	///
+	/// @param setter
+	///	A function to invoke when setting this property's value.
+	///	add_ref will be called on the function.
+	///
+	/// @param flags
+	///     Flags for the new member. By default dontDelete and dontEnum.
+	///	See as_prop_flags::Flags.
+	///
+	/// @param nsname
+	/// The id of the namespace to which this member belongs. 0 is a wildcard
+	/// and will be matched by anything not asking for a specific namespace.
+	void init_property(string_table::key key, as_c_function_ptr getter,
+		as_c_function_ptr setter, int flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum,
+		string_table::key nsname = 0);
+
 
 	/// \brief
 	/// Initialize a destructive getter/setter property
@@ -418,6 +477,24 @@
 			int flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum,
 			string_table::key nsname = 0);
 
+	/// \brief
+	/// Use this method for read-only properties.
+	//
+	/// This method achieves the same as the above init_property method.
+	/// Additionally, it sets the property as read-only so that a default
+	/// handler will be triggered when ActionScript attempts to set the
+	/// property.
+	/// 
+	/// The arguments are the same as the above init_property arguments,
+	/// although the setter argument is omitted.
+	///
+	/// @param nsname
+	/// The id of the namespace to which this member belongs. 0 is a wildcard
+	/// and will be matched by anything not asking for a specific namespace.
+	void init_readonly_property(const std::string& key, as_c_function_ptr getter,
+			int flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum,
+			string_table::key nsname = 0);
+
 	/// Get a member as_value by name
 	//
 	/// The default behaviour is to call set_member_default,
@@ -783,6 +860,29 @@
 	bool add_property(const std::string& key, as_function& getter,
 		as_function& setter);
 
+	/// \brief
+	/// Add a getter/setter property, if no member already has
+	/// that name (or should we allow override ? TODO: check this)
+	//
+	/// @param key
+	///     Name of the property.
+	///	Case insensitive up to SWF6,
+	///	case *sensitive* from SWF7 up.
+	///
+	/// @param getter
+	///	A function to invoke when this property value is requested.
+	///	add_ref will be called on the function.
+	///
+	/// @param setter
+	///	A function to invoke when setting this property's value.
+	///	add_ref will be called on the function.
+	///
+	/// @return true if the property was successfully added, false
+	///         otherwise (property already existent?)
+	///
+	bool add_property(const std::string& key, as_c_function_ptr getter,
+		as_c_function_ptr setter);
+
 	/// Return this object '__proto__' member.
 	//
 	/// The __proto__ member is the exported interface ('prototype')
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.482
diff -u -r1.482 sprite_instance.cpp
--- server/sprite_instance.cpp	4 Mar 2008 11:04:35 -0000	1.482
+++ server/sprite_instance.cpp	6 Mar 2008 09:28:03 -0000
@@ -2008,8 +2008,6 @@
 {
   //int target_version = o.getVM().getSWFVersion();
 
-  boost::intrusive_ptr<builtin_function> gettersetter;
-
   // This is a normal property, can be overridden, deleted and enumerated
   // See swfdec/test/trace/movieclip-version-#.swf for why we only initialize this
   // if we don't have a parent
@@ -2019,6 +2017,10 @@
   // Properties (TODO: move to appropriate SWF version section)
   //
   
+#if 0
+
+  boost::intrusive_ptr<builtin_function> gettersetter;
+
   gettersetter = new builtin_function(&character::x_getset, NULL);
   o.init_property("_x", *gettersetter, *gettersetter);
 
@@ -2085,24 +2087,76 @@
   gettersetter = new builtin_function(&sprite_soundbuftime_getset, NULL);
   o.init_property("_soundbuftime", *gettersetter, *gettersetter);
 
-#if 0
-  gettersetter = new builtin_function(&character::onrollover_getset, NULL);
-  o.init_property("onRollOver", *gettersetter, *gettersetter);
+#else
+
+  as_c_function_ptr gettersetter;
+
+  gettersetter = character::x_getset;
+  o.init_property("_x", gettersetter, gettersetter);
+
+  gettersetter = character::y_getset;
+  o.init_property("_y", gettersetter, gettersetter);
+
+  gettersetter = character::xscale_getset;
+  o.init_property("_xscale", gettersetter, gettersetter);
+
+  gettersetter = character::yscale_getset;
+  o.init_property("_yscale", gettersetter, gettersetter);
+
+  gettersetter = character::xmouse_get;
+  o.init_readonly_property("_xmouse", gettersetter);
+
+  gettersetter = character::ymouse_get;
+  o.init_readonly_property("_ymouse", gettersetter);
+
+  gettersetter = character::alpha_getset;
+  o.init_property("_alpha", gettersetter, gettersetter);
+
+  gettersetter = character::visible_getset;
+  o.init_property("_visible", gettersetter, gettersetter);
+
+  gettersetter = character::width_getset;
+  o.init_property("_width", gettersetter, gettersetter);
+
+  gettersetter = character::height_getset;
+  o.init_property("_height", gettersetter, gettersetter);
+
+  gettersetter = character::rotation_getset;
+  o.init_property("_rotation", gettersetter, gettersetter);
+
+  gettersetter = character::parent_getset;
+  o.init_property("_parent", gettersetter, gettersetter);
+
+  gettersetter = sprite_currentframe_get;
+  o.init_property("_currentframe", gettersetter, gettersetter);
+
+  gettersetter = sprite_totalframes_get;
+  o.init_property("_totalframes", gettersetter, gettersetter);
+
+  gettersetter = sprite_framesloaded_get;
+  o.init_property("_framesloaded", gettersetter, gettersetter);
+
+  gettersetter = character::target_getset;
+  o.init_property("_target", gettersetter, gettersetter);
+
+  gettersetter = character::name_getset;
+  o.init_property("_name", gettersetter, gettersetter);
+
+  gettersetter = sprite_droptarget_getset;
+  o.init_property("_droptarget", gettersetter, gettersetter);
 
-  gettersetter = new builtin_function(&character::onrollout_getset, NULL);
-  o.init_property("onRollOut", *gettersetter, *gettersetter);
+  gettersetter = sprite_url_getset;
+  o.init_property("_url", gettersetter, gettersetter);
 
-  gettersetter = new builtin_function(&character::onload_getset, NULL);
-  o.init_property("onLoad", *gettersetter, *gettersetter);
+  gettersetter = sprite_highquality_getset;
+  o.init_property("_highquality", gettersetter, gettersetter);
 
-  gettersetter = new builtin_function(&character::onmouseup_getset, NULL);
-  o.init_property("onMouseUp", *gettersetter, *gettersetter);
+  gettersetter = sprite_focusrect_getset;
+  o.init_property("_focusrect", gettersetter, gettersetter);
 
-  gettersetter = new builtin_function(&character::onmousedown_getset, NULL);
-  o.init_property("onMouseDown", *gettersetter, *gettersetter);
+  gettersetter = sprite_soundbuftime_getset;
+  o.init_property("_soundbuftime", gettersetter, gettersetter);
 
-  gettersetter = new builtin_function(&character::onmousemove_getset, NULL);
-  o.init_property("onMouseMove", *gettersetter, *gettersetter);
 #endif
 
 }
Index: server/vm/Machine.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/Machine.cpp,v
retrieving revision 1.7
diff -u -r1.7 Machine.cpp
--- server/vm/Machine.cpp	21 Jan 2008 20:56:04 -0000	1.7
+++ server/vm/Machine.cpp	6 Mar 2008 09:28:03 -0000
@@ -1032,12 +1032,15 @@
 		as_object *obj = mStack.top(argc).to_object().get();
 		Property *f = obj->getByIndex(dispatch_id);
 		as_function* func;
+#if 0
 		if (f->isGetterSetter())
 		{
 			// Likely an error, but try to handle it.
 			func = f->getGetter();
 		}
-		else if (f->getValue(*obj).is_function())
+		else
+#endif
+		if (f->getValue(*obj).is_function())
 			func = f->getValue(*obj).to_as_function();
 		else
 		{
@@ -1090,7 +1093,7 @@
 			a.getNamespace()->getURI());
 		if (!b)
 			throw ASReferenceError();
-		as_function *f = b->isGetterSetter() ? b->getGetter() :
+		as_function *f = // b->isGetterSetter() ? b->getGetter() :
 			b->getValue(super).to_as_function();
 
 		if (opcode == SWF::ABC_ACTION_CALLSUPER)
@@ -1136,12 +1139,16 @@
 				mStack.drop(argc + shift);
 				break;
 			}
+#if 0
 			else
 			{
-				func = b->getGetter();
+				//func = b->getGetter();
+				log_error("Can't do  ABC_ACTION_CALLPROPVOID or ABC_ACTION_CALLPROPERTY")
+				break;
 			}
+#endif
 		}
-		else
+		//else
 			func = b->getValue(obj).to_as_function();
 
 		if (opcode == SWF::ABC_ACTION_CALLPROPVOID)
