[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] /srv/bzr/gnash/trunk r11552: Partially refactor property lookup for much greater flexibility.,
Benjamin Wolsey <=