gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] /srv/bzr/gnash/trunk r11637: Reduce size of as_object cla


From: Benjamin Wolsey
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r11637: Reduce size of as_object class by only assign triggers when used. This
Date: Fri, 20 Nov 2009 12:55:09 +0100
User-agent: Bazaar (1.16.1)

------------------------------------------------------------
revno: 11637 [merge]
committer: Benjamin Wolsey <address@hidden>
branch nick: trunk
timestamp: Fri 2009-11-20 12:55:09 +0100
message:
  Reduce size of as_object class by only assign triggers when used. This
  is relatively rare, so we shouldn't have to worry about them most of the
  time.
modified:
  libcore/as_object.cpp
  libcore/as_object.h
=== modified file 'libcore/as_object.cpp'
--- a/libcore/as_object.cpp     2009-11-18 13:09:52 +0000
+++ b/libcore/as_object.cpp     2009-11-20 11:11:54 +0000
@@ -295,35 +295,33 @@
 as_object::add_property(const std::string& name, as_function& getter,
                as_function* setter)
 {
-       string_table &st = getStringTable(*this);
+       string_table& st = getStringTable(*this);
        string_table::key k = st.find(name);
 
        as_value cacheVal;
 
        Property* prop = _members.getProperty(k);
-       if ( prop )
-       {
+
+    if (prop) {
                cacheVal = prop->getCache();
-
         // Used to return the return value of addGetterSetter, but this
         // is always true.
                _members.addGetterSetter(k, getter, setter, cacheVal);
-
         return;
                // NOTE: watch triggers not called when adding a new
         // getter-setter property
        }
-       else
-       {
+       else {
 
                _members.addGetterSetter(k, getter, setter, cacheVal);
 
-#if 1
+        // Nothing more to do if there are no triggers.
+        if (!_trigs.get()) return;
+
                // check if we have a trigger, if so, invoke it
                // and set val to its return
-               TriggerContainer::iterator trigIter = _trigs.find(ObjectURI(k, 
0));
-               if ( trigIter != _trigs.end() )
-               {
+               TriggerContainer::iterator trigIter = _trigs->find(ObjectURI(k, 
0));
+               if (trigIter != _trigs->end()) {
                        Trigger& trig = trigIter->second;
 
                        log_debug("add_property: property %s is being watched, "
@@ -334,15 +332,13 @@
                        // so we check for its existence again, and do NOT put
                        // it back in if it was deleted
                        prop = _members.getProperty(k);
-                       if ( ! prop )
-                       {
+                       if (!prop) {
                                log_debug("Property %s deleted by trigger on 
create "
                         "(getter-setter)", name);
                                return;
                        }
                        prop->setCache(cacheVal);
                }
-#endif
                return;
        }
 }
@@ -591,10 +587,12 @@
 {
 
     // check if we have a trigger, if so, invoke it
-    // and set val to it's return
-    TriggerContainer::iterator trigIter = _trigs.find(uri);
+    // and set val to its return
+    TriggerContainer::iterator trigIter;
     
-    if (trigIter == _trigs.end()) {
+    // If there are no triggers or the trigger is not found, just set
+    // the property.
+    if (!_trigs.get() || (trigIter = _trigs->find(uri)) == _trigs->end()) {
         if (prop) {
             prop->setValue(*this, val);
             prop->clearVisible(getSWFVersion(*this));
@@ -605,7 +603,7 @@
     Trigger& trig = trigIter->second;
 
     if (trig.dead()) {
-        _trigs.erase(trigIter);
+        _trigs->erase(trigIter);
         return;
     }
 
@@ -622,7 +620,7 @@
     as_value newVal = trig.call(curVal, val, *this);
     
     // This is a particularly clear and concise way of removing dead triggers.
-    EraseIf(_trigs, boost::bind(boost::mem_fn(&Trigger::dead), 
+    EraseIf(*_trigs, boost::bind(boost::mem_fn(&Trigger::dead), 
             boost::bind(SecondElement<TriggerContainer::value_type>(), _1)));
                     
     // The trigger call could have deleted the property,
@@ -1167,10 +1165,12 @@
        ObjectURI k(key, ns);
        std::string propname = getStringTable(*this).value(key);
 
-       TriggerContainer::iterator it = _trigs.find(k);
-       if (it == _trigs.end())
+    if (!_trigs.get()) _trigs.reset(new TriggerContainer);
+
+       TriggerContainer::iterator it = _trigs->find(k);
+       if (it == _trigs->end())
        {
-               return _trigs.insert(
+               return _trigs->insert(
                 std::make_pair(k, Trigger(propname, trig, cust))).second;
        }
        it->second = Trigger(propname, trig, cust);
@@ -1180,16 +1180,16 @@
 bool
 as_object::unwatch(string_table::key key, string_table::key ns)
 {
-       TriggerContainer::iterator trigIter = _trigs.find(ObjectURI(key, ns));
-       if ( trigIter == _trigs.end() )
-       {
+    if (!_trigs.get()) return false; 
+
+       TriggerContainer::iterator trigIter = _trigs->find(ObjectURI(key, ns));
+       if (trigIter == _trigs->end()) {
                log_debug("No watch for property %s",
                 getStringTable(*this).value(key));
                return false;
        }
        Property* prop = _members.getProperty(key, ns);
-       if ( prop && prop->isGetterSetter() )
-       {
+       if (prop && prop->isGetterSetter()) {
                log_debug("Watch on %s not removed (is a getter-setter)",
                 getStringTable(*this).value(key));
                return false;
@@ -1204,11 +1204,13 @@
 {
        _members.setReachable();
 
-       for (TriggerContainer::const_iterator it = _trigs.begin();
-                       it != _trigs.end(); ++it)
-       {
-               it->second.setReachable();
-       }
+    if (_trigs.get()) {
+        for (TriggerContainer::const_iterator it = _trigs->begin();
+                it != _trigs->end(); ++it)
+        {
+            it->second.setReachable();
+        }
+    }
 
     /// Proxy objects can contain references to other as_objects.
     if (_relay) _relay->setReachable();
@@ -1229,12 +1231,12 @@
 {
     assert(!_dead);
 
-       if ( _executing ) return newval;
+       if (_executing) return newval;
 
        _executing = true;
 
        try {
-               as_environment env(VM::get()); // TODO: get VM in some other 
way 
+               as_environment env(getVM(this_obj));
 
         fn_call::Args args;
         args += _propname, oldval, newval, _customArg;
@@ -1248,8 +1250,7 @@
                return ret;
 
        }
-       catch (GnashException&)
-       {
+       catch (GnashException&) {
                _executing = false;
                throw;
        }

=== modified file 'libcore/as_object.h'
--- a/libcore/as_object.h       2009-11-18 13:09:52 +0000
+++ b/libcore/as_object.h       2009-11-20 11:11:54 +0000
@@ -1078,7 +1078,7 @@
     std::list<as_object*> mInterfaces;
 
     typedef std::map<ObjectURI, Trigger> TriggerContainer;
-    TriggerContainer _trigs;
+    boost::scoped_ptr<TriggerContainer> _trigs;
 };
 
 /// Function objects for visiting properties.


reply via email to

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