[Swfdec] 12 commits - libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c test/trace

Pekka Lampila medar at kemper.freedesktop.org
Thu Oct 25 08:03:01 PDT 2007


 libswfdec/swfdec_as_internal.h                 |    4 
 libswfdec/swfdec_as_interpret.c                |   44 +++++++
 libswfdec/swfdec_as_object.c                   |   73 +++++++++----
 libswfdec/swfdec_text_field_movie.c            |   20 +--
 libswfdec/swfdec_text_field_movie_as.c         |    6 -
 test/trace/Makefile.am                         |   45 ++++++--
 test/trace/instance-of-5.swf                   |binary
 test/trace/instance-of-5.swf.trace             |   56 ++++++++++
 test/trace/instance-of-6.swf                   |binary
 test/trace/instance-of-6.swf.trace             |   58 ++++++++++
 test/trace/instance-of-7.swf                   |binary
 test/trace/instance-of-7.swf.trace             |   58 ++++++++++
 test/trace/instance-of-8.swf                   |binary
 test/trace/instance-of-8.swf.trace             |   58 ++++++++++
 test/trace/instance-of.as                      |   82 ++++++++++++++
 test/trace/prototype-handling-5.swf            |binary
 test/trace/prototype-handling-5.swf.trace      |  127 ++++++++++++++++++++++
 test/trace/prototype-handling-6.swf            |binary
 test/trace/prototype-handling-6.swf.trace      |  139 ++++++++++++++++++++++++
 test/trace/prototype-handling-7.swf            |binary
 test/trace/prototype-handling-7.swf.trace      |  139 ++++++++++++++++++++++++
 test/trace/prototype-handling-8.swf            |binary
 test/trace/prototype-handling-8.swf.trace      |  140 +++++++++++++++++++++++++
 test/trace/prototype-handling.as               |  118 +++++++++++++++++++++
 test/trace/text-field-replace-text-5.swf       |binary
 test/trace/text-field-replace-text-5.swf.trace |    9 +
 test/trace/text-field-replace-text-6.swf       |binary
 test/trace/text-field-replace-text-6.swf.trace |    9 +
 test/trace/text-field-replace-text-7.swf       |binary
 test/trace/text-field-replace-text-7.swf.trace |    9 +
 test/trace/text-field-replace-text-8.swf       |binary
 test/trace/text-field-replace-text-8.swf.trace |    9 +
 test/trace/text-field-replace-text.as          |   53 +++++++++
 test/trace/textformat-init-5.swf               |binary
 test/trace/textformat-init-5.swf.trace         |    2 
 test/trace/textformat-init-6.swf               |binary
 test/trace/textformat-init-6.swf.trace         |    2 
 test/trace/textformat-init-7.swf               |binary
 test/trace/textformat-init-7.swf.trace         |    2 
 test/trace/textformat-init-8.swf               |binary
 test/trace/textformat-init-8.swf.trace         |    2 
 test/trace/textformat-init.as                  |    5 
 42 files changed, 1224 insertions(+), 45 deletions(-)

New commits:
commit e872e8da0fc9e844df32212e268bc4c44fdc065e
Merge: 1b395e8... 429b509...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 18:02:11 2007 +0300

    Merge commit 'origin'

commit 1b395e83331d516388a4370df93936b7f544b1ae
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 18:00:58 2007 +0300

    Add a test to see how __proto__ is handled in different places

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index bcada90..5bde4df 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1261,6 +1261,15 @@ EXTRA_DIST = \
 	prototype-addProperty-7.swf.trace \
 	prototype-addProperty-8.swf \
 	prototype-addProperty-8.swf.trace \
+	prototype-handling.as \
+	prototype-handling-5.swf \
+	prototype-handling-5.swf.trace \
+	prototype-handling-6.swf \
+	prototype-handling-6.swf.trace \
+	prototype-handling-7.swf \
+	prototype-handling-7.swf.trace \
+	prototype-handling-8.swf \
+	prototype-handling-8.swf.trace \
 	prototype-movie.as \
 	prototype-movie-5.swf \
 	prototype-movie-5.swf.trace \
diff --git a/test/trace/prototype-handling-5.swf b/test/trace/prototype-handling-5.swf
new file mode 100644
index 0000000..54fd55a
Binary files /dev/null and b/test/trace/prototype-handling-5.swf differ
diff --git a/test/trace/prototype-handling-5.swf.trace b/test/trace/prototype-handling-5.swf.trace
new file mode 100644
index 0000000..e7dab0c
--- /dev/null
+++ b/test/trace/prototype-handling-5.swf.trace
@@ -0,0 +1,127 @@
+Test how different functions handle __proto__ and it's propflags
+instanceOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+false
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+false
+o.__proto__: 2048
+true
+o.__proto__: 4096
+false
+o.__proto__: deleted
+false
+get:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+undefined
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+undefined
+o.__proto__: 2048
+true
+o.__proto__: 4096
+undefined
+o.__proto__: deleted
+undefined
+set:
+o.__proto__: 2
+o.__proto__: 4
+o.__proto__: 8
+o.__proto__: 16
+o.__proto__: 32
+o.__proto__: 64
+o.__proto__: 128
+o.__proto__: 256
+o.__proto__: 512
+o.__proto__: 1024
+o.__proto__: 2048
+o.__proto__: 4096
+o.__proto__: deleted
+for ... in:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+false
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+false
+o.__proto__: 2048
+true
+o.__proto__: 4096
+false
+o.__proto__: deleted
+false
+isPrototypeOf:
+undefined
+o.__proto__: 2
+undefined
+o.__proto__: 4
+undefined
+o.__proto__: 8
+undefined
+o.__proto__: 16
+undefined
+o.__proto__: 32
+undefined
+o.__proto__: 64
+undefined
+o.__proto__: 128
+undefined
+o.__proto__: 256
+undefined
+o.__proto__: 512
+undefined
+o.__proto__: 1024
+undefined
+o.__proto__: 2048
+undefined
+o.__proto__: 4096
+undefined
+o.__proto__: deleted
+undefined
diff --git a/test/trace/prototype-handling-6.swf b/test/trace/prototype-handling-6.swf
new file mode 100644
index 0000000..3d16c9d
Binary files /dev/null and b/test/trace/prototype-handling-6.swf differ
diff --git a/test/trace/prototype-handling-6.swf.trace b/test/trace/prototype-handling-6.swf.trace
new file mode 100644
index 0000000..20768bc
--- /dev/null
+++ b/test/trace/prototype-handling-6.swf.trace
@@ -0,0 +1,139 @@
+Test how different functions handle __proto__ and it's propflags
+instanceOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+false
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
+get:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+undefined
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+undefined
+set:
+test_set: true
+o.__proto__: 2
+test_set: true
+o.__proto__: 4
+test_set: true
+o.__proto__: 8
+test_set: true
+o.__proto__: 16
+test_set: true
+o.__proto__: 32
+test_set: true
+o.__proto__: 64
+test_set: true
+o.__proto__: 128
+test_set: true
+o.__proto__: 256
+test_set: true
+o.__proto__: 512
+test_set: true
+o.__proto__: 1024
+o.__proto__: 2048
+test_set: true
+o.__proto__: 4096
+test_set: true
+o.__proto__: deleted
+for ... in:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+false
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
+isPrototypeOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+false
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
diff --git a/test/trace/prototype-handling-7.swf b/test/trace/prototype-handling-7.swf
new file mode 100644
index 0000000..e8f8bc1
Binary files /dev/null and b/test/trace/prototype-handling-7.swf differ
diff --git a/test/trace/prototype-handling-7.swf.trace b/test/trace/prototype-handling-7.swf.trace
new file mode 100644
index 0000000..26914d0
--- /dev/null
+++ b/test/trace/prototype-handling-7.swf.trace
@@ -0,0 +1,139 @@
+Test how different functions handle __proto__ and it's propflags
+instanceOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+false
+o.__proto__: deleted
+false
+get:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+true
+set:
+test_set: true
+o.__proto__: 2
+test_set: true
+o.__proto__: 4
+test_set: true
+o.__proto__: 8
+test_set: true
+o.__proto__: 16
+test_set: true
+o.__proto__: 32
+test_set: true
+o.__proto__: 64
+test_set: true
+o.__proto__: 128
+test_set: true
+o.__proto__: 256
+test_set: true
+o.__proto__: 512
+test_set: true
+o.__proto__: 1024
+test_set: true
+o.__proto__: 2048
+test_set: true
+o.__proto__: 4096
+o.__proto__: deleted
+for ... in:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+false
+o.__proto__: deleted
+false
+isPrototypeOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+false
+o.__proto__: deleted
+false
diff --git a/test/trace/prototype-handling-8.swf b/test/trace/prototype-handling-8.swf
new file mode 100644
index 0000000..c939537
Binary files /dev/null and b/test/trace/prototype-handling-8.swf differ
diff --git a/test/trace/prototype-handling-8.swf.trace b/test/trace/prototype-handling-8.swf.trace
new file mode 100644
index 0000000..90c95fa
--- /dev/null
+++ b/test/trace/prototype-handling-8.swf.trace
@@ -0,0 +1,140 @@
+Test how different functions handle __proto__ and it's propflags
+instanceOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
+get:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+true
+set:
+test_set: true
+o.__proto__: 2
+test_set: true
+o.__proto__: 4
+test_set: true
+o.__proto__: 8
+test_set: true
+o.__proto__: 16
+test_set: true
+o.__proto__: 32
+test_set: true
+o.__proto__: 64
+test_set: true
+o.__proto__: 128
+test_set: true
+o.__proto__: 256
+test_set: true
+o.__proto__: 512
+test_set: true
+o.__proto__: 1024
+test_set: true
+o.__proto__: 2048
+test_set: true
+o.__proto__: 4096
+test_set: true
+o.__proto__: deleted
+for ... in:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
+isPrototypeOf:
+true
+o.__proto__: 2
+true
+o.__proto__: 4
+true
+o.__proto__: 8
+true
+o.__proto__: 16
+true
+o.__proto__: 32
+true
+o.__proto__: 64
+true
+o.__proto__: 128
+true
+o.__proto__: 256
+true
+o.__proto__: 512
+true
+o.__proto__: 1024
+true
+o.__proto__: 2048
+true
+o.__proto__: 4096
+true
+o.__proto__: deleted
+false
diff --git a/test/trace/prototype-handling.as b/test/trace/prototype-handling.as
new file mode 100644
index 0000000..6dcfb9d
--- /dev/null
+++ b/test/trace/prototype-handling.as
@@ -0,0 +1,118 @@
+// makeswf -v 7 -r 1 -o test-7.swf test.as
+
+trace ("Test how different functions handle __proto__ and it's propflags");
+
+trace ("instanceOf:");
+
+var p = { prototype: {} };
+var o = { __proto__: p.prototype };
+
+trace (o instanceOf p);
+for (var i = 1; i <= 12; i++) {
+  trace ("o.__proto__: " + Math.pow (2, i));
+  ASSetPropFlags (o, "__proto__", Math.pow (2, i), 0);
+  trace (o instanceOf p);
+  ASSetPropFlags (o, "__proto__", 0, Math.pow (2, i));
+}
+trace ("o.__proto__: deleted");
+delete o.__proto__;
+trace (o instanceOf p);
+
+
+trace ("get:");
+
+p = { test: true };
+o = { __proto__: p };
+
+trace (o.test);
+for (var i = 1; i <= 12; i++) {
+  trace ("o.__proto__: " + Math.pow (2, i));
+  ASSetPropFlags (o, "__proto__", Math.pow (2, i), 0);
+  trace (o.test);
+  ASSetPropFlags (o, "__proto__", 0, Math.pow (2, i));
+}
+trace ("o.__proto__: deleted");
+delete o.__proto__;
+trace (o.test);
+
+
+trace ("set:");
+
+function test_get () {
+  trace ("test_get");
+  return true;
+}
+
+function test_set () {
+  trace ("test_set: " + arguments);
+}
+
+p = {};
+p.addProperty ("test", test_get, test_set);
+o = { __proto__: p };
+o.hasOwnProperty = ASnative (101, 5);
+
+o.test = true;
+delete o.test;
+for (var i = 1; i <= 12; i++) {
+  trace ("o.__proto__: " + Math.pow (2, i));
+  ASSetPropFlags (o, "__proto__", Math.pow (2, i), 0);
+  o.test = true;
+  delete o.test;
+  ASSetPropFlags (o, "__proto__", 0, Math.pow (2, i));
+}
+trace ("o.__proto__: deleted");
+delete o.__proto__;
+o.test = true;
+
+
+trace ("for ... in:");
+
+p = { test: true };
+o = { __proto__: p };
+
+var found = false;
+for (var prop in o) {
+  if (prop == "test")
+    found = true;
+}
+trace (found);
+for (var i = 1; i <= 12; i++) {
+  trace ("o.__proto__: " + Math.pow (2, i));
+  ASSetPropFlags (o, "__proto__", Math.pow (2, i), 0);
+  found = false;
+  for (var prop in o) {
+    if (prop == "test")
+      found = true;
+  }
+  trace (found);
+  ASSetPropFlags (o, "__proto__", 0, Math.pow (2, i));
+}
+trace ("o.__proto__: deleted");
+delete o.__proto__;
+found = false;
+for (var prop in o) {
+  if (prop == "test")
+    found = true;
+}
+trace (found);
+
+
+trace ("isPrototypeOf:");
+
+p = { test: true };
+o = { __proto__: p };
+
+trace (p.isPrototypeOf (o));
+for (var i = 1; i <= 12; i++) {
+  trace ("o.__proto__: " + Math.pow (2, i));
+  ASSetPropFlags (o, "__proto__", Math.pow (2, i), 0);
+  trace (p.isPrototypeOf (o));
+  ASSetPropFlags (o, "__proto__", 0, Math.pow (2, i));
+}
+trace ("o.__proto__: deleted");
+delete o.__proto__;
+trace (p.isPrototypeOf (o));
+
+
+loadMovie ("FSCommand:quit", "");
commit 28bf895b93b1f95aa372a78adbda188718be6bee
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 17:55:44 2007 +0300

    Fix test/trace/Makefile.am to say text-format-init not -properties (oops)

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index d32492e..bcada90 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1963,15 +1963,15 @@ EXTRA_DIST = \
 	textformat-7.swf.trace \
 	textformat-8.swf \
 	textformat-8.swf.trace \
-	textformat-properties.as \
-	textformat-properties-5.swf \
-	textformat-properties-5.swf.trace \
-	textformat-properties-6.swf \
-	textformat-properties-6.swf.trace \
-	textformat-properties-7.swf \
-	textformat-properties-7.swf.trace \
-	textformat-properties-8.swf \
-	textformat-properties-8.swf.trace \
+	textformat-init.as \
+	textformat-init-5.swf \
+	textformat-init-5.swf.trace \
+	textformat-init-6.swf \
+	textformat-init-6.swf.trace \
+	textformat-init-7.swf \
+	textformat-init-7.swf.trace \
+	textformat-init-8.swf \
+	textformat-init-8.swf.trace \
 	textformat-valueof.as \
 	textformat-valueof-5.swf \
 	textformat-valueof-5.swf.trace \
commit 0e27bb910e8fce7932affabef8c9c4b354435b50
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 17:46:19 2007 +0300

    Replace swfdec_as_object_prototype_for_version, use for instanceOf too
    
    swfdec_as_object_prototype_for_version was replaced with
    swfdec_as_object_get_prototype and swfdec_as_object_get_prototype_internal

diff --git a/libswfdec/swfdec_as_internal.h b/libswfdec/swfdec_as_internal.h
index 374232d..6dc088d 100644
--- a/libswfdec/swfdec_as_internal.h
+++ b/libswfdec/swfdec_as_internal.h
@@ -71,9 +71,7 @@ void		swfdec_as_object_init_context	(SwfdecAsContext *	context,
 					      	 guint			version);
 void		swfdec_as_object_decode		(SwfdecAsObject *	obj,
 						 const char *		str);
-SwfdecAsObject * swfdec_as_object_prototype_for_version (SwfdecAsObject *object,
-						 guint			version,
-						 gboolean		check7);
+SwfdecAsObject * swfdec_as_object_get_prototype (SwfdecAsObject *	object);
 void		swfdec_as_object_run_with_security 
 						(SwfdecAsObject *	object,
 						 SwfdecScript *		script,
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 8f5012c..b30bde8 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -2206,15 +2206,11 @@ swfdec_action_instance_of (SwfdecAsContext *cx, guint action,
   prototype = SWFDEC_AS_VALUE_GET_OBJECT (&val);
 
   class = object;
-  swfdec_as_object_get_variable (class, SWFDEC_AS_STR___proto__, &val);
-  while (SWFDEC_AS_VALUE_IS_OBJECT (&val))
-  {
-    class = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+  while ((class = swfdec_as_object_get_prototype (class)) != NULL) {
     if (class == prototype) {
       SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_peek (cx, 1), TRUE);
       break;
     }
-    swfdec_as_object_get_variable (class, SWFDEC_AS_STR___proto__, &val);
   }
 }
 
@@ -2275,7 +2271,7 @@ swfdec_action_do_enumerate (SwfdecAsContext *cx, SwfdecAsObject *object)
   
   for (i = 0; i < 256 && object; i++) {
     swfdec_as_object_foreach (object, swfdec_action_enumerate_foreach, &list);
-    object = swfdec_as_object_prototype_for_version (object, cx->version, TRUE);
+    object = swfdec_as_object_get_prototype (object);
   }
   if (i == 256) {
     swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded");
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index a7d45d7..6c4feb9 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -290,10 +290,20 @@ swfdec_as_watch_unref (SwfdecAsWatch *watch)
   }
 }
 
-SwfdecAsObject *
-swfdec_as_object_prototype_for_version (SwfdecAsObject *object, guint version,
-    gboolean check7)
+/*
+ * Like swfdec_as_object_get_prototype, but doesn't check 8_UP flag when
+ * version is 7 and doesn't check if the property has been deleted if version
+ * is 6 or earlier
+ */
+static SwfdecAsObject *
+swfdec_as_object_get_prototype_internal (SwfdecAsObject *object)
 {
+  int version;
+
+  g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
+
+  version = object->context->version;
+
   if (object->prototype == NULL)
     return NULL;
 
@@ -302,14 +312,44 @@ swfdec_as_object_prototype_for_version (SwfdecAsObject *object, guint version,
   // don't check for NOT_6 flag
   if (object->prototype_flags & SWFDEC_AS_VARIABLE_VERSION_7_UP && version < 7)
     return NULL;
-  // only check 8_UP for version < 6
+  // don't check 8_UP for version 6 or 7
   if (object->prototype_flags & SWFDEC_AS_VARIABLE_VERSION_8_UP &&
       version < 6)
     return NULL;
-  if (check7) {
-    if (object->prototype_flags & SWFDEC_AS_VARIABLE_VERSION_8_UP && version == 7)
-      return NULL;
-  }
+  // check that it exists, if version < 7
+  if (version < 7 &&
+      !swfdec_as_object_hash_lookup (object, SWFDEC_AS_STR___proto__))
+    return NULL;
+
+  return object->prototype;
+}
+
+/*
+ * Get's the object->prototype, if propflags allow it for current version and
+ * if it hasn't been deleted from the object already
+ */
+SwfdecAsObject *
+swfdec_as_object_get_prototype (SwfdecAsObject *object)
+{
+  int version;
+  SwfdecAsObject *prototype;
+
+  g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
+
+  version = object->context->version;
+
+  prototype = swfdec_as_object_get_prototype_internal (object);
+
+  if (prototype == NULL)
+    return NULL;
+  // check 8_UP for version 7, still not for version 6
+  if (object->prototype_flags & SWFDEC_AS_VARIABLE_VERSION_8_UP &&
+      version == 7)
+    return NULL;
+  // require it to exist even on version >= 7
+  if (version >= 7 &&
+      !swfdec_as_object_hash_lookup (object, SWFDEC_AS_STR___proto__))
+    return NULL;
 
   return object->prototype;
 }
@@ -329,15 +369,13 @@ swfdec_as_object_do_set (SwfdecAsObject *object, const char *variable,
     guint i;
     SwfdecAsObject *proto;
 
-    proto = swfdec_as_object_prototype_for_version (object,
-	object->context->version, FALSE);
+    proto = swfdec_as_object_get_prototype (object);
 
     for (i = 0; i < SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT && proto; i++) {
       var = swfdec_as_object_hash_lookup (proto, variable);
       if (var && var->get)
 	break;
-      proto = swfdec_as_object_prototype_for_version (proto,
-	  proto->context->version, FALSE);
+      proto = swfdec_as_object_get_prototype (proto);
       var = NULL;
     }
     if (i == SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT) {
@@ -443,11 +481,8 @@ swfdec_as_object_do_delete (SwfdecAsObject *object, const char *variable)
   if (var->flags & SWFDEC_AS_VARIABLE_PERMANENT)
     return SWFDEC_AS_DELETE_NOT_DELETED;
 
-  // special case: in version > 6 deleting doesn't stop __proto__ from working
-  if (variable == SWFDEC_AS_STR___proto__ && object->context->version <= 6) {
-    object->prototype = NULL;
-    object->prototype_flags = 0;
-  }
+  // Note: We won't remove object->prototype, even if __proto__ is deleted
+
   swfdec_as_object_free_property (NULL, var, object);
   if (!g_hash_table_remove (object->properties, variable)) {
     g_assert_not_reached ();
@@ -826,8 +861,7 @@ swfdec_as_object_get_variable_and_flags (SwfdecAsObject *object,
       *pobject = cur;
       return TRUE;
     }
-    cur = swfdec_as_object_prototype_for_version (cur, cur->context->version,
-	FALSE);
+    cur = swfdec_as_object_get_prototype_internal (cur);
   }
   if (i > SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT) {
     swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded");
@@ -1409,7 +1443,7 @@ swfdec_as_object_isPrototypeOf (SwfdecAsContext *cx,
   if (class == NULL)
     return;
 
-  while ((class = swfdec_as_object_prototype_for_version (class, cx->version, TRUE)) != NULL) {
+  while ((class = swfdec_as_object_get_prototype (class)) != NULL) {
     if (object == class) {
       SWFDEC_AS_VALUE_SET_BOOLEAN (retval, TRUE);
       return;
commit 7a422e1eed7cf157fa0eecb3bb4f1060423174c9
Merge: 379173f... 45ecc75...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 17:22:21 2007 +0300

    Merge commit 'origin'

commit 379173f63232e5009e5ebbce3fb64dfda8076217
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 15:08:20 2007 +0300

    Add a test case for instanceOf

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index a39326f..ff8b3ce 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -762,6 +762,15 @@ EXTRA_DIST = \
 	instance-name-loaded-6.swf.trace \
 	instance-name-loaded-7.swf \
 	instance-name-loaded-7.swf.trace \
+	instance-of.as \
+	instance-of-5.swf \
+	instance-of-5.swf.trace \
+	instance-of-6.swf \
+	instance-of-6.swf.trace \
+	instance-of-7.swf \
+	instance-of-7.swf.trace \
+	instance-of-8.swf \
+	instance-of-8.swf.trace \
 	invalid-variable-name.as \
 	invalid-variable-name-5.swf \
 	invalid-variable-name-5.swf.trace \
diff --git a/test/trace/instance-of-5.swf b/test/trace/instance-of-5.swf
new file mode 100644
index 0000000..8efa11e
Binary files /dev/null and b/test/trace/instance-of-5.swf differ
diff --git a/test/trace/instance-of-5.swf.trace b/test/trace/instance-of-5.swf.trace
new file mode 100644
index 0000000..c10f962
--- /dev/null
+++ b/test/trace/instance-of-5.swf.trace
@@ -0,0 +1,56 @@
+0: Object
+1: Object.prototype
+2: new Object ()
+3: Object ()
+4: {}
+5: new Object (), properties removed
+6: {}, properties added
+7: String
+8: String.prototype
+9: new String ()
+10: String ()
+11: "test"
+12: Number
+13: Number.prototype
+14: new Number ()
+15: Number ()
+16: 1
+17: Array
+18: Array.prototype
+19: new Array ()
+20: Array ()
+21: []
+22: new Array (), __proto__ changed and restored
+23: XML
+24: MovieClip
+25: this
+26: TextField
+
+    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
+ 0                                                                                 
+ 1                                                                                 
+ 2  0                                                                              
+ 3                                                                                 
+ 4  0                                                                              
+ 5                                                                                 
+ 6  0                                                                              
+ 7                                                                                 
+ 8  0                                                                              
+ 9  0                    7                                                         
+10                                                                                 
+11                                                                                 
+12                                                                                 
+13  0                                                                              
+14  0                                  12                                          
+15                                                                                 
+16                                                                                 
+17                                                                                 
+18  0                                                                              
+19  0                                                 17                           
+20  0                                                 17                           
+21  0                                                 17                           
+22  0                                                 17                           
+23                                                                                 
+24                                                                                 
+25  0                                                                      24      
+26                                                                                 
diff --git a/test/trace/instance-of-6.swf b/test/trace/instance-of-6.swf
new file mode 100644
index 0000000..c28ea4c
Binary files /dev/null and b/test/trace/instance-of-6.swf differ
diff --git a/test/trace/instance-of-6.swf.trace b/test/trace/instance-of-6.swf.trace
new file mode 100644
index 0000000..c1e8354
--- /dev/null
+++ b/test/trace/instance-of-6.swf.trace
@@ -0,0 +1,58 @@
+0: Object
+1: Object.prototype
+2: new Object ()
+3: Object ()
+4: {}
+5: new Object (), properties removed
+6: {}, properties added
+7: String
+8: String.prototype
+9: new String ()
+10: String ()
+11: "test"
+12: Number
+13: Number.prototype
+14: new Number ()
+15: Number ()
+16: 1
+17: Array
+18: Array.prototype
+19: new Array ()
+20: Array ()
+21: []
+22: new Array (), __proto__ changed and restored
+23: XML
+24: MovieClip
+25: this
+26: TextField
+27: createTextField (...)
+
+    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
+ 0  0                                                                                 
+ 1                                                                                    
+ 2  0                                                                                 
+ 3                                                                                    
+ 4  0                                                                                 
+ 5                                                                                    
+ 6  0                                                                                 
+ 7  0                                                                                 
+ 8  0                                                                                 
+ 9  0                    7                                                            
+10                                                                                    
+11                                                                                    
+12  0                                                                                 
+13  0                                                                                 
+14  0                                  12                                             
+15                                                                                    
+16                                                                                    
+17  0                                                                                 
+18  0                                                                                 
+19  0                                                 17                              
+20  0                                                 17                              
+21  0                                                 17                              
+22  0                                                 17                              
+23  0                                                                                 
+24  0                                                                                 
+25  0                                                                      24         
+26  0                                                                                 
+27  0                                                                            26   
diff --git a/test/trace/instance-of-7.swf b/test/trace/instance-of-7.swf
new file mode 100644
index 0000000..51cd6c3
Binary files /dev/null and b/test/trace/instance-of-7.swf differ
diff --git a/test/trace/instance-of-7.swf.trace b/test/trace/instance-of-7.swf.trace
new file mode 100644
index 0000000..c1e8354
--- /dev/null
+++ b/test/trace/instance-of-7.swf.trace
@@ -0,0 +1,58 @@
+0: Object
+1: Object.prototype
+2: new Object ()
+3: Object ()
+4: {}
+5: new Object (), properties removed
+6: {}, properties added
+7: String
+8: String.prototype
+9: new String ()
+10: String ()
+11: "test"
+12: Number
+13: Number.prototype
+14: new Number ()
+15: Number ()
+16: 1
+17: Array
+18: Array.prototype
+19: new Array ()
+20: Array ()
+21: []
+22: new Array (), __proto__ changed and restored
+23: XML
+24: MovieClip
+25: this
+26: TextField
+27: createTextField (...)
+
+    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
+ 0  0                                                                                 
+ 1                                                                                    
+ 2  0                                                                                 
+ 3                                                                                    
+ 4  0                                                                                 
+ 5                                                                                    
+ 6  0                                                                                 
+ 7  0                                                                                 
+ 8  0                                                                                 
+ 9  0                    7                                                            
+10                                                                                    
+11                                                                                    
+12  0                                                                                 
+13  0                                                                                 
+14  0                                  12                                             
+15                                                                                    
+16                                                                                    
+17  0                                                                                 
+18  0                                                                                 
+19  0                                                 17                              
+20  0                                                 17                              
+21  0                                                 17                              
+22  0                                                 17                              
+23  0                                                                                 
+24  0                                                                                 
+25  0                                                                      24         
+26  0                                                                                 
+27  0                                                                            26   
diff --git a/test/trace/instance-of-8.swf b/test/trace/instance-of-8.swf
new file mode 100644
index 0000000..e91f063
Binary files /dev/null and b/test/trace/instance-of-8.swf differ
diff --git a/test/trace/instance-of-8.swf.trace b/test/trace/instance-of-8.swf.trace
new file mode 100644
index 0000000..c1e8354
--- /dev/null
+++ b/test/trace/instance-of-8.swf.trace
@@ -0,0 +1,58 @@
+0: Object
+1: Object.prototype
+2: new Object ()
+3: Object ()
+4: {}
+5: new Object (), properties removed
+6: {}, properties added
+7: String
+8: String.prototype
+9: new String ()
+10: String ()
+11: "test"
+12: Number
+13: Number.prototype
+14: new Number ()
+15: Number ()
+16: 1
+17: Array
+18: Array.prototype
+19: new Array ()
+20: Array ()
+21: []
+22: new Array (), __proto__ changed and restored
+23: XML
+24: MovieClip
+25: this
+26: TextField
+27: createTextField (...)
+
+    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
+ 0  0                                                                                 
+ 1                                                                                    
+ 2  0                                                                                 
+ 3                                                                                    
+ 4  0                                                                                 
+ 5                                                                                    
+ 6  0                                                                                 
+ 7  0                                                                                 
+ 8  0                                                                                 
+ 9  0                    7                                                            
+10                                                                                    
+11                                                                                    
+12  0                                                                                 
+13  0                                                                                 
+14  0                                  12                                             
+15                                                                                    
+16                                                                                    
+17  0                                                                                 
+18  0                                                                                 
+19  0                                                 17                              
+20  0                                                 17                              
+21  0                                                 17                              
+22  0                                                 17                              
+23  0                                                                                 
+24  0                                                                                 
+25  0                                                                      24         
+26  0                                                                                 
+27  0                                                                            26   
diff --git a/test/trace/instance-of.as b/test/trace/instance-of.as
new file mode 100644
index 0000000..436da43
--- /dev/null
+++ b/test/trace/instance-of.as
@@ -0,0 +1,82 @@
+// makeswf -v 7 -r 1 -o instance-of-7.swf instance-of.as
+
+var empty_object_properties_added = {};
+var new_object_properties_removed = new Object ();
+ASSetPropFlags (new_object_properties_removed, null, 0, 7);
+for (var prop in new_object_properties_removed) {
+  empty_object_properties_added[prop] = new_object_properties_removed[prop];
+  delete new_object_properties_removed[prop];
+}
+
+var new_array_proto_changed_and_restored = new Array ();
+new_array_proto_changed_and_restored.__proto__ = XML.prototype;
+new_array_proto_changed_and_restored.__proto__ = Array.prototype;
+
+this.createTextField ("t", 0, 0, 0, 100, 100);
+
+var objects = [];
+objects.push ({ o: Object, n: "Object" });
+objects.push ({ o: Object.prototype, n: "Object.prototype" });
+objects.push ({ o: new Object (), n: "new Object ()" });
+objects.push ({ o: Object (), n: "Object ()" });
+objects.push ({ o: {}, n: "{}" });
+objects.push ({ o: new_object_properties_removed, n: "new Object (), properties removed" });
+objects.push ({ o: empty_object_properties_added, n: "{}, properties added" });
+objects.push ({ o: String, n: "String" });
+objects.push ({ o: String.prototype, n: "String.prototype" });
+objects.push ({ o: new String (), n: "new String ()" });
+objects.push ({ o: String (), n: "String ()" });
+objects.push ({ o: "test", n: "\"test\"" });
+objects.push ({ o: Number, n: "Number" });
+objects.push ({ o: Number.prototype, n: "Number.prototype" });
+objects.push ({ o: new Number (), n: "new Number ()" });
+objects.push ({ o: Number (), n: "Number ()" });
+objects.push ({ o: 1, n: "1" });
+objects.push ({ o: Array, n: "Array" });
+objects.push ({ o: Array.prototype, n: "Array.prototype" });
+objects.push ({ o: new Array (), n: "new Array ()" });
+objects.push ({ o: Array (), n: "Array ()" });
+objects.push ({ o: [], n: "[]" });
+objects.push ({ o: new_array_proto_changed_and_restored, n: "new Array (), __proto__ changed and restored" });
+objects.push ({ o: XML, n: "XML" });
+objects.push ({ o: MovieClip, n: "MovieClip" });
+objects.push ({ o: this, n: "this" });
+objects.push ({ o: TextField, n: "TextField" });
+// FIXME
+#if __SWF_VERSION__ > 5
+objects.push ({ o: t, n: "createTextField (...)" });
+#endif
+
+for (var i = 0; i < objects.length; i++) {
+  trace (i + ": " + objects[i].n);
+}
+trace ("");
+
+var str = "  ";
+for (var i = 0; i < objects.length; i++) {
+  if (i < 10)
+    str += " ";
+  str += " " + i;
+}
+trace (str);
+
+for (var i = 0; i < objects.length; i++) {
+  if (i < 10) {
+    str = " ";
+  } else {
+    str = "";
+  }
+  str += i;
+  for (var j = 0; j < objects.length; j++) {
+    if (objects[i].o instanceOf objects[j].o) {
+      if (j < 10)
+	str += " ";
+      str += " "+j;
+    } else {
+      str += "   ";
+    }
+  }
+  trace (str);
+}
+
+loadMovie ("FSCommand:quit", "");
commit 8a03a1c260c8bb822f7585da4ba006c014109590
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 14:49:16 2007 +0300

    Implement the InstanceOf ActionScript action

diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 99a1215..8f5012c 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -2175,6 +2175,50 @@ swfdec_action_get_time (SwfdecAsContext *cx, guint action, const guint8 *data, g
 }
 
 static void
+swfdec_action_instance_of (SwfdecAsContext *cx, guint action,
+    const guint8 *data, guint len)
+{
+  SwfdecAsValue val, *val_p;
+  SwfdecAsObject *object, *class, *constructor, *prototype;
+
+  val_p = swfdec_as_stack_pop (cx);
+  if (SWFDEC_AS_VALUE_IS_OBJECT (val_p)) {
+    constructor = SWFDEC_AS_VALUE_GET_OBJECT (val_p);
+  } else {
+    constructor = NULL;
+  }
+
+  val_p = swfdec_as_stack_pop (cx);
+  if (SWFDEC_AS_VALUE_IS_OBJECT (val_p)) {
+    object = SWFDEC_AS_VALUE_GET_OBJECT (val_p);
+  } else {
+    object = NULL;
+  }
+
+  SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_push (cx), FALSE);
+
+  if (object == NULL || constructor == NULL)
+    return;
+
+  swfdec_as_object_get_variable (constructor, SWFDEC_AS_STR_prototype, &val);
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
+    return;
+  prototype = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+
+  class = object;
+  swfdec_as_object_get_variable (class, SWFDEC_AS_STR___proto__, &val);
+  while (SWFDEC_AS_VALUE_IS_OBJECT (&val))
+  {
+    class = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+    if (class == prototype) {
+      SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_peek (cx, 1), TRUE);
+      break;
+    }
+    swfdec_as_object_get_variable (class, SWFDEC_AS_STR___proto__, &val);
+  }
+}
+
+static void
 swfdec_action_extends (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
 {
   SwfdecAsValue *superclass, *subclass, proto;
@@ -2856,7 +2900,7 @@ const SwfdecActionSpec swfdec_as_actions[256] = {
   [SWFDEC_AS_ACTION_CALL_METHOD] = { "CallMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_call_method, swfdec_action_call_method, swfdec_action_call_method } },
   [SWFDEC_AS_ACTION_NEW_METHOD] = { "NewMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_new_method, swfdec_action_new_method, swfdec_action_new_method } },
   /* version 6 */
-  [SWFDEC_AS_ACTION_INSTANCE_OF] = { "InstanceOf", NULL },
+  [SWFDEC_AS_ACTION_INSTANCE_OF] = { "InstanceOf", NULL, 2, 1, { NULL, NULL, NULL, swfdec_action_instance_of, swfdec_action_instance_of } },
   [SWFDEC_AS_ACTION_ENUMERATE2] = { "Enumerate2", NULL, 1, -1, { NULL, NULL, NULL, swfdec_action_enumerate2, swfdec_action_enumerate2 } },
   [SWFDEC_AS_ACTION_BREAKPOINT] = { "Breakpoint", NULL, },
   /* version 5 */
commit 76af34f924f385678683a5af30428d75dc005347
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 14:43:38 2007 +0300

    Add a comment about __proto__ deleting

diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 6cd0661..a7d45d7 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -443,6 +443,7 @@ swfdec_as_object_do_delete (SwfdecAsObject *object, const char *variable)
   if (var->flags & SWFDEC_AS_VARIABLE_PERMANENT)
     return SWFDEC_AS_DELETE_NOT_DELETED;
 
+  // special case: in version > 6 deleting doesn't stop __proto__ from working
   if (variable == SWFDEC_AS_STR___proto__ && object->context->version <= 6) {
     object->prototype = NULL;
     object->prototype_flags = 0;
commit 9db3b17ad978716efb19666e19cbdba562a3cb9b
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 13:21:52 2007 +0300

    Make getTextFormat init TextFormat's properties, add a test

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 88207a2..979652e 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1126,6 +1126,7 @@ swfdec_text_field_movie_get_text_format (SwfdecTextFieldMovie *text,
       continue;
 
     if (format == NULL) {
+      swfdec_text_format_init_properties (SWFDEC_AS_OBJECT (text)->context);
       format =
 	swfdec_text_format_copy (((SwfdecFormatIndex *)iter->data)->format);
     } else {
diff --git a/test/trace/textformat-init-5.swf b/test/trace/textformat-init-5.swf
index 3a223ce..0d0f898 100644
Binary files a/test/trace/textformat-init-5.swf and b/test/trace/textformat-init-5.swf differ
diff --git a/test/trace/textformat-init-5.swf.trace b/test/trace/textformat-init-5.swf.trace
index 0eee3fb..5250da6 100644
--- a/test/trace/textformat-init-5.swf.trace
+++ b/test/trace/textformat-init-5.swf.trace
@@ -9,3 +9,5 @@ undefined
 undefined
 undefined
 undefined
+undefined
+undefined
diff --git a/test/trace/textformat-init-6.swf b/test/trace/textformat-init-6.swf
index 5ebe00a..90fa33d 100644
Binary files a/test/trace/textformat-init-6.swf and b/test/trace/textformat-init-6.swf differ
diff --git a/test/trace/textformat-init-6.swf.trace b/test/trace/textformat-init-6.swf.trace
index feaee9f..fe7abe9 100644
--- a/test/trace/textformat-init-6.swf.trace
+++ b/test/trace/textformat-init-6.swf.trace
@@ -6,6 +6,8 @@ false
 true
 false
 true
+true
+true
 false
 false
 false
diff --git a/test/trace/textformat-init-7.swf b/test/trace/textformat-init-7.swf
index 552ff89..241b9c6 100644
Binary files a/test/trace/textformat-init-7.swf and b/test/trace/textformat-init-7.swf differ
diff --git a/test/trace/textformat-init-7.swf.trace b/test/trace/textformat-init-7.swf.trace
index 5368f4e..ad56dfa 100644
--- a/test/trace/textformat-init-7.swf.trace
+++ b/test/trace/textformat-init-7.swf.trace
@@ -6,6 +6,8 @@ false
 true
 false
 true
+true
+true
 false
 false
 false
diff --git a/test/trace/textformat-init-8.swf b/test/trace/textformat-init-8.swf
index 9d93be3..3171d89 100644
Binary files a/test/trace/textformat-init-8.swf and b/test/trace/textformat-init-8.swf differ
diff --git a/test/trace/textformat-init-8.swf.trace b/test/trace/textformat-init-8.swf.trace
index 5368f4e..ad56dfa 100644
--- a/test/trace/textformat-init-8.swf.trace
+++ b/test/trace/textformat-init-8.swf.trace
@@ -6,6 +6,8 @@ false
 true
 false
 true
+true
+true
 false
 false
 false
diff --git a/test/trace/textformat-init.as b/test/trace/textformat-init.as
index adfd606..3459b91 100644
--- a/test/trace/textformat-init.as
+++ b/test/trace/textformat-init.as
@@ -21,6 +21,7 @@ tmp.parse (".a { text-size: 4; }");
 check_and_reset ();
 
 this.createTextField ("t", 0, 0, 0, 100, 100);
+t.text = "hello";
 check_and_reset ();
 t.getNewTextFormat ();
 check_and_reset ();
@@ -28,6 +29,10 @@ t.setNewTextFormat (new Object ());
 check_and_reset ();
 t.getTextFormat ();
 check_and_reset ();
+t.getTextFormat (20, 21);
+check_and_reset ();
+t.getTextFormat (1, 2);
+check_and_reset ();
 t.setTextFormat (new Object ());
 check_and_reset ();
 tmp = t.textColor;
commit 1c3323f7df70f50fb6ad4184c66c8977d6ea6612
Merge: c0affd1... b0b423c...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 13:15:05 2007 +0300

    Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec
    
    Conflicts:
    
    	libswfdec/swfdec_text_field_movie.c

diff --cc libswfdec/swfdec_text_field_movie.c
index 8cdd015,bd42350..88207a2
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@@ -1592,8 -1601,7 +1592,8 @@@ swfdec_text_field_movie_replace_text (S
      }
      prev = iter;
    }
 +
-   if (end_index == g_utf8_strlen (text->input->str, -1)) {
+   if (end_index == (guint) g_utf8_strlen (text->input->str, -1)) {
      if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
        SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
      }
commit c0affd1ac98b7ac9e2eebd02ad47018ecdce0415
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 12:04:55 2007 +0300

    Add a test for TextField's replaceText method

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index aa7b8e8..a39326f 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1891,6 +1891,15 @@ EXTRA_DIST = \
 	text-field-length-7.swf.trace \
 	text-field-length-8.swf \
 	text-field-length-8.swf.trace \
+	text-field-replace-text.as \
+	text-field-replace-text-5.swf \
+	text-field-replace-text-5.swf.trace \
+	text-field-replace-text-6.swf \
+	text-field-replace-text-6.swf.trace \
+	text-field-replace-text-7.swf \
+	text-field-replace-text-7.swf.trace \
+	text-field-replace-text-8.swf \
+	text-field-replace-text-8.swf.trace \
 	text-field-set-text-format.as \
 	text-field-set-text-format-5.swf \
 	text-field-set-text-format-5.swf.trace \
diff --git a/test/trace/text-field-replace-text-5.swf b/test/trace/text-field-replace-text-5.swf
new file mode 100644
index 0000000..7d427b3
Binary files /dev/null and b/test/trace/text-field-replace-text-5.swf differ
diff --git a/test/trace/text-field-replace-text-5.swf.trace b/test/trace/text-field-replace-text-5.swf.trace
new file mode 100644
index 0000000..e3c0074
--- /dev/null
+++ b/test/trace/text-field-replace-text-5.swf.trace
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/test/trace/text-field-replace-text-6.swf b/test/trace/text-field-replace-text-6.swf
new file mode 100644
index 0000000..db176b1
Binary files /dev/null and b/test/trace/text-field-replace-text-6.swf differ
diff --git a/test/trace/text-field-replace-text-6.swf.trace b/test/trace/text-field-replace-text-6.swf.trace
new file mode 100644
index 0000000..6ef5cf6
--- /dev/null
+++ b/test/trace/text-field-replace-text-6.swf.trace
@@ -0,0 +1,9 @@
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
diff --git a/test/trace/text-field-replace-text-7.swf b/test/trace/text-field-replace-text-7.swf
new file mode 100644
index 0000000..8569a94
Binary files /dev/null and b/test/trace/text-field-replace-text-7.swf differ
diff --git a/test/trace/text-field-replace-text-7.swf.trace b/test/trace/text-field-replace-text-7.swf.trace
new file mode 100644
index 0000000..f9b8139
--- /dev/null
+++ b/test/trace/text-field-replace-text-7.swf.trace
@@ -0,0 +1,9 @@
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l12Hiw13o14r15l16d17!
+6H7e8l12Hiw13o15Hil16d17!
+6H7e8l12Hiw13o15Hil16d17!6Hi
+6H7e8l12Hiw13o15Hil6Hi
diff --git a/test/trace/text-field-replace-text-8.swf b/test/trace/text-field-replace-text-8.swf
new file mode 100644
index 0000000..65de215
Binary files /dev/null and b/test/trace/text-field-replace-text-8.swf differ
diff --git a/test/trace/text-field-replace-text-8.swf.trace b/test/trace/text-field-replace-text-8.swf.trace
new file mode 100644
index 0000000..f9b8139
--- /dev/null
+++ b/test/trace/text-field-replace-text-8.swf.trace
@@ -0,0 +1,9 @@
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l9l10o11 12w13o14r15l16d17!
+6H7e8l12Hiw13o14r15l16d17!
+6H7e8l12Hiw13o15Hil16d17!
+6H7e8l12Hiw13o15Hil16d17!6Hi
+6H7e8l12Hiw13o15Hil6Hi
diff --git a/test/trace/text-field-replace-text.as b/test/trace/text-field-replace-text.as
new file mode 100644
index 0000000..f4c53e0
--- /dev/null
+++ b/test/trace/text-field-replace-text.as
@@ -0,0 +1,53 @@
+// makeswf -v 7 -r 1 -o text-field-replace-text-7.swf text-field-replace-text.as
+
+function check() {
+  str = "";
+  size = -1;
+  for (var i = 0; i < t.length; i++) {
+    var fmt = t.getTextFormat (i);
+    if (fmt.size != size) {
+      size = fmt.size;
+      str = str + size;
+    }
+    str = str + t.text.charAt (i);
+  }
+  trace (str);
+}
+
+this.createTextField ("t", 1, 0, 0, 100, 100);
+
+t.html = true;
+t.text = "Hello world!";
+
+var fmt = new TextFormat ();
+for (var i = 0; i < t.length; i++) {
+  fmt.size = 6 + i;
+  t.setTextFormat (i, i + 1, fmt);
+}
+fmt.size = 5;
+fmt.color = 0xFF0000;
+t.setNewTextFormat (fmt);
+
+check ();
+
+// won't work:
+t.replaceText (1, "Hi");
+check ();
+t.replaceText (1, 0, "Hi");
+check ();
+t.replaceText (-1, 5, "Hi");
+check ();
+t.replaceText (50, 45, "Hi");
+check ();
+
+// will work:
+t.replaceText (3, 6, "Hi");
+check ();
+t.replaceText (7, 8, "Hi");
+check ();
+t.replaceText (50, 55, "Hi");
+check ();
+t.replaceText (10, 20, "Hi");
+check ();
+
+loadMovie ("FSCommand:quit", "");
commit 602a2fd29e587c2ca9b62c5483fafdf7a92f6a28
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Oct 25 12:03:54 2007 +0300

    Fix errors in TextField's replaceText method

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index 516e270..8cdd015 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1566,15 +1566,6 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
   if (text->style_sheet_input)
     return;
 
-  text->input = g_string_erase (text->input,
-      g_utf8_offset_to_pointer (text->input->str, start_index) -
-      text->input->str,
-      g_utf8_offset_to_pointer (text->input->str, end_index) -
-      g_utf8_offset_to_pointer (text->input->str, start_index));
-  text->input = g_string_insert (text->input,
-      g_utf8_offset_to_pointer (text->input->str, start_index) -
-      text->input->str, str);
-
   first = TRUE;
   prev = NULL;
   for (iter = text->formats; iter != NULL; iter = iter->next)
@@ -1601,6 +1592,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     }
     prev = iter;
   }
+
   if (end_index == g_utf8_strlen (text->input->str, -1)) {
     if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
       SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
@@ -1612,6 +1604,15 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     text->formats = g_slist_append (text->formats, findex);
   }
 
+  text->input = g_string_erase (text->input,
+      g_utf8_offset_to_pointer (text->input->str, start_index) -
+      text->input->str,
+      g_utf8_offset_to_pointer (text->input->str, end_index) -
+      g_utf8_offset_to_pointer (text->input->str, start_index));
+  text->input = g_string_insert (text->input,
+      g_utf8_offset_to_pointer (text->input->str, start_index) -
+      text->input->str, str);
+
   swfdec_movie_invalidate (SWFDEC_MOVIE (text));
   swfdec_text_field_movie_auto_size (text);
   swfdec_text_field_movie_update_scroll (text, TRUE);
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index bc810ea..9f7cf46 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -1089,14 +1089,14 @@ swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "iis", &start_index,
       &end_index, &str);
 
-  start_index = MIN (start_index, g_utf8_strlen (text->input->str, -1));
   if (start_index < 0)
     return;
-
-  end_index = MIN (end_index, g_utf8_strlen (text->input->str, -1));
   if (end_index < start_index)
     return;
 
+  start_index = MIN (start_index, g_utf8_strlen (text->input->str, -1));
+  end_index = MIN (end_index, g_utf8_strlen (text->input->str, -1));
+
   swfdec_text_field_movie_replace_text (text, start_index, end_index, str);
 }
 


More information about the Swfdec mailing list