gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] /srv/bzr/gnash/trunk r11552: Partially refactor property


From: Benjamin Wolsey
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r11552: Partially refactor property lookup for much greater flexibility.
Date: Thu, 08 Oct 2009 13:31:00 +0200
User-agent: Bazaar (1.16.1)

------------------------------------------------------------
revno: 11552 [merge]
committer: Benjamin Wolsey <address@hidden>
branch nick: trunk
timestamp: Thu 2009-10-08 13:31:00 +0200
message:
  Partially refactor property lookup for much greater flexibility.
  
  Make some corrections and improvements to property lookup, add tests in
  actionscript.all. Various accidental passes in swfdec testsuite.
  
  Drop MovieClip::get_member and handle the remaining special MovieClip
  properties in the course of as_object::get_member and 
getDisplayObjectProperty.
  This could surely be improved more, but is a good intermediate stage.
  
  Rename on_event to notifyEvent.
modified:
  libcore/Button.cpp
  libcore/Button.h
  libcore/DisplayObject.cpp
  libcore/DisplayObject.h
  libcore/InteractiveObject.h
  libcore/MovieClip.cpp
  libcore/MovieClip.h
  libcore/TextField.cpp
  libcore/TextField.h
  libcore/as_object.cpp
  libcore/as_object.h
  libcore/asobj/flash/display/MovieClip_as.cpp
  libcore/movie_root.cpp
  libcore/vm/ExecutableCode.h
  testsuite/actionscript.all/Object.as
  testsuite/swfdec/PASSING
=== modified file 'libcore/Button.cpp'
--- a/libcore/Button.cpp        2009-10-07 07:01:31 +0000
+++ b/libcore/Button.cpp        2009-10-07 11:54:54 +0000
@@ -310,7 +310,7 @@
 
 
 bool
-Button::on_event(const event_id& id)
+Button::notifyEvent(const event_id& id)
 {
     if (unloaded())
     {

=== modified file 'libcore/Button.h'
--- a/libcore/Button.h  2009-10-06 14:18:18 +0000
+++ b/libcore/Button.h  2009-10-07 11:54:54 +0000
@@ -82,7 +82,7 @@
     virtual bool trackAsMenu();
 
        // called from keypress listener only
-       bool on_event(const event_id& id);
+       bool notifyEvent(const event_id& id);
 
        void display(Renderer& renderer);
        

=== modified file 'libcore/DisplayObject.cpp'
--- a/libcore/DisplayObject.cpp 2009-10-07 07:01:31 +0000
+++ b/libcore/DisplayObject.cpp 2009-10-08 10:34:32 +0000
@@ -930,7 +930,6 @@
 getDisplayObjectProperty(as_object& obj, string_table::key key,
         as_value& val)
 {
-    
     DisplayObject& o = static_cast<DisplayObject&>(obj);
 
     // These properties have normal case-sensitivity.
@@ -971,10 +970,20 @@
     const string_table::key noCaseKey = 
st.find(boost::to_lower_copy(propname));
 
     Getters::const_iterator it = getters.find(noCaseKey);
-    if (it == getters.end()) return false;
-
-    val = (*it->second)(o);
-    return true;
+    if (it != getters.end()) {
+        val = (*it->second)(o);
+        return true;
+    }
+
+    // Check MovieClip such as TextField variables.
+    // TODO: check if there's a better way to find these properties.
+    //
+    // Some tests in the swfdec testsuite suggest that these properties are
+    // checked only after the magic properties.
+    MovieClip* mc = dynamic_cast<MovieClip*>(&obj);
+    if (mc && mc->getMovieClipProperty(key, val)) return true;
+
+    return false;
 }
     
 

=== modified file 'libcore/DisplayObject.h'
--- a/libcore/DisplayObject.h   2009-10-07 07:01:31 +0000
+++ b/libcore/DisplayObject.h   2009-10-07 11:54:54 +0000
@@ -604,14 +604,14 @@
     //
     /// Must be overridden or will always return false.
     ///
-    virtual bool on_event(const event_id& /* id */)
+    virtual bool notifyEvent(const event_id& /* id */)
     {
         return false;
     }
 
     /// Queue event in the global action queue.
     //
-    /// on_event(id) will be called by execution of the queued
+    /// notifyEvent(id) will be called by execution of the queued
     /// action
     ///
     void queueEvent(const event_id& id, int lvl);

=== modified file 'libcore/InteractiveObject.h'
--- a/libcore/InteractiveObject.h       2009-10-01 13:19:43 +0000
+++ b/libcore/InteractiveObject.h       2009-10-07 11:54:54 +0000
@@ -110,7 +110,7 @@
 
     virtual void mouseEvent(const event_id& id)
     {
-        on_event(id);
+        notifyEvent(id);
     }
 
     /// Return true if the given point falls in this DisplayObject's shape

=== modified file 'libcore/MovieClip.cpp'
--- a/libcore/MovieClip.cpp     2009-10-07 07:01:18 +0000
+++ b/libcore/MovieClip.cpp     2009-10-08 10:34:32 +0000
@@ -486,33 +486,14 @@
     return _displayList.getDisplayObjectAtDepth(depth);
 }
 
-// Set *val to the value of the named member and
+// Set val to the value of the named member and
 // return true, if we have the named member.
-// Otherwise leave *val alone and return false.
+// Otherwise leave val alone and return false.
 bool
-MovieClip::get_member(string_table::key name_key, as_value* val,
-    string_table::key nsname)
+MovieClip::getMovieClipProperty(string_table::key name_key, as_value& val)
 {
-
-
-    // Own members take precendence over display list items 
-    // (see testcase VarAndCharClash.swf in testsuite/misc-ming.all)
-    as_object* owner = NULL;
-    Property* prop = findProperty(name_key, nsname, &owner);
-    if ( prop && owner == this ) 
-    {
-        try { *val = prop->getValue(*this); }
-        catch (ActionLimitException&) { throw; }
-        catch (ActionTypeError& ex) {
-            log_error(_("Caught exception: %s"), ex.what());
-            return false;
-        }
-        return true;
-    }
-    
     const std::string& name = getStringTable(*this).value(name_key);
-    if (getDisplayObjectProperty(*this, name_key, *val)) return true;
-    
+
     // Try items on our display list.
     DisplayObject* ch;
     if (getSWFVersion(*this) >= 7 ) {
@@ -524,15 +505,10 @@
 
             // If the object is an ActionScript referenciable one we
             // return it, otherwise we return ourselves
-            if ( ch->isActionScriptReferenceable() )
-            {
-                val->set_as_object(ch);
-            }
-            else
-            {
-                val->set_as_object(this);
-            }
-
+            if (ch->isActionScriptReferenceable()) {
+                val = ch;
+            }
+            else val = this;
             return true;
     }
 
@@ -546,28 +522,12 @@
             boost::intrusive_ptr<TextField> tf = i->get();
             if ( tf->getTextDefined() )
             {
-                val->set_string(tf->get_text_value());
+                val = tf->get_text_value();
                 return true;
             }
         }
     }
 
-    // Inherited members come last 
-    // (see testcase VarAndCharClash.swf in testsuite/misc-ming.all)
-    if ( prop )
-    {
-        assert(owner != this);
-        try { *val = prop->getValue(*this); }
-        catch (ActionLimitException&) { throw; }
-        catch (ActionTypeError& ex)
-        {
-                log_error(_("Caught exception: %s"), ex.what());
-                return false;
-        }
-        return true;
-    }
-
-
     return false;
 
 }
@@ -749,10 +709,11 @@
         const action_buffer* buf = *it;
         queueAction(*buf);
     }
+
 }
 
 bool
-MovieClip::on_event(const event_id& id)
+MovieClip::notifyEvent(const event_id& id)
 {
     testInvariant();
 
@@ -2038,7 +1999,7 @@
         constructAsScriptObject(); 
 
         // Tested in testsuite/swfdec/duplicateMovieclip-events.c and
-        // testsuite/swfdec/clone-sprite-events.c not to call on_event
+        // testsuite/swfdec/clone-sprite-events.c not to call notifyEvent
         // immediately.
         queueEvent(event_id::INITIALIZE, movie_root::apINIT);
     }
@@ -2092,7 +2053,7 @@
 
             // Call event handlers *after* setting up the __proto__
             // but *before* calling the registered class constructor
-            on_event(event_id::CONSTRUCT);
+            notifyEvent(event_id::CONSTRUCT);
             eventHandlersInvoked = true;
 
             int swfversion = getSWFVersion(*this);
@@ -2137,7 +2098,7 @@
     /// Invoke event handlers if not done yet
     if ( ! eventHandlersInvoked )
     {
-        on_event(event_id::CONSTRUCT);
+        notifyEvent(event_id::CONSTRUCT);
     }
 }
 
@@ -2316,7 +2277,7 @@
     }
 
     // We want to call a clip-event too if available, see bug #22116
-    on_event(event_id::DATA);
+    notifyEvent(event_id::DATA);
 }
 
 /*private*/

=== modified file 'libcore/MovieClip.h'
--- a/libcore/MovieClip.h       2009-10-07 07:01:18 +0000
+++ b/libcore/MovieClip.h       2009-10-08 10:34:32 +0000
@@ -522,15 +522,9 @@
     void loadVariables(const std::string& urlstr,
             VariablesMethod sendVarsMethod);
 
-    //
-    // ActionScript support
-    //
+    bool getMovieClipProperty(string_table::key name, as_value& val);
 
     // See dox in as_object.h
-    bool get_member(string_table::key name, as_value* val, 
-        string_table::key nsname = 0);
-        
-    // See dox in as_object.h
     virtual bool set_member(string_table::key name, const as_value& val,
         string_table::key nsname = 0, bool ifFound=false);
 
@@ -570,7 +564,7 @@
         int newdepth, as_object* init_object=NULL);
         
     /// Dispatch event handler(s), if any.
-    virtual bool on_event(const event_id& id);
+    virtual bool notifyEvent(const event_id& id);
 
     // inherited from DisplayObject class, see dox in DisplayObject.h
     as_environment& get_environment() {

=== modified file 'libcore/TextField.cpp'
--- a/libcore/TextField.cpp     2009-10-06 07:45:26 +0000
+++ b/libcore/TextField.cpp     2009-10-08 10:02:31 +0000
@@ -584,7 +584,7 @@
     _selection = std::make_pair(start, end);
 }
 bool
-TextField::on_event(const event_id& ev)
+TextField::notifyEvent(const event_id& ev)
 {    
     switch (ev.id())
     {
@@ -2711,11 +2711,15 @@
 
 /// This is called by movie_root when focus is applied to this TextField.
 //
-/// The return value is true if the TextField can recieve focus.
+/// The return value is true if the TextField can receive focus.
+/// The swfdec testsuite suggests that version 5 textfields cannot ever
+/// handle focus.
 bool
 TextField::handleFocus()
 {
 
+    if (getSWFVersion(*this) < 6) return false;
+
     set_invalidated();
 
     /// Select the entire text on focus.

=== modified file 'libcore/TextField.h'
--- a/libcore/TextField.h       2009-10-01 13:19:43 +0000
+++ b/libcore/TextField.h       2009-10-07 11:54:54 +0000
@@ -139,7 +139,7 @@
        }       
 
        /// This function is called as a user-input handler
-       bool on_event(const event_id& id);      
+       bool notifyEvent(const event_id& id);   
 
        const std::string& getVariableName() const
        {

=== modified file 'libcore/as_object.cpp'
--- a/libcore/as_object.cpp     2009-10-04 08:14:49 +0000
+++ b/libcore/as_object.cpp     2009-10-08 09:50:44 +0000
@@ -51,6 +51,96 @@
 
 namespace gnash {
 
+namespace {
+
+    class IsVisible
+    {
+    public:
+        IsVisible(as_object* obj) : _version(getSWFVersion(*obj)) {}
+        bool operator()(const Property* const prop) const {
+            return prop->visible(_version);
+        }
+    private:
+        const int _version;
+
+    };
+
+}
+
+template<typename T>
+class
+as_object::PrototypeRecursor
+{
+public:
+    PrototypeRecursor(as_object* top, const ObjectURI& property)
+        :
+        _object(top),
+        _name(getName(property)),
+        _ns(getNamespace(property)),
+        _iterations(0),
+        _condition(top)
+    {
+        _visited.insert(top);
+    }
+
+    /// Iterate to the next object in the inheritance chain.
+    //
+    /// This function throws an ActionLimitException when the maximum
+    /// number of recursions is reached.
+    //
+    /// @return     false if there is no next object. In this case calling
+    ///             the other functions will abort.
+    bool operator()()
+    {
+        ++_iterations;
+
+        // See swfdec/prototype-recursion-get-?.swf
+               if (_iterations > 256) {
+                       throw ActionLimitException("Lookup depth exceeded.");
+        }
+
+        _object = _object->get_prototype().get();
+
+        // TODO: there is recursion prevention anyway; is this extra 
+        // check for circularity really necessary?
+        if (!_visited.insert(_object).second) return 0;
+        return _object && !_object->_displayObject;
+    }
+
+    /// Return the object reached in searching the chain.
+    //
+    /// This will abort if there is no current object, so make sure
+    /// operator() returns true and that the PrototypeRecursor was
+    /// initialized with a valid as_object.
+    as_object* currentObject() const {
+        assert(_object);
+        return _object;
+    }
+
+    /// Return the wanted property if it exists and satisfies the predicate.
+    //
+    /// This will abort if there is no current object.
+    Property* getProperty(as_object** owner = 0) const {
+
+        assert(_object);
+        Property* prop = _object->_members.getProperty(_name, _ns);
+        
+        if (prop && _condition(prop)) {
+            if (owner) *owner = _object;
+            return prop;
+        }
+        return 0;
+    }
+
+private:
+    as_object* _object;
+    const string_table::key _name;
+    const string_table::key _ns;
+    std::set<const as_object*> _visited;
+    size_t _iterations;
+    T _condition;
+};
+
 // Anonymous namespace used for module-static defs
 namespace {
 
@@ -327,28 +417,35 @@
        }
 }
 
-/// Current order of property lookup
+
+/// Order of property lookup:
 //
-/// If DisplayObject:
-///     DisplayObject magic properties
-///     (DisplayList, TextField variables?)
-/// Own properties up __proto__ chain
-/// __resolve.
+/// 1. Own properties.
+/// 2. If DisplayObject, magic properties
+/// 3. Own properties of all __proto__ objects (a DisplayObject ends the 
chain).
+/// 4. __resolve properties of this object and all __proto__ objects.
 bool
 as_object::get_member(string_table::key name, as_value* val,
        string_table::key nsname)
 {
        assert(val);
-    
-    if (_displayObject) {
-        if (getDisplayObjectProperty(*this, name, *val)) return true;
+
+    PrototypeRecursor<IsVisible> pr(this, ObjectURI(name, nsname));
+       
+       Property* prop = pr.getProperty();
+    if (!prop) {
+        if (_displayObject) {
+            if (getDisplayObjectProperty(*this, name, *val)) return true;
+        }
+        while (pr()) {
+            if ((prop = pr.getProperty())) break;
+        }
     }
-       
-       Property* prop = findProperty(name, nsname);
 
+    // If the property isn't found or doesn't apply to any objects in the
+    // inheritance chain, try the __resolve property.
     if (!prop) {
 
-        /// If the property isn't found, try the __resolve property.
         prop = findProperty(NSV::PROP_uuRESOLVE, nsname);
         if (!prop) return false;
 
@@ -358,6 +455,7 @@
         const std::string& undefinedName = st.value(name);
         log_debug("__resolve exists, calling with '%s'", undefinedName);
 
+        // TODO: we've found the property, don't search for it again.
         *val = callMethod(NSV::PROP_uuRESOLVE, undefinedName);
         return true;
     }
@@ -477,47 +575,13 @@
 as_object::findProperty(string_table::key key, string_table::key nsname, 
        as_object **owner)
 {
-       int swfVersion = getSWFVersion(*this);
-
-       // don't enter an infinite loop looking for __proto__ ...
-       if (key == NSV::PROP_uuPROTOuu && !nsname)
-       {
-               Property* prop = _members.getProperty(key, nsname);
-               // TODO: add ignoreVisibility parameter to allow using 
-        // __proto__ even when not visible ?
-               if (prop && prop->visible(swfVersion))
-               {
-                       if (owner) *owner = this;
-                       return prop;
-               }
-               return 0;
-       }
-
-       // keep track of visited objects, avoid infinite loops.
-       std::set<as_object*> visited;
-
-       int i = 0;
-
-       boost::intrusive_ptr<as_object> obj = this;
-               
-    // This recursion prevention seems not to exist in the PP.
-    // Instead, it stops when its general timeout for the
-    // execution of scripts is reached.
-       while (obj && visited.insert(obj.get()).second)
-       {
-               ++i;
-               if ((i > 255 && swfVersion == 5) || i > 257)
-                       throw ActionLimitException("Lookup depth exceeded.");
-
-               Property* prop = obj->_members.getProperty(key, nsname);
-               if (prop && prop->visible(swfVersion) )
-               {
-                       if (owner) *owner = obj.get();
-                       return prop;
-               }
-               else
-                       obj = obj->get_prototype();
-       }
+
+    PrototypeRecursor<IsVisible> pr(this, ObjectURI(key, nsname));
+
+    do {
+        Property* prop = pr.getProperty(owner);
+        if (prop) return prop;
+    } while (pr());
 
        // No Property found
        return NULL;
@@ -537,9 +601,6 @@
        // 
        if ( prop )     return prop;  // TODO: what about visible ?
 
-       // don't enter an infinite loop looking for __proto__ ...
-       if (key == NSV::PROP_uuPROTOuu) return NULL;
-
        std::set<as_object*> visited;
        visited.insert(this);
 

=== modified file 'libcore/as_object.h'
--- a/libcore/as_object.h       2009-10-04 08:14:49 +0000
+++ b/libcore/as_object.h       2009-10-08 07:53:12 +0000
@@ -54,6 +54,7 @@
     class asName;
     class RunResources;
     class Global_as;
+    class PrototypeRecursor;
 }
 
 namespace gnash {
@@ -1102,7 +1103,9 @@
 #endif // GNASH_USE_GC
 
 private:
- 
+
+    template<typename T> class PrototypeRecursor;
+
     /// DisplayObjects have properties not in the AS inheritance chain
     //
     /// These magic properties are invoked in get_member only if the

=== modified file 'libcore/asobj/flash/display/MovieClip_as.cpp'
--- a/libcore/asobj/flash/display/MovieClip_as.cpp      2009-10-01 13:19:43 
+0000
+++ b/libcore/asobj/flash/display/MovieClip_as.cpp      2009-10-08 09:35:24 
+0000
@@ -363,7 +363,7 @@
     o.init_property("scale9Grid", *getset, *getset, swf8Flags);
 
     // External functions.
-    o.init_member("createTextField", vm.getNative(104, 200), swf6Flags);
+    o.init_member("createTextField", vm.getNative(104, 200));
     o.init_member("getTextSnapshot", 
             gl->createFunction(movieclip_getTextSnapshot), swf6Flags);
 

=== modified file 'libcore/movie_root.cpp'
--- a/libcore/movie_root.cpp    2009-10-07 07:01:31 +0000
+++ b/libcore/movie_root.cpp    2009-10-07 11:54:54 +0000
@@ -1222,13 +1222,13 @@
                        if(down)
                        {
                                // KEY_UP and KEY_DOWN events are unrelated to 
any key!
-                               ch->on_event(event_id(event_id::KEY_DOWN, 
key::INVALID)); 
+                               ch->notifyEvent(event_id(event_id::KEY_DOWN, 
key::INVALID)); 
                                // Pass the unique Gnash key code!
-                               ch->on_event(event_id(event_id::KEY_PRESS, k));
+                               ch->notifyEvent(event_id(event_id::KEY_PRESS, 
k));
                        }
                        else
                        {
-                               ch->on_event(event_id(event_id::KEY_UP, 
key::INVALID));   
+                               ch->notifyEvent(event_id(event_id::KEY_UP, 
key::INVALID));   
                        }
                }
        }
@@ -1272,7 +1272,7 @@
                DisplayObject* const ch = *iter;
                if (!ch->unloaded())
                {
-                       ch->on_event(event);
+                       ch->notifyEvent(event);
                }
        }
 

=== modified file 'libcore/vm/ExecutableCode.h'
--- a/libcore/vm/ExecutableCode.h       2009-07-14 06:01:56 +0000
+++ b/libcore/vm/ExecutableCode.h       2009-10-07 11:54:54 +0000
@@ -172,7 +172,7 @@
 
 };
 
-/// Generic event  (constructed by id, invoked using on_event
+/// Generic event  (constructed by id, invoked using notifyEvent
 class QueuedEvent: public ExecutableCode {
 
 public:
@@ -194,7 +194,7 @@
         // don't execute any events for destroyed DisplayObject.
         if( !_target->isDestroyed() )
         {
-            _target->on_event(_eventId);
+            _target->notifyEvent(_eventId);
         }
     }
 

=== modified file 'testsuite/actionscript.all/Object.as'
--- a/testsuite/actionscript.all/Object.as      2009-08-11 11:45:26 +0000
+++ b/testsuite/actionscript.all/Object.as      2009-10-08 09:18:08 +0000
@@ -918,6 +918,43 @@
 check_equals(resolveCalled, 3);
 check_equals(result, "quibbleDibblePropertyWithASillyName");
 
+result = undefined;
+
+g = {};
+g.udef();
+check_equals(typeof(result), "undefined");
+check_equals(resolveCalled, 3);
+
+g.__proto__ = o;
+g.udef();
+check_equals(typeof(result), "string");
+check_equals(result, "udef");
+check_equals(resolveCalled, 4);
+
+/// Check DisplayObject property lookup.
+
+/// Apparently no DisplayObjects are included in the prototype
+/// recursion.
+
+nonk = {};
+nonk.__proto__ = _root;
+_root.bobo = "hi there";
+_root.__proto__.ubble = "U!";
+
+check(!nonk._width);
+check(!nonk.bobo);
+check(!nonk.ubble);
+
+check(nonk.__proto__._width);
+check_equals(nonk.__proto__.bobo, "hi there");
+check(nonk.__proto__);
+
+_root.createTextField("tf", getNextHighestDepth(), 0, 0, 10, 10);
+nonk.__proto__ = _root.tf;
+check(nonk.__proto__);
+check(!nonk._width);
+check(nonk.__proto__._width);
+
 ////////////////////////////////
 
 // Messing about here with global classes may ruin later tests, so don't add
@@ -950,10 +987,10 @@
 check_equals(typeof(o), "undefined");
 
 #if OUTPUT_VERSION <= 5
-totals(116);
+totals(130);
 #endif
 
 #if OUTPUT_VERSION >= 6
-totals(304);
+totals(318);
 #endif
 

=== modified file 'testsuite/swfdec/PASSING'
--- a/testsuite/swfdec/PASSING  2009-10-07 07:16:45 +0000
+++ b/testsuite/swfdec/PASSING  2009-10-08 09:50:27 +0000
@@ -315,6 +315,7 @@
 crash-0.7.1-uncompressed-half-samples-6.swf:7ea0fa524a97ac33fa2f76c13ac9c09c
 crash-0.7.1-uncompressed-half-samples-7.swf:bd828f2702ae2d96c31f0ec74e8eb2d9
 crash-0.7.1-uncompressed-half-samples-8.swf:8043058b7c22459d2f8ef3f69884cf04
+crash-0.7.2-TextField-replace-infloop-5.swf:f36e906743e23c4918becdb34d6c08cf
 crash-0.7.2-TextField-replace-infloop-6.swf:a75b13bb89ab3f2fc673ba2af3fa856f
 crash-0.7.5-draw-on-disposed-bitmap-5.swf:073596b26cce990e4a32088da6c19f4c
 crash-0.7.5-draw-on-disposed-bitmap-6.swf:63105692441eb2330261237f05b02d32
@@ -324,6 +325,7 @@
 crash-0.7.5-duplicate-6.swf:559cd7f51f4c2bb03ad3fb8050aac403
 crash-0.7.5-duplicate-7.swf:87c22c444cf6d4a71bafbd1e357028be
 crash-0.7.5-duplicate-8.swf:90c1a16d3f22dc579abca718da6822dd
+crash-0.7.5-textlayout-5.swf:9972229778edebb4772da9c90c591b8f
 crash-0.8.0-huffmann-table-5.swf:6819164ec8cc6299bbd6d0d05a7428d8
 crash-0.8.0-huffmann-table-6.swf:a269bc06dd35de125087b2444622f130
 crash-0.8.0-huffmann-table-7.swf:2134c93509e1fc5d2eff527e79e1ea60
@@ -955,9 +957,14 @@
 propflags-set-prototype-9.swf:17684d704cf7f8c6b69e81f15bab8823
 prototype-addProperty-5.swf:1d9ac80542b3a9238ed09e78bdb8c563
 prototype-addProperty-6.swf:e4a54c188bd5ef8bde1d99ad06317644
+prototype-movie-5.swf:dfc767bc182145cc5588b90c42096a36
+prototype-movie-6.swf:076e99fae7f4d43132022b0666a0eefe
+prototype-movie-7.swf:d96c27b56d0da8fb93bf46ba0c9ea15d
+prototype-movie-8.swf:aedd31cfc64ec96c744def4927523de8
 prototype-propflags-5.swf:43f4ffa51653f54d0182610a01db8f1f
 prototype-propflags-8.swf:3c6f02bf6a3348879f3f50c28ee599cb
 prototype-recursion-addProperty-5.swf:cb268cb74f2ebda340868ef624c02672
+prototype-recursion-get-5.swf:fbb029ff389d27c79338d8bc7248137b
 prototype-recursion-get-6.swf:47fa73c88db1f3acedd832e2ddec6315
 prototype-recursion-get-7.swf:766d65bdfdb4a79073728607ce8dc0d3
 prototype-recursion-get-8.swf:9e1f31c39062dffaa99e9db4ca28838f
@@ -987,6 +994,7 @@
 remove-depths-6.swf:0c3bb7456c11fbff848efc03a29efe30
 remove-depths-7.swf:4172052b6f6e97339c52d6315c1c139b
 remove-depths-8.swf:55303aac24d7e87427ba716c1d50e631
+remove-movie-5.swf:dc86624c3d6fd8e32d2a272ab4e04413
 removesprite-depths-5.swf:03c73fab9efd3909214def0f6b233486
 removesprite-depths-6.swf:039c217ab8233668d64bffd2e7a6ef79
 removesprite-depths-7.swf:b792dc92c63978c09f9c937a2d5a24cf
@@ -1271,11 +1279,13 @@
 targetpath-6.swf:a359790235e622d7d7c3d30376dcee2c
 targetpath-7.swf:4e4f761384cb7fc41954c04f009ca55f
 targetpath-7.swf:b280daedd3a8f4e3d0defd38ff2c2b2a
+text-field-autosize-layout-update-5.swf:3d7958ab7feba680bf7b2a22e8774542
 text-field-get-text-format-5.swf:1e3a1b39de01a627e3d9cf327b6fcefa
 text-field-hscroll-5.swf:f0b6b2bdc087164334da9fad1ca0140a
 text-field-hscroll-6.swf:7d69d4a6bcadb7dccaaa620f1262f482
 text-field-hscroll-7.swf:5d363482002e2bed17c793dff9c7671b
 text-field-hscroll-8.swf:7f0fb367212b71f3e52076fd743c886b
+text-field-html-new-format-5.swf:478143758da9587b72ec18b712b37acb
 text-field-init-5.swf:f9c095838e41c5b00de362cef6c20167
 text-field-init-native-5.swf:881f1f6314617bd2d789fa99f9765e60
 text-field-init-native-6.swf:39c6fb4139696e3334b64fb4e48376e1
@@ -1283,12 +1293,14 @@
 text-field-init-native-8.swf:86e8f2d4419f1747735f180d22030701
 text-field-replace-text-5.swf:571ec2f1d311c65f98e5e7f76392cb9e
 text-field-replace-text-5.swf:e89d3694aef9f668e714916e8db3195f
+text-field-scroll-5.swf:0753abed58f12bc1bcfef6785730e5c9
 text-field-set-text-format-5.swf:f576da900f9e9b8d911f6791d4114983
 text-field-tag-variable-change.swf:4c03970cb4293453219d053f3c07d024
 text-field-tag-variable.swf:a9e93d3ab26a08dafb196ffd7450e4f7
 text-field-type-of-6.swf:8a88f247b547bccb14060801c9cf6443
 text-field-type-of-7.swf:7593f12ceefba6925ce6abcbc01751bf
 text-field-type-of-8.swf:bac748e2b13ba9331c27f5ee45109ac4
+text-field-variable-5.swf:20821d0f34ab14b27bbc55f27c70c57f
 textformat-init-5.swf:52dec30885359d5bdda450588076eb10
 textformat-init-5.swf:d45b857148b96635af7d18855cb067ae
 textformat-properties-7.swf:390495b699f387f9647c8cf47afa2175


reply via email to

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