[Swfdec-commits] 6 commits - swfdec/swfdec_as_array.c swfdec/swfdec_as_context.c swfdec/swfdec_as_object.c swfdec/swfdec_as_strings.c test/trace

Pekka Lampila medar at kemper.freedesktop.org
Wed Jul 23 05:18:43 PDT 2008


 swfdec/swfdec_as_array.c                        |    2 
 swfdec/swfdec_as_context.c                      |    2 
 swfdec/swfdec_as_object.c                       |   35 ++++++
 swfdec/swfdec_as_strings.c                      |    1 
 test/trace/Makefile.am                          |   20 +++
 test/trace/object-resolve-5.swf                 |binary
 test/trace/object-resolve-5.swf.trace           |   38 +++++++
 test/trace/object-resolve-6.swf                 |binary
 test/trace/object-resolve-6.swf.trace           |   36 ++++++
 test/trace/object-resolve-7.swf                 |binary
 test/trace/object-resolve-7.swf.trace           |   41 +++++++
 test/trace/object-resolve-8.swf                 |binary
 test/trace/object-resolve-8.swf.trace           |   41 +++++++
 test/trace/object-resolve-propflags-5.swf       |binary
 test/trace/object-resolve-propflags-5.swf.trace |   60 +++++++++++
 test/trace/object-resolve-propflags-6.swf       |binary
 test/trace/object-resolve-propflags-6.swf.trace |   60 +++++++++++
 test/trace/object-resolve-propflags-7.swf       |binary
 test/trace/object-resolve-propflags-7.swf.trace |   58 ++++++++++
 test/trace/object-resolve-propflags-8.swf       |binary
 test/trace/object-resolve-propflags-8.swf.trace |   57 ++++++++++
 test/trace/object-resolve-propflags-9.swf       |binary
 test/trace/object-resolve-propflags-9.swf.trace |   56 ++++++++++
 test/trace/object-resolve-propflags.as          |   22 ++++
 test/trace/object-resolve.as                    |  129 ++++++++++++++++++++++++
 25 files changed, 654 insertions(+), 4 deletions(-)

New commits:
commit 651a4d6c9854711c8c1e943ca0621230a69150d1
Merge: 0513f3c... 11aa51d...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Jul 23 15:15:05 2008 +0300

    Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec

commit 0513f3c270629372e850b0f93b49dc84c8f66ef9
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Jul 22 11:40:08 2008 +0300

    Update swfdec_as_context_use_mem documentation, it no longer has a return value

diff --git a/swfdec/swfdec_as_context.c b/swfdec/swfdec_as_context.c
index cdd7291..4fc4c07 100644
--- a/swfdec/swfdec_as_context.c
+++ b/swfdec/swfdec_as_context.c
@@ -215,8 +215,6 @@ swfdec_as_context_try_use_mem (SwfdecAsContext *context, gsize bytes)
  * keeps track of the memory that script code consumes. If too much memory is
  * in use, this function may decide to stop the script engine with an out of
  * memory error.
- *
- * Returns: %TRUE if the memory could be allocated. %FALSE on OOM.
  **/
 void
 swfdec_as_context_use_mem (SwfdecAsContext *context, gsize bytes)
commit ac3fd1207c73636919c6b116a43453cff2c24aaf
Merge: 5f31572... 7cb70c8...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Tue Jul 22 11:38:21 2008 +0300

    Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec

commit 5f315724ef6019f6064ef6067614e030e2be88ee
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jul 21 14:18:34 2008 +0300

    Add a test for Object.__resolve's interaction with propflags

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 4ab3d66..6be1d8f 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -2363,6 +2363,17 @@ EXTRA_DIST = \
 	object-resolve-7.swf.trace \
 	object-resolve-8.swf \
 	object-resolve-8.swf.trace \
+	object-resolve-propflags.as \
+	object-resolve-propflags-5.swf \
+	object-resolve-propflags-5.swf.trace \
+	object-resolve-propflags-6.swf \
+	object-resolve-propflags-6.swf.trace \
+	object-resolve-propflags-7.swf \
+	object-resolve-propflags-7.swf.trace \
+	object-resolve-propflags-8.swf \
+	object-resolve-propflags-8.swf.trace \
+	object-resolve-propflags-9.swf \
+	object-resolve-propflags-9.swf.trace \
 	object-valueof.as \
 	object-valueof-5.swf \
 	object-valueof-5.swf.trace \
diff --git a/test/trace/object-resolve-propflags-5.swf b/test/trace/object-resolve-propflags-5.swf
new file mode 100644
index 0000000..bfd89cc
Binary files /dev/null and b/test/trace/object-resolve-propflags-5.swf differ
diff --git a/test/trace/object-resolve-propflags-5.swf.trace b/test/trace/object-resolve-propflags-5.swf.trace
new file mode 100644
index 0000000..7e70b5e
--- /dev/null
+++ b/test/trace/object-resolve-propflags-5.swf.trace
@@ -0,0 +1,60 @@
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+__resolve: 7
+resolved
+hello
+hello
+__resolve: 10
+resolved
+hello
+__resolve: 12
+resolved
+__resolve: 13
+resolved
+flags for resolve: 0
+__resolve: hello
+resolved
+flags for resolve: 1
+__resolve: hello
+resolved
+flags for resolve: 2
+__resolve: hello
+resolved
+flags for resolve: 3
+__resolve: hello
+resolved
+flags for resolve: 4
+__resolve: hello
+resolved
+flags for resolve: 5
+__resolve: hello
+resolved
+flags for resolve: 6
+__resolve: hello
+resolved
+flags for resolve: 7
+__resolve: hello
+resolved
+flags for resolve: 8
+__resolve: hello
+resolved
+flags for resolve: 9
+__resolve: hello
+resolved
+flags for resolve: 10
+__resolve: hello
+resolved
+flags for resolve: 11
+__resolve: hello
+resolved
+flags for resolve: 12
+__resolve: hello
+resolved
+flags for resolve: 13
+__resolve: hello
+resolved
diff --git a/test/trace/object-resolve-propflags-6.swf b/test/trace/object-resolve-propflags-6.swf
new file mode 100644
index 0000000..d1a8592
Binary files /dev/null and b/test/trace/object-resolve-propflags-6.swf differ
diff --git a/test/trace/object-resolve-propflags-6.swf.trace b/test/trace/object-resolve-propflags-6.swf.trace
new file mode 100644
index 0000000..31a092d
--- /dev/null
+++ b/test/trace/object-resolve-propflags-6.swf.trace
@@ -0,0 +1,60 @@
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+__resolve: 8
+resolved
+hello
+__resolve: 10
+resolved
+hello
+__resolve: 12
+resolved
+__resolve: 13
+resolved
+flags for resolve: 0
+__resolve: hello
+resolved
+flags for resolve: 1
+__resolve: hello
+resolved
+flags for resolve: 2
+__resolve: hello
+resolved
+flags for resolve: 3
+__resolve: hello
+resolved
+flags for resolve: 4
+__resolve: hello
+resolved
+flags for resolve: 5
+__resolve: hello
+resolved
+flags for resolve: 6
+__resolve: hello
+resolved
+flags for resolve: 7
+__resolve: hello
+resolved
+flags for resolve: 8
+__resolve: hello
+resolved
+flags for resolve: 9
+__resolve: hello
+resolved
+flags for resolve: 10
+__resolve: hello
+resolved
+flags for resolve: 11
+__resolve: hello
+resolved
+flags for resolve: 12
+__resolve: hello
+resolved
+flags for resolve: 13
+__resolve: hello
+resolved
diff --git a/test/trace/object-resolve-propflags-7.swf b/test/trace/object-resolve-propflags-7.swf
new file mode 100644
index 0000000..f9fb0d4
Binary files /dev/null and b/test/trace/object-resolve-propflags-7.swf differ
diff --git a/test/trace/object-resolve-propflags-7.swf.trace b/test/trace/object-resolve-propflags-7.swf.trace
new file mode 100644
index 0000000..64e39eb
--- /dev/null
+++ b/test/trace/object-resolve-propflags-7.swf.trace
@@ -0,0 +1,58 @@
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+__resolve: 12
+resolved
+__resolve: 13
+resolved
+flags for resolve: 0
+__resolve: hello
+resolved
+flags for resolve: 1
+__resolve: hello
+resolved
+flags for resolve: 2
+__resolve: hello
+resolved
+flags for resolve: 3
+__resolve: hello
+resolved
+flags for resolve: 4
+__resolve: hello
+resolved
+flags for resolve: 5
+__resolve: hello
+resolved
+flags for resolve: 6
+__resolve: hello
+resolved
+flags for resolve: 7
+__resolve: hello
+resolved
+flags for resolve: 8
+__resolve: hello
+resolved
+flags for resolve: 9
+__resolve: hello
+resolved
+flags for resolve: 10
+__resolve: hello
+resolved
+flags for resolve: 11
+__resolve: hello
+resolved
+flags for resolve: 12
+__resolve: hello
+resolved
+flags for resolve: 13
+__resolve: hello
+resolved
diff --git a/test/trace/object-resolve-propflags-8.swf b/test/trace/object-resolve-propflags-8.swf
new file mode 100644
index 0000000..adfec04
Binary files /dev/null and b/test/trace/object-resolve-propflags-8.swf differ
diff --git a/test/trace/object-resolve-propflags-8.swf.trace b/test/trace/object-resolve-propflags-8.swf.trace
new file mode 100644
index 0000000..2eff3e1
--- /dev/null
+++ b/test/trace/object-resolve-propflags-8.swf.trace
@@ -0,0 +1,57 @@
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+__resolve: 13
+resolved
+flags for resolve: 0
+__resolve: hello
+resolved
+flags for resolve: 1
+__resolve: hello
+resolved
+flags for resolve: 2
+__resolve: hello
+resolved
+flags for resolve: 3
+__resolve: hello
+resolved
+flags for resolve: 4
+__resolve: hello
+resolved
+flags for resolve: 5
+__resolve: hello
+resolved
+flags for resolve: 6
+__resolve: hello
+resolved
+flags for resolve: 7
+__resolve: hello
+resolved
+flags for resolve: 8
+__resolve: hello
+resolved
+flags for resolve: 9
+__resolve: hello
+resolved
+flags for resolve: 10
+__resolve: hello
+resolved
+flags for resolve: 11
+__resolve: hello
+resolved
+flags for resolve: 12
+__resolve: hello
+resolved
+flags for resolve: 13
+__resolve: hello
+resolved
diff --git a/test/trace/object-resolve-propflags-9.swf b/test/trace/object-resolve-propflags-9.swf
new file mode 100644
index 0000000..6eee4f0
Binary files /dev/null and b/test/trace/object-resolve-propflags-9.swf differ
diff --git a/test/trace/object-resolve-propflags-9.swf.trace b/test/trace/object-resolve-propflags-9.swf.trace
new file mode 100644
index 0000000..f0f73e6
--- /dev/null
+++ b/test/trace/object-resolve-propflags-9.swf.trace
@@ -0,0 +1,56 @@
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+hello
+flags for resolve: 0
+__resolve: hello
+resolved
+flags for resolve: 1
+__resolve: hello
+resolved
+flags for resolve: 2
+__resolve: hello
+resolved
+flags for resolve: 3
+__resolve: hello
+resolved
+flags for resolve: 4
+__resolve: hello
+resolved
+flags for resolve: 5
+__resolve: hello
+resolved
+flags for resolve: 6
+__resolve: hello
+resolved
+flags for resolve: 7
+__resolve: hello
+resolved
+flags for resolve: 8
+__resolve: hello
+resolved
+flags for resolve: 9
+__resolve: hello
+resolved
+flags for resolve: 10
+__resolve: hello
+resolved
+flags for resolve: 11
+__resolve: hello
+resolved
+flags for resolve: 12
+__resolve: hello
+resolved
+flags for resolve: 13
+__resolve: hello
+resolved
diff --git a/test/trace/object-resolve-propflags.as b/test/trace/object-resolve-propflags.as
new file mode 100644
index 0000000..f102940
--- /dev/null
+++ b/test/trace/object-resolve-propflags.as
@@ -0,0 +1,22 @@
+// makeswf -v 7 -s 200x150 -r 1 -o settarget-remove.swf settarget-remove.as
+
+var o = {};
+o.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+for (var i = 0; i <= 13; i++) {
+  o[i] = "hello";
+  ASSetPropFlags (o, i, 1 << i, 0);
+  trace (o[i]);
+}
+
+for (var i = 0; i <= 13; i++) {
+  ASSetPropFlags (o, "__resolve", 1 << i, 0);
+  trace ("flags for resolve: " + i);
+  trace (o["hello"]);
+  ASSetPropFlags (o, "__resolve", 0, 1 << i);
+}
+
+getURL ("fscommand:quit", "");
commit fe5e509ba94617d93050a6ef9dcf8c28c9835b6c
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jul 21 14:12:29 2008 +0300

    Add a test for Object.__resolve

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 5196770..4ab3d66 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -2354,6 +2354,15 @@ EXTRA_DIST = \
 	object-properties-7.swf.trace \
 	object-properties-8.swf \
 	object-properties-8.swf.trace \
+	object-resolve.as \
+	object-resolve-5.swf \
+	object-resolve-5.swf.trace \
+	object-resolve-6.swf \
+	object-resolve-6.swf.trace \
+	object-resolve-7.swf \
+	object-resolve-7.swf.trace \
+	object-resolve-8.swf \
+	object-resolve-8.swf.trace \
 	object-valueof.as \
 	object-valueof-5.swf \
 	object-valueof-5.swf.trace \
diff --git a/test/trace/object-resolve-5.swf b/test/trace/object-resolve-5.swf
new file mode 100644
index 0000000..8dd3208
Binary files /dev/null and b/test/trace/object-resolve-5.swf differ
diff --git a/test/trace/object-resolve-5.swf.trace b/test/trace/object-resolve-5.swf.trace
new file mode 100644
index 0000000..1ee2abf
--- /dev/null
+++ b/test/trace/object-resolve-5.swf.trace
@@ -0,0 +1,38 @@
+-- normal
+__resolve: world
+resolved
+__resolve: wORld
+resolved
+assigned
+assigned
+-- with
+assigned
+assigned
+__resolve: missing
+resolved
+-- __proto__
+__resolve: world
+resolved
+-- variable in __proto__
+assigned
+-- __proto__, undefined in the way
+undefined
+-- __proto__, number in the way
+undefined
+-- __proto__, Object in the way
+undefined
+-- addProperty
+undefined
+assigned
+-- addProperty and normal in __proto__
+__proto__.__resolve: world
+resolved
+assigned
+__resolve: addProperty
+-- addProperty and normal together
+__resolve: world
+resolved
+assigned
+-- yaragh
+undefined
+assigned
diff --git a/test/trace/object-resolve-6.swf b/test/trace/object-resolve-6.swf
new file mode 100644
index 0000000..808a738
Binary files /dev/null and b/test/trace/object-resolve-6.swf differ
diff --git a/test/trace/object-resolve-6.swf.trace b/test/trace/object-resolve-6.swf.trace
new file mode 100644
index 0000000..64073ac
--- /dev/null
+++ b/test/trace/object-resolve-6.swf.trace
@@ -0,0 +1,36 @@
+-- normal
+__resolve: world
+resolved
+__resolve: wORld
+resolved
+assigned
+assigned
+-- with
+assigned
+assigned
+__resolve: missing
+resolved
+-- __proto__
+__resolve: world
+resolved
+-- variable in __proto__
+assigned
+-- __proto__, undefined in the way
+undefined
+-- __proto__, number in the way
+undefined
+-- __proto__, Object in the way
+undefined
+-- addProperty
+undefined
+assigned
+-- addProperty and normal in __proto__
+undefined
+assigned
+-- addProperty and normal together
+__resolve: world
+resolved
+assigned
+-- yaragh
+undefined
+assigned
diff --git a/test/trace/object-resolve-7.swf b/test/trace/object-resolve-7.swf
new file mode 100644
index 0000000..bf4afbc
Binary files /dev/null and b/test/trace/object-resolve-7.swf differ
diff --git a/test/trace/object-resolve-7.swf.trace b/test/trace/object-resolve-7.swf.trace
new file mode 100644
index 0000000..ab6190e
--- /dev/null
+++ b/test/trace/object-resolve-7.swf.trace
@@ -0,0 +1,41 @@
+-- normal
+__resolve: world
+resolved
+__resolve: wORld
+resolved
+assigned
+__resolve: wORld
+resolved
+-- with
+assigned
+__resolve: wORld
+resolved
+__resolve: missing
+resolved
+-- __proto__
+__resolve: world
+resolved
+-- variable in __proto__
+assigned
+-- __proto__, undefined in the way
+__resolve: world
+resolved
+-- __proto__, number in the way
+__resolve: world
+resolved
+-- __proto__, Object in the way
+undefined
+-- addProperty
+undefined
+assigned
+-- addProperty and normal in __proto__
+__proto__.__resolve: world
+resolved
+assigned
+-- addProperty and normal together
+__resolve: world
+resolved
+assigned
+-- yaragh
+undefined
+assigned
diff --git a/test/trace/object-resolve-8.swf b/test/trace/object-resolve-8.swf
new file mode 100644
index 0000000..ff0184d
Binary files /dev/null and b/test/trace/object-resolve-8.swf differ
diff --git a/test/trace/object-resolve-8.swf.trace b/test/trace/object-resolve-8.swf.trace
new file mode 100644
index 0000000..ab6190e
--- /dev/null
+++ b/test/trace/object-resolve-8.swf.trace
@@ -0,0 +1,41 @@
+-- normal
+__resolve: world
+resolved
+__resolve: wORld
+resolved
+assigned
+__resolve: wORld
+resolved
+-- with
+assigned
+__resolve: wORld
+resolved
+__resolve: missing
+resolved
+-- __proto__
+__resolve: world
+resolved
+-- variable in __proto__
+assigned
+-- __proto__, undefined in the way
+__resolve: world
+resolved
+-- __proto__, number in the way
+__resolve: world
+resolved
+-- __proto__, Object in the way
+undefined
+-- addProperty
+undefined
+assigned
+-- addProperty and normal in __proto__
+__proto__.__resolve: world
+resolved
+assigned
+-- addProperty and normal together
+__resolve: world
+resolved
+assigned
+-- yaragh
+undefined
+assigned
diff --git a/test/trace/object-resolve.as b/test/trace/object-resolve.as
new file mode 100644
index 0000000..f640b68
--- /dev/null
+++ b/test/trace/object-resolve.as
@@ -0,0 +1,129 @@
+// makeswf -v 7 -s 200x150 -r 15 -o object-resolve.swf object-resolve.as
+
+var o = {};
+o.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+trace ("-- normal");
+trace (o.world);
+trace (o.wORld);
+o.world = "assigned";
+trace (o.world);
+trace (o.wORld);
+
+trace ("-- with");
+with (o) {
+  trace (world);
+  trace (wORld);
+  trace (missing);
+}
+
+var o = { __proto__: {} };
+o.__proto__.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+trace ("-- __proto__");
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+o.__proto__.world = "assigned";
+
+trace ("-- variable in __proto__");
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = undefined;
+o.__proto__.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+trace ("-- __proto__, undefined in the way");
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = 42;
+o.__proto__.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+trace ("-- __proto__, number in the way");
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = new Object ();
+o.__proto__.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+
+trace ("-- __proto__, Object in the way");
+trace (o.world);
+
+function get () {
+  trace ("get");
+  return function () {
+    trace ("__resolve: " + arguments);
+    return "resolved";
+  };
+}
+
+function set () {
+  trace ("set: " + arguments);
+}
+
+var o = {};
+o.addProperty ("__resolve", get, set);
+trace ("-- addProperty");
+trace (o.world);
+o.world = "assigned";
+trace (o.world);
+
+var o = { __proto__: {} };
+o.addProperty ("__resolve", get, set);
+o.__proto__.__resolve = function () {
+  trace ("__proto__.__resolve: " + arguments);
+  return "resolved";
+};
+trace ("-- addProperty and normal in __proto__");
+trace (o.world);
+o.world = "assigned";
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = function () {
+  trace ("__resolve: " + arguments);
+  return "resolved";
+};
+o.addProperty ("__resolve", get, set);
+o.__proto__.__resolve = function () {
+  trace ("__proto__.__resolve: " + arguments);
+  return "resolved";
+};
+trace ("-- addProperty and normal together");
+trace (o.world);
+o.world = "assigned";
+trace (o.world);
+
+var o = { __proto__: {} };
+o.__resolve = new Object ();
+o.addProperty ("__resolve", get, set);
+o.__proto__.__resolve = function () {
+  trace ("__proto__.__resolve: " + arguments);
+  return "resolved";
+};
+trace ("-- yaragh");
+trace (o.world);
+o.world = "assigned";
+trace (o.world);
+
+getURL ("fscommand:quit", "");
commit 3ff6f65ccebba724d1dcd43fb5668584e704854a
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Mon Jul 21 14:08:54 2008 +0300

    Implement Object.__resolve
    
    It's a function that is called when a property is not found

diff --git a/swfdec/swfdec_as_array.c b/swfdec/swfdec_as_array.c
index 070f0ab..b4435e2 100644
--- a/swfdec/swfdec_as_array.c
+++ b/swfdec/swfdec_as_array.c
@@ -590,7 +590,7 @@ swfdec_as_array_new (SwfdecAsContext *context)
   if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
     swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
 
-  swfdec_as_array_set_length (SWFDEC_AS_ARRAY (ret), 0);
+  swfdec_as_array_set_length_object (ret, 0);
 
   return ret;
 }
diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index a590d5e..8ec5cca 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -935,7 +935,7 @@ swfdec_as_object_get_variable_and_flags (SwfdecAsObject *object,
   guint i;
   SwfdecAsValue tmp_val;
   guint tmp_flags;
-  SwfdecAsObject *tmp_pobject, *cur;
+  SwfdecAsObject *tmp_pobject, *cur, *resolve;
 
   g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE);
   g_return_val_if_fail (variable != NULL, FALSE);
@@ -948,12 +948,21 @@ swfdec_as_object_get_variable_and_flags (SwfdecAsObject *object,
     pobject = &tmp_pobject;
 
   cur = object;
+  resolve = NULL;
   for (i = 0; i <= SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT && cur != NULL; i++) {
     klass = SWFDEC_AS_OBJECT_GET_CLASS (cur);
     if (klass->get (cur, object, variable, value, flags)) {
       *pobject = cur;
       return TRUE;
     }
+    if (resolve == NULL) {
+      SwfdecAsVariable *var =
+	swfdec_as_object_hash_lookup (cur, SWFDEC_AS_STR___resolve);
+
+      if (var != NULL && (object->context->version <= 6 ||
+	    SWFDEC_AS_VALUE_IS_OBJECT (&var->value)))
+	resolve = cur;
+    }
     cur = swfdec_as_object_get_prototype_internal (cur);
   }
   if (i > SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT) {
@@ -963,6 +972,30 @@ swfdec_as_object_get_variable_and_flags (SwfdecAsObject *object,
     *pobject = NULL;
     return FALSE;
   }
+  if (variable != SWFDEC_AS_STR___resolve && resolve != NULL) {
+    SwfdecAsValue argv;
+    SwfdecAsVariable *var;
+    SwfdecAsFunction *fun;
+
+    *flags = 0;
+    *pobject = resolve;
+    SWFDEC_AS_VALUE_SET_UNDEFINED (value);
+
+    var = swfdec_as_object_hash_lookup (resolve, SWFDEC_AS_STR___resolve);
+    g_assert (var != NULL);
+    if (!SWFDEC_AS_VALUE_IS_OBJECT (&var->value))
+      return FALSE;
+    fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&var->value);
+    if (!SWFDEC_IS_AS_FUNCTION (fun))
+      return FALSE;
+    SWFDEC_AS_VALUE_SET_STRING (&argv, variable);
+    swfdec_as_function_call (fun, resolve, 1, &argv, value);
+    if (swfdec_as_context_is_aborted (resolve->context))
+      return TRUE;
+    swfdec_as_context_run (resolve->context);
+
+    return TRUE;
+  }
   //SWFDEC_WARNING ("no such variable %s", variable);
   SWFDEC_AS_VALUE_SET_UNDEFINED (value);
   *flags = 0;
diff --git a/swfdec/swfdec_as_strings.c b/swfdec/swfdec_as_strings.c
index c05441b..b09f0c3 100644
--- a/swfdec/swfdec_as_strings.c
+++ b/swfdec/swfdec_as_strings.c
@@ -523,5 +523,6 @@ const char swfdec_as_strings[] =
   SWFDEC_AS_CONSTANT_STRING ("liveDelay")
   SWFDEC_AS_CONSTANT_STRING ("videoCodec")
   SWFDEC_AS_CONSTANT_STRING ("System")
+  SWFDEC_AS_CONSTANT_STRING ("__resolve")
   /* add more here */
 ;


More information about the Swfdec-commits mailing list