[Swfdec] 5 commits - configure.ac libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_strings.c test/trace
Pekka Lampila
medar at kemper.freedesktop.org
Thu Nov 15 08:25:09 PST 2007
configure.ac | 12 +-
libswfdec/swfdec_as_frame.c | 14 +++
libswfdec/swfdec_as_frame_internal.h | 3
libswfdec/swfdec_as_function.c | 12 ++
libswfdec/swfdec_as_interpret.c | 1
libswfdec/swfdec_as_strings.c | 2
test/trace/Makefile.am | 9 ++
test/trace/arguments-5.swf |binary
test/trace/arguments-5.swf.trace | 63 ++++++++++++++
test/trace/arguments-6.swf |binary
test/trace/arguments-6.swf.trace | 115 ++++++++++++++++++++++++++
test/trace/arguments-7.swf |binary
test/trace/arguments-7.swf.trace | 115 ++++++++++++++++++++++++++
test/trace/arguments-8.swf |binary
test/trace/arguments-8.swf.trace | 115 ++++++++++++++++++++++++++
test/trace/arguments.as | 150 +++++++++++++++++++++++++++++++++++
16 files changed, 605 insertions(+), 6 deletions(-)
New commits:
commit 59fc3ad219854c539528044c8aeaf60dde8c9633
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Thu Nov 15 18:19:59 2007 +0200
Add a test for arguments caller and callee
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 78f38a4..1a9640a 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -83,6 +83,15 @@ EXTRA_DIST = \
and-or-6.swf.trace \
and-or-7.swf \
and-or-7.swf.trace \
+ arguments.as \
+ arguments-5.swf \
+ arguments-5.swf.trace \
+ arguments-6.swf \
+ arguments-6.swf.trace \
+ arguments-7.swf \
+ arguments-7.swf.trace \
+ arguments-8.swf \
+ arguments-8.swf.trace \
array.swf \
array.swf.trace \
array-new.as \
diff --git a/test/trace/arguments-5.swf b/test/trace/arguments-5.swf
new file mode 100644
index 0000000..3c8b5c0
Binary files /dev/null and b/test/trace/arguments-5.swf differ
diff --git a/test/trace/arguments-5.swf.trace b/test/trace/arguments-5.swf.trace
new file mode 100644
index 0000000..ea28be3
--- /dev/null
+++ b/test/trace/arguments-5.swf.trace
@@ -0,0 +1,63 @@
+Global:
+arguments:
+caller:
+callee:
+
+Calling from outside of function
+
+CallFunction
+arguments:
+caller: null
+callee:
+
+CallMethod
+arguments:
+caller: null
+callee:
+
+Call:
+
+Apply:
+
+New:
+arguments:
+caller: null
+callee:
+
+Sort:
+arguments: a,
+caller: null
+callee:
+
+Calling from inside a function
+
+Check
+
+CallFunction
+arguments:
+caller:
+callee:
+
+CallMethod
+arguments:
+caller:
+callee:
+
+Call:
+
+Apply:
+
+New:
+arguments:
+caller:
+callee:
+
+Sort:
+arguments: a,
+caller:
+callee:
+
+Timeout:
+arguments:
+caller: null
+callee:
diff --git a/test/trace/arguments-6.swf b/test/trace/arguments-6.swf
new file mode 100644
index 0000000..bff66b5
Binary files /dev/null and b/test/trace/arguments-6.swf differ
diff --git a/test/trace/arguments-6.swf.trace b/test/trace/arguments-6.swf.trace
new file mode 100644
index 0000000..3f766da
--- /dev/null
+++ b/test/trace/arguments-6.swf.trace
@@ -0,0 +1,115 @@
+Global:
+arguments:
+caller:
+callee:
+
+Calling from outside of function
+
+CallFunction
+arguments:
+caller: null
+callee: func
+
+CallMethod
+arguments:
+caller: null
+callee: func
+
+Call:
+arguments:
+caller: null
+callee: func
+
+Apply:
+arguments:
+caller: null
+callee: func
+
+New:
+arguments:
+caller: null
+callee: func
+
+Sort:
+arguments: a,
+caller: null
+callee: func
+
+Prop set:
+arguments: 2
+caller: null
+callee: prop_set
+
+Prop get:
+arguments:
+caller: null
+callee: prop_get
+
+Watcher:
+arguments: watched,true,false,
+caller: null
+callee: watcher
+
+Broadcast:
+arguments:
+caller: null
+callee: broadcast
+
+Calling from inside a function
+
+Check
+
+CallFunction
+arguments:
+caller: check
+callee: func
+
+CallMethod
+arguments:
+caller: check
+callee: func
+
+Call:
+arguments:
+caller: check
+callee: func
+
+Apply:
+arguments:
+caller: check
+callee: func
+
+New:
+arguments:
+caller: check
+callee: func
+
+Sort:
+arguments: a,
+caller: check
+callee: func
+
+Prop set:
+arguments: 2
+caller: check
+callee: prop_set
+
+Prop get:
+arguments:
+caller: check
+callee: prop_get
+
+Watcher:
+arguments: watched,,false,
+caller: check
+callee: watcher
+
+Broadcast:
+arguments:
+caller: check
+callee: broadcast
+
+Timeout:
+arguments:
+caller: null
+callee: timeout
diff --git a/test/trace/arguments-7.swf b/test/trace/arguments-7.swf
new file mode 100644
index 0000000..42fbf87
Binary files /dev/null and b/test/trace/arguments-7.swf differ
diff --git a/test/trace/arguments-7.swf.trace b/test/trace/arguments-7.swf.trace
new file mode 100644
index 0000000..e681495
--- /dev/null
+++ b/test/trace/arguments-7.swf.trace
@@ -0,0 +1,115 @@
+Global:
+arguments: undefined
+caller: undefined
+callee: undefined
+
+Calling from outside of function
+
+CallFunction
+arguments:
+caller: null
+callee: func
+
+CallMethod
+arguments:
+caller: null
+callee: func
+
+Call:
+arguments:
+caller: null
+callee: func
+
+Apply:
+arguments:
+caller: null
+callee: func
+
+New:
+arguments:
+caller: null
+callee: func
+
+Sort:
+arguments: a,undefined
+caller: null
+callee: func
+
+Prop set:
+arguments: 2
+caller: null
+callee: prop_set
+
+Prop get:
+arguments:
+caller: null
+callee: prop_get
+
+Watcher:
+arguments: watched,true,false,undefined
+caller: null
+callee: watcher
+
+Broadcast:
+arguments:
+caller: null
+callee: broadcast
+
+Calling from inside a function
+
+Check
+
+CallFunction
+arguments:
+caller: check
+callee: func
+
+CallMethod
+arguments:
+caller: check
+callee: func
+
+Call:
+arguments:
+caller: check
+callee: func
+
+Apply:
+arguments:
+caller: check
+callee: func
+
+New:
+arguments:
+caller: check
+callee: func
+
+Sort:
+arguments: a,undefined
+caller: check
+callee: func
+
+Prop set:
+arguments: 2
+caller: check
+callee: prop_set
+
+Prop get:
+arguments:
+caller: check
+callee: prop_get
+
+Watcher:
+arguments: watched,undefined,false,undefined
+caller: check
+callee: watcher
+
+Broadcast:
+arguments:
+caller: check
+callee: broadcast
+
+Timeout:
+arguments:
+caller: null
+callee: timeout
diff --git a/test/trace/arguments-8.swf b/test/trace/arguments-8.swf
new file mode 100644
index 0000000..3dc3637
Binary files /dev/null and b/test/trace/arguments-8.swf differ
diff --git a/test/trace/arguments-8.swf.trace b/test/trace/arguments-8.swf.trace
new file mode 100644
index 0000000..e681495
--- /dev/null
+++ b/test/trace/arguments-8.swf.trace
@@ -0,0 +1,115 @@
+Global:
+arguments: undefined
+caller: undefined
+callee: undefined
+
+Calling from outside of function
+
+CallFunction
+arguments:
+caller: null
+callee: func
+
+CallMethod
+arguments:
+caller: null
+callee: func
+
+Call:
+arguments:
+caller: null
+callee: func
+
+Apply:
+arguments:
+caller: null
+callee: func
+
+New:
+arguments:
+caller: null
+callee: func
+
+Sort:
+arguments: a,undefined
+caller: null
+callee: func
+
+Prop set:
+arguments: 2
+caller: null
+callee: prop_set
+
+Prop get:
+arguments:
+caller: null
+callee: prop_get
+
+Watcher:
+arguments: watched,true,false,undefined
+caller: null
+callee: watcher
+
+Broadcast:
+arguments:
+caller: null
+callee: broadcast
+
+Calling from inside a function
+
+Check
+
+CallFunction
+arguments:
+caller: check
+callee: func
+
+CallMethod
+arguments:
+caller: check
+callee: func
+
+Call:
+arguments:
+caller: check
+callee: func
+
+Apply:
+arguments:
+caller: check
+callee: func
+
+New:
+arguments:
+caller: check
+callee: func
+
+Sort:
+arguments: a,undefined
+caller: check
+callee: func
+
+Prop set:
+arguments: 2
+caller: check
+callee: prop_set
+
+Prop get:
+arguments:
+caller: check
+callee: prop_get
+
+Watcher:
+arguments: watched,undefined,false,undefined
+caller: check
+callee: watcher
+
+Broadcast:
+arguments:
+caller: check
+callee: broadcast
+
+Timeout:
+arguments:
+caller: null
+callee: timeout
diff --git a/test/trace/arguments.as b/test/trace/arguments.as
new file mode 100644
index 0000000..479013e
--- /dev/null
+++ b/test/trace/arguments.as
@@ -0,0 +1,150 @@
+// makeswf -v 7 -r 1 -o test-7.swf test.as
+
+trace ("Global:");
+trace ("arguments: " + arguments);
+trace ("caller: " + arguments.caller);
+trace ("callee: " + arguments.callee);
+
+function func () {
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+}
+func.toString = function () { return "func"; };
+
+function prop_get () {
+ trace ("");
+ trace ("Prop get:");
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+}
+prop_get.toString = function () { return "prop_get"; };
+
+function prop_set () {
+ trace ("");
+ trace ("Prop set:");
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+}
+prop_set.toString = function () { return "prop_set"; };
+
+function watcher () {
+ trace ("");
+ trace ("Watcher:");
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+}
+watcher.toString = function () { return "watcher"; };
+
+var o = {};
+o.func = func;
+o.addProperty ("prop", prop_get, prop_set);
+o.watched = true;
+o.watch ("watched", watcher);
+
+var emitter = new Object ();
+AsBroadcaster.initialize (emitter);
+emitter._listeners.push (new Object ());
+emitter._listeners[0].broadcast = function () {
+ trace ("");
+ trace ("Broadcast:");
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+};
+emitter._listeners[0].broadcast.toString = function () { return "broadcast"; };
+
+function timeout () {
+ trace ("");
+ trace ("Timeout:");
+ trace ("arguments: " + arguments);
+ trace ("caller: " + arguments.caller);
+ trace ("callee: " + arguments.callee);
+
+ loadMovie ("FSCommand:quit", "");
+}
+timeout.toString = function () { return "timeout"; };
+
+trace ("");
+trace ("Calling from outside of function");
+
+trace ("");
+trace ("CallFunction");
+func ();
+
+trace ("");
+trace ("CallMethod");
+o.func ();
+
+trace ("");
+trace ("Call:");
+func.call ();
+
+trace ("");
+trace ("Apply:");
+func.apply ();
+
+trace ("");
+trace ("New:");
+var a = new func ();
+
+trace ("");
+trace ("Sort:");
+a = new Array (2);
+a[0] = "a";
+a.sort (func);
+
+o.prop = 2;
+a = o.prop;
+
+o.watched = false;
+
+emitter.broadcastMessage ("broadcast");
+
+function check () {
+ trace ("");
+ trace ("CallFunction");
+ func ();
+
+ trace ("");
+ trace ("CallMethod");
+ o.func ();
+
+ trace ("");
+ trace ("Call:");
+ func.call ();
+
+ trace ("");
+ trace ("Apply:");
+ func.apply ();
+
+ trace ("");
+ trace ("New:");
+ var a = new func ();
+
+ trace ("");
+ trace ("Sort:");
+ a = new Array (2);
+ a[0] = "a";
+ a.sort (func);
+
+ o.prop = 2;
+ a = o.prop;
+
+ o.watched = false;
+
+ emitter.broadcastMessage ("broadcast");
+
+ setTimeout (timeout, 0);
+}
+check.toString = function () { return "check"; };
+
+trace ("");
+trace ("Calling from inside a function");
+
+trace ("");
+trace ("Check");
+check ();
commit 25f366a8e7bbc45c0925d78c98457345ec0dd027
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Thu Nov 15 18:16:57 2007 +0200
Implement arguments.caller
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 0fb7a04..26287bc 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -696,6 +696,13 @@ swfdec_as_frame_preload (SwfdecAsFrame *frame)
swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur);
}
+ if (frame->caller != NULL) {
+ SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (frame->caller));
+ } else {
+ SWFDEC_AS_VALUE_SET_NULL (&val);
+ }
+ swfdec_as_object_set_variable (args, SWFDEC_AS_STR_caller, &val);
+
if (frame->callee != NULL) {
SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (frame->callee));
} else {
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index 59cdc5a..7c4f3ac 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -40,7 +40,9 @@ struct _SwfdecAsFrame {
guint argc; /* number of arguments */
const SwfdecAsValue * argv; /* arguments or %NULL if taken from stack */
SwfdecSecurity * security; /* security for this frame or %NULL if not allowed to call */
+ SwfdecAsFunction * caller; /* the function that made the call or %NULL */
SwfdecAsFunction * callee; /* the function being called or %NULL */
+ gboolean update_caller; /* whether callee should be used as a caller for called functions */
/* debugging */
const char * function_name; /* name of function */
/* script execution */
diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index c6b0f65..0f0d3b5 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -105,16 +105,24 @@ swfdec_as_function_call_no_preload (SwfdecAsFunction *function,
{
SwfdecAsContext *context;
SwfdecAsFrame *frame;
+ SwfdecAsFunction *caller;
SwfdecAsFunctionClass *klass;
g_return_val_if_fail (SWFDEC_IS_AS_FUNCTION (function), NULL);
g_return_val_if_fail (thisp == NULL || SWFDEC_IS_AS_OBJECT (thisp), NULL);
- context = SWFDEC_AS_OBJECT (function)->context;
/* just to be sure... */
if (return_value)
SWFDEC_AS_VALUE_SET_UNDEFINED (return_value);
+ context = SWFDEC_AS_OBJECT (function)->context;
+ if (context->frame != NULL) {
+ caller = (context->frame->update_caller ? context->frame->callee :
+ context->frame->caller);
+ } else {
+ caller = NULL;
+ }
+
klass = SWFDEC_AS_FUNCTION_GET_CLASS (function);
g_assert (klass->call);
frame = klass->call (function);
@@ -130,6 +138,7 @@ swfdec_as_function_call_no_preload (SwfdecAsFunction *function,
swfdec_as_frame_set_this (frame, swfdec_as_object_resolve (thisp));
}
frame->is_local = TRUE;
+ frame->caller = caller;
frame->callee = function;
frame->argc = n_args;
frame->argv = args;
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 7d6686f..ab6b41c 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -865,6 +865,7 @@ swfdec_action_call_function (SwfdecAsContext *cx, guint action, const guint8 *da
frame = swfdec_action_call (cx, n_args);
if (frame) {
swfdec_as_frame_preload (frame);
+ frame->update_caller = TRUE;
} else {
SWFDEC_WARNING ("no function named %s", name);
}
diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c
index acf1a33..e294a03 100644
--- a/libswfdec/swfdec_as_strings.c
+++ b/libswfdec/swfdec_as_strings.c
@@ -433,5 +433,6 @@ const char swfdec_as_strings[] =
SWFDEC_AS_CONSTANT_STRING ("IllegalRequest")
SWFDEC_AS_CONSTANT_STRING ("LoadNeverCompleted")
SWFDEC_AS_CONSTANT_STRING ("callee")
+ SWFDEC_AS_CONSTANT_STRING ("caller")
/* add more here */
;
commit 2bf52c7c12c4194778a673e26a9a74ffea3a0b5b
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Thu Nov 15 16:11:26 2007 +0200
Require glib 2.14 for vivified and 2.12 for everything else
diff --git a/configure.ac b/configure.ac
index c9c5d43..924aa4d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -72,7 +72,7 @@ AC_ARG_WITH(pkg-config-path,
dnl Check for essential libraries first:
dnl ====================================
-GLIB_VER=2.10
+GLIB_VER=2.12
PKG_CHECK_MODULES(GLIB, glib-2.0 >= $GLIB_VER gobject-2.0 >= $GLIB_VER gthread-2.0 >= $GLIB_VER,
HAVE_GLIB=yes, HAVE_GLIB=no)
if test "$HAVE_GLIB" = "no"; then
@@ -287,11 +287,12 @@ AC_ARG_ENABLE(vivified,
if test "$enable_vivi" = "yes"; then
MING_REQUIRED=0.4.0.beta5
VIVI_GTK_REQUIRED=2.11.6
- PKG_CHECK_MODULES(VIVI, libming >= $MING_REQUIRED gmodule-export-2.0 gtk+-2.0 >= $VIVI_GTK_REQUIRED, HAVE_VIVI=yes, HAVE_VIVI=no)
+ VIVI_GLIB_REQUIRED=2.14
+ PKG_CHECK_MODULES(VIVI, libming >= $MING_REQUIRED gmodule-export-2.0 gtk+-2.0 >= $VIVI_GTK_REQUIRED glib-2.0 >= $VIVI_GLIB_REQUIRED, HAVE_VIVI=yes, HAVE_VIVI=no)
if test "x$HAVE_VIVI" = xyes; then
AC_DEFINE(HAVE_VIVI, 1, [Define if Vivified is enabled])
else
- AC_MSG_ERROR([Vivified requirements not met. You need libming >= $MING_REQUIRED and Gtk+ >= $VIVI_GTK_REQUIRED.])
+ AC_MSG_ERROR([Vivified requirements not met. You need libming >= $MING_REQUIRED, glib >= $VIVI_GLIB_REQUIRED and Gtk+ >= $VIVI_GTK_REQUIRED.])
fi
else
AC_MSG_NOTICE([Vivified was not enabled.])
commit 8bbc396cd2c337506839b6a2af6d72639042a486
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Thu Nov 15 15:30:49 2007 +0200
Require at least pangocairo 1.16
We might even need 1.18, not sure
diff --git a/configure.ac b/configure.ac
index 96ffeed..c9c5d43 100644
--- a/configure.ac
+++ b/configure.ac
@@ -87,9 +87,10 @@ AC_SUBST(GLIB_GENMARSHAL)
GLIB_MKENUMS=glib-mkenums
AC_SUBST(GLIB_MKENUMS)
-PKG_CHECK_MODULES(PANGO, pangocairo, HAVE_PANGO=yes, HAVE_PANGO=no)
+PANGO_VER=1.16
+PKG_CHECK_MODULES(PANGO, pangocairo >= $PANGO_VER, HAVE_PANGO=yes, HAVE_PANGO=no)
if test "$HAVE_PANGO" = "no"; then
- AC_MSG_ERROR([pangocairo is required to build swfdec])
+ AC_MSG_ERROR([pangocairo >= $PANGO_VER is required to build swfdec])
fi
AC_SUBST(PANGO_LIBS)
AC_SUBST(PANGO_CFLAGS)
commit b9f4dbed6c21f1d79d1da825b9e293cabdeb763d
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date: Thu Nov 15 10:49:08 2007 +0200
Implement arguments.callee
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 77f4c3a..0fb7a04 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -695,6 +695,13 @@ swfdec_as_frame_preload (SwfdecAsFrame *frame)
cur = swfdec_as_stack_iterator_next (&iter)) {
swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur);
}
+
+ if (frame->callee != NULL) {
+ SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (frame->callee));
+ } else {
+ SWFDEC_AS_VALUE_SET_NULL (&val);
+ }
+ swfdec_as_object_set_variable (args, SWFDEC_AS_STR_callee, &val);
} else {
/* silence gcc */
args = NULL;
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index d50a9ce..59cdc5a 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -40,6 +40,7 @@ struct _SwfdecAsFrame {
guint argc; /* number of arguments */
const SwfdecAsValue * argv; /* arguments or %NULL if taken from stack */
SwfdecSecurity * security; /* security for this frame or %NULL if not allowed to call */
+ SwfdecAsFunction * callee; /* the function being called or %NULL */
/* debugging */
const char * function_name; /* name of function */
/* script execution */
diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index c64df5e..c6b0f65 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -130,6 +130,7 @@ swfdec_as_function_call_no_preload (SwfdecAsFunction *function,
swfdec_as_frame_set_this (frame, swfdec_as_object_resolve (thisp));
}
frame->is_local = TRUE;
+ frame->callee = function;
frame->argc = n_args;
frame->argv = args;
frame->return_value = return_value;
diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c
index 2879324..acf1a33 100644
--- a/libswfdec/swfdec_as_strings.c
+++ b/libswfdec/swfdec_as_strings.c
@@ -432,5 +432,6 @@ const char swfdec_as_strings[] =
SWFDEC_AS_CONSTANT_STRING ("URLNotFound")
SWFDEC_AS_CONSTANT_STRING ("IllegalRequest")
SWFDEC_AS_CONSTANT_STRING ("LoadNeverCompleted")
+ SWFDEC_AS_CONSTANT_STRING ("callee")
/* add more here */
;
More information about the Swfdec
mailing list