Benjamin Otte
2007-Oct-14 13:06 UTC
[Swfdec] 4 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_sound.c test/trace
libswfdec/swfdec_as_interpret.c | 88 +++++++++++++++------------ libswfdec/swfdec_sound.c | 8 ++ test/trace/Makefile.am | 9 ++ test/trace/getsetproperty-target-5.swf |binary test/trace/getsetproperty-target-5.swf.trace | 6 + test/trace/getsetproperty-target-6.swf |binary test/trace/getsetproperty-target-6.swf.trace | 6 + test/trace/getsetproperty-target-7.swf |binary test/trace/getsetproperty-target-7.swf.trace | 6 + test/trace/getsetproperty-target-8.swf |binary test/trace/getsetproperty-target-8.swf.trace | 6 + test/trace/getsetproperty-target.as | 34 ++++++++++ 12 files changed, 124 insertions(+), 39 deletions(-) New commits: commit 04c37ddd61e7e3f899e1f5dc534acf2630538b3f Merge: c7fcc86... 5272df3... Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 15:02:30 2007 +0200 Merge branch 'master' of ssh://company at git.freedesktop.org/git/swfdec/swfdec commit c7fcc86ae0097fe4071520f66b4470f3820dc6fc Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 15:02:02 2007 +0200 add test for Get/SetProperty actions Not a very complete test, but it used to fail ;) diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index d20beb2..33cc77d 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -590,6 +590,15 @@ EXTRA_DIST = \ forin-delete-6.swf.trace \ forin-delete-7.swf \ forin-delete-7.swf.trace \ + getsetproperty-target.as \ + getsetproperty-target-5.swf \ + getsetproperty-target-5.swf.trace \ + getsetproperty-target-6.swf \ + getsetproperty-target-6.swf.trace \ + getsetproperty-target-7.swf \ + getsetproperty-target-7.swf.trace \ + getsetproperty-target-8.swf \ + getsetproperty-target-8.swf.trace \ getvariable-delimiters.as \ getvariable-delimiters-5.swf \ getvariable-delimiters-5.swf.trace \ diff --git a/test/trace/getsetproperty-target-5.swf b/test/trace/getsetproperty-target-5.swf new file mode 100644 index 0000000..8e87bec Binary files /dev/null and b/test/trace/getsetproperty-target-5.swf differ diff --git a/test/trace/getsetproperty-target-5.swf.trace b/test/trace/getsetproperty-target-5.swf.trace new file mode 100644 index 0000000..6dfa5e7 --- /dev/null +++ b/test/trace/getsetproperty-target-5.swf.trace @@ -0,0 +1,6 @@ +undefined +undefined +undefined +undefined +/ +42 diff --git a/test/trace/getsetproperty-target-6.swf b/test/trace/getsetproperty-target-6.swf new file mode 100644 index 0000000..ff143d4 Binary files /dev/null and b/test/trace/getsetproperty-target-6.swf differ diff --git a/test/trace/getsetproperty-target-6.swf.trace b/test/trace/getsetproperty-target-6.swf.trace new file mode 100644 index 0000000..91a3e10 --- /dev/null +++ b/test/trace/getsetproperty-target-6.swf.trace @@ -0,0 +1,6 @@ +/a/a +42 +/a/a +42 +/ +42 diff --git a/test/trace/getsetproperty-target-7.swf b/test/trace/getsetproperty-target-7.swf new file mode 100644 index 0000000..fb06c28 Binary files /dev/null and b/test/trace/getsetproperty-target-7.swf differ diff --git a/test/trace/getsetproperty-target-7.swf.trace b/test/trace/getsetproperty-target-7.swf.trace new file mode 100644 index 0000000..91a3e10 --- /dev/null +++ b/test/trace/getsetproperty-target-7.swf.trace @@ -0,0 +1,6 @@ +/a/a +42 +/a/a +42 +/ +42 diff --git a/test/trace/getsetproperty-target-8.swf b/test/trace/getsetproperty-target-8.swf new file mode 100644 index 0000000..edf375f Binary files /dev/null and b/test/trace/getsetproperty-target-8.swf differ diff --git a/test/trace/getsetproperty-target-8.swf.trace b/test/trace/getsetproperty-target-8.swf.trace new file mode 100644 index 0000000..91a3e10 --- /dev/null +++ b/test/trace/getsetproperty-target-8.swf.trace @@ -0,0 +1,6 @@ +/a/a +42 +/a/a +42 +/ +42 diff --git a/test/trace/getsetproperty-target.as b/test/trace/getsetproperty-target.as new file mode 100644 index 0000000..cbc2ff0 --- /dev/null +++ b/test/trace/getsetproperty-target.as @@ -0,0 +1,34 @@ +// makeswf -v 7 -s 200x150 -r 1 -o getsetproperty-target.swf getsetproperty-target.as + +createEmptyMovieClip ("a", 0); +a.createEmptyMovieClip ("a", 0); + +function do_test (x) { + // equivalent code: + // trace (eval (x)._target); + // eval (x)._x = 42; + // trace (eval (x)._x); + asm { + push "x" + getvariable + dup + push 11 + getproperty + trace + dup + push 0, 42 + setproperty + push 0 + getproperty + trace + }; +}; + +tests = [ "/a/a", "a/../a::::a", "" ]; + +for (i = 0; i < tests.length; i++) { + do_test (tests[i]); +}; + + +loadMovie ("FSCommand:quit", ""); commit be4a34a44fc04b3665a0d6d0c7c7835bd1bd369d Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 14:49:37 2007 +0200 fix GetProperty and SetProperty actions to use swfdec_player_get_movie() One more swfdec_as_context_eval() user down diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 59b6052..3055a7d 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -470,8 +470,14 @@ swfdec_action_lookup_object (SwfdecAsContext *cx, SwfdecAsObject *o, const char gboolean dot_allowed = TRUE; const char *start; - if (path == end) - return NULL; + if (path == end) { + if (o == NULL) + o = cx->frame->target; + if (SWFDEC_IS_MOVIE (o)) + return o; + else + return NULL; + } if (path[0] == '/') { o = cx->frame->target; @@ -550,8 +556,10 @@ swfdec_player_get_movie_from_value (SwfdecPlayer *player, SwfdecAsValue *val) cx = SWFDEC_AS_CONTEXT (player); s = swfdec_as_value_to_string (cx, val); ret = swfdec_action_lookup_object (cx, NULL, s, s + strlen (s)); - if (!SWFDEC_IS_MOVIE (ret)) + if (!SWFDEC_IS_MOVIE (ret)) { + SWFDEC_WARNING ("\"%s\" does not reference a movie", s); return NULL; + } return SWFDEC_MOVIE (ret); } @@ -607,7 +615,10 @@ swfdec_action_get_movie_by_path (SwfdecAsContext *cx, const char *path, /* variable to use is the part after the last dot or colon */ *variable = end + 1; /* look up object for start of path */ - movie = swfdec_action_lookup_object (cx, NULL, path, end); + if (path == end) + movie = NULL; + else + movie = swfdec_action_lookup_object (cx, NULL, path, end); if (movie) { *object = movie; return TRUE; @@ -694,58 +705,59 @@ extern struct { static void swfdec_action_get_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecAsValue *val; - SwfdecAsObject *obj; + SwfdecMovie *movie; guint id; - id = swfdec_as_value_to_integer (cx, swfdec_as_stack_pop (cx)); - if (id > (cx->version > 4 ? 21 : 18)) { - SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); - goto out; - } - val = swfdec_as_stack_peek (cx, 1); - swfdec_as_interpret_eval (cx, NULL, val); - if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { - obj = cx->frame->target; - } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { - obj = SWFDEC_AS_VALUE_GET_OBJECT (val); + id = swfdec_as_value_to_integer (cx, swfdec_as_stack_peek (cx, 1)); + if (!SWFDEC_IS_PLAYER (cx)) { + SWFDEC_INFO ("tried using GetProperty in a non-SwfdecPlayer context"); + goto error; } else { - SWFDEC_WARNING ("not an object, can't GetProperty"); - goto out; + movie = swfdec_player_get_movie_from_value (SWFDEC_PLAYER (cx), + swfdec_as_stack_peek (cx, 2)); + if (movie == NULL) + goto error; } - swfdec_as_object_get_variable (obj, swfdec_movieclip_props[id].name, - swfdec_as_stack_peek (cx, 1)); + if (id > (cx->version > 4 ? 21 : 18)) { + SWFDEC_WARNING ("trying to SetProperty %u, doesn't exist", id); + goto error; + } + swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (movie), swfdec_movieclip_props[id].name, + swfdec_as_stack_peek (cx, 2)); + swfdec_as_stack_pop (cx); return; -out: +error : + swfdec_as_stack_pop (cx); SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_peek (cx, 1)); } static void swfdec_action_set_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecAsValue *val; - SwfdecAsObject *obj; + SwfdecMovie *movie; guint id; id = swfdec_as_value_to_integer (cx, swfdec_as_stack_peek (cx, 2)); - if (id > (cx->version > 4 ? 21 : 18)) { - SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); - goto out; - } - val = swfdec_as_stack_peek (cx, 3); - swfdec_as_interpret_eval (cx, NULL, val); - if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { - obj = cx->frame->target; - } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { - obj = SWFDEC_AS_VALUE_GET_OBJECT (val); + if (!SWFDEC_IS_PLAYER (cx)) { + SWFDEC_INFO ("tried using GetProperty in a non-SwfdecPlayer context"); + goto error; } else { - SWFDEC_WARNING ("not an object, can't get SetProperty"); - goto out; + movie = swfdec_player_get_movie_from_value (SWFDEC_PLAYER (cx), + swfdec_as_stack_peek (cx, 3)); + if (movie == NULL) + goto error; } - swfdec_as_object_set_variable (obj, swfdec_movieclip_props[id].name, + if (id > (cx->version > 4 ? 21 : 18)) { + SWFDEC_WARNING ("trying to SetProperty %u, doesn't exist", id); + goto error; + } + swfdec_as_object_set_variable (SWFDEC_AS_OBJECT (movie), swfdec_movieclip_props[id].name, swfdec_as_stack_peek (cx, 1)); -out: + swfdec_as_stack_pop_n (cx, 3); + return; + +error : swfdec_as_stack_pop_n (cx, 3); } commit 9ee02d87b2f6837237a717b3b6232ebe7ec63c63 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 11:41:36 2007 +0200 don't crash when decoding didn't produce any output (fixes #12793) diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c index 7ee1660..e4e9086 100644 --- a/libswfdec/swfdec_sound.c +++ b/libswfdec/swfdec_sound.c @@ -171,6 +171,7 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) SwfdecBufferQueue *queue; guint sample_bytes; guint n_samples; + guint depth; g_return_val_if_fail (SWFDEC_IS_SOUND (sound), NULL); g_return_val_if_fail (format != NULL, NULL); @@ -199,7 +200,12 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) swfdec_buffer_queue_push (queue, tmp); } swfdec_audio_decoder_free (decoder); - tmp = swfdec_buffer_queue_pull (queue, swfdec_buffer_queue_get_depth (queue)); + depth = swfdec_buffer_queue_get_depth (queue); + if (depth == 0) { + SWFDEC_ERROR ("decoding didn't produce any data, bailing"); + return NULL; + } + tmp = swfdec_buffer_queue_pull (queue, depth); swfdec_buffer_queue_unref (queue); SWFDEC_LOG ("after decoding, got %u samples, should get %u and skip %u",
Apparently Analagous Threads
- Branch 'as' - 9 commits - configure.ac libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h
- 8 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_sound.c libswfdec/swfdec_sound.h test/trace
- 14 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_script.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_tag.c libswfdec/swfdec_text_field_movie.c
- Branch 'as' - 14 commits - libswfdec-gtk/swfdec_playback_alsa.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h
- Branch 'as' - libswfdec/swfdec_as_interpret.c