[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