[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/Property.cpp server/Prop...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/Property.cpp server/Prop... |
Date: |
Thu, 06 Mar 2008 14:52:21 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 08/03/06 14:52:21
Modified files:
. : ChangeLog
server : Property.cpp Property.h PropertyList.cpp
PropertyList.h as_object.cpp as_object.h
sprite_instance.cpp
server/vm : Machine.cpp
Log message:
Add support for native getter-setters, and use them for MovieClip
instances.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5823&r2=1.5824
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Property.cpp?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Property.h?cvsroot=gnash&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/gnash/server/PropertyList.cpp?cvsroot=gnash&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/gnash/server/PropertyList.h?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.99&r2=1.100
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.h?cvsroot=gnash&r1=1.93&r2=1.94
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.482&r2=1.483
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/Machine.cpp?cvsroot=gnash&r1=1.7&r2=1.8
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5823
retrieving revision 1.5824
diff -u -b -r1.5823 -r1.5824
--- ChangeLog 6 Mar 2008 14:48:36 -0000 1.5823
+++ ChangeLog 6 Mar 2008 14:52:19 -0000 1.5824
@@ -1,5 +1,15 @@
2008-03-06 Sandro Santilli <address@hidden>
+ * server/: Property.{cpp,h}, PropertyList.{cpp,h},
+ as_object.{cpp,h}:
+ Add support for native getter-setters.
+ * server/sprite_instance.cpp: use native getter-setters
+ for sprite properties.
+ * server/vm/Machine.cpp: don't assume a getter setter is
+ always implemented using an as_function.
+
+2008-03-06 Sandro Santilli <address@hidden>
+
* server/asobj/Global.cpp: cast istringstream to bool as a way
to detect errors, tellg() == -1 was ambiguos.
* testsuite/actionscript.all/String.as: fix expected results
Index: server/Property.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/Property.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/Property.cpp 28 Feb 2008 07:26:42 -0000 1.8
+++ server/Property.cpp 6 Mar 2008 14:52:20 -0000 1.9
@@ -25,26 +25,13 @@
as_value
Property::getDelayedValue(const as_object& this_ptr) const
{
- 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;
- }
+ const GetterSetter* a = boost::get<const GetterSetter>(&mBound);
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,49 +40,20 @@
}
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
Property::setDelayedValue(as_object& this_ptr, const as_value& value)
{
- 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;
- }
-
+ GetterSetter* a = boost::get<GetterSetter>(&mBound);
as_environment env;
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,10 +61,11 @@
{
if (isGetterSetter())
{
- boost::get<as_accessors>(&mBound)->mSetter = func;
+ GetterSetter* a = boost::get<GetterSetter>(&mBound);
+ a->setSetter(func);
}
else
- mBound = as_accessors(NULL, func);
+ mBound = GetterSetter(NULL, func);
}
void
@@ -114,10 +73,11 @@
{
if (isGetterSetter())
{
- boost::get<as_accessors>(&mBound)->mGetter = func;
+ GetterSetter* a = boost::get<GetterSetter>(&mBound);
+ a->setGetter(func);
}
else
- mBound = as_accessors(func, NULL);
+ mBound = GetterSetter(func, NULL);
}
void
@@ -134,7 +94,7 @@
}
case 2: // Getter/setter
{
- const as_accessors& a = boost::get<as_accessors>(mBound);
+ const GetterSetter& a = boost::get<GetterSetter>(mBound);
a.markReachableResources();
break;
}
@@ -145,11 +105,37 @@
}
void
-as_accessors::markReachableResources() const
+GetterSetter::UserDefinedGetterSetter::markReachableResources() const
{
if (mGetter) mGetter->setReachable();
if (mSetter) mSetter->setReachable();
underlyingValue.setReachable();
}
+as_value
+GetterSetter::UserDefinedGetterSetter::get(fn_call& fn) const
+{
+ ScopedLock lock(*this);
+ if ( ! lock.obtained() )
+ {
+ return underlyingValue;
+ }
+
+ if ( mGetter ) return (*mGetter)(fn);
+ else return as_value();
+}
+
+void
+GetterSetter::UserDefinedGetterSetter::set(fn_call& fn)
+{
+ ScopedLock lock(*this);
+ if ( ! lock.obtained() )
+ {
+ underlyingValue = fn.arg(0);
+ return;
+ }
+
+ if ( mSetter ) (*mSetter)(fn);
+}
+
} // namespace gnash
Index: server/Property.h
===================================================================
RCS file: /sources/gnash/gnash/server/Property.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- server/Property.h 5 Mar 2008 03:55:58 -0000 1.21
+++ server/Property.h 6 Mar 2008 14:52:20 -0000 1.22
@@ -33,27 +33,135 @@
namespace gnash {
+typedef as_value (*as_c_function_ptr)(const fn_call& fn);
+
class as_function;
class PropertyList;
-/// Simple Holder for getter/setter functions
-class as_accessors
+/// Holder for getter/setter functions
+//
+/// Getter setter can be user-defined or native ones.
+/// This class abstracts the two.
+///
+class GetterSetter
{
public:
- /// For SWF6 (not higher) a setter would not be invoked
+ /// Construct a user-defined getter-setter
+ GetterSetter(as_function* getter, as_function* setter)
+ :
+ _getset(UserDefinedGetterSetter(getter, setter))
+ {/**/}
+
+ /// Construct a native getter-setter
+ GetterSetter(as_c_function_ptr getter, as_c_function_ptr setter)
+ :
+ _getset(NativeGetterSetter(getter, setter))
+ {/**/}
+
+ /// Invoke the getter
+ as_value get(fn_call& fn) const
+ {
+ switch ( _getset.which() )
+ {
+ case 0: // user-defined
+ return
boost::get<UserDefinedGetterSetter>(_getset).get(fn);
+ break;
+ case 1: // native
+ return
boost::get<NativeGetterSetter>(_getset).get(fn);
+ break;
+ }
+ return as_value(); // not reached (TODO: log error ? assert ?)
+ }
+
+ /// Invoke the setter
+ void set(fn_call& fn)
+ {
+ switch ( _getset.which() )
+ {
+ case 0: // user-defined
+
boost::get<UserDefinedGetterSetter>(_getset).set(fn);
+ break;
+ case 1: // native
+ boost::get<NativeGetterSetter>(_getset).set(fn);
+ break;
+ }
+ }
+
+ /// Set a user-defined getter
+ void setGetter(as_function* fun)
+ {
+ if ( _getset.which() == 0 )
+ {
+
boost::get<UserDefinedGetterSetter>(_getset).setGetter(fun);
+ }
+ }
+
+ /// Set a user-defined setter
+ void setSetter(as_function* fun)
+ {
+ if ( _getset.which() == 0 )
+ {
+
boost::get<UserDefinedGetterSetter>(_getset).setSetter(fun);
+ }
+ }
+
+ void markReachableResources() const
+ {
+ if ( _getset.which() == 0 )
+ {
+
boost::get<UserDefinedGetterSetter>(_getset).markReachableResources();
+ }
+ }
+
+private:
+
+ /// User-defined getter/setter
+ class UserDefinedGetterSetter {
+ public:
+ UserDefinedGetterSetter(as_function* get, as_function* set)
+ :
+ mGetter(get),
+ mSetter(set),
+ underlyingValue(),
+ beingAccessed(false)
+ {}
+
+ /// Invoke the getter
+ as_value get(fn_call& fn) const;
+
+ /// Invoke the setter
+ void set(fn_call& fn);
+
+ /// Set the setter
+ void setSetter(as_function* setter) { mSetter = setter; }
+
+ /// Set the getter
+ void setGetter(as_function* getter) { mGetter = getter; }
+
+ void markReachableResources() const;
+
+ private:
+ as_function* mGetter;
+ as_function* mSetter;
+
+ as_value underlyingValue;
+
+ mutable bool beingAccessed;
+
+ /// For SWF6 (not higher) a user-defined getter-setter would
not be invoked
/// while being set. This ScopedLock helps marking a
/// Getter-Setter as being invoked in an exception-safe
/// manner.
class ScopedLock {
- const as_accessors& a;
+ const UserDefinedGetterSetter& a;
bool obtainedLock;
ScopedLock(ScopedLock&);
ScopedLock& operator==(ScopedLock&);
public:
- ScopedLock(const as_accessors& na) : a(na)
+ ScopedLock(const UserDefinedGetterSetter& na) : a(na)
{
if ( a.beingAccessed ) obtainedLock=false;
else {
@@ -75,20 +183,37 @@
friend class ScopedLock;
- as_function* mGetter;
- as_function* mSetter;
+ };
- as_value underlyingValue;
+ /// Native GetterSetter
+ class NativeGetterSetter {
- as_accessors(as_function* getter, as_function* setter) :
mGetter(getter),
- mSetter(setter), underlyingValue(), beingAccessed(false)
- {/**/}
+ public:
- void markReachableResources() const;
+ NativeGetterSetter(as_c_function_ptr get, as_c_function_ptr set)
+ :
+ cGetter(get), cSetter(set) {}
-private:
+ /// Invoke the getter
+ as_value get(fn_call& fn) const
+ {
+ return cGetter(fn);
+ }
- mutable bool beingAccessed;
+ /// Invoke the setter
+ void set(fn_call& fn)
+ {
+ cSetter(fn);
+ }
+
+ private:
+
+ as_c_function_ptr cGetter;
+
+ as_c_function_ptr cSetter;
+ };
+
+ boost::variant<UserDefinedGetterSetter, NativeGetterSetter> _getset;
};
@@ -102,7 +227,8 @@
as_prop_flags _flags;
// Store the various types of things that can be held.
- typedef boost::variant<boost::blank, as_value, as_accessors> boundType;
+ typedef boost::variant<boost::blank, as_value, GetterSetter> boundType;
+
// Changing this doesn't change the identity of the property, so it is
// mutable.
mutable boundType mBound;
@@ -160,18 +286,31 @@
Property(string_table::key name, string_table::key nsId,
as_function *getter, as_function *setter,
const as_prop_flags& flags, bool destroy = false) :
- _flags(flags), mBound(as_accessors(getter, setter)),
+ _flags(flags), mBound(GetterSetter(getter, setter)),
mDestructive(destroy), mName(name), mNamespace(nsId),
mOrderId(0)
{/**/}
Property(string_table::key name, string_table::key nsId,
as_function *getter, as_function *setter, bool destroy = false)
:
- _flags(), mBound(as_accessors(getter, setter)),
mDestructive(destroy),
+ _flags(), mBound(GetterSetter(getter, setter)),
mDestructive(destroy),
mName(name), mNamespace(nsId),
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(GetterSetter(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,18 +393,6 @@
/// Get the order id
int getOrder() const { return mOrderId; }
- /// Set the setter
- void setSetter(as_function*);
- /// Get the setter, throws if not a getter/setter
- as_function *getSetter()
- { return boost::get<as_accessors>(mBound).mSetter; }
-
- /// Set the getter
- void setGetter(as_function*);
- /// Get the getter, throws if not a getter/setter
- as_function *getGetter()
- { return boost::get<as_accessors>(mBound).mGetter; }
-
/// 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
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/PropertyList.cpp 19 Feb 2008 19:20:52 -0000 1.29
+++ server/PropertyList.cpp 6 Mar 2008 14:52:20 -0000 1.30
@@ -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
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/PropertyList.h 6 Mar 2008 05:22:52 -0000 1.24
+++ server/PropertyList.h 6 Mar 2008 14:52:20 -0000 1.25
@@ -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
retrieving revision 1.100
diff -u -b -r1.99 -r1.100
--- server/as_object.cpp 19 Feb 2008 19:20:52 -0000 1.99
+++ server/as_object.cpp 6 Mar 2008 14:52:20 -0000 1.100
@@ -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
retrieving revision 1.94
diff -u -b -r1.93 -r1.94
--- server/as_object.h 19 Feb 2008 19:20:52 -0000 1.93
+++ server/as_object.h 6 Mar 2008 14:52:20 -0000 1.94
@@ -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
retrieving revision 1.483
diff -u -b -r1.482 -r1.483
--- server/sprite_instance.cpp 4 Mar 2008 11:04:35 -0000 1.482
+++ server/sprite_instance.cpp 6 Mar 2008 14:52:20 -0000 1.483
@@ -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
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- server/vm/Machine.cpp 21 Jan 2008 20:56:04 -0000 1.7
+++ server/vm/Machine.cpp 6 Mar 2008 14:52:21 -0000 1.8
@@ -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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog server/Property.cpp server/Prop...,
Sandro Santilli <=