[Swfdec] 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 libswfdec/swfdec_as_script_function.h libswfdec/swfdec_as_with.c libswfdec/swfdec_as_with.h
Benjamin Otte
company at kemper.freedesktop.org
Thu Sep 13 10:36:26 PDT 2007
libswfdec/Makefile.am | 4
libswfdec/swfdec_as_context.c | 39 ++----
libswfdec/swfdec_as_frame.c | 218 ++++++++++++++++++++--------------
libswfdec/swfdec_as_frame_internal.h | 38 ++++-
libswfdec/swfdec_as_interpret.c | 39 +++---
libswfdec/swfdec_as_scope.c | 78 ------------
libswfdec/swfdec_as_scope.h | 55 --------
libswfdec/swfdec_as_script_function.c | 10 -
libswfdec/swfdec_as_script_function.h | 6
libswfdec/swfdec_as_with.c | 143 ----------------------
libswfdec/swfdec_as_with.h | 56 --------
11 files changed, 207 insertions(+), 479 deletions(-)
New commits:
diff-tree ef4b8c89c3e50cdd36402301e9aad38270accf24 (from 7abe5c03e87fbfd281426b1cf06e2d4890698338)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Sep 13 19:34:54 2007 +0200
replace swfdec_as_frame_find_variable with _get/set_variable
Since the setting code works way differet from the getting code, it seemed
clever to make them 2 different functions
diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index 035e1fd..733192d 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -963,16 +963,11 @@ swfdec_as_context_eval_get_property (Swf
swfdec_as_object_get_variable (obj, name, ret);
} else {
if (cx->frame) {
- obj = swfdec_as_frame_find_variable (cx->frame, name);
- if (obj) {
- swfdec_as_object_get_variable (obj, name, ret);
- return;
- }
+ swfdec_as_frame_get_variable (cx->frame, name, ret);
} else {
SWFDEC_WARNING ("eval called without a frame");
swfdec_as_object_get_variable (cx->global, name, ret);
}
- SWFDEC_AS_VALUE_SET_UNDEFINED (ret);
}
}
@@ -985,11 +980,10 @@ swfdec_as_context_eval_set_property (Swf
SWFDEC_ERROR ("no frame in eval_set?");
return;
}
- obj = swfdec_as_frame_find_variable (cx->frame, name);
- if (obj == NULL || obj == cx->global)
- obj = cx->frame->target;
+ swfdec_as_frame_set_variable (cx->frame, name, ret);
+ } else {
+ swfdec_as_object_set_variable (obj, name, ret);
}
- swfdec_as_object_set_variable (obj, name, ret);
}
static void
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 5620ac7..c11c03a 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -535,45 +535,72 @@ swfdec_as_frame_set_this (SwfdecAsFrame
}
/**
- * swfdec_as_frame_find_variable:
+ * swfdec_as_frame_get_variable_and_flags:
* @frame: a #SwfdecAsFrame
- * @variable: name of the variable to find
+ * @variable: name of the variable
+ * @value: pointer to take value of the variable or %NULL
+ * @flags: pointer to take flags or %NULL
+ * @pobject: pointer to take the actual object that held the variable or %NULL
+ *
+ * Walks the scope chain of @frame trying to resolve the given @variable and if
+ * found, returns its value and flags. Note that there might be a difference
+ * between @pobject and the returned object, since the returned object will be
+ * part of the scope chain while @pobject will contain the actual property. It
+ * will be a prototype of the returned object though.
*
- * Finds the given variable in the current scope chain. Returns the first
- * object in the scope chain that contains this variable in its prototype
- * chain. If you want to know the explicit object that contains the variable,
- * you have to call swfdec_as_object_get_variable_and_flags() on the result.
- * If no such variable exist in the scope chain, %NULL is returned.
- * <note>The returned object might be an internal object. You probably do not
- * want to expose it to scripts. Call swfdec_as_object_resolve () on the
- * returned value to be sure of not having an internal object.</note>
- *
- * Returns: the object that contains @variable or %NULL if none.
+ * Returns: Object in scope chain that contained the variable.
**/
SwfdecAsObject *
-swfdec_as_frame_find_variable (SwfdecAsFrame *frame, const char *variable)
+swfdec_as_frame_get_variable_and_flags (SwfdecAsFrame *frame, const char *variable,
+ SwfdecAsValue *value, guint *flags, SwfdecAsObject **pobject)
{
GSList *walk;
- SwfdecAsValue val;
g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL);
g_return_val_if_fail (variable != NULL, NULL);
for (walk = frame->scope_chain; walk; walk = walk->next) {
- if (swfdec_as_object_get_variable (walk->data, variable, &val))
- return SWFDEC_AS_OBJECT (walk->data);
+ if (swfdec_as_object_get_variable_and_flags (walk->data, variable, value,
+ flags, pobject))
+ return walk->data;
}
/* we've walked the scope chain down. Now look in the special objects. */
/* 1) the target */
- if (swfdec_as_object_get_variable (frame->target, variable, &val))
+ if (swfdec_as_object_get_variable_and_flags (frame->target, variable, value,
+ flags, pobject))
return frame->target;
/* 2) the global object */
- if (swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (frame)->context->global, variable, &val))
+ if (swfdec_as_object_get_variable_and_flags (
+ SWFDEC_AS_OBJECT (frame)->context->global, variable, value, flags, pobject))
return SWFDEC_AS_OBJECT (frame)->context->global;
return NULL;
}
+void
+swfdec_as_frame_set_variable_and_flags (SwfdecAsFrame *frame, const char *variable,
+ const SwfdecAsValue *value, guint default_flags)
+{
+ SwfdecAsObject *pobject, *set;
+ GSList *walk;
+
+ g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
+ g_return_if_fail (variable != NULL);
+
+ set = NULL;
+ for (walk = frame->scope_chain; walk; walk = walk->next) {
+ if (swfdec_as_object_get_variable_and_flags (walk->data, variable, NULL, NULL, &pobject) &&
+ pobject == walk->data) {
+ set = walk->data;
+ break;
+ }
+ }
+ if (set == NULL)
+ set = frame->target;
+
+ swfdec_as_object_set_variable_and_flags (set, variable, value, default_flags);
+}
+
SwfdecAsDeleteReturn
swfdec_as_frame_delete_variable (SwfdecAsFrame *frame, const char *variable)
{
@@ -721,25 +748,14 @@ swfdec_as_frame_preload (SwfdecAsFrame *
}
}
if (script->flags & SWFDEC_SCRIPT_PRELOAD_ROOT && current_reg < script->n_registers) {
- SwfdecAsObject *obj;
-
- obj = swfdec_as_frame_find_variable (frame, SWFDEC_AS_STR__root);
- if (obj) {
- swfdec_as_object_get_variable (obj, SWFDEC_AS_STR__root, &frame->registers[current_reg]);
- } else {
+ if (!swfdec_as_frame_get_variable (frame, SWFDEC_AS_STR__root, &frame->registers[current_reg])) {
SWFDEC_WARNING ("no root to preload");
- SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]);
}
+ current_reg++;
}
if (script->flags & SWFDEC_SCRIPT_PRELOAD_PARENT && current_reg < script->n_registers) {
- SwfdecAsObject *obj;
-
- obj = swfdec_as_frame_find_variable (frame, SWFDEC_AS_STR__parent);
- if (obj) {
- swfdec_as_object_get_variable (obj, SWFDEC_AS_STR__parent, &frame->registers[current_reg++]);
- } else {
- SWFDEC_WARNING ("no parent to preload");
- SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]);
+ if (!swfdec_as_frame_get_variable (frame, SWFDEC_AS_STR__parent, &frame->registers[current_reg])) {
+ SWFDEC_WARNING ("no root to preload");
}
current_reg++;
}
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index 280f48a..be9d1ae 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -72,8 +72,21 @@ void swfdec_as_frame_set_this (SwfdecAs
SwfdecAsObject * thisp);
void swfdec_as_frame_preload (SwfdecAsFrame * frame);
-SwfdecAsObject *swfdec_as_frame_find_variable (SwfdecAsFrame * frame,
- const char * variable);
+#define swfdec_as_frame_get_variable(frame, variable, value) \
+ swfdec_as_frame_get_variable_and_flags (frame, variable, value, NULL, NULL)
+SwfdecAsObject *swfdec_as_frame_get_variable_and_flags
+ (SwfdecAsFrame * frame,
+ const char * variable,
+ SwfdecAsValue * value,
+ guint * flags,
+ SwfdecAsObject ** pobject);
+#define swfdec_as_frame_set_variable(frame, variable, value) \
+ swfdec_as_frame_set_variable_and_flags (frame, variable, value, 0)
+void swfdec_as_frame_set_variable_and_flags
+ (SwfdecAsFrame * frame,
+ const char * variable,
+ const SwfdecAsValue * value,
+ guint default_flags);
SwfdecAsDeleteReturn
swfdec_as_frame_delete_variable (SwfdecAsFrame * frame,
const char * variable);
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 70f3c09..b9204a6 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -578,16 +578,14 @@ swfdec_action_get_variable (SwfdecAsCont
val = swfdec_as_stack_peek (cx, 1);
s = swfdec_as_value_to_string (cx, val);
if (swfdec_action_get_movie_by_path (cx, s, &object, &s)) {
- if (object == NULL)
- object = swfdec_as_frame_find_variable (cx->frame, s);
- } else {
- object = NULL;
- }
- if (object != NULL) {
- if (s) {
- swfdec_as_object_get_variable (object, swfdec_as_context_get_string (cx, s), val);
+ if (object) {
+ if (s) {
+ swfdec_as_object_get_variable (object, swfdec_as_context_get_string (cx, s), val);
+ } else {
+ SWFDEC_AS_VALUE_SET_OBJECT (val, object);
+ }
} else {
- SWFDEC_AS_VALUE_SET_OBJECT (val, object);
+ swfdec_as_frame_get_variable (cx->frame, swfdec_as_context_get_string (cx, s), val);
}
} else {
SWFDEC_AS_VALUE_SET_UNDEFINED (val);
@@ -791,9 +789,8 @@ swfdec_action_call_function (SwfdecAsCon
name = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 1));
thisp = swfdec_as_stack_peek (cx, 2);
fun = swfdec_as_stack_peek (cx, 1);
- obj = swfdec_as_frame_find_variable (frame, name);
+ obj = swfdec_as_frame_get_variable (frame, name, fun);
if (obj) {
- swfdec_as_object_get_variable (obj, name, fun);
SWFDEC_AS_VALUE_SET_OBJECT (thisp, obj);
} else {
SWFDEC_AS_VALUE_SET_NULL (thisp);
diff-tree 7abe5c03e87fbfd281426b1cf06e2d4890698338 (from c4ba717de9a7bcabb49dcf5efd94c0dfd4a1fea5)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Sep 13 15:49:54 2007 +0200
properly exit when pc == endpc
diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index e332c5b..035e1fd 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -797,6 +797,10 @@ start:
goto start;
}
if (pc < startpc || pc >= endpc) {
+ if (pc == endpc) {
+ swfdec_as_frame_return (frame, NULL);
+ goto start;
+ }
SWFDEC_ERROR ("pc %p not in valid range [%p, %p) anymore", pc, startpc, endpc);
goto error;
}
diff-tree c4ba717de9a7bcabb49dcf5efd94c0dfd4a1fea5 (from parents)
Merge: f5f3a3978cf4b5ce623f2d0118f5936c9d1608a6 8fcb6912a4fb328bc33fea63ccb4816a7fc47e4d
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Sep 13 14:28:41 2007 +0200
Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec
diff-tree f5f3a3978cf4b5ce623f2d0118f5936c9d1608a6 (from parents)
Merge: 8c921f54f26b483cd271a0677bb6e731bf7feb0b 7028d035feb026c8f194d4d27be9348ff294fc10
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Sep 13 13:38:00 2007 +0200
Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec
diff-tree 8c921f54f26b483cd271a0677bb6e731bf7feb0b (from 93f0e1b0eaeb04357370f7daf9ea8dbbe3786d3e)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Sep 13 13:36:03 2007 +0200
rewrite scope chain handling
Previously we had lots of scope objects that were instantiated whenever the
scope chain changed.
Now it's just a list of objects in the scope chain.
It also adds a function swfdec_as_frame_push_block() that allows registering
a callback that gets called whenever the program counter leaves that block. It
is used for implementing With and should also work for try/catch.
diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index b3e5bdf..ca6d565 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -32,14 +32,12 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES
swfdec_as_native_function.c \
swfdec_as_number.c \
swfdec_as_object.c \
- swfdec_as_scope.c \
swfdec_as_script_function.c \
swfdec_as_stack.c \
swfdec_as_string.c \
swfdec_as_strings.c \
swfdec_as_super.c \
swfdec_as_types.c \
- swfdec_as_with.c \
swfdec_amf.c \
swfdec_asbroadcaster.c \
swfdec_audio.c \
@@ -162,13 +160,11 @@ noinst_HEADERS = \
swfdec_as_date.h \
swfdec_as_interpret.h \
swfdec_as_number.h \
- swfdec_as_scope.h \
swfdec_as_script_function.h \
swfdec_as_stack.h \
swfdec_as_string.h \
swfdec_as_strings.h \
swfdec_as_super.h \
- swfdec_as_with.h \
swfdec_asnative.h \
swfdec_amf.h \
swfdec_audio_internal.h \
diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index 89859d3..e332c5b 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -711,7 +711,7 @@ swfdec_as_context_run (SwfdecAsContext *
int version;
guint original_version;
void (* step) (SwfdecAsDebugger *debugger, SwfdecAsContext *context);
- gboolean check_scope; /* some opcodes avoid a scope check */
+ gboolean check_block; /* some opcodes avoid a scope check */
g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context));
if (context->frame == NULL || context->state == SWFDEC_AS_CONTEXT_ABORTED)
@@ -786,19 +786,20 @@ start:
startpc = script->buffer->data;
endpc = startpc + script->buffer->length;
pc = frame->pc;
- check_scope = TRUE;
+ check_block = TRUE;
while (context->state < SWFDEC_AS_CONTEXT_ABORTED) {
- if (pc == endpc) {
- swfdec_as_frame_return (frame, NULL);
- goto start;
+ if (check_block && (pc < frame->block_start || pc >= frame->block_end)) {
+ SWFDEC_LOG ("code exited block");
+ swfdec_as_frame_check_block (frame);
+ pc = frame->pc;
+ if (frame != context->frame)
+ goto start;
}
if (pc < startpc || pc >= endpc) {
SWFDEC_ERROR ("pc %p not in valid range [%p, %p) anymore", pc, startpc, endpc);
goto error;
}
- if (check_scope)
- swfdec_as_frame_check_scope (frame);
/* decode next action */
action = *pc;
@@ -847,7 +848,7 @@ start:
SWFDEC_WARNING ("cannot interpret action %3u 0x%02X %s for version %u, skipping it", action,
action, spec->name ? spec->name : "Unknown", script->version);
frame->pc = pc = nextpc;
- check_scope = TRUE;
+ check_block = TRUE;
continue;
}
SWFDEC_WARNING ("cannot interpret action %3u 0x%02X %s for version %u, using version %u instead",
@@ -875,10 +876,10 @@ start:
/* FIXME: do this via flag? */
if (frame->pc == pc) {
frame->pc = pc = nextpc;
- check_scope = TRUE;
+ check_block = TRUE;
} else {
pc = frame->pc;
- check_scope = FALSE;
+ check_block = FALSE;
}
if (frame == context->frame) {
#ifndef G_DISABLE_ASSERT
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index 52745bd..5620ac7 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -195,8 +195,71 @@ swfdec_as_stack_iterator_next (SwfdecAsS
return iter->current;
}
+/*** BLOCK HANDLING ***/
-G_DEFINE_TYPE (SwfdecAsFrame, swfdec_as_frame, SWFDEC_TYPE_AS_SCOPE)
+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 */
+ gpointer data; /* data to pass to function */
+ GDestroyNotify destroy;/* destroy function called for data */
+} SwfdecAsFrameBlock;
+
+void
+swfdec_as_frame_push_block (SwfdecAsFrame *frame, const guint8 *start,
+ const guint8 *end, SwfdecAsFrameBlockFunc func, gpointer data, GDestroyNotify destroy)
+{
+ SwfdecAsFrameBlock block = { start, end, func, data, destroy };
+
+ g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
+ g_return_if_fail (start < end);
+ g_return_if_fail (start >= frame->block_start);
+ g_return_if_fail (end <= frame->block_end);
+ g_return_if_fail (func != NULL);
+
+ frame->block_start = start;
+ frame->block_end = end;
+ g_array_append_val (frame->blocks, block);
+}
+
+void
+swfdec_as_frame_pop_block (SwfdecAsFrame *frame)
+{
+ SwfdecAsFrameBlock *block;
+
+ g_assert (frame->blocks->len > 0);
+
+ block = &g_array_index (frame->blocks, SwfdecAsFrameBlock, frame->blocks->len - 1);
+ if (block->destroy) {
+ block->destroy (block->data);
+ }
+ g_array_set_size (frame->blocks, frame->blocks->len - 1);
+ if (frame->blocks->len) {
+ block--;
+ frame->block_start = block->start;
+ frame->block_end = block->end;
+ } else {
+ /* FIXME: do we need to set the block_start and block_end here? */
+ frame->block_start = NULL;
+ frame->block_end = NULL;
+ }
+}
+
+void
+swfdec_as_frame_check_block (SwfdecAsFrame *frame)
+{
+ SwfdecAsFrameBlock *block;
+
+ g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
+ g_assert (frame->blocks->len > 0);
+
+ block = &g_array_index (frame->blocks, SwfdecAsFrameBlock, frame->blocks->len - 1);
+ block->func (frame, block->data);
+}
+
+/*** FRAME ***/
+
+G_DEFINE_TYPE (SwfdecAsFrame, swfdec_as_frame, SWFDEC_TYPE_AS_OBJECT)
static void
swfdec_as_frame_dispose (GObject *object)
@@ -216,6 +279,9 @@ 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_OBJECT_CLASS (swfdec_as_frame_parent_class)->dispose (object);
}
@@ -228,8 +294,7 @@ swfdec_as_frame_mark (SwfdecAsObject *ob
if (frame->next)
swfdec_as_object_mark (SWFDEC_AS_OBJECT (frame->next));
- if (frame->scope)
- swfdec_as_object_mark (SWFDEC_AS_OBJECT (frame->scope));
+ g_slist_foreach (frame->scope_chain, (GFunc) swfdec_as_object_mark, NULL);
if (frame->thisp)
swfdec_as_object_mark (frame->thisp);
if (frame->super)
@@ -297,6 +362,8 @@ static void
swfdec_as_frame_init (SwfdecAsFrame *frame)
{
frame->function_name = "unnamed";
+ frame->blocks = g_array_new (FALSE, FALSE, sizeof (SwfdecAsFrameBlock));
+ frame->block_end = (gpointer) -1;
}
static void
@@ -329,7 +396,7 @@ swfdec_as_frame_new (SwfdecAsContext *co
frame->function_name = script->name;
SWFDEC_DEBUG ("new frame for function %s", frame->function_name);
frame->pc = script->buffer->data;
- frame->scope = SWFDEC_AS_SCOPE (frame);
+ frame->scope_chain = g_slist_prepend (frame->scope_chain, frame);
frame->n_registers = script->n_registers;
frame->registers = g_slice_alloc0 (sizeof (SwfdecAsValue) * frame->n_registers);
if (script->constant_pool) {
@@ -486,26 +553,16 @@ swfdec_as_frame_set_this (SwfdecAsFrame
SwfdecAsObject *
swfdec_as_frame_find_variable (SwfdecAsFrame *frame, const char *variable)
{
- SwfdecAsScope *cur;
- guint i;
+ GSList *walk;
SwfdecAsValue val;
g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL);
g_return_val_if_fail (variable != NULL, NULL);
- cur = frame->scope;
- for (i = 0; i < 256; i++) {
- if (swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (cur), variable, &val))
- return SWFDEC_AS_OBJECT (cur);
- if (cur->next == NULL)
- break;
- cur = cur->next;
- }
- if (i == 256) {
- swfdec_as_context_abort (SWFDEC_AS_OBJECT (frame)->context, "Scope recursion limit exceeded");
- return NULL;
+ for (walk = frame->scope_chain; walk; walk = walk->next) {
+ if (swfdec_as_object_get_variable (walk->data, variable, &val))
+ return SWFDEC_AS_OBJECT (walk->data);
}
- g_assert (SWFDEC_IS_AS_FRAME (cur));
/* we've walked the scope chain down. Now look in the special objects. */
/* 1) the target */
if (swfdec_as_object_get_variable (frame->target, variable, &val))
@@ -520,27 +577,17 @@ swfdec_as_frame_find_variable (SwfdecAsF
SwfdecAsDeleteReturn
swfdec_as_frame_delete_variable (SwfdecAsFrame *frame, const char *variable)
{
- SwfdecAsScope *cur;
- guint i;
+ GSList *walk;
SwfdecAsDeleteReturn ret;
g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), FALSE);
g_return_val_if_fail (variable != NULL, FALSE);
- cur = frame->scope;
- for (i = 0; i < 256; i++) {
- ret = swfdec_as_object_delete_variable (SWFDEC_AS_OBJECT (cur), variable);
+ for (walk = frame->scope_chain; walk; walk = walk->next) {
+ ret = swfdec_as_object_delete_variable (walk->data, variable);
if (ret)
return ret;
- if (cur->next == NULL)
- break;
- cur = cur->next;
- }
- if (i == 256) {
- swfdec_as_context_abort (SWFDEC_AS_OBJECT (frame)->context, "Scope recursion limit exceeded");
- return FALSE;
}
- g_assert (SWFDEC_IS_AS_FRAME (cur));
/* we've walked the scope chain down. Now look in the special objects. */
/* 1) the target set via SetTarget */
ret = swfdec_as_object_delete_variable (frame->target, variable);
@@ -699,6 +746,10 @@ swfdec_as_frame_preload (SwfdecAsFrame *
if (script->flags & SWFDEC_SCRIPT_PRELOAD_GLOBAL && current_reg < script->n_registers) {
SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], context->global);
}
+ /*** add a default block that protects the program counter */
+ swfdec_as_frame_push_block (frame, frame->script->buffer->data,
+ frame->script->buffer->data + frame->script->buffer->length,
+ (SwfdecAsFrameBlockFunc) swfdec_as_frame_return, NULL, NULL);
out:
if (context->debugger) {
@@ -710,33 +761,6 @@ out:
}
/**
- * swfdec_as_frame_check_scope:
- * @frame: a #SwfdecAsFrame
- *
- * Checks that the current scope of the given @frame is still correct.
- * If it is not, the current scope is popped and the next one is used.
- * If the
- **/
-void
-swfdec_as_frame_check_scope (SwfdecAsFrame *frame)
-{
- SwfdecAsScope *frame_scope;
-
- g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
-
- frame_scope = SWFDEC_AS_SCOPE (frame);
- while (frame->scope != frame_scope) {
- SwfdecAsScope *cur = frame->scope;
-
- if (frame->pc >= cur->startpc &&
- frame->pc < cur->endpc)
- break;
-
- frame->scope = cur->next;
- }
-}
-
-/**
* swfdec_as_frame_get_next:
* @frame: a #SwfdecAsFrame
*
diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h
index 544d009..280f48a 100644
--- a/libswfdec/swfdec_as_frame_internal.h
+++ b/libswfdec/swfdec_as_frame_internal.h
@@ -20,14 +20,15 @@
#ifndef _SWFDEC_AS_FRAME_INTERNAL_H_
#define _SWFDEC_AS_FRAME_INTERNAL_H_
-#include <libswfdec/swfdec_as_scope.h>
#include <libswfdec/swfdec_as_types.h>
#include <libswfdec/swfdec_script_internal.h>
G_BEGIN_DECLS
+typedef void (* SwfdecAsFrameBlockFunc) (SwfdecAsFrame *frame, gpointer data);
+
struct _SwfdecAsFrame {
- SwfdecAsScope scope_object;
+ SwfdecAsObject object;
SwfdecAsFrame * next; /* next frame (FIXME: keep a list in the context instead?) */
SwfdecAsFunction * function; /* function we're executing or NULL if toplevel */
@@ -41,7 +42,10 @@ struct _SwfdecAsFrame {
const char * function_name; /* name of function */
/* script execution */
SwfdecScript * script; /* script being executed */
- SwfdecAsScope * scope; /* first object in scope chain (either this frame or a with object) */
+ GSList * scope_chain; /* the scope chain (with objects etc) */
+ const guint8 * block_start; /* start of current block */
+ const guint8 * block_end; /* end of current block */
+ GArray * blocks; /* blocks we have entered (like With) */
SwfdecAsObject * target; /* target to use as last object in scope chain or for SetVariable */
SwfdecAsObject * original_target;/* original target (used when resetting target) */
gboolean is_local; /* TRUE if this frame takes local variables */
@@ -55,7 +59,7 @@ struct _SwfdecAsFrame {
};
struct _SwfdecAsFrameClass {
- SwfdecAsScopeClass scope_class;
+ SwfdecAsObjectClass object_class;
};
SwfdecAsFrame * swfdec_as_frame_new (SwfdecAsContext * context,
@@ -76,7 +80,14 @@ SwfdecAsDeleteReturn
void swfdec_as_frame_set_target (SwfdecAsFrame * frame,
SwfdecAsObject * target);
-void swfdec_as_frame_check_scope (SwfdecAsFrame * frame);
+void swfdec_as_frame_push_block (SwfdecAsFrame * frame,
+ const guint8 * start,
+ const guint8 * end,
+ SwfdecAsFrameBlockFunc func,
+ gpointer data,
+ GDestroyNotify destroy);
+void swfdec_as_frame_pop_block (SwfdecAsFrame * frame);
+void swfdec_as_frame_check_block (SwfdecAsFrame * frame);
G_END_DECLS
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 564c35a..70f3c09 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -30,7 +30,6 @@
#include "swfdec_as_string.h"
#include "swfdec_as_strings.h"
#include "swfdec_as_super.h"
-#include "swfdec_as_with.h"
#include "swfdec_debug.h"
#include <errno.h>
@@ -1742,12 +1741,9 @@ swfdec_action_define_function (SwfdecAsC
/* see function-scope tests */
if (cx->version > 5) {
/* FIXME: or original target? */
- fun = swfdec_as_script_function_new (frame->scope ? frame->scope : SWFDEC_AS_SCOPE (frame), frame->target, script);
+ fun = swfdec_as_script_function_new (frame->target, frame->scope_chain, script);
} else {
- SwfdecAsScope *scope = frame->scope ? frame->scope : SWFDEC_AS_SCOPE (frame);
- while (scope->next)
- scope = scope->next;
- fun = swfdec_as_script_function_new (scope, frame->target, script);
+ fun = swfdec_as_script_function_new (frame->target, NULL, script);
}
if (fun == NULL)
return;
@@ -2264,6 +2260,14 @@ swfdec_action_mb_ascii_to_char_5 (Swfdec
}
static void
+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
swfdec_action_with (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
{
SwfdecAsObject *object;
@@ -2280,7 +2284,9 @@ swfdec_action_with (SwfdecAsContext *cx,
SWFDEC_INFO ("With called without an object, skipping");
cx->frame->pc = (guint8 *) data + len + offset;
} else {
- swfdec_as_with_new (object, data + len, offset);
+ 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_as_stack_pop (cx);
}
diff --git a/libswfdec/swfdec_as_scope.c b/libswfdec/swfdec_as_scope.c
deleted file mode 100644
index 1104b63..0000000
--- a/libswfdec/swfdec_as_scope.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "swfdec_as_scope.h"
-#include "swfdec_as_context.h"
-#include "swfdec_debug.h"
-
-/**
- * SwfdecAsScope:
- * @see_also: #SwfdecAsFrame, #SwfdecAsWith
- *
- * A scope is the abstract base class for the #SwfdecAsWith and #SwfdecAsFrame
- * classes. It is used to resolve variable references inside ActionScript.
- * Consider the following simple ActionScript code:
- * <informalexample><programlisting>
- * foo = bar;
- * </programlisting></informalexample>
- * The variables foo and bar have to be resolved here, so that the script
- * engine knows, what object to set them on. This is done by walking the scope
- * chain. This chain is build up using With and Frame objects.
- */
-G_DEFINE_ABSTRACT_TYPE (SwfdecAsScope, swfdec_as_scope, SWFDEC_TYPE_AS_OBJECT)
-
-static void
-swfdec_as_scope_dispose (GObject *object)
-{
- //SwfdecAsScope *scope = SWFDEC_AS_SCOPE (object);
-
- G_OBJECT_CLASS (swfdec_as_scope_parent_class)->dispose (object);
-}
-
-static void
-swfdec_as_scope_mark (SwfdecAsObject *object)
-{
- SwfdecAsScope *scope = SWFDEC_AS_SCOPE (object);
-
- if (scope->next)
- swfdec_as_object_mark (SWFDEC_AS_OBJECT (scope->next));
-
- SWFDEC_AS_OBJECT_CLASS (swfdec_as_scope_parent_class)->mark (object);
-}
-
-static void
-swfdec_as_scope_class_init (SwfdecAsScopeClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);
-
- object_class->dispose = swfdec_as_scope_dispose;
-
- asobject_class->mark = swfdec_as_scope_mark;
-}
-
-static void
-swfdec_as_scope_init (SwfdecAsScope *scope)
-{
-}
-
diff --git a/libswfdec/swfdec_as_scope.h b/libswfdec/swfdec_as_scope.h
deleted file mode 100644
index 7c32e02..0000000
--- a/libswfdec/swfdec_as_scope.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_AS_SCOPE_H_
-#define _SWFDEC_AS_SCOPE_H_
-
-#include <libswfdec/swfdec_as_object.h>
-#include <libswfdec/swfdec_as_types.h>
-#include <libswfdec/swfdec_script.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecAsScopeClass SwfdecAsScopeClass;
-
-#define SWFDEC_TYPE_AS_SCOPE (swfdec_as_scope_get_type())
-#define SWFDEC_IS_AS_SCOPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_AS_SCOPE))
-#define SWFDEC_IS_AS_SCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_AS_SCOPE))
-#define SWFDEC_AS_SCOPE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_AS_SCOPE, SwfdecAsScope))
-#define SWFDEC_AS_SCOPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_AS_SCOPE, SwfdecAsScopeClass))
-#define SWFDEC_AS_SCOPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_AS_SCOPE, SwfdecAsScopeClass))
-
-struct _SwfdecAsScope {
- SwfdecAsObject object;
-
- /*< private >*/
- SwfdecAsScope * next; /* next scope or NULL if last */
- const guint8 * startpc; /* start of this scope */
- const guint8 * endpc; /* end of this scope */
-};
-
-struct _SwfdecAsScopeClass {
- SwfdecAsObjectClass object_class;
-};
-
-GType swfdec_as_scope_get_type (void);
-
-
-G_END_DECLS
-#endif
diff --git a/libswfdec/swfdec_as_script_function.c b/libswfdec/swfdec_as_script_function.c
index 1abf45c..dc10056 100644
--- a/libswfdec/swfdec_as_script_function.c
+++ b/libswfdec/swfdec_as_script_function.c
@@ -40,7 +40,7 @@ swfdec_as_script_function_call (SwfdecAs
frame = swfdec_as_frame_new (SWFDEC_AS_OBJECT (function)->context, script->script);
if (frame == NULL)
return NULL;
- SWFDEC_AS_SCOPE (frame)->next = script->scope;
+ frame->scope_chain = g_slist_concat (frame->scope_chain, g_slist_copy (script->scope_chain));
frame->function = function;
frame->target = script->target;
frame->original_target = script->target;
@@ -65,8 +65,7 @@ swfdec_as_script_function_mark (SwfdecAs
{
SwfdecAsScriptFunction *script = SWFDEC_AS_SCRIPT_FUNCTION (object);
- if (script->scope)
- swfdec_as_object_mark (SWFDEC_AS_OBJECT (script->scope));
+ g_slist_foreach (script->scope_chain, (GFunc) swfdec_as_object_mark, NULL);
SWFDEC_AS_OBJECT_CLASS (swfdec_as_script_function_parent_class)->mark (object);
}
@@ -112,14 +111,13 @@ swfdec_as_script_function_init (SwfdecAs
}
SwfdecAsFunction *
-swfdec_as_script_function_new (SwfdecAsScope *scope, SwfdecAsObject *target, SwfdecScript *script)
+swfdec_as_script_function_new (SwfdecAsObject *target, const GSList *scope_chain, SwfdecScript *script)
{
SwfdecAsValue val;
SwfdecAsScriptFunction *fun;
SwfdecAsObject *proto;
SwfdecAsContext *context;
- g_return_val_if_fail (SWFDEC_IS_AS_SCOPE (scope), NULL);
g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (target), NULL);
g_return_val_if_fail (script != NULL, NULL);
@@ -129,7 +127,7 @@ swfdec_as_script_function_new (SwfdecAsS
fun = g_object_new (SWFDEC_TYPE_AS_SCRIPT_FUNCTION, NULL);
if (fun == NULL)
return NULL;
- fun->scope = scope;
+ fun->scope_chain = g_slist_copy ((GSList *) scope_chain);
fun->script = script;
fun->target = target;
swfdec_as_object_add (SWFDEC_AS_OBJECT (fun), context, sizeof (SwfdecAsScriptFunction));
diff --git a/libswfdec/swfdec_as_script_function.h b/libswfdec/swfdec_as_script_function.h
index 69f3481..c82aa62 100644
--- a/libswfdec/swfdec_as_script_function.h
+++ b/libswfdec/swfdec_as_script_function.h
@@ -42,7 +42,7 @@ struct _SwfdecAsScriptFunction {
/* for script script_functions */
SwfdecScript * script; /* script being executed or NULL when native */
- SwfdecAsScope * scope; /* scope this script_function was defined in */
+ GSList * scope_chain; /* scope this script_function was defined in */
SwfdecAsObject * target; /* target this object was defined in */
};
@@ -52,8 +52,8 @@ struct _SwfdecAsScriptFunctionClass {
GType swfdec_as_script_function_get_type (void);
-SwfdecAsFunction * swfdec_as_script_function_new (SwfdecAsScope * scope,
- SwfdecAsObject * target,
+SwfdecAsFunction * swfdec_as_script_function_new (SwfdecAsObject * target,
+ const GSList * scope_chain,
SwfdecScript * script);
diff --git a/libswfdec/swfdec_as_with.c b/libswfdec/swfdec_as_with.c
deleted file mode 100644
index 4484079..0000000
--- a/libswfdec/swfdec_as_with.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "swfdec_as_with.h"
-#include "swfdec_as_context.h"
-#include "swfdec_as_frame_internal.h"
-#include "swfdec_debug.h"
-
-G_DEFINE_TYPE (SwfdecAsWith, swfdec_as_with, SWFDEC_TYPE_AS_SCOPE)
-
-static void
-swfdec_as_with_mark (SwfdecAsObject *object)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
-
- swfdec_as_object_mark (with->object);
-
- SWFDEC_AS_OBJECT_CLASS (swfdec_as_with_parent_class)->mark (object);
-}
-
-static SwfdecAsObject *
-swfdec_as_with_resolve (SwfdecAsObject *object)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
-
- return with->object;
-}
-
-static gboolean
-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);
-}
-
-static void
-swfdec_as_with_set (SwfdecAsObject *object, const char *variable,
- const SwfdecAsValue *val, guint flags)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
- SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
-
- klass->set (with->object, variable, val, flags);
-}
-
-static void
-swfdec_as_with_set_flags (SwfdecAsObject *object, const char *variable,
- guint flags, guint mask)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
- SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
-
- klass->set_flags (with->object, variable, flags, mask);
-}
-
-static SwfdecAsDeleteReturn
-swfdec_as_with_delete (SwfdecAsObject *object, const char *variable)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
-
- return swfdec_as_object_delete_variable (with->object, variable);
-}
-
-static gboolean
-swfdec_as_with_foreach (SwfdecAsObject *object, SwfdecAsVariableForeach func,
- gpointer data)
-{
- SwfdecAsWith *with = SWFDEC_AS_WITH (object);
- SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
-
- return klass->foreach (with->object, func, data);
-}
-
-static void
-swfdec_as_with_class_init (SwfdecAsWithClass *klass)
-{
- SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);
-
- asobject_class->mark = swfdec_as_with_mark;
- asobject_class->get = swfdec_as_with_get;
- asobject_class->set = swfdec_as_with_set;
- asobject_class->set_flags = swfdec_as_with_set_flags;
- asobject_class->del = swfdec_as_with_delete;
- asobject_class->foreach = swfdec_as_with_foreach;
- asobject_class->resolve = swfdec_as_with_resolve;
-}
-
-static void
-swfdec_as_with_init (SwfdecAsWith *with)
-{
-}
-
-SwfdecAsScope *
-swfdec_as_with_new (SwfdecAsObject *object, const guint8 *startpc, guint n_bytes)
-{
- SwfdecAsContext *context;
- SwfdecAsFrame *frame;
- SwfdecAsScope *scope;
- SwfdecAsWith *with;
-
- g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
-
- context = object->context;
- if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsWith)))
- return NULL;
- with = g_object_new (SWFDEC_TYPE_AS_WITH, NULL);
- swfdec_as_object_add (SWFDEC_AS_OBJECT (with), context, sizeof (SwfdecAsWith));
- scope = SWFDEC_AS_SCOPE (with);
- frame = context->frame;
- with->object = object;
- scope->startpc = startpc;
- scope->endpc = startpc + n_bytes;
- scope->next = frame->scope;
- frame->scope = scope;
-
- return scope;
-}
-
diff --git a/libswfdec/swfdec_as_with.h b/libswfdec/swfdec_as_with.h
deleted file mode 100644
index 1d24d07..0000000
--- a/libswfdec/swfdec_as_with.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_AS_WITH_H_
-#define _SWFDEC_AS_WITH_H_
-
-#include <libswfdec/swfdec_as_scope.h>
-#include <libswfdec/swfdec_as_types.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecAsWith SwfdecAsWith;
-typedef struct _SwfdecAsWithClass SwfdecAsWithClass;
-
-#define SWFDEC_TYPE_AS_WITH (swfdec_as_with_get_type())
-#define SWFDEC_IS_AS_WITH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_AS_WITH))
-#define SWFDEC_IS_AS_WITH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_AS_WITH))
-#define SWFDEC_AS_WITH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_AS_WITH, SwfdecAsWith))
-#define SWFDEC_AS_WITH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_AS_WITH, SwfdecAsWithClass))
-#define SWFDEC_AS_WITH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_AS_WITH, SwfdecAsWithClass))
-
-struct _SwfdecAsWith {
- SwfdecAsScope scope;
-
- /*< private >*/
- SwfdecAsObject * object; /* the object of this With context */
-};
-
-struct _SwfdecAsWithClass {
- SwfdecAsScopeClass scope_class;
-};
-
-GType swfdec_as_with_get_type (void);
-
-SwfdecAsScope * swfdec_as_with_new (SwfdecAsObject * object,
- const guint8 * startpc,
- guint n_bytes);
-
-G_END_DECLS
-#endif
More information about the Swfdec
mailing list