[Swfdec-commits] 9 commits - swfdec-gtk/swfdec_gtk_system.c swfdec/swfdec_as_interpret.c swfdec/swfdec_as_string.c swfdec/swfdec_player.c swfdec/swfdec_url.c test/custom test/trace

Benjamin Otte company at kemper.freedesktop.org
Tue Feb 19 04:31:20 PST 2008


 swfdec-gtk/swfdec_gtk_system.c                |    2 
 swfdec/swfdec_as_interpret.c                  |   26 ++++-
 swfdec/swfdec_as_string.c                     |    9 -
 swfdec/swfdec_player.c                        |   76 +++++++-------
 swfdec/swfdec_url.c                           |    2 
 test/custom/Makefile.am                       |    7 +
 test/custom/crash-0.5.90-up-to-date.as        |   12 ++
 test/custom/crash-0.5.90-up-to-date.stas      |   64 ++++++++++++
 test/custom/crash-0.5.90-up-to-date.sts       |binary
 test/custom/crash-0.5.90-up-to-date.swf       |binary
 test/trace/Makefile.am                        |    9 +
 test/trace/add2-different-objects-5.swf       |binary
 test/trace/add2-different-objects-5.swf.trace |  132 ++++++++++++++++++++++++++
 test/trace/add2-different-objects-6.swf       |binary
 test/trace/add2-different-objects-6.swf.trace |  108 +++++++++++++++++++++
 test/trace/add2-different-objects-7.swf       |binary
 test/trace/add2-different-objects-7.swf.trace |  108 +++++++++++++++++++++
 test/trace/add2-different-objects-8.swf       |binary
 test/trace/add2-different-objects-8.swf.trace |  108 +++++++++++++++++++++
 test/trace/add2-different-objects.as          |   32 ++++++
 test/trace/values.as                          |    3 
 21 files changed, 643 insertions(+), 55 deletions(-)

New commits:
commit 8f349e3e49be6604326b1f991fb3c69765d7fc96
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 19 12:39:08 2008 +0100

    add testcase for recent fix

diff --git a/test/custom/Makefile.am b/test/custom/Makefile.am
index 4b2bc0c..e9d0a93 100644
--- a/test/custom/Makefile.am
+++ b/test/custom/Makefile.am
@@ -34,6 +34,11 @@ EXTRA_DIST = \
 	button-hittest.c \
 	button-hittest.stas \
 	button-hittest.sts \
+	crash-0.5.90-up-to-date.as \
+	crash-0.5.90-up-to-date.stas \
+	crash-0.5.90-up-to-date.sts \
+  	crash-0.5.90-up-to-date.swf \
+	crash-0.5.90-up-to-date.swf.trace  
 	definebutton-5.swf \
 	definebutton-5.swf.trace \
 	definebutton-6.swf \
diff --git a/test/custom/crash-0.5.90-up-to-date.as b/test/custom/crash-0.5.90-up-to-date.as
new file mode 100644
index 0000000..e4fd071
--- /dev/null
+++ b/test/custom/crash-0.5.90-up-to-date.as
@@ -0,0 +1,12 @@
+// makeswf -v 7 -s 200x150 -r 1 -o crash-0.5.90-up-to-date.swf crash-0.5.90-up-to-date.as
+
+createEmptyMovieClip ("a", 0);
+a.beginFill (0);
+a.lineTo (0, 10);
+a.lineTo (10, 10);
+a.lineTo (10, 0);
+a.lineTo (0, 0);
+a.endFill ();
+a._xscale = 50;
+Mouse.addListener ({ onMouseMove: function () { trace ("hi"); a._xscale = 10000 / a._xscale; } });
+startDrag (a, 1);
diff --git a/test/custom/crash-0.5.90-up-to-date.stas b/test/custom/crash-0.5.90-up-to-date.stas
new file mode 100644
index 0000000..865329d
--- /dev/null
+++ b/test/custom/crash-0.5.90-up-to-date.stas
@@ -0,0 +1,64 @@
+/* Swfdec
+ * Copyright (C) 2008 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+run_test = function (t, file) {
+  var e;
+  print ("Testing " + file);
+  try {
+    t.reset (file);
+    t.trace (file + ".trace");
+    t.advance (1000);
+    t.mouse_move (50, 50);
+    t.advance (1000);
+    t.mouse_press (50, 50);
+    t.advance (1000);
+    t.mouse_move (140, 140);
+    t.advance (1000);
+    t.mouse_move (50, 50);
+    t.advance (1000);
+    t.mouse_release (50, 50);
+    t.advance (1000);
+    t.mouse_press (50, 50);
+    t.advance (1000);
+    t.mouse_move (140, 140);
+    t.advance (1000);
+    t.mouse_release (140, 140);
+    t.advance (1000);
+    t.trace ();
+  } catch (e) {
+    if (e) {
+      error (e);
+      return false;
+    }
+  };
+  Native.print ("  OK\n");
+  return true;
+};
+
+filenames.sort ();
+t = new Test ();
+fail = [];
+for (var i = 0; i < filenames.length; i++) {
+  if (!run_test (t, filenames[i]))
+    fail.push (filenames[i]);
+};
+if (fail.length > 0) {
+  error (fail.join ("\n       "));
+  throw (fail.length + " failures");
+}
diff --git a/test/custom/crash-0.5.90-up-to-date.sts b/test/custom/crash-0.5.90-up-to-date.sts
new file mode 100644
index 0000000..378773f
Binary files /dev/null and b/test/custom/crash-0.5.90-up-to-date.sts differ
diff --git a/test/custom/crash-0.5.90-up-to-date.swf b/test/custom/crash-0.5.90-up-to-date.swf
new file mode 100644
index 0000000..1484cd9
Binary files /dev/null and b/test/custom/crash-0.5.90-up-to-date.swf differ
diff --git a/test/custom/crash-0.5.90-up-to-date.swf.trace b/test/custom/crash-0.5.90-up-to-date.swf.trace
new file mode 100644
index 0000000..e69de29
commit 0ef290706934ca486aa9d2de7e7fc4e0aaeff750
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 19 12:37:59 2008 +0100

    don't crash when Mouse.onMouseMove modifies the dragged movie

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index bab43c3..e056149 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -1070,40 +1070,6 @@ swfdec_player_update_mouse_cursor (SwfdecPlayer *player)
   }
 }
 
-static void
-swfdec_player_update_drag_movie (SwfdecPlayer *player)
-{
-  SwfdecPlayerPrivate *priv = player->priv;
-  double x, y;
-  SwfdecMovie *movie;
-
-  if (priv->mouse_drag == NULL)
-    return;
-
-  movie = priv->mouse_drag;
-  g_assert (movie->cache_state == SWFDEC_MOVIE_UP_TO_DATE);
-  x = priv->mouse_x;
-  y = priv->mouse_y;
-  swfdec_player_stage_to_global (player, &x, &y);
-  if (movie->parent)
-    swfdec_movie_global_to_local (movie->parent, &x, &y);
-  if (priv->mouse_drag_center) {
-    x -= (movie->extents.x1 - movie->extents.x0) / 2;
-    y -= (movie->extents.y1 - movie->extents.y0) / 2;
-  } else {
-    x -= priv->mouse_drag_x;
-    y -= priv->mouse_drag_y;
-  }
-  x = CLAMP (x, priv->mouse_drag_rect.x0, priv->mouse_drag_rect.x1);
-  y = CLAMP (y, priv->mouse_drag_rect.y0, priv->mouse_drag_rect.y1);
-  SWFDEC_LOG ("mouse is at %g %g, originally (%g %g)", x, y, priv->mouse_x, priv->mouse_y);
-  if (x != movie->matrix.x0 || y != movie->matrix.y0) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
-    movie->matrix.x0 = x;
-    movie->matrix.y0 = y;
-  }
-}
-
 /**
  * swfdec_player_set_drag_movie:
  * @player: a #SwfdecPlayer
@@ -1148,12 +1114,8 @@ swfdec_player_set_drag_movie (SwfdecPlayer *player, SwfdecMovie *drag, gboolean
   SWFDEC_DEBUG ("starting drag in %g %g  %g %g", 
       priv->mouse_drag_rect.x0, priv->mouse_drag_rect.y0,
       priv->mouse_drag_rect.x1, priv->mouse_drag_rect.y1);
-  /* FIXME: need a way to make sure we get updated */
-  if (drag) {
-    swfdec_movie_update (drag);
+  if (drag)
     drag->modified = TRUE;
-    swfdec_player_update_drag_movie (player);
-  }
 }
 
 static void
@@ -1227,7 +1189,6 @@ swfdec_player_do_mouse_move (SwfdecPlayer *player, double x, double y)
     swfdec_player_broadcast (player, SWFDEC_AS_STR_Mouse, SWFDEC_AS_STR_onMouseMove);
   }
   swfdec_player_grab_mouse_movie (player);
-  swfdec_player_update_drag_movie (player);
 
   /* FIXME: allow events to pass through */
   return TRUE;
@@ -1544,6 +1505,40 @@ swfdec_player_lock (SwfdecPlayer *player)
   return TRUE;
 }
 
+static void
+swfdec_player_update_drag_movie (SwfdecPlayer *player)
+{
+  SwfdecPlayerPrivate *priv = player->priv;
+  double x, y;
+  SwfdecMovie *movie;
+
+  if (priv->mouse_drag == NULL)
+    return;
+
+  movie = priv->mouse_drag;
+  swfdec_movie_update (movie);
+  x = priv->mouse_x;
+  y = priv->mouse_y;
+  swfdec_player_stage_to_global (player, &x, &y);
+  if (movie->parent)
+    swfdec_movie_global_to_local (movie->parent, &x, &y);
+  if (priv->mouse_drag_center) {
+    x -= (movie->extents.x1 - movie->extents.x0) / 2;
+    y -= (movie->extents.y1 - movie->extents.y0) / 2;
+  } else {
+    x -= priv->mouse_drag_x;
+    y -= priv->mouse_drag_y;
+  }
+  x = CLAMP (x, priv->mouse_drag_rect.x0, priv->mouse_drag_rect.x1);
+  y = CLAMP (y, priv->mouse_drag_rect.y0, priv->mouse_drag_rect.y1);
+  SWFDEC_LOG ("mouse is at %g %g, originally (%g %g)", x, y, priv->mouse_x, priv->mouse_y);
+  if (x != movie->matrix.x0 || y != movie->matrix.y0) {
+    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    movie->matrix.x0 = x;
+    movie->matrix.y0 = y;
+  }
+}
+
 /* runs queued invalidations for all movies and resets the movies */
 static void
 swfdec_player_update_movies (SwfdecPlayer *player)
@@ -1551,6 +1546,7 @@ swfdec_player_update_movies (SwfdecPlayer *player)
   SwfdecMovie *movie;
   GList *walk;
 
+  swfdec_player_update_drag_movie (player);
   /* FIXME: This g_list_last could be slow */
   for (walk = g_list_last (player->priv->movies); walk; walk = walk->prev) {
     movie = walk->data;
commit 0c651629b9ca08257a9bf56d5883d0bff66043b5
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 19 12:37:35 2008 +0100

    remove useless comment

diff --git a/swfdec/swfdec_as_string.c b/swfdec/swfdec_as_string.c
index 1b284a4..3468e37 100644
--- a/swfdec/swfdec_as_string.c
+++ b/swfdec/swfdec_as_string.c
@@ -342,15 +342,6 @@ swfdec_as_string_valueOf (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STRING (object)->string);
 }
 
-#if 0
-charAt(index:Number) : String
-charCodeAt(index:Number) : Number
-concat(value:Object) : String
-indexOf(value:String, [startIndex:Number]) : Number
-slice(start:Number, end:Number) : String
-split(delimiter:String, [limit:Number]) : Array
-#endif
-
 static void
 swfdec_as_string_split_5 (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
commit e9f03754837dca8c40b5058ee9d5673d0e6243f6
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 19 12:32:32 2008 +0100

    actually exit on failure (whoopee)

diff --git a/test/custom/Makefile.am b/test/custom/Makefile.am
index 11b2d82..4b2bc0c 100644
--- a/test/custom/Makefile.am
+++ b/test/custom/Makefile.am
@@ -1,6 +1,6 @@
 check-local:
 	for file in $(srcdir)/*.sts; do \
-	  ../swfdec-test --script $$file $(srcdir)/`basename $$file .sts`*.swf; \
+	  ../swfdec-test --script $$file $(srcdir)/`basename $$file .sts`*.swf || exit $?; \
 	done
 
 EXTRA_DIST = \
commit f6e192706f105e677b6a858c90a023ab772b89ae
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Feb 19 10:50:44 2008 +0100

    one slash too much for absolute urls

diff --git a/swfdec/swfdec_url.c b/swfdec/swfdec_url.c
index 5e86632..3a041d3 100644
--- a/swfdec/swfdec_url.c
+++ b/swfdec/swfdec_url.c
@@ -646,7 +646,7 @@ swfdec_url_new_from_input (const char *input)
   /* FIXME: split at '?' for query? */
   if (g_path_is_absolute (input)) {
     url = swfdec_url_new_components ("file", NULL, 0,
-	input, NULL);
+	input[0] == '/' ? &input[1] : &input[0], NULL);
   } else {
     char *absolute, *cur;
     cur = g_get_current_dir ();
commit 9a8be7124accd34e02a637493ec9099f0ce222a1
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Feb 18 16:19:24 2008 +0100

    add testcase for recent commit

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 86d3f08..850d742 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -30,6 +30,15 @@ EXTRA_DIST = \
 	add2-7.swf.trace \
 	add2-8.swf \
 	add2-8.swf.trace \
+	add2-different-objects-5.swf \
+	add2-different-objects-5.swf.trace \
+	add2-different-objects-6.swf \
+	add2-different-objects-6.swf.trace \
+	add2-different-objects-7.swf \
+	add2-different-objects-7.swf.trace \
+	add2-different-objects-8.swf \
+	add2-different-objects-8.swf.trace \
+	add2-different-objects.as \
 	addProperty.as \
 	addProperty-5.swf \
 	addProperty-5.swf.trace \
diff --git a/test/trace/add2-different-objects-5.swf b/test/trace/add2-different-objects-5.swf
new file mode 100644
index 0000000..ec7666d
Binary files /dev/null and b/test/trace/add2-different-objects-5.swf differ
diff --git a/test/trace/add2-different-objects-5.swf.trace b/test/trace/add2-different-objects-5.swf.trace
new file mode 100644
index 0000000..0ff75c7
--- /dev/null
+++ b/test/trace/add2-different-objects-5.swf.trace
@@ -0,0 +1,132 @@
+>>> Date
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> Number
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> String
+valueOf: 
+String: 
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> Object
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> XML
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> Boolean
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+valueOf: 
+== "hi": false
+valueOf: 
+valueOf: 
+== 1: false
+valueOf: 
+valueOf: 
+== self: true
+>>> MovieClip
+String: _level0
+Number: NaN
+Self: NaN
+== "hi": false
+== 1: false
+== self: true
diff --git a/test/trace/add2-different-objects-6.swf b/test/trace/add2-different-objects-6.swf
new file mode 100644
index 0000000..4bbc189
Binary files /dev/null and b/test/trace/add2-different-objects-6.swf differ
diff --git a/test/trace/add2-different-objects-6.swf.trace b/test/trace/add2-different-objects-6.swf.trace
new file mode 100644
index 0000000..700c7d3
--- /dev/null
+++ b/test/trace/add2-different-objects-6.swf.trace
@@ -0,0 +1,108 @@
+>>> Date
+toString:
+toString:
+String: [type Object]
+toString:
+valueOf: 
+Number: NaN
+toString:
+toString:
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Number
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> String
+valueOf: 
+String: 
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Object
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> XML
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Boolean
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> MovieClip
+String: _level0
+Number: NaN
+Self: NaN
+== "hi": false
+== 1: false
+== self: true
diff --git a/test/trace/add2-different-objects-7.swf b/test/trace/add2-different-objects-7.swf
new file mode 100644
index 0000000..a87ba09
Binary files /dev/null and b/test/trace/add2-different-objects-7.swf differ
diff --git a/test/trace/add2-different-objects-7.swf.trace b/test/trace/add2-different-objects-7.swf.trace
new file mode 100644
index 0000000..700c7d3
--- /dev/null
+++ b/test/trace/add2-different-objects-7.swf.trace
@@ -0,0 +1,108 @@
+>>> Date
+toString:
+toString:
+String: [type Object]
+toString:
+valueOf: 
+Number: NaN
+toString:
+toString:
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Number
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> String
+valueOf: 
+String: 
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Object
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> XML
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Boolean
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> MovieClip
+String: _level0
+Number: NaN
+Self: NaN
+== "hi": false
+== 1: false
+== self: true
diff --git a/test/trace/add2-different-objects-8.swf b/test/trace/add2-different-objects-8.swf
new file mode 100644
index 0000000..10392c4
Binary files /dev/null and b/test/trace/add2-different-objects-8.swf differ
diff --git a/test/trace/add2-different-objects-8.swf.trace b/test/trace/add2-different-objects-8.swf.trace
new file mode 100644
index 0000000..700c7d3
--- /dev/null
+++ b/test/trace/add2-different-objects-8.swf.trace
@@ -0,0 +1,108 @@
+>>> Date
+toString:
+toString:
+String: [type Object]
+toString:
+valueOf: 
+Number: NaN
+toString:
+toString:
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Number
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> String
+valueOf: 
+String: 
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Object
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> XML
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> Boolean
+valueOf: 
+toString:
+String: [type Object]
+valueOf: 
+valueOf: 
+Number: NaN
+valueOf: 
+valueOf: 
+valueOf: 
+valueOf: 
+Self: NaN
+valueOf: 
+== "hi": false
+valueOf: 
+== 1: false
+== self: true
+>>> MovieClip
+String: _level0
+Number: NaN
+Self: NaN
+== "hi": false
+== 1: false
+== self: true
diff --git a/test/trace/add2-different-objects.as b/test/trace/add2-different-objects.as
new file mode 100644
index 0000000..ac3645a
--- /dev/null
+++ b/test/trace/add2-different-objects.as
@@ -0,0 +1,32 @@
+// makeswf -v 7 -s 200x150 -r 1 -o add2-different-objects.swf add2-different-objects.as
+
+classes = [ "Date", "Number", "String", "Object", "XML", "Boolean" ];
+
+function test (x)
+{
+  x.valueOf = function () { trace ("valueOf: " + arguments); return x; };
+  x.toString = function () { trace ("toString:" + arguments); return x; };
+  trace ("String: " + x);
+  trace ("Number: " + (0 + x));
+  trace ("Self: " + (x + x));
+  trace ("== \"hi\": " + (x == "hi"));
+  trace ("== 1: " + (x == 1));
+  trace ("== self: " + (x == x));
+};
+
+for (i = 0; i < classes.length; i++) {
+  trace (">>> " + classes[i]);
+  x = classes[i];
+  asm {
+    push "x", "x"
+    getvariable
+    getvariable
+    setvariable
+  };
+  test (new x ());
+}
+
+trace (">>> MovieClip");
+test (this);
+
+loadMovie ("fscommand:quit", "");
commit 32f4bf91cdb5cc4810c012db274853a7f1c29729
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Feb 18 16:17:10 2008 +0100

    add2 calls toString instead of valueOf for Date objects if version >= 6
    
    don't ask me why...

diff --git a/swfdec/swfdec_as_interpret.c b/swfdec/swfdec_as_interpret.c
index da2ba77..d9030d3 100644
--- a/swfdec/swfdec_as_interpret.c
+++ b/swfdec/swfdec_as_interpret.c
@@ -1,5 +1,5 @@
 /* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *               2007 Pekka Lampila <pekka.lampila at iki.fi>
  *
  * This library is free software; you can redistribute it and/or
@@ -24,6 +24,7 @@
 #include "swfdec_as_interpret.h"
 #include "swfdec_as_array.h"
 #include "swfdec_as_context.h"
+#include "swfdec_as_date.h"
 #include "swfdec_as_frame_internal.h"
 #include "swfdec_as_function.h"
 #include "swfdec_as_internal.h"
@@ -960,6 +961,25 @@ swfdec_action_binary (SwfdecAsContext *cx, guint action, const guint8 *data, gui
 }
 
 static void
+swfdec_action_add2_to_primitive (SwfdecAsValue *value)
+{
+  SwfdecAsObject *object;
+  const char *name;
+
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (value))
+    return;
+  object = SWFDEC_AS_VALUE_GET_OBJECT (value);
+  if (SWFDEC_IS_MOVIE (object))
+    return;
+
+  if (SWFDEC_IS_AS_DATE (object) && object->context->version > 5)
+    name = SWFDEC_AS_STR_toString;
+  else
+    name = SWFDEC_AS_STR_valueOf;
+  swfdec_as_object_call (SWFDEC_AS_VALUE_GET_OBJECT (value), name, 0, NULL, value);
+}
+
+static void
 swfdec_action_add2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
 {
   SwfdecAsValue *rval, *lval, rtmp, ltmp;
@@ -968,10 +988,10 @@ swfdec_action_add2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint
   lval = swfdec_as_stack_peek (cx, 2);
   rtmp = *rval;
   ltmp = *lval;
-  swfdec_as_value_to_primitive (&rtmp);
+  swfdec_action_add2_to_primitive (&rtmp);
   if (!SWFDEC_AS_VALUE_IS_OBJECT (&rtmp) || SWFDEC_IS_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (&rtmp)))
     rval = &rtmp;
-  swfdec_as_value_to_primitive (&ltmp);
+  swfdec_action_add2_to_primitive (&ltmp);
   if (!SWFDEC_AS_VALUE_IS_OBJECT (&ltmp) || SWFDEC_IS_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (&ltmp)))
     lval = &ltmp;
 
commit c3783a43dbe309182c75cc36862cbc537abf011c
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Feb 18 16:13:56 2008 +0100

    Date and String are somewhat special it seems

diff --git a/test/trace/values.as b/test/trace/values.as
index b6f19be..3121ed1 100644
--- a/test/trace/values.as
+++ b/test/trace/values.as
@@ -36,7 +36,8 @@ values = [
   true, false, 
   0, 1, 0.5, -1, -0.5, Infinity, -Infinity, NaN,
   "", "0", "-0", "0.0", "1", "Hello World!", "true", "_level0", "äöü",
-  this, new Object (), Function, printall, printtostring, printvalueof, nothing ];
+  this, new Object (), new Date (), new String (),
+  Function, printall, printtostring, printvalueof, nothing ];
 
 var l = values.length;
 var v = function () {
commit 0249fa5fa7d5a6846dfbf8bd7c292d3ead17a1d6
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Feb 18 12:46:49 2008 +0100

    compute pixel aspect ratio, too

diff --git a/swfdec-gtk/swfdec_gtk_system.c b/swfdec-gtk/swfdec_gtk_system.c
index 1c94bc1..c54feb7 100644
--- a/swfdec-gtk/swfdec_gtk_system.c
+++ b/swfdec-gtk/swfdec_gtk_system.c
@@ -149,6 +149,8 @@ swfdec_gtk_system_new (GdkScreen *screen)
       "language", lang, "utc-offset", swfdec_gtk_system_get_utc_offset (),
       "dpi", dpi, "screen-height", gdk_screen_get_height (screen), 
       "screen-width", gdk_screen_get_width (screen), 
+      "pixel-aspect-ratio", (double) gdk_screen_get_width (screen) * gdk_screen_get_height_mm (screen)
+	  / (gdk_screen_get_width_mm (screen) * gdk_screen_get_height (screen)),
       NULL);
   SWFDEC_GTK_SYSTEM (system)->priv->screen = g_object_ref (screen);
 


More information about the Swfdec-commits mailing list