gnash-commit
[Top][All Lists]
Advanced

[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)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]