[Swfdec] Branch 'vivi' - 23 commits - libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_super.c libswfdec/swfdec_as_with.c libswfdec/swfdec_movie.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_sprite_movie.c test/trace vivified/core vivified/dock vivified/ui
Benjamin Otte
company at kemper.freedesktop.org
Thu Aug 16 04:09:29 PDT 2007
libswfdec/swfdec_as_object.c | 111 ++++++++++++++--------
libswfdec/swfdec_as_object.h | 1
libswfdec/swfdec_as_super.c | 4
libswfdec/swfdec_as_with.c | 7 -
libswfdec/swfdec_movie.c | 10 -
libswfdec/swfdec_net_stream.c | 6 -
libswfdec/swfdec_sprite_movie.c | 6 -
test/trace/Makefile.am | 45 ++++++++
test/trace/addProperty-delete-5.swf |binary
test/trace/addProperty-delete-5.swf.trace | 3
test/trace/addProperty-delete-6.swf |binary
test/trace/addProperty-delete-6.swf.trace | 3
test/trace/addProperty-delete-7.swf |binary
test/trace/addProperty-delete-7.swf.trace | 3
test/trace/addProperty-delete-8.swf |binary
test/trace/addProperty-delete-8.swf.trace | 3
test/trace/addProperty-delete.as | 11 ++
test/trace/addProperty-get-prototypes-5.swf |binary
test/trace/addProperty-get-prototypes-5.swf.trace | 6 +
test/trace/addProperty-get-prototypes-6.swf |binary
test/trace/addProperty-get-prototypes-6.swf.trace | 9 +
test/trace/addProperty-get-prototypes-7.swf |binary
test/trace/addProperty-get-prototypes-7.swf.trace | 9 +
test/trace/addProperty-get-prototypes-8.swf |binary
test/trace/addProperty-get-prototypes-8.swf.trace | 9 +
test/trace/addProperty-get-prototypes.as | 18 +++
test/trace/addProperty-set-prototypes-5.swf |binary
test/trace/addProperty-set-prototypes-5.swf.trace | 4
test/trace/addProperty-set-prototypes-6.swf |binary
test/trace/addProperty-set-prototypes-6.swf.trace | 5
test/trace/addProperty-set-prototypes-7.swf |binary
test/trace/addProperty-set-prototypes-7.swf.trace | 5
test/trace/addProperty-set-prototypes-8.swf |binary
test/trace/addProperty-set-prototypes-8.swf.trace | 5
test/trace/addProperty-set-prototypes.as | 18 +++
test/trace/property-native-5.swf |binary
test/trace/property-native-5.swf.trace | 4
test/trace/property-native-6.swf |binary
test/trace/property-native-6.swf.trace | 4
test/trace/property-native-7.swf |binary
test/trace/property-native-7.swf.trace | 4
test/trace/property-native-8.swf |binary
test/trace/property-native-8.swf.trace | 4
test/trace/property-native.as | 11 ++
test/trace/prototype-movie-5.swf |binary
test/trace/prototype-movie-5.swf.trace | 4
test/trace/prototype-movie-6.swf |binary
test/trace/prototype-movie-6.swf.trace | 4
test/trace/prototype-movie-7.swf |binary
test/trace/prototype-movie-7.swf.trace | 4
test/trace/prototype-movie-8.swf |binary
test/trace/prototype-movie-8.swf.trace | 4
test/trace/prototype-movie.as | 12 ++
vivified/core/vivi_application.c | 58 ++++++++++-
vivified/core/vivi_application.h | 2
vivified/core/vivi_application_as.c | 15 ++
vivified/core/vivi_debugger.c | 2
vivified/core/vivi_function.c | 6 +
vivified/core/vivi_initialize.as | 52 ++++++++--
vivified/dock/vivi_vdock.c | 73 ++++----------
vivified/dock/vivi_vdock.h | 6 +
vivified/ui/main.c | 18 ++-
vivified/ui/vivi_player.c | 3
63 files changed, 467 insertions(+), 124 deletions(-)
New commits:
diff-tree 6e6a99cc02d9399a08398cdcffe0599bc724fe1a (from 380e971ad1cbc7ebf9e8bea743d47cf70072d6c7)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 13:09:31 2007 +0200
debugging g_print removal #3423
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 803d82f..ee112db 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -897,7 +897,6 @@ swfdec_as_object_create (SwfdecAsFunctio
if (native->construct_size) {
type = native->construct_type;
size = native->construct_size;
- g_print ("type is %s\n", g_type_name (type));
break;
}
}
@@ -908,7 +907,6 @@ swfdec_as_object_create (SwfdecAsFunctio
if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
cur = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val);
if (SWFDEC_IS_AS_FUNCTION (cur)) {
- g_print ("found one!\n");
continue;
}
}
diff-tree 380e971ad1cbc7ebf9e8bea743d47cf70072d6c7 (from 670335c62948358e9126c86478752e20eee5d20f)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 13:09:05 2007 +0200
don't mess with the prototype anymore, swfdec handles it now
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 6c8640b..430110d 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -22,7 +22,6 @@ Breakpoint = function () extends Native.
Breakpoint.list.push (this);
};
Breakpoint.list = new Array ();
-Breakpoint.prototype = new Object ();
Wrap = function () {};
Wrap.prototype = {};
diff-tree 670335c62948358e9126c86478752e20eee5d20f (from ab94c6f2d440cd05cf4363a717769aa7886a7587)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 13:08:44 2007 +0200
walk the inheritance chain to find an objects type
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index b5dcd25..803d82f 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -883,6 +883,7 @@ swfdec_as_object_create (SwfdecAsFunctio
SwfdecAsObject *new;
SwfdecAsContext *context;
SwfdecAsFunction *cur;
+ SwfdecAsValue val;
guint size;
GType type = 0;
@@ -890,29 +891,30 @@ swfdec_as_object_create (SwfdecAsFunctio
context = SWFDEC_AS_OBJECT (fun)->context;
cur = fun;
- while (type == 0 && cur != NULL) {
+ do {
if (SWFDEC_IS_AS_NATIVE_FUNCTION (cur)) {
SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (cur);
if (native->construct_size) {
type = native->construct_type;
size = native->construct_size;
+ g_print ("type is %s\n", g_type_name (type));
break;
}
}
-#if 0
- This doesn't work. It's supposed to figure out the last native object in the inheritance chain.
- swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (cur), SWFDEC_AS_STR___constructor__, &val);
+ swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (cur), SWFDEC_AS_STR_prototype, &val);
if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
- cur = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val);
- if (!SWFDEC_IS_AS_FUNCTION (cur))
- cur = NULL;
- } else {
- cur = NULL;
+ SwfdecAsObject *proto = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+ swfdec_as_object_get_variable (proto, SWFDEC_AS_STR___constructor__, &val);
+ if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
+ cur = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val);
+ if (SWFDEC_IS_AS_FUNCTION (cur)) {
+ g_print ("found one!\n");
+ continue;
+ }
+ }
}
-#else
cur = NULL;
-#endif
- }
+ } while (type == 0 && cur != NULL);
if (type == 0) {
type = SWFDEC_TYPE_AS_OBJECT;
size = sizeof (SwfdecAsObject);
diff-tree ab94c6f2d440cd05cf4363a717769aa7886a7587 (from 9792ce9e8ae0793131e59008f15c2d47e69dd2b5)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 13:08:17 2007 +0200
breakpoints are objects
diff --git a/vivified/core/vivi_function.c b/vivified/core/vivi_function.c
index 4c2608c..686862a 100644
--- a/vivified/core/vivi_function.c
+++ b/vivified/core/vivi_function.c
@@ -76,6 +76,12 @@ vivi_function_init_context (ViviApplicat
0, functions[i].fun, 0);
swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (fun),
VIVI_TYPE_BREAKPOINT);
+ obj = swfdec_as_object_new (cx);
+ if (obj == NULL)
+ return;
+ SWFDEC_AS_VALUE_SET_OBJECT (&val, obj);
+ swfdec_as_object_set_variable (SWFDEC_AS_OBJECT (fun),
+ swfdec_as_context_get_string (cx, "prototype"), &val);
g_signal_connect (app, "message", G_CALLBACK (vivi_function_not_reached), NULL);
vivi_application_execute (app, vivi_initialize);
diff-tree 9792ce9e8ae0793131e59008f15c2d47e69dd2b5 (from 567ee69db12396392b896a06868c6c27edcc6a90)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:54:24 2007 +0200
add a list command to list all breakpoints
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index a754cb2..6c8640b 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -17,7 +17,12 @@
* Boston, MA 02110-1301 USA
*/
-Breakpoint = Native.Breakpoint;
+Breakpoint = function () extends Native.Breakpoint {
+ super ();
+ Breakpoint.list.push (this);
+};
+Breakpoint.list = new Array ();
+Breakpoint.prototype = new Object ();
Wrap = function () {};
Wrap.prototype = {};
@@ -59,5 +64,14 @@ Commands.add = function (name) {
Commands.print (" " + frame);
return true;
};
+ ret.toString = function () {
+ return "function call " + name;
+ };
+};
+Commands.list = function () {
+ var a = Breakpoint.list;
+ var i;
+ for (i = 0; i < a.length; i++) {
+ Commands.print (i + ": " + a[i]);
+ }
};
-
diff-tree 567ee69db12396392b896a06868c6c27edcc6a90 (from 2101df59fadb5037503673f1ce712ecb1a3dff19)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:35:25 2007 +0200
new "add" function to add breakpoints
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 281faba..a754cb2 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -44,3 +44,20 @@ Commands.restart = function () {
Commands.run ();
};
Commands.quit = Native.quit;
+/* can't use "break" as a function name, it's a keyword in JS */
+Commands.add = function (name) {
+ if (name == undefined) {
+ Commands.error ("add command requires a function name");
+ return undefined;
+ }
+ var ret = new Breakpoint ();
+ ret.onStartFrame = function (frame) {
+ if (frame.name != name)
+ return false;
+
+ Commands.print ("Breakpoint: function " + name + " called");
+ Commands.print (" " + frame);
+ return true;
+ };
+};
+
diff-tree 2101df59fadb5037503673f1ce712ecb1a3dff19 (from 97c4c386c1da957a75e2b41fecac9a2253515211)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:33:01 2007 +0200
restructure and add error function
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index 4852d82..281faba 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -17,8 +17,21 @@
* Boston, MA 02110-1301 USA
*/
+Breakpoint = Native.Breakpoint;
+
+Wrap = function () {};
+Wrap.prototype = {};
+Wrap.prototype.toString = Native.wrap_toString;
+
+Frame = function () extends Wrap {};
+Frame.prototype = new Wrap ();
+Frame.prototype.addProperty ("name", Native.frame_name_get, null);
+
+/*** commands available for debugging ***/
+
Commands = new Object ();
Commands.print = Native.print;
+Commands.error = Native.error;
Commands.r = Native.run;
Commands.run = Native.run;
Commands.halt = Native.stop;
@@ -31,14 +44,3 @@ Commands.restart = function () {
Commands.run ();
};
Commands.quit = Native.quit;
-
-Breakpoint = Native.Breakpoint;
-
-Wrap = function () {};
-Wrap.prototype = {};
-Wrap.prototype.toString = Native.wrap_toString;
-
-Frame = function () extends Wrap {};
-Frame.prototype = new Wrap ();
-Frame.prototype.addProperty ("name", Native.frame_name_get, null);
-
diff-tree 97c4c386c1da957a75e2b41fecac9a2253515211 (from ece89b8a8842215f3e1e68a09181e1b6ebadf8e3)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:32:20 2007 +0200
clean up the vdock, so it properly shuts down
diff --git a/vivified/dock/vivi_vdock.c b/vivified/dock/vivi_vdock.c
index d37d563..f79cb2d 100644
--- a/vivified/dock/vivi_vdock.c
+++ b/vivified/dock/vivi_vdock.c
@@ -28,14 +28,14 @@
G_DEFINE_TYPE (ViviVDock, vivi_vdock, GTK_TYPE_BIN)
static void
-vivi_vdock_dispose (GObject *object)
+vivi_vdock_destroy (GtkObject *object)
{
ViviVDock *vdock = VIVI_VDOCK (object);
+ GTK_OBJECT_CLASS (vivi_vdock_parent_class)->destroy (object);
+
g_list_free (vdock->docklets);
vdock->docklets = NULL;
-
- G_OBJECT_CLASS (vivi_vdock_parent_class)->dispose (object);
}
static void
@@ -62,18 +62,20 @@ vivi_vdock_size_allocate (GtkWidget *wid
}
}
-static void
-vivi_vdock_add (GtkContainer *container, GtkWidget *widget)
+void
+vivi_vdock_add (ViviVDock *vdock, GtkWidget *widget)
{
- ViviVDock *vdock = VIVI_VDOCK (container);
GtkWidget *docker;
+ g_return_if_fail (VIVI_IS_VDOCK (vdock));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
docker = vivi_docker_new (VIVI_DOCKLET (widget));
gtk_widget_show (docker);
g_object_ref (widget);
if (vdock->docklets == NULL) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->add (container, docker);
+ gtk_container_add (GTK_CONTAINER (vdock), docker);
} else {
/* docklet is in docker, so we need to use parent */
GtkWidget *last = gtk_widget_get_parent (vdock->docklets->data);
@@ -81,18 +83,14 @@ vivi_vdock_add (GtkContainer *container,
GtkWidget *paned;
g_object_ref (last);
- if (parent == (GtkWidget *) container) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->remove (container, last);
- } else {
- gtk_container_remove (GTK_CONTAINER (parent), last);
- }
+ gtk_container_remove (GTK_CONTAINER (parent), last);
paned = gtk_vpaned_new ();
gtk_paned_pack1 (GTK_PANED (paned), last, TRUE, FALSE);
gtk_paned_pack2 (GTK_PANED (paned), docker, TRUE, FALSE);
g_object_unref (last);
gtk_widget_show (paned);
- if (parent == (GtkWidget *) container) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->add (container, paned);
+ if (parent == (GtkWidget *) vdock) {
+ gtk_container_add (GTK_CONTAINER (vdock), paned);
} else {
gtk_paned_pack1 (GTK_PANED (parent), paned, TRUE, FALSE);
}
@@ -100,18 +98,17 @@ vivi_vdock_add (GtkContainer *container,
vdock->docklets = g_list_prepend (vdock->docklets, widget);
}
-static void
-vivi_vdock_remove (GtkContainer *container, GtkWidget *widget)
+void
+vivi_vdock_remove (ViviVDock *vdock, GtkWidget *widget)
{
- ViviVDock *vdock = VIVI_VDOCK (container);
GtkWidget *docker, *parent;
g_return_if_fail (g_list_find (vdock->docklets, widget));
docker = gtk_widget_get_parent (widget);
parent = gtk_widget_get_parent (docker);
- if (parent == (GtkWidget *) container) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->remove (container, docker);
+ if (parent == (GtkWidget *) vdock) {
+ gtk_container_remove (GTK_CONTAINER (vdock), docker);
} else {
GtkWidget *other;
GtkWidget *paned_parent;
@@ -123,9 +120,9 @@ vivi_vdock_remove (GtkContainer *contain
g_object_ref (other);
gtk_container_remove (GTK_CONTAINER (parent), docker);
gtk_container_remove (GTK_CONTAINER (parent), other);
- if (paned_parent == (GtkWidget *) container) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->remove (container, parent);
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->remove (container, other);
+ if (paned_parent == (GtkWidget *) vdock) {
+ gtk_container_remove (GTK_CONTAINER (vdock), parent);
+ gtk_container_add (GTK_CONTAINER (vdock), other);
} else {
gtk_container_remove (GTK_CONTAINER (paned_parent), parent);
gtk_paned_pack1 (GTK_PANED (parent), other, TRUE, FALSE);
@@ -136,44 +133,16 @@ vivi_vdock_remove (GtkContainer *contain
g_object_unref (widget);
}
-static GType
-vivi_vdock_child_type (GtkContainer *container)
-{
- return VIVI_TYPE_DOCKLET;
-}
-
-static void
-vivi_vdock_forall (GtkContainer *container, gboolean include_internals,
- GtkCallback callback, gpointer callback_data)
-{
- if (include_internals) {
- GTK_CONTAINER_CLASS (vivi_vdock_parent_class)->forall (container, include_internals,
- callback, callback_data);
- } else {
- GList *walk;
-
- for (walk = VIVI_VDOCK (container)->docklets; walk; walk = walk->next) {
- callback (walk->data, callback_data);
- }
- }
-}
-
static void
vivi_vdock_class_init (ViviVDockClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
- object_class->dispose = vivi_vdock_dispose;
+ object_class->destroy = vivi_vdock_destroy;
widget_class->size_request = vivi_vdock_size_request;
widget_class->size_allocate = vivi_vdock_size_allocate;
-
- container_class->add = vivi_vdock_add;
- container_class->remove = vivi_vdock_remove;
- container_class->child_type = vivi_vdock_child_type;
- container_class->forall = vivi_vdock_forall;
}
static void
diff --git a/vivified/dock/vivi_vdock.h b/vivified/dock/vivi_vdock.h
index ec3527f..7b0f61f 100644
--- a/vivified/dock/vivi_vdock.h
+++ b/vivified/dock/vivi_vdock.h
@@ -50,5 +50,11 @@ GType vivi_vdock_get_type (void);
GtkWidget * vivi_vdock_new (void);
+void vivi_vdock_add (ViviVDock * vdock,
+ GtkWidget * widget);
+void vivi_vdock_remove (ViviVDock * vdock,
+ GtkWidget * widget);
+
+
G_END_DECLS
#endif
diff --git a/vivified/ui/main.c b/vivified/ui/main.c
index 399483f..3f96021 100644
--- a/vivified/ui/main.c
+++ b/vivified/ui/main.c
@@ -37,6 +37,16 @@ try_grab_focus (GtkWidget *widget, gpoin
gtk_container_foreach (GTK_CONTAINER (widget), try_grab_focus, NULL);
}
+static gboolean
+delete_event (GtkWidget *widget, GdkEvent *event, ViviApplication *app)
+{
+ if (!vivi_application_is_quit (app)) {
+ vivi_application_quit (app);
+ return TRUE;
+ }
+ return FALSE;
+}
+
static void
setup (const char *filename)
{
@@ -46,15 +56,17 @@ setup (const char *filename)
app = vivi_application_new ();
vivi_application_set_filename (app, filename);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect_swapped (app, "notify::quit", G_CALLBACK (gtk_widget_destroy), window);
box = vivi_vdock_new ();
gtk_container_add (GTK_CONTAINER (window), box);
widget = vivi_player_new (app);
- gtk_container_add (GTK_CONTAINER (box), widget);
+ vivi_vdock_add (VIVI_VDOCK (box), widget);
widget = vivi_command_line_new (app);
- gtk_container_add (GTK_CONTAINER (box), widget);
+ vivi_vdock_add (VIVI_VDOCK (box), widget);
gtk_container_foreach (GTK_CONTAINER (widget), try_grab_focus, NULL);
- g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+ g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), app);
+ g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), app);
gtk_widget_show_all (window);
}
diff-tree ece89b8a8842215f3e1e68a09181e1b6ebadf8e3 (from 49807e47ac5b6560070a29a2d041df5ae57a2e88)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:31:51 2007 +0200
listen to the app's interrupted state and disable mouse and keyboard input on breakpoints
diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c
index 657d169..f54a935 100644
--- a/vivified/ui/vivi_player.c
+++ b/vivified/ui/vivi_player.c
@@ -31,6 +31,9 @@ vivi_player_notify_app (ViviApplication
{
if (g_str_equal (pspec->name, "player")) {
swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player->player), vivi_application_get_player (app));
+ } else if (g_str_equal (pspec->name, "interrupted")) {
+ swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (player->player),
+ !vivi_application_get_interrupted (app));
}
}
diff-tree 49807e47ac5b6560070a29a2d041df5ae57a2e88 (from dfa2a625eb1c2f036a30220c4606a8c010786272)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:31:10 2007 +0200
notify when the application is interrupted
diff --git a/vivified/core/vivi_debugger.c b/vivified/core/vivi_debugger.c
index 44149cc..915dff0 100644
--- a/vivified/core/vivi_debugger.c
+++ b/vivified/core/vivi_debugger.c
@@ -72,11 +72,13 @@ vivi_debugger_break (ViviDebugger *debug
app->playback_state = 0;
app->playback_count = 0;
app->loop = g_main_loop_new (NULL, FALSE);
+ g_object_notify (G_OBJECT (app), "interrupted");
g_main_loop_run (app->loop);
g_main_loop_unref (app->loop);
app->loop = NULL;
+ g_object_notify (G_OBJECT (app), "interrupted");
swfdec_player_lock_soft (app->player);
}
diff-tree dfa2a625eb1c2f036a30220c4606a8c010786272 (from af9936023a852946d0c23048d7d3195b757a7cdb)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 12:30:45 2007 +0200
add "interrupted" and "quit" property
ALso improve quitting to work as expected
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index e8f489f..624c911 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -35,7 +35,9 @@ enum {
enum {
PROP_0,
PROP_FILENAME,
- PROP_PLAYER
+ PROP_PLAYER,
+ PROP_INTERRUPTED,
+ PROP_QUIT
};
G_DEFINE_TYPE (ViviApplication, vivi_application, SWFDEC_TYPE_AS_CONTEXT)
@@ -54,6 +56,12 @@ vivi_application_get_property (GObject *
case PROP_PLAYER:
g_value_set_object (value, app->player);
break;
+ case PROP_INTERRUPTED:
+ g_value_set_boolean (value, app->loop != NULL);
+ break;
+ case PROP_QUIT:
+ g_value_set_boolean (value, app->playback_state == VIVI_APPLICATION_EXITING);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -81,6 +89,9 @@ vivi_application_dispose (GObject *objec
{
ViviApplication *app = VIVI_APPLICATION (object);
+ if (app->playback_state != VIVI_APPLICATION_EXITING)
+ vivi_application_quit (app);
+
g_object_unref (app->player);
g_hash_table_destroy (app->wraps);
@@ -102,6 +113,12 @@ vivi_application_class_init (ViviApplica
g_object_class_install_property (object_class, PROP_PLAYER,
g_param_spec_object ("player", "player", "Flash player in use",
SWFDEC_TYPE_PLAYER, G_PARAM_READABLE));
+ g_object_class_install_property (object_class, PROP_INTERRUPTED,
+ g_param_spec_boolean ("interrupted", "interrupted", "TRUE if handling a breakpoint",
+ FALSE, G_PARAM_READABLE));
+ g_object_class_install_property (object_class, PROP_QUIT,
+ g_param_spec_boolean ("quit", "quit", "TRUE if application has been quit (no breakpoints will happen)",
+ FALSE, G_PARAM_READABLE));
signals[MESSAGE] = g_signal_new ("message", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, /* FIXME */
@@ -189,6 +206,22 @@ vivi_application_get_player (ViviApplica
return app->player;
}
+gboolean
+vivi_application_get_interrupted (ViviApplication *app)
+{
+ g_return_val_if_fail (VIVI_IS_APPLICATION (app), FALSE);
+
+ return app->loop != NULL;
+}
+
+gboolean
+vivi_application_is_quit (ViviApplication *app)
+{
+ g_return_val_if_fail (VIVI_IS_APPLICATION (app), FALSE);
+
+ return app->playback_state == VIVI_APPLICATION_EXITING;
+}
+
static gboolean
vivi_application_step_forward (gpointer appp)
{
@@ -204,9 +237,14 @@ vivi_application_step_forward (gpointer
static void
vivi_application_check (ViviApplication *app)
{
- gboolean is_playing = swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (app->player));
- gboolean is_breakpoint = app->loop != NULL;
+ gboolean is_playing, is_breakpoint;
+ /* if we're inside some script code, don't do anything */
+ if (swfdec_as_context_get_frame (SWFDEC_AS_CONTEXT (app)))
+ return;
+
+ is_playing = swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (app->player));
+ is_breakpoint = app->loop != NULL;
swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (app));
switch (app->playback_state) {
@@ -293,8 +331,11 @@ vivi_application_play (ViviApplication *
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
+ if (app->playback_state == VIVI_APPLICATION_EXITING)
+ return;
app->playback_state = VIVI_APPLICATION_PLAYING;
app->playback_count = 1;
+ vivi_application_check (app);
}
void
@@ -302,8 +343,11 @@ vivi_application_stop (ViviApplication *
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
+ if (app->playback_state == VIVI_APPLICATION_EXITING)
+ return;
app->playback_state = VIVI_APPLICATION_STOPPED;
app->playback_count = 0;
+ vivi_application_check (app);
}
void
@@ -311,8 +355,11 @@ vivi_application_step (ViviApplication *
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
+ if (app->playback_state == VIVI_APPLICATION_EXITING)
+ return;
app->playback_state = VIVI_APPLICATION_STEPPING;
app->playback_count = n_times;
+ vivi_application_check (app);
}
void
@@ -320,8 +367,11 @@ vivi_application_quit (ViviApplication *
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
+ if (app->playback_state == VIVI_APPLICATION_EXITING)
+ return;
app->playback_state = VIVI_APPLICATION_EXITING;
app->playback_count = 1;
- gtk_main_quit ();
+ g_object_notify (G_OBJECT (app), "quit");
+ vivi_application_check (app);
}
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index 2636453..812b304 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -89,6 +89,8 @@ void vivi_application_set_filename (Vi
const char * filename);
const char * vivi_application_get_filename (ViviApplication * app);
SwfdecPlayer * vivi_application_get_player (ViviApplication * app);
+gboolean vivi_application_get_interrupted(ViviApplication * app);
+gboolean vivi_application_is_quit (ViviApplication * app);
void vivi_application_init_player (ViviApplication * app);
void vivi_application_reset (ViviApplication * app);
diff-tree af9936023a852946d0c23048d7d3195b757a7cdb (from 400039ceb439cbeb5938dac445ca5995eb0fce9d)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Aug 16 09:32:39 2007 +0200
add an error function for printing errors
diff --git a/vivified/core/vivi_application_as.c b/vivified/core/vivi_application_as.c
index a637428..6e2c011 100644
--- a/vivified/core/vivi_application_as.c
+++ b/vivified/core/vivi_application_as.c
@@ -89,6 +89,21 @@ vivi_application_as_print (SwfdecAsConte
vivi_application_output (app, "%s", s);
}
+VIVI_FUNCTION ("error", vivi_application_as_error)
+void
+vivi_application_as_error (SwfdecAsContext *cx, SwfdecAsObject *this,
+ guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+ ViviApplication *app = VIVI_APPLICATION (cx);
+ const char *s;
+
+ if (argc == 0)
+ return;
+
+ s = swfdec_as_value_to_string (cx, &argv[0]);
+ vivi_application_error (app, "%s", s);
+}
+
VIVI_FUNCTION ("quit", vivi_application_as_quit)
void
vivi_application_as_quit (SwfdecAsContext *cx, SwfdecAsObject *this,
diff-tree 400039ceb439cbeb5938dac445ca5995eb0fce9d (from parents)
Merge: 82cbf15d290ca8584505fd0c1970fa976de545dc bf81efebf34c71944530945a70c24532de6ea111
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 23:17:16 2007 +0200
Merge branch 'master' into vivi
diff-tree bf81efebf34c71944530945a70c24532de6ea111 (from 565cb315b34355849f0de3c656b3d9497b1164d2)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 23:14:01 2007 +0200
add test for deleting addProperty()'d properties
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 6ec5d28..45b56a8 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -37,6 +37,15 @@ EXTRA_DIST = \
addProperty-7.swf.trace \
addProperty-8.swf \
addProperty-8.swf.trace \
+ addProperty-delete.as \
+ addProperty-delete-5.swf \
+ addProperty-delete-5.swf.trace \
+ addProperty-delete-6.swf \
+ addProperty-delete-6.swf.trace \
+ addProperty-delete-7.swf \
+ addProperty-delete-7.swf.trace \
+ addProperty-delete-8.swf \
+ addProperty-delete-8.swf.trace \
addProperty-get-prototypes.as \
addProperty-get-prototypes-5.swf \
addProperty-get-prototypes-5.swf.trace \
diff --git a/test/trace/addProperty-delete-5.swf b/test/trace/addProperty-delete-5.swf
new file mode 100644
index 0000000..e10fec5
Binary files /dev/null and b/test/trace/addProperty-delete-5.swf differ
diff --git a/test/trace/addProperty-delete-5.swf.trace b/test/trace/addProperty-delete-5.swf.trace
new file mode 100644
index 0000000..2796bd0
--- /dev/null
+++ b/test/trace/addProperty-delete-5.swf.trace
@@ -0,0 +1,3 @@
+check if deleting a property added with addProperty works
+undefined
+undefined
diff --git a/test/trace/addProperty-delete-6.swf b/test/trace/addProperty-delete-6.swf
new file mode 100644
index 0000000..86571b2
Binary files /dev/null and b/test/trace/addProperty-delete-6.swf differ
diff --git a/test/trace/addProperty-delete-6.swf.trace b/test/trace/addProperty-delete-6.swf.trace
new file mode 100644
index 0000000..ec5834a
--- /dev/null
+++ b/test/trace/addProperty-delete-6.swf.trace
@@ -0,0 +1,3 @@
+check if deleting a property added with addProperty works
+42
+undefined
diff --git a/test/trace/addProperty-delete-7.swf b/test/trace/addProperty-delete-7.swf
new file mode 100644
index 0000000..ef3db72
Binary files /dev/null and b/test/trace/addProperty-delete-7.swf differ
diff --git a/test/trace/addProperty-delete-7.swf.trace b/test/trace/addProperty-delete-7.swf.trace
new file mode 100644
index 0000000..ec5834a
--- /dev/null
+++ b/test/trace/addProperty-delete-7.swf.trace
@@ -0,0 +1,3 @@
+check if deleting a property added with addProperty works
+42
+undefined
diff --git a/test/trace/addProperty-delete-8.swf b/test/trace/addProperty-delete-8.swf
new file mode 100644
index 0000000..cdf6511
Binary files /dev/null and b/test/trace/addProperty-delete-8.swf differ
diff --git a/test/trace/addProperty-delete-8.swf.trace b/test/trace/addProperty-delete-8.swf.trace
new file mode 100644
index 0000000..ec5834a
--- /dev/null
+++ b/test/trace/addProperty-delete-8.swf.trace
@@ -0,0 +1,3 @@
+check if deleting a property added with addProperty works
+42
+undefined
diff --git a/test/trace/addProperty-delete.as b/test/trace/addProperty-delete.as
new file mode 100644
index 0000000..2c8076b
--- /dev/null
+++ b/test/trace/addProperty-delete.as
@@ -0,0 +1,11 @@
+// makeswf -v 7 -s 200x150 -r 1 -o addProperty-delete.swf addProperty-delete.as
+
+trace ("check if deleting a property added with addProperty works");
+
+o = {};
+o.addProperty ("x", function () { return 42; }, null);
+trace (o.x);
+delete o.x;
+trace (o.x);
+
+loadMovie ("FSCommand:quit", "");
diff-tree 565cb315b34355849f0de3c656b3d9497b1164d2 (from b9d80cd0852b204c03e5828bfb4210e3ed98a2a4)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 23:11:31 2007 +0200
porperties added with addProperty aren't permanent.
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 8999597..b5dcd25 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -991,7 +991,7 @@ swfdec_as_object_add_variable (SwfdecAsO
return;
var->get = get;
var->set = set;
- var->flags = SWFDEC_AS_VARIABLE_PERMANENT;
+ var->flags = 0;
if (set == NULL)
var->flags |= SWFDEC_AS_VARIABLE_READONLY;
}
diff-tree b9d80cd0852b204c03e5828bfb4210e3ed98a2a4 (from c94ea432d4a4a30c76cd89d701d8cb9395347647)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 23:09:59 2007 +0200
fix getting of properties added with addProperty
We need access to the original object, so we can call the getter function
with that object.
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index b1d06e5..8999597 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -172,8 +172,8 @@ swfdec_as_object_hash_create (SwfdecAsOb
}
static gboolean
-swfdec_as_object_do_get (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_as_object_do_get (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecAsVariable *var = swfdec_as_object_hash_lookup (object, variable);
@@ -184,7 +184,7 @@ swfdec_as_object_do_get (SwfdecAsObject
return FALSE;
if (var->get) {
- swfdec_as_function_call (var->get, object, 0, NULL, val);
+ swfdec_as_function_call (var->get, orig, 0, NULL, val);
swfdec_as_context_run (object->context);
*flags = var->flags;
} else {
@@ -602,7 +602,7 @@ swfdec_as_object_get_variable_and_flags
guint i;
SwfdecAsValue tmp_val;
guint tmp_flags;
- SwfdecAsObject *tmp_pobject;
+ SwfdecAsObject *tmp_pobject, *cur;
g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE);
g_return_val_if_fail (variable != NULL, FALSE);
@@ -614,13 +614,14 @@ swfdec_as_object_get_variable_and_flags
if (pobject == NULL)
pobject = &tmp_pobject;
- for (i = 0; i < 256 && object != NULL; i++) {
- klass = SWFDEC_AS_OBJECT_GET_CLASS (object);
- if (klass->get (object, variable, value, flags)) {
- *pobject = object;
+ cur = object;
+ for (i = 0; i < 256 && cur != NULL; i++) {
+ klass = SWFDEC_AS_OBJECT_GET_CLASS (cur);
+ if (klass->get (cur, object, variable, value, flags)) {
+ *pobject = cur;
return TRUE;
}
- object = object->prototype;
+ cur = cur->prototype;
}
if (i == 256) {
swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded");
diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h
index f82cd9c..265c6cb 100644
--- a/libswfdec/swfdec_as_object.h
+++ b/libswfdec/swfdec_as_object.h
@@ -65,6 +65,7 @@ struct _SwfdecAsObjectClass {
void (* add) (SwfdecAsObject * object);
/* get the value and flags for a variables */
gboolean (* get) (SwfdecAsObject * object,
+ SwfdecAsObject * orig,
const char * variable,
SwfdecAsValue * val,
guint * flags);
diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c
index 5447bcd..653c30a 100644
--- a/libswfdec/swfdec_as_super.c
+++ b/libswfdec/swfdec_as_super.c
@@ -68,8 +68,8 @@ swfdec_as_super_call (SwfdecAsFunction *
}
static gboolean
-swfdec_as_super_get (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_as_super_get (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecAsSuper *super = SWFDEC_AS_SUPER (object);
diff --git a/libswfdec/swfdec_as_with.c b/libswfdec/swfdec_as_with.c
index a000ca3..62af9b8 100644
--- a/libswfdec/swfdec_as_with.c
+++ b/libswfdec/swfdec_as_with.c
@@ -47,11 +47,14 @@ swfdec_as_with_resolve (SwfdecAsObject *
}
static gboolean
-swfdec_as_with_get (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_as_with_get (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+ if (orig != object) {
+ SWFDEC_FIXME ("write tests for this case");
+ }
return swfdec_as_object_get_variable_and_flags (with->object, variable, val, flags, NULL);
}
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 776e2b1..3bac79f 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -841,15 +841,15 @@ swfdec_movie_get_by_name (SwfdecPlayer *
}
static gboolean
-swfdec_movie_get_variable (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecMovie *movie = SWFDEC_MOVIE (object);
if (movie->state == SWFDEC_MOVIE_STATE_DESTROYED)
return FALSE;
- if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, variable, val, flags))
+ if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, orig, variable, val, flags))
return TRUE;
if (swfdec_movie_get_asprop (movie, variable, val)) {
diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c
index b95f7a4..fac0886 100644
--- a/libswfdec/swfdec_net_stream.c
+++ b/libswfdec/swfdec_net_stream.c
@@ -350,12 +350,12 @@ swfdec_net_stream_dispose (GObject *obje
}
static gboolean
-swfdec_net_stream_get_variable (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_net_stream_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecNetStream *stream;
- if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, variable, val, flags))
+ if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, orig, variable, val, flags))
return TRUE;
stream = SWFDEC_NET_STREAM (object);
diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 488864c..4f9067d 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -622,12 +622,12 @@ swfdec_sprite_movie_get_by_name (SwfdecM
}
static gboolean
-swfdec_sprite_movie_get_variable (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *val, guint *flags)
+swfdec_sprite_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
+ const char *variable, SwfdecAsValue *val, guint *flags)
{
SwfdecMovie *movie;
- if (SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->get (object, variable, val, flags))
+ if (SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->get (object, orig, variable, val, flags))
return TRUE;
movie = swfdec_sprite_movie_get_by_name (SWFDEC_MOVIE (object), variable);
diff-tree c94ea432d4a4a30c76cd89d701d8cb9395347647 (from 01e8d90362605acf52d171de350853bd773e7edb)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 23:09:10 2007 +0200
add test case for next commit
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 591144a..6ec5d28 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -37,6 +37,15 @@ EXTRA_DIST = \
addProperty-7.swf.trace \
addProperty-8.swf \
addProperty-8.swf.trace \
+ addProperty-get-prototypes.as \
+ addProperty-get-prototypes-5.swf \
+ addProperty-get-prototypes-5.swf.trace \
+ addProperty-get-prototypes-6.swf \
+ addProperty-get-prototypes-6.swf.trace \
+ addProperty-get-prototypes-7.swf \
+ addProperty-get-prototypes-7.swf.trace \
+ addProperty-get-prototypes-8.swf \
+ addProperty-get-prototypes-8.swf.trace \
addProperty-set-prototypes.as \
addProperty-set-prototypes-5.swf \
addProperty-set-prototypes-5.swf.trace \
diff --git a/test/trace/addProperty-get-prototypes-5.swf b/test/trace/addProperty-get-prototypes-5.swf
new file mode 100644
index 0000000..171fd19
Binary files /dev/null and b/test/trace/addProperty-get-prototypes-5.swf differ
diff --git a/test/trace/addProperty-get-prototypes-5.swf.trace b/test/trace/addProperty-get-prototypes-5.swf.trace
new file mode 100644
index 0000000..f9ebb80
--- /dev/null
+++ b/test/trace/addProperty-get-prototypes-5.swf.trace
@@ -0,0 +1,6 @@
+Check getting of variables when addProperty has been used on prototypes.
+10
+10
+15
+undefined
+20
diff --git a/test/trace/addProperty-get-prototypes-6.swf b/test/trace/addProperty-get-prototypes-6.swf
new file mode 100644
index 0000000..9207fd8
Binary files /dev/null and b/test/trace/addProperty-get-prototypes-6.swf differ
diff --git a/test/trace/addProperty-get-prototypes-6.swf.trace b/test/trace/addProperty-get-prototypes-6.swf.trace
new file mode 100644
index 0000000..1082851
--- /dev/null
+++ b/test/trace/addProperty-get-prototypes-6.swf.trace
@@ -0,0 +1,9 @@
+Check getting of variables when addProperty has been used on prototypes.
+10
+10
+15
+o
+42
+o set
+o
+42
diff --git a/test/trace/addProperty-get-prototypes-7.swf b/test/trace/addProperty-get-prototypes-7.swf
new file mode 100644
index 0000000..cd76446
Binary files /dev/null and b/test/trace/addProperty-get-prototypes-7.swf differ
diff --git a/test/trace/addProperty-get-prototypes-7.swf.trace b/test/trace/addProperty-get-prototypes-7.swf.trace
new file mode 100644
index 0000000..1082851
--- /dev/null
+++ b/test/trace/addProperty-get-prototypes-7.swf.trace
@@ -0,0 +1,9 @@
+Check getting of variables when addProperty has been used on prototypes.
+10
+10
+15
+o
+42
+o set
+o
+42
diff --git a/test/trace/addProperty-get-prototypes-8.swf b/test/trace/addProperty-get-prototypes-8.swf
new file mode 100644
index 0000000..c2b4add
Binary files /dev/null and b/test/trace/addProperty-get-prototypes-8.swf differ
diff --git a/test/trace/addProperty-get-prototypes-8.swf.trace b/test/trace/addProperty-get-prototypes-8.swf.trace
new file mode 100644
index 0000000..1082851
--- /dev/null
+++ b/test/trace/addProperty-get-prototypes-8.swf.trace
@@ -0,0 +1,9 @@
+Check getting of variables when addProperty has been used on prototypes.
+10
+10
+15
+o
+42
+o set
+o
+42
diff --git a/test/trace/addProperty-get-prototypes.as b/test/trace/addProperty-get-prototypes.as
new file mode 100644
index 0000000..e617cc2
--- /dev/null
+++ b/test/trace/addProperty-get-prototypes.as
@@ -0,0 +1,18 @@
+// makeswf -v 7 -s 200x150 -r 1 -o addProperty-get-prototypes.swf addProperty-get-prototypes.as
+
+trace ("Check getting of variables when addProperty has been used on prototypes.");
+
+o = {name: "o"};
+o.__proto__ = {name: "proto"};
+o.x = 10;
+trace (o.x);
+o.__proto__.addProperty ("x", function () { trace (this.name); return 42; }, function () { trace (this.name + " set"); });
+trace (o.x);
+o.x = 15;
+trace (o.x);
+delete o.x;
+trace (o.x);
+o.x = 20;
+trace (o.x);
+
+loadMovie ("FSCommand:quit", "");
diff-tree 01e8d90362605acf52d171de350853bd773e7edb (from d43d504a01b534233965d5c7fd851ae65ac5ce09)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 22:03:07 2007 +0200
add check for last commit
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 7e72228..591144a 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -37,6 +37,15 @@ EXTRA_DIST = \
addProperty-7.swf.trace \
addProperty-8.swf \
addProperty-8.swf.trace \
+ addProperty-set-prototypes.as \
+ addProperty-set-prototypes-5.swf \
+ addProperty-set-prototypes-5.swf.trace \
+ addProperty-set-prototypes-6.swf \
+ addProperty-set-prototypes-6.swf.trace \
+ addProperty-set-prototypes-7.swf \
+ addProperty-set-prototypes-7.swf.trace \
+ addProperty-set-prototypes-8.swf \
+ addProperty-set-prototypes-8.swf.trace \
and-or-5.swf \
and-or-5.swf.trace \
and-or-6.swf \
diff --git a/test/trace/addProperty-set-prototypes-5.swf b/test/trace/addProperty-set-prototypes-5.swf
new file mode 100644
index 0000000..956a6b1
Binary files /dev/null and b/test/trace/addProperty-set-prototypes-5.swf differ
diff --git a/test/trace/addProperty-set-prototypes-5.swf.trace b/test/trace/addProperty-set-prototypes-5.swf.trace
new file mode 100644
index 0000000..50d348c
--- /dev/null
+++ b/test/trace/addProperty-set-prototypes-5.swf.trace
@@ -0,0 +1,4 @@
+Check how addProperty affects prototypes
+10
+15
+15
diff --git a/test/trace/addProperty-set-prototypes-6.swf b/test/trace/addProperty-set-prototypes-6.swf
new file mode 100644
index 0000000..22ca2dc
Binary files /dev/null and b/test/trace/addProperty-set-prototypes-6.swf differ
diff --git a/test/trace/addProperty-set-prototypes-6.swf.trace b/test/trace/addProperty-set-prototypes-6.swf.trace
new file mode 100644
index 0000000..2d83ca9
--- /dev/null
+++ b/test/trace/addProperty-set-prototypes-6.swf.trace
@@ -0,0 +1,5 @@
+Check how addProperty affects prototypes
+10
+10
+a set
+10
diff --git a/test/trace/addProperty-set-prototypes-7.swf b/test/trace/addProperty-set-prototypes-7.swf
new file mode 100644
index 0000000..e49f1e8
Binary files /dev/null and b/test/trace/addProperty-set-prototypes-7.swf differ
diff --git a/test/trace/addProperty-set-prototypes-7.swf.trace b/test/trace/addProperty-set-prototypes-7.swf.trace
new file mode 100644
index 0000000..2d83ca9
--- /dev/null
+++ b/test/trace/addProperty-set-prototypes-7.swf.trace
@@ -0,0 +1,5 @@
+Check how addProperty affects prototypes
+10
+10
+a set
+10
diff --git a/test/trace/addProperty-set-prototypes-8.swf b/test/trace/addProperty-set-prototypes-8.swf
new file mode 100644
index 0000000..e3cf58f
Binary files /dev/null and b/test/trace/addProperty-set-prototypes-8.swf differ
diff --git a/test/trace/addProperty-set-prototypes-8.swf.trace b/test/trace/addProperty-set-prototypes-8.swf.trace
new file mode 100644
index 0000000..2d83ca9
--- /dev/null
+++ b/test/trace/addProperty-set-prototypes-8.swf.trace
@@ -0,0 +1,5 @@
+Check how addProperty affects prototypes
+10
+10
+a set
+10
diff --git a/test/trace/addProperty-set-prototypes.as b/test/trace/addProperty-set-prototypes.as
new file mode 100644
index 0000000..9cf4c38
--- /dev/null
+++ b/test/trace/addProperty-set-prototypes.as
@@ -0,0 +1,18 @@
+// makeswf -v 7 -s 200x150 -r 1 -o addProperty-set-prototypes.swf addProperty-set-prototypes.as
+
+trace ("Check how addProperty affects prototypes");
+
+o = {name: "a"};
+o.__proto__ = {name: "b", x: 10 };
+o.__proto__.__proto__ = {name: "c"};
+o.__proto__.__proto__.__proto__ = {name: "d"};
+o.__proto__.__proto__.addProperty ("x", function () { trace (this.name); return 42; }, null);
+o.__proto__.__proto__.__proto__.addProperty ("x", function () { trace (this.name); return 642; }, function () { trace (this.name + " set"); });
+trace (o.x);
+o.x = 15;
+trace (o.x);
+o.__proto__.__proto__ = o.__proto__.__proto__.__proto__;
+o.x = 15;
+trace (o.x);
+
+loadMovie ("FSCommand:quit", "");
diff-tree d43d504a01b534233965d5c7fd851ae65ac5ce09 (from 01dc987b2068a641f131abed7da476b2f7fd852a)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 21:59:48 2007 +0200
fix property setting when addProperty had been called on parents
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 64b8ff0..b1d06e5 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -139,6 +139,12 @@ swfdec_as_object_lookup_case_insensitive
return strcasecmp (key, user_data) == 0;
}
+static gboolean
+swfdec_as_variable_name_is_valid (const char *name)
+{
+ return name != SWFDEC_AS_STR_EMPTY;
+}
+
static inline SwfdecAsVariable *
swfdec_as_object_hash_lookup (SwfdecAsObject *object, const char *variable)
{
@@ -150,6 +156,21 @@ swfdec_as_object_hash_lookup (SwfdecAsOb
return var;
}
+static inline SwfdecAsVariable *
+swfdec_as_object_hash_create (SwfdecAsObject *object, const char *variable)
+{
+ SwfdecAsVariable *var;
+
+ if (!swfdec_as_context_use_mem (object->context, sizeof (SwfdecAsVariable)))
+ return NULL;
+ if (!swfdec_as_variable_name_is_valid (variable))
+ return NULL;
+ var = g_slice_new0 (SwfdecAsVariable);
+ g_hash_table_insert (object->properties, (gpointer) variable, var);
+
+ return var;
+}
+
static gboolean
swfdec_as_object_do_get (SwfdecAsObject *object, const char *variable,
SwfdecAsValue *val, guint *flags)
@@ -173,26 +194,14 @@ swfdec_as_object_do_get (SwfdecAsObject
return TRUE;
}
-static gboolean
-swfdec_as_variable_name_is_valid (const char *name)
-{
- return name != SWFDEC_AS_STR_EMPTY;
-}
-
static SwfdecAsVariable *
swfdec_as_object_lookup_variable (SwfdecAsObject *object, const char *variable)
{
SwfdecAsVariable *var;
var = swfdec_as_object_hash_lookup (object, variable);
- if (var == NULL) {
- if (!swfdec_as_context_use_mem (object->context, sizeof (SwfdecAsVariable)))
- return NULL;
- if (!swfdec_as_variable_name_is_valid (variable))
- return NULL;
- var = g_slice_new0 (SwfdecAsVariable);
- g_hash_table_insert (object->properties, (gpointer) variable, var);
- }
+ if (var == NULL)
+ var = swfdec_as_object_hash_create (object, variable);
return var;
}
@@ -214,9 +223,28 @@ swfdec_as_object_do_set (SwfdecAsObject
}
}
- var = swfdec_as_object_lookup_variable (object, variable);
- if (var == NULL)
- return;
+ var = swfdec_as_object_hash_lookup (object, variable);
+ if (var == NULL) {
+ guint i;
+ SwfdecAsObject *proto = object->prototype;
+
+ for (i = 0; i < 256 && proto; i++) {
+ var = swfdec_as_object_hash_lookup (proto, variable);
+ if (var && var->get)
+ break;
+ proto = proto->prototype;
+ var = NULL;
+ }
+ if (i == 256) {
+ swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded");
+ return;
+ }
+ }
+ if (var == NULL) {
+ var = swfdec_as_object_hash_create (object, variable);
+ if (var == NULL)
+ return;
+ }
if (var->flags & SWFDEC_AS_VARIABLE_READONLY)
return;
if (var->get) {
diff-tree 01dc987b2068a641f131abed7da476b2f7fd852a (from 130724227041a0e3916529bd498b207986880838)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 19:01:48 2007 +0200
add test for last commit
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index e3168fe..7e72228 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -740,6 +740,15 @@ EXTRA_DIST = \
place-object-remove-name-7.swf.trace \
preload.swf \
preload.swf.trace \
+ property-native.as \
+ property-native-5.swf \
+ property-native-5.swf.trace \
+ property-native-6.swf \
+ property-native-6.swf.trace \
+ property-native-7.swf \
+ property-native-7.swf.trace \
+ property-native-8.swf \
+ property-native-8.swf.trace \
prototype-movie.as \
prototype-movie-5.swf \
prototype-movie-5.swf.trace \
diff --git a/test/trace/property-native-5.swf b/test/trace/property-native-5.swf
new file mode 100644
index 0000000..e70f266
Binary files /dev/null and b/test/trace/property-native-5.swf differ
diff --git a/test/trace/property-native-5.swf.trace b/test/trace/property-native-5.swf.trace
new file mode 100644
index 0000000..c64601c
--- /dev/null
+++ b/test/trace/property-native-5.swf.trace
@@ -0,0 +1,4 @@
+Check how addProperty overwrites native properties
+0
+0
+10
diff --git a/test/trace/property-native-6.swf b/test/trace/property-native-6.swf
new file mode 100644
index 0000000..a875d5e
Binary files /dev/null and b/test/trace/property-native-6.swf differ
diff --git a/test/trace/property-native-6.swf.trace b/test/trace/property-native-6.swf.trace
new file mode 100644
index 0000000..bcc092c
--- /dev/null
+++ b/test/trace/property-native-6.swf.trace
@@ -0,0 +1,4 @@
+Check how addProperty overwrites native properties
+0
+42
+42
diff --git a/test/trace/property-native-7.swf b/test/trace/property-native-7.swf
new file mode 100644
index 0000000..5e0b535
Binary files /dev/null and b/test/trace/property-native-7.swf differ
diff --git a/test/trace/property-native-7.swf.trace b/test/trace/property-native-7.swf.trace
new file mode 100644
index 0000000..bcc092c
--- /dev/null
+++ b/test/trace/property-native-7.swf.trace
@@ -0,0 +1,4 @@
+Check how addProperty overwrites native properties
+0
+42
+42
diff --git a/test/trace/property-native-8.swf b/test/trace/property-native-8.swf
new file mode 100644
index 0000000..d081fd9
Binary files /dev/null and b/test/trace/property-native-8.swf differ
diff --git a/test/trace/property-native-8.swf.trace b/test/trace/property-native-8.swf.trace
new file mode 100644
index 0000000..bcc092c
--- /dev/null
+++ b/test/trace/property-native-8.swf.trace
@@ -0,0 +1,4 @@
+Check how addProperty overwrites native properties
+0
+42
+42
diff --git a/test/trace/property-native.as b/test/trace/property-native.as
new file mode 100644
index 0000000..a987b1b
--- /dev/null
+++ b/test/trace/property-native.as
@@ -0,0 +1,11 @@
+// makeswf -v 7 -s 200x150 -r 1 -o property-native.swf property-native.as
+
+trace ("Check how addProperty overwrites native properties");
+this.__proto__._x = 42;
+trace (this._x);
+this.addProperty ("_x", function () { return 42; }, function () { trace ("set"); });
+trace (this._x);
+this._x = 10;
+trace (this._x);
+
+loadMovie ("FSCommand:quit", "");
diff-tree 130724227041a0e3916529bd498b207986880838 (from d930fe50031d06c34edff598697220405ce7e88b)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 18:55:52 2007 +0200
query own properties before doing special ones
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index 42444b7..776e2b1 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -849,14 +849,14 @@ swfdec_movie_get_variable (SwfdecAsObjec
if (movie->state == SWFDEC_MOVIE_STATE_DESTROYED)
return FALSE;
+ if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, variable, val, flags))
+ return TRUE;
+
if (swfdec_movie_get_asprop (movie, variable, val)) {
*flags = 0;
return TRUE;
}
- if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, variable, val, flags))
- return TRUE;
-
/* FIXME: check that this is correct */
if (object->context->version > 5 && variable == SWFDEC_AS_STR__global) {
SWFDEC_AS_VALUE_SET_OBJECT (val, object->context->global);
diff-tree d930fe50031d06c34edff598697220405ce7e88b (from 261b8c34898a7a4cd6b89a11acc08bfb0a5c35d2)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 16:03:40 2007 +0200
add check that sets movie as prototype
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 3481072..e3168fe 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -740,6 +740,15 @@ EXTRA_DIST = \
place-object-remove-name-7.swf.trace \
preload.swf \
preload.swf.trace \
+ prototype-movie.as \
+ prototype-movie-5.swf \
+ prototype-movie-5.swf.trace \
+ prototype-movie-6.swf \
+ prototype-movie-6.swf.trace \
+ prototype-movie-7.swf \
+ prototype-movie-7.swf.trace \
+ prototype-movie-8.swf \
+ prototype-movie-8.swf.trace \
prototypes.swf \
prototypes.swf.trace \
register-count.swf \
diff --git a/test/trace/prototype-movie-5.swf b/test/trace/prototype-movie-5.swf
new file mode 100644
index 0000000..d6e8053
Binary files /dev/null and b/test/trace/prototype-movie-5.swf differ
diff --git a/test/trace/prototype-movie-5.swf.trace b/test/trace/prototype-movie-5.swf.trace
new file mode 100644
index 0000000..84187bf
--- /dev/null
+++ b/test/trace/prototype-movie-5.swf.trace
@@ -0,0 +1,4 @@
+Check that movies cannot be prototypes
+undefined
+undefined
+undefined
diff --git a/test/trace/prototype-movie-6.swf b/test/trace/prototype-movie-6.swf
new file mode 100644
index 0000000..41a4005
Binary files /dev/null and b/test/trace/prototype-movie-6.swf differ
diff --git a/test/trace/prototype-movie-6.swf.trace b/test/trace/prototype-movie-6.swf.trace
new file mode 100644
index 0000000..d8b7ab2
--- /dev/null
+++ b/test/trace/prototype-movie-6.swf.trace
@@ -0,0 +1,4 @@
+Check that movies cannot be prototypes
+[type Function]
+undefined
+undefined
diff --git a/test/trace/prototype-movie-7.swf b/test/trace/prototype-movie-7.swf
new file mode 100644
index 0000000..434a42a
Binary files /dev/null and b/test/trace/prototype-movie-7.swf differ
diff --git a/test/trace/prototype-movie-7.swf.trace b/test/trace/prototype-movie-7.swf.trace
new file mode 100644
index 0000000..d8b7ab2
--- /dev/null
+++ b/test/trace/prototype-movie-7.swf.trace
@@ -0,0 +1,4 @@
+Check that movies cannot be prototypes
+[type Function]
+undefined
+undefined
diff --git a/test/trace/prototype-movie-8.swf b/test/trace/prototype-movie-8.swf
new file mode 100644
index 0000000..18f4e1b
Binary files /dev/null and b/test/trace/prototype-movie-8.swf differ
diff --git a/test/trace/prototype-movie-8.swf.trace b/test/trace/prototype-movie-8.swf.trace
new file mode 100644
index 0000000..d8b7ab2
--- /dev/null
+++ b/test/trace/prototype-movie-8.swf.trace
@@ -0,0 +1,4 @@
+Check that movies cannot be prototypes
+[type Function]
+undefined
+undefined
diff --git a/test/trace/prototype-movie.as b/test/trace/prototype-movie.as
new file mode 100644
index 0000000..92074b9
--- /dev/null
+++ b/test/trace/prototype-movie.as
@@ -0,0 +1,12 @@
+// makeswf -v 7 -s 200x150 -r 1 -o prototype-movie.swf movie6.as
+
+trace ("Check that movies cannot be prototypes");
+
+o = new Object ();
+this.foo = 42;
+trace (o.addProperty);
+o.__proto__ = this;
+trace (o.foo);
+trace (o.addProperty);
+
+loadMovie ("FSCommand:quit", "");
diff-tree 261b8c34898a7a4cd6b89a11acc08bfb0a5c35d2 (from 37ed222d6ea5305df2c238122be4e31a98af3229)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Aug 15 16:02:30 2007 +0200
movies cannot be prototypes
diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index f7b0e98..64b8ff0 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -31,6 +31,7 @@
#include "swfdec_as_stack.h"
#include "swfdec_as_strings.h"
#include "swfdec_debug.h"
+#include "swfdec_movie.h"
/**
* SECTION:SwfdecAsObject
@@ -205,7 +206,8 @@ swfdec_as_object_do_set (SwfdecAsObject
return;
if (variable == SWFDEC_AS_STR___proto__) {
- if (SWFDEC_AS_VALUE_IS_OBJECT (val)) {
+ if (SWFDEC_AS_VALUE_IS_OBJECT (val) &&
+ !SWFDEC_IS_MOVIE (SWFDEC_AS_VALUE_GET_OBJECT (val))) {
object->prototype = SWFDEC_AS_VALUE_GET_OBJECT (val);
} else {
object->prototype = NULL;
More information about the Swfdec
mailing list