Benjamin Otte
2007-Oct-28 18:04 UTC
[Swfdec] 4 commits - libswfdec-gtk/swfdec_gtk_loader.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_load_object.c libswfdec/swfdec_net_stream.c
libswfdec-gtk/swfdec_gtk_loader.c | 3 - libswfdec/swfdec_as_context.c | 2 - libswfdec/swfdec_as_frame.c | 56 +++++++++++++++++++---------------- libswfdec/swfdec_as_frame_internal.h | 4 -- libswfdec/swfdec_as_interpret.c | 45 +++++++--------------------- libswfdec/swfdec_load_object.c | 10 ++++-- libswfdec/swfdec_loader.c | 26 ++++++++-------- libswfdec/swfdec_loader.h | 4 +- libswfdec/swfdec_net_stream.c | 8 ++--- 9 files changed, 73 insertions(+), 85 deletions(-) New commits: commit eb9d4887c22c7b50b86d57f14e7ca672ec329e90 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 19:04:34 2007 +0100 set 0 content-length, but not a too huge one diff --git a/libswfdec-gtk/swfdec_gtk_loader.c b/libswfdec-gtk/swfdec_gtk_loader.c index f61a999..fb93cf9 100644 --- a/libswfdec-gtk/swfdec_gtk_loader.c +++ b/libswfdec-gtk/swfdec_gtk_loader.c @@ -112,8 +112,7 @@ swfdec_gtk_loader_headers (SoupMessage *msg, gpointer loader) errno = 0; l = strtoul (s, &end, 10); - // FIXME: need a way to allow 0-size files - if (errno == 0 && *end == 0 && l > 0) + if (errno == 0 && *end == 0 && l <= G_MAXLONG) swfdec_loader_set_size (loader, l); } commit 4a6886684a3f3c99f303d678425646ba99f2f8fd Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 19:04:12 2007 +0100 fix docs diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c index e79ba1e..ca84656 100644 --- a/libswfdec/swfdec_loader.c +++ b/libswfdec/swfdec_loader.c @@ -540,15 +540,15 @@ swfdec_loader_set_size (SwfdecLoader *loader, gulong size) * swfdec_loader_get_size: * @loader: a #SwfdecLoader * - * Queries the amount of bytes inside @loader. If the size is unknown, 0 is - * returned. + * Queries the amount of bytes inside @loader. If the size is unknown, -1 is + * returned. Otherwise the number is greater or equal to 0. * - * Returns: the total number of bytes for this loader or 0 if unknown + * Returns: the total number of bytes for this loader or -1 if unknown **/ glong swfdec_loader_get_size (SwfdecLoader *loader) { - g_return_val_if_fail (SWFDEC_IS_LOADER (loader), 0); + g_return_val_if_fail (SWFDEC_IS_LOADER (loader), -1); return loader->size; } commit 931ba99893d1f223068cc188e498d82100387ddb Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 19:00:31 2007 +0100 allow 0 as the size of a loader diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 3defeca..7125e05 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2542,7 +2542,6 @@ swfdec_action_throw (SwfdecAsContext *cx, guint action, const guint8 *data, } typedef struct { - int ref_count; const guint8 * catch_start; const guint8 * finally_start; guint catch_size; @@ -2556,25 +2555,12 @@ typedef struct { } TryData; static void -swfdec_action_try_data_ref (gpointer data) +swfdec_action_try_data_free (gpointer data) { TryData *try_data = data; g_return_if_fail (try_data != NULL); - try_data->ref_count++; -} - -static void -swfdec_action_try_data_unref (gpointer data) -{ - TryData *try_data = data; - - g_return_if_fail (try_data != NULL); - - if (--try_data->ref_count > 0) - return; - if (!try_data->use_register) g_free (try_data->variable_name); g_free (try_data); @@ -2595,7 +2581,7 @@ swfdec_action_try_end_finally (SwfdecAsFrame *frame, gpointer data) if (!cx->exception) swfdec_as_context_throw (cx, exception_value); - swfdec_as_frame_pop_block (frame); + g_free (data); } static void @@ -2610,9 +2596,6 @@ swfdec_action_try_end_catch (SwfdecAsFrame *frame, gpointer data) cx = SWFDEC_AS_OBJECT (frame)->context; - swfdec_action_try_data_ref (try_data); - swfdec_as_frame_pop_block (frame); - if (swfdec_as_context_catch (cx, &val)) { // we got an exception while in catch block: @@ -2625,10 +2608,10 @@ swfdec_action_try_end_catch (SwfdecAsFrame *frame, gpointer data) // FIXME: the exception value is not marked while finally block runs swfdec_as_frame_push_block (frame, try_data->finally_start, try_data->finally_start + try_data->finally_size, - swfdec_action_try_end_finally, exception_value, g_free); + swfdec_action_try_end_finally, exception_value); } - swfdec_action_try_data_unref (try_data); + swfdec_action_try_data_free (try_data); } static void @@ -2650,9 +2633,6 @@ swfdec_action_try_end_try (SwfdecAsFrame *frame, gpointer data) cx = SWFDEC_AS_OBJECT (frame)->context; - swfdec_action_try_data_ref (try_data); - swfdec_as_frame_pop_block (frame); - if (swfdec_as_context_catch (cx, &val)) { // we got an exception while in try block: @@ -2695,13 +2675,14 @@ swfdec_action_try_end_try (SwfdecAsFrame *frame, gpointer data) } } - swfdec_action_try_data_ref (try_data); swfdec_as_frame_push_block (frame, try_data->catch_start, try_data->catch_start + try_data->catch_size, - swfdec_action_try_end_catch, try_data, swfdec_action_try_data_unref); + swfdec_action_try_end_catch, try_data); + } + else + { + swfdec_action_try_data_free (try_data); } - - swfdec_action_try_data_unref (try_data); } static void @@ -2720,7 +2701,6 @@ swfdec_action_try (SwfdecAsContext *cx, guint action, const guint8 *data, guint } try_data = g_malloc0 (sizeof (TryData)); - swfdec_action_try_data_ref (try_data); swfdec_bits_init_data (&bits, data, len); @@ -2750,10 +2730,10 @@ swfdec_action_try (SwfdecAsContext *cx, guint action, const guint8 *data, guint if (try_data->catch_start || try_data->finally_start) { swfdec_as_frame_push_block (cx->frame, data + len, data + len + try_size, - swfdec_action_try_end_try, try_data, swfdec_action_try_data_unref); + swfdec_action_try_end_try, try_data); } else { SWFDEC_ERROR ("Try without neither catch or finally block"); - swfdec_action_try_data_unref (try_data); + swfdec_action_try_data_free (try_data); } } @@ -2762,7 +2742,6 @@ swfdec_action_pop_with (SwfdecAsFrame *frame, gpointer with_object) { g_assert (frame->scope_chain->data == with_object); frame->scope_chain = g_slist_delete_link (frame->scope_chain, frame->scope_chain); - swfdec_as_frame_pop_block (frame); } static void @@ -2784,7 +2763,7 @@ swfdec_action_with (SwfdecAsContext *cx, guint action, const guint8 *data, guint } else { cx->frame->scope_chain = g_slist_prepend (cx->frame->scope_chain, object); swfdec_as_frame_push_block (cx->frame, data + len, data + len + offset, - swfdec_action_pop_with, object, NULL); + swfdec_action_pop_with, object); } swfdec_as_stack_pop (cx); } diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 09ac8c8..ebd6fdc 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -41,14 +41,18 @@ static void swfdec_load_object_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) { - SwfdecAsValue val; SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); + SwfdecAsValue val; + glong size; - SWFDEC_AS_VALUE_SET_INT (&val, swfdec_loader_get_loaded (loader)); + SWFDEC_AS_VALUE_SET_NUMBER (&val, swfdec_loader_get_loaded (loader)); swfdec_as_object_set_variable_and_flags (load_object->target, SWFDEC_AS_STR__bytesLoaded, &val, SWFDEC_AS_VARIABLE_HIDDEN); - SWFDEC_AS_VALUE_SET_INT (&val, swfdec_loader_get_size (loader)); + size = swfdec_loader_get_size (loader); + if (size < 0) + size = swfdec_loader_get_loaded (loader); + SWFDEC_AS_VALUE_SET_NUMBER (&val, size); swfdec_as_object_set_variable_and_flags (load_object->target, SWFDEC_AS_STR__bytesTotal, &val, SWFDEC_AS_VARIABLE_HIDDEN); } diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c index 9bde057..e79ba1e 100644 --- a/libswfdec/swfdec_loader.c +++ b/libswfdec/swfdec_loader.c @@ -112,7 +112,7 @@ swfdec_loader_get_property (GObject *object, guint param_id, GValue *value, g_value_set_enum (value, loader->data_type); break; case PROP_SIZE: - g_value_set_ulong (value, loader->size); + g_value_set_long (value, loader->size); break; case PROP_LOADED: g_value_set_ulong (value, swfdec_loader_get_loaded (loader)); @@ -137,8 +137,8 @@ swfdec_loader_set_property (GObject *object, guint param_id, const GValue *value swfdec_loader_error (loader, g_value_get_string (value)); break; case PROP_SIZE: - if (loader->size == 0 && g_value_get_ulong (value) > 0) - swfdec_loader_set_size (loader, g_value_get_ulong (value)); + if (loader->size == -1 && g_value_get_long (value) >= 0) + swfdec_loader_set_size (loader, g_value_get_long (value)); break; case PROP_URL: loader->url = g_value_dup_boxed (value); @@ -186,8 +186,8 @@ swfdec_loader_class_init (SwfdecLoaderClass *klass) g_param_spec_enum ("data-type", "data type", "the data's type as identified by Swfdec", SWFDEC_TYPE_LOADER_DATA_TYPE, SWFDEC_LOADER_DATA_UNKNOWN, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_SIZE, - g_param_spec_ulong ("size", "size", "amount of bytes in loader", - 0, G_MAXULONG, 0, G_PARAM_READWRITE)); + g_param_spec_long ("size", "size", "amount of bytes in loader", + -1, G_MAXLONG, -1, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_LOADED, g_param_spec_ulong ("loaded", "loaded", "bytes already loaded", 0, G_MAXULONG, 0, G_PARAM_READWRITE)); @@ -201,6 +201,8 @@ swfdec_loader_init (SwfdecLoader *loader) { loader->queue = swfdec_buffer_queue_new (); loader->data_type = SWFDEC_LOADER_DATA_UNKNOWN; + + loader->size = -1; } /*** INTERNAL API ***/ @@ -527,8 +529,8 @@ void swfdec_loader_set_size (SwfdecLoader *loader, gulong size) { g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (loader->size == 0); - g_return_if_fail (size > 0); + g_return_if_fail (loader->size == -1); + g_return_if_fail (size <= G_MAXLONG); loader->size = size; g_object_notify (G_OBJECT (loader), "size"); @@ -543,7 +545,7 @@ swfdec_loader_set_size (SwfdecLoader *loader, gulong size) * * Returns: the total number of bytes for this loader or 0 if unknown **/ -gulong +glong swfdec_loader_get_size (SwfdecLoader *loader) { g_return_val_if_fail (SWFDEC_IS_LOADER (loader), 0); diff --git a/libswfdec/swfdec_loader.h b/libswfdec/swfdec_loader.h index 61e0b31..614907a 100644 --- a/libswfdec/swfdec_loader.h +++ b/libswfdec/swfdec_loader.h @@ -58,7 +58,7 @@ struct _SwfdecLoader /*< private >*/ guint state; /* SwfdecLoaderState the loader is currently in */ SwfdecURL * url; /* the URL for this loader in UTF-8 - must be set on creation */ - gulong size; /* number of bytes in stream or 0 if unknown */ + glong size; /* number of bytes in stream or -1 if unknown */ char * error; /* error message if in error state or NULL */ gpointer target; /* SwfdecLoaderTarget that gets notified about loading progress */ gpointer player; /* SwfdecPlayer belonging to target or %NULL */ @@ -93,7 +93,7 @@ const SwfdecURL * swfdec_loader_get_url (SwfdecLoader * loader); void swfdec_loader_set_size (SwfdecLoader * loader, gulong size); -gulong swfdec_loader_get_size (SwfdecLoader * loader); +glong swfdec_loader_get_size (SwfdecLoader * loader); gulong swfdec_loader_get_loaded (SwfdecLoader * loader); char * swfdec_loader_get_filename (SwfdecLoader * loader); SwfdecLoaderDataType diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index c401125..fa119ba 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -412,19 +412,19 @@ swfdec_net_stream_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig, if (stream->loader == NULL) SWFDEC_AS_VALUE_SET_INT (val, 0); else - SWFDEC_AS_VALUE_SET_INT (val, swfdec_loader_get_loaded (stream->loader)); + SWFDEC_AS_VALUE_SET_NUMBER (val, swfdec_loader_get_loaded (stream->loader)); *flags = 0; return TRUE; } else if (variable == SWFDEC_AS_STR_bytesTotal) { - guint bytes; + glong bytes; if (stream->loader == NULL) { bytes = 0; } else { bytes = swfdec_loader_get_size (stream->loader); - if (bytes == 0) + if (bytes < 0) bytes = swfdec_loader_get_loaded (stream->loader); } - SWFDEC_AS_VALUE_SET_INT (val, bytes); + SWFDEC_AS_VALUE_SET_NUMBER (val, bytes); *flags = 0; return TRUE; } commit dfb094f0c03c2b2d59b0f38484c10165d9e3298e Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 19:00:14 2007 +0100 get rid of 2 ways to pop blocks. blocks are now popped automatically and whenever that has happened, the func registered with a block is called. It is free to push new blocks. diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index f83632f..54a1ac8 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -865,7 +865,7 @@ start: } if (check_block && (pc < frame->block_start || pc >= frame->block_end)) { SWFDEC_LOG ("code exited block"); - swfdec_as_frame_check_block (frame); + swfdec_as_frame_pop_block (frame); pc = frame->pc; if (frame != context->frame) goto start; diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index c902406..c101b9c 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -203,16 +203,28 @@ swfdec_as_stack_iterator_next (SwfdecAsStackIterator *iter) typedef struct { const guint8 * start; /* start of block */ const guint8 * end; /* end of block (hitting this address will exit the block) */ - SwfdecAsFrameBlockFunc func; /* function to call when block is exited */ + SwfdecAsFrameBlockFunc func; /* function to call when block is exited (or frame is destroyed) */ gpointer data; /* data to pass to function */ - GDestroyNotify destroy;/* destroy function called for data */ } SwfdecAsFrameBlock; +/** + * swfdec_as_frame_push_block: + * @frame: a #SwfdecAsFrame + * @start: start of block + * @end: byte after end of block + * @func: function to call when block gets exited + * @data: data to pass to @func + * + * Registers a function that guards a block of memory. When the function + * exits this block of memory, it will call this function. This can happen + * either when the program counter leaves the guarded region, when the function + * returns or when the context aborted due to an unrecoverable error. + **/ void swfdec_as_frame_push_block (SwfdecAsFrame *frame, const guint8 *start, - const guint8 *end, SwfdecAsFrameBlockFunc func, gpointer data, GDestroyNotify destroy) + const guint8 *end, SwfdecAsFrameBlockFunc func, gpointer data) { - SwfdecAsFrameBlock block = { start, end, func, data, destroy }; + SwfdecAsFrameBlock block = { start, end, func, data }; g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); g_return_if_fail (start <= end); @@ -228,14 +240,16 @@ swfdec_as_frame_push_block (SwfdecAsFrame *frame, const guint8 *start, void swfdec_as_frame_pop_block (SwfdecAsFrame *frame) { + SwfdecAsFrameBlockFunc func; + gpointer data; SwfdecAsFrameBlock *block; - g_assert (frame->blocks->len > 0); + g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); + g_return_if_fail (frame->blocks->len > 0); block = &g_array_index (frame->blocks, SwfdecAsFrameBlock, frame->blocks->len - 1); - if (block->destroy) { - block->destroy (block->data); - } + func = block->func; + data = block->data; g_array_set_size (frame->blocks, frame->blocks->len - 1); if (frame->blocks->len) { block--; @@ -245,19 +259,8 @@ swfdec_as_frame_pop_block (SwfdecAsFrame *frame) frame->block_start = frame->script->buffer->data; frame->block_end = frame->script->buffer->data + frame->script->buffer->length; } -} - -void -swfdec_as_frame_check_block (SwfdecAsFrame *frame) -{ - SwfdecAsFrameBlock *block; - - g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); - if (frame->blocks->len == 0) - return; - - block = &g_array_index (frame->blocks, SwfdecAsFrameBlock, frame->blocks->len - 1); - block->func (frame, block->data); + /* only call function after we popped the block, so the block can push a new one */ + func (frame, data); } /*** FRAME ***/ @@ -269,6 +272,11 @@ swfdec_as_frame_dispose (GObject *object) { SwfdecAsFrame *frame = SWFDEC_AS_FRAME (object); + /* pop blocks while state is intact */ + while (frame->blocks->len > 0) + swfdec_as_frame_pop_block (frame); + + /* clean up */ g_slice_free1 (sizeof (SwfdecAsValue) * frame->n_registers, frame->registers); if (frame->security) { g_object_unref (frame->security); @@ -282,8 +290,6 @@ swfdec_as_frame_dispose (GObject *object) swfdec_buffer_unref (frame->constant_pool_buffer); frame->constant_pool_buffer = NULL; } - while (frame->blocks->len > 0) - swfdec_as_frame_pop_block (frame); g_array_free (frame->blocks, TRUE); g_slist_free (frame->scope_chain); if (frame->script) { @@ -799,9 +805,9 @@ swfdec_as_frame_handle_exception (SwfdecAsFrame *frame) /* pop blocks in the hope that we are inside a Try block */ while (cx->exception && frame->blocks->len) { - swfdec_as_frame_check_block (frame); + swfdec_as_frame_pop_block (frame); } - /* exit frame, nothing caught the exception */ + /* no Try blocks caught it, exit frame */ if (cx->exception) { swfdec_as_frame_return (frame, NULL); } diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h index 1e2075d..d50a9ce 100644 --- a/libswfdec/swfdec_as_frame_internal.h +++ b/libswfdec/swfdec_as_frame_internal.h @@ -101,10 +101,8 @@ void swfdec_as_frame_push_block (SwfdecAsFrame * frame, const guint8 * start, const guint8 * end, SwfdecAsFrameBlockFunc func, - gpointer data, - GDestroyNotify destroy); + gpointer data); void swfdec_as_frame_pop_block (SwfdecAsFrame * frame); -void swfdec_as_frame_check_block (SwfdecAsFrame * frame); void swfdec_as_frame_handle_exception(SwfdecAsFrame * frame);
Maybe Matching Threads
- 3 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_interpret.c
- 8 commits - doc/swfdec-sections.txt libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_interpret.c test/trace
- 5 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_scope.c libswfdec/swfdec_as_scope.h libswfdec/swfdec_as_script_function.c
- 5 commits - configure.ac doc/Makefile.am doc/swfdec-sections.txt libswfdec/swfdec_js_net_stream.c libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_net_stream.c
- 3 commits - libswfdec/swfdec_as_frame.c test/trace