[Swfdec] Branch 'as' - 6 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_js_xml.c libswfdec/swfdec_tag.c player/swfplay.c
Benjamin Otte
company at kemper.freedesktop.org
Tue May 29 09:38:04 PDT 2007
libswfdec/swfdec_as_interpret.c | 126 +++++++++++++++++-----------------------
libswfdec/swfdec_js_xml.c | 2
libswfdec/swfdec_tag.c | 2
player/swfplay.c | 2
4 files changed, 60 insertions(+), 72 deletions(-)
New commits:
diff-tree 66f9ced7820cb09446dc493778fbd8348bfcb626 (from 33ee0a567aa0a7d9b287a5285527b436ae3fe560)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 15:13:03 2007 +0200
this is just INFO, since 0-frame sprites are common
diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c
index 7df13f4..10a33b6 100644
--- a/libswfdec/swfdec_tag.c
+++ b/libswfdec/swfdec_tag.c
@@ -254,7 +254,7 @@ tag_func_define_sprite (SwfdecSwfDecoder
/* sanity check the sprite */
if (s->parse_sprite->n_frames != s->parse_sprite->parse_frame) {
- SWFDEC_ERROR ("not enough frames in sprite %u (have %u, want %u), filling up with empty frames",
+ SWFDEC_INFO ("not enough frames in sprite %u (have %u, want %u), filling up with empty frames",
id, s->parse_sprite->parse_frame, s->parse_sprite->n_frames);
s->parse_sprite->parse_frame = s->parse_sprite->n_frames;
}
diff-tree 33ee0a567aa0a7d9b287a5285527b436ae3fe560 (from 91a151966efb877bc00d769a59700857e8534353)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 15:09:12 2007 +0200
implement Delete and Delete2
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 42479d2..abc4c8c 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1652,41 +1652,29 @@ swfdec_action_return (SwfdecAsContext *c
swfdec_as_context_return (cx);
}
-#if 0
static void
swfdec_action_delete (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
{
+ SwfdecAsValue *val;
const char *name;
- cx->fp->sp -= 2;
- name = swfdec_js_to_string (cx, cx->fp->sp[1]);
- if (name == NULL)
- return JS_FALSE;
- if (!JSVAL_IS_OBJECT (cx->fp->sp[0]))
- return JS_TRUE;
- return JS_DeleteProperty (cx, JSVAL_TO_OBJECT (cx->fp->sp[0]), name);
+ name = swfdec_as_value_to_string (cx, swfdec_as_stack_pop (cx->frame->stack));
+ val = swfdec_as_stack_pop (cx->frame->stack);
+ if (SWFDEC_AS_VALUE_IS_OBJECT (val))
+ swfdec_as_object_delete_variable (SWFDEC_AS_VALUE_GET_OBJECT (val), name);
}
static void
swfdec_action_delete2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
{
const char *name;
- JSObject *obj, *pobj;
- JSProperty *prop;
- JSAtom *atom;
+ SwfdecAsObject *object;
- cx->fp->sp -= 1;
- name = swfdec_js_to_string (cx, cx->fp->sp[1]);
- if (name == NULL)
- return JS_FALSE;
- if (!(atom = js_Atomize (cx, name, strlen (name), 0)) ||
- !js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop))
- return JS_FALSE;
- if (!pobj)
- return JS_TRUE;
- return JS_DeleteProperty (cx, pobj, name);
+ name = swfdec_as_value_to_string (cx, swfdec_as_stack_pop (cx->frame->stack));
+ object = swfdec_as_frame_find_variable (cx->frame, name);
+ if (object)
+ swfdec_as_object_delete_variable (object, name);
}
-#endif
static void
swfdec_action_store_register (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
@@ -2236,10 +2224,8 @@ const SwfdecActionSpec swfdec_as_actions
[SWFDEC_AS_ACTION_MB_CHAR_TO_ASCII] = { "MBCharToAscii", NULL },
[SWFDEC_AS_ACTION_MB_ASCII_TO_CHAR] = { "MBAsciiToChar", NULL },
/* version 5 */
-#if 0
- [0x3a] = { "Delete", NULL, 2, 0, { NULL, NULL, swfdec_action_delete, swfdec_action_delete, swfdec_action_delete } },
- [0x3b] = { "Delete2", NULL, 1, 0, { NULL, NULL, swfdec_action_delete2, swfdec_action_delete2, swfdec_action_delete2 } },
-#endif
+ [SWFDEC_AS_ACTION_DELETE] = { "Delete", NULL, 2, 0, { NULL, NULL, swfdec_action_delete, swfdec_action_delete, swfdec_action_delete } },
+ [SWFDEC_AS_ACTION_DELETE2] = { "Delete2", NULL, 1, 0, { NULL, NULL, swfdec_action_delete2, swfdec_action_delete2, swfdec_action_delete2 } },
[SWFDEC_AS_ACTION_DEFINE_LOCAL] = { "DefineLocal", NULL, 2, 0, { NULL, NULL, swfdec_action_define_local, swfdec_action_define_local, swfdec_action_define_local } },
[SWFDEC_AS_ACTION_CALL_FUNCTION] = { "CallFunction", NULL, -1, 1, { NULL, NULL, swfdec_action_call_function, swfdec_action_call_function, swfdec_action_call_function } },
[SWFDEC_AS_ACTION_RETURN] = { "Return", NULL, 1, 0, { NULL, NULL, swfdec_action_return, swfdec_action_return, swfdec_action_return } },
diff-tree 91a151966efb877bc00d769a59700857e8534353 (from e43ad1b2e784b00f6ba8b9955a32ee61388269b1)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 14:57:43 2007 +0200
reimplement NewMethod action
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index b9e19ad..42479d2 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1327,54 +1327,44 @@ fail:
SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_peek (cx->frame->stack, 1));
}
-#if 0
static void
swfdec_action_new_method (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
{
- JSStackFrame *fp = cx->fp;
- const char *s;
- guint32 n_args;
- JSObject *object;
- jsval constructor;
-
- if (!swfdec_script_ensure_stack (cx, 3))
- return JS_FALSE;
- s = swfdec_js_to_string (cx, fp->sp[-1]);
- if (s == NULL)
- return JS_FALSE;
- if (!JS_ValueToECMAUint32 (cx, fp->sp[-3], &n_args))
- return JS_FALSE;
-
- if (!JS_ValueToObject (cx, fp->sp[-2], &object))
- return JS_FALSE;
- if (object == NULL)
+ SwfdecAsValue *constructor;
+ SwfdecAsFunction *fun;
+ guint n_args;
+ const char *name;
+
+ swfdec_as_stack_ensure_size (cx->frame->stack, 3);
+ name = swfdec_as_value_to_string (cx, swfdec_as_stack_pop (cx->frame->stack));
+
+ constructor = swfdec_as_stack_pop (cx->frame->stack);
+ n_args = swfdec_as_value_to_integer (cx, swfdec_as_stack_peek (cx->frame->stack, 1));
+ n_args = MIN (swfdec_as_stack_get_size (cx->frame->stack) - 1, n_args);
+ if (!SWFDEC_AS_VALUE_IS_OBJECT (constructor) ||
+ !SWFDEC_IS_AS_FUNCTION (fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (constructor))) {
+ SWFDEC_WARNING ("%s is not a constructor", name);
goto fail;
- if (s[0] == '\0') {
- constructor = OBJECT_TO_JSVAL (object);
- } else {
- if (!JS_GetProperty (cx, object, s, &constructor))
- return JS_FALSE;
- if (!JSVAL_IS_OBJECT (constructor)) {
- SWFDEC_WARNING ("%s:%s is not a function", JS_GetClass (object)->name, s);
+ }
+ if (name != SWFDEC_AS_STR_EMPTY) {
+ if (SWFDEC_AS_VALUE_IS_OBJECT (constructor)) {
+ swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (constructor),
+ name, constructor);
}
}
- fp->sp[-1] = OBJECT_TO_JSVAL (constructor);
- if (!swfdec_js_construct_object (cx, NULL, constructor, &object))
- return JS_FALSE;
- if (object == NULL)
+ if (!SWFDEC_AS_VALUE_IS_OBJECT (constructor) ||
+ !SWFDEC_IS_AS_FUNCTION (fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (constructor))) {
+ SWFDEC_WARNING ("%s is not a constructor", name);
goto fail;
- fp->sp[-2] = OBJECT_TO_JSVAL (object);
- if (!swfdec_action_call (cx, n_args, JSINVOKE_CONSTRUCT))
- return JS_FALSE;
- fp->sp[-1] = OBJECT_TO_JSVAL (object);
- return JS_TRUE;
+ }
+
+ swfdec_action_create (fun, n_args);
+ return;
fail:
- fp->sp -= 2 + n_args;
- fp->sp[-1] = JSVAL_VOID;
- return JS_TRUE;
+ swfdec_as_stack_pop_n (cx->frame->stack, n_args);
+ SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_peek (cx->frame->stack, 1));
}
-#endif
static void
swfdec_action_init_object (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
@@ -2275,10 +2265,8 @@ const SwfdecActionSpec swfdec_as_actions
[SWFDEC_AS_ACTION_INCREMENT] = { "Increment", NULL, 1, 1, { NULL, NULL, swfdec_action_increment, swfdec_action_increment, swfdec_action_increment } },
[SWFDEC_AS_ACTION_DECREMENT] = { "Decrement", NULL, 1, 1, { NULL, NULL, swfdec_action_decrement, swfdec_action_decrement, swfdec_action_decrement } },
[SWFDEC_AS_ACTION_CALL_METHOD] = { "CallMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_call_method, swfdec_action_call_method, swfdec_action_call_method } },
-#if 0
- [0x53] = { "NewMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_new_method, swfdec_action_new_method, swfdec_action_new_method } },
+ [SWFDEC_AS_ACTION_NEW_METHOD] = { "NewMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_new_method, swfdec_action_new_method, swfdec_action_new_method } },
/* version 6 */
-#endif
[SWFDEC_AS_ACTION_INSTANCE_OF] = { "InstanceOf", NULL },
[SWFDEC_AS_ACTION_ENUMERATE2] = { "Enumerate2", NULL, 1, -1, { NULL, NULL, NULL, swfdec_action_enumerate2, swfdec_action_enumerate2 } },
/* version 5 */
diff-tree e43ad1b2e784b00f6ba8b9955a32ee61388269b1 (from df33e9b5c1cf59dafab3a0dd3518e825df80e714)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 14:45:58 2007 +0200
handle NaN == NaN
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 3f81944..b9e19ad 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -1055,7 +1055,10 @@ swfdec_action_equals2_5 (SwfdecAsContext
}
/* else compare as numbers */
- cond = l == r;
+ if (isnan (l) && isnan (r))
+ cond = ltype == rtype;
+ else
+ cond = l == r;
out:
swfdec_as_stack_pop (cx->frame->stack);
@@ -1138,7 +1141,11 @@ swfdec_action_equals2 (SwfdecAsContext *
/* else compare as numbers */
l = swfdec_as_value_to_number (cx, lval);
r = swfdec_as_value_to_number (cx, rval);
- cond = l == r;
+
+ if (isnan (l) && isnan (r))
+ cond = ltype == rtype;
+ else
+ cond = l == r;
out:
swfdec_as_stack_pop (cx->frame->stack);
@@ -1166,7 +1173,12 @@ swfdec_action_strict_equals (SwfdecAsCon
cond = SWFDEC_AS_VALUE_GET_BOOLEAN (rval) == SWFDEC_AS_VALUE_GET_BOOLEAN (lval);
break;
case SWFDEC_AS_TYPE_NUMBER:
- cond = SWFDEC_AS_VALUE_GET_NUMBER (rval) == SWFDEC_AS_VALUE_GET_NUMBER (lval);
+ {
+ double l, r;
+ r = SWFDEC_AS_VALUE_GET_NUMBER (rval);
+ l = SWFDEC_AS_VALUE_GET_NUMBER (lval);
+ cond = (l == r) || (isnan (l) && isnan (r));
+ }
break;
case SWFDEC_AS_TYPE_STRING:
cond = SWFDEC_AS_VALUE_GET_STRING (rval) == SWFDEC_AS_VALUE_GET_STRING (lval);
diff-tree df33e9b5c1cf59dafab3a0dd3518e825df80e714 (from parents)
Merge: 0d9fe11f2441d5fa448c46d5b770dd213566825d abce336a0b32f84a97e5a6621b634833ed78a49c
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 13:47:19 2007 +0200
Merge branch 'as' of ssh://company@git.freedesktop.org/git/swfdec into as
diff-tree 0d9fe11f2441d5fa448c46d5b770dd213566825d (from dc6c1becbfb201aa15c126c05ba38e4c772fac80)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue May 29 13:46:32 2007 +0200
merge master
diff --git a/libswfdec/swfdec_js_xml.c b/libswfdec/swfdec_js_xml.c
index 59632b6..92da66e 100644
--- a/libswfdec/swfdec_js_xml.c
+++ b/libswfdec/swfdec_js_xml.c
@@ -32,7 +32,7 @@ swfdec_js_xml_load (JSContext *cx, JSObj
SwfdecXml *xml;
const char *url;
- xml = JS_GetPrivate (cx, obj);
+ xml = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_XML);
if (xml == NULL)
return JS_TRUE;
url = swfdec_js_to_string (cx, argv[0]);
diff --git a/player/swfplay.c b/player/swfplay.c
index 0c2e062..46737ae 100644
--- a/player/swfplay.c
+++ b/player/swfplay.c
@@ -122,6 +122,8 @@ main (int argc, char *argv[])
#else
loader = swfdec_gtk_loader_new (argv[1]);
#endif
+ g_object_unref (loader);
+ loader = swfdec_loader_new_from_file (argv[1]);
if (loader->error) {
g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], loader->error);
g_object_unref (loader);
More information about the Swfdec
mailing list