Benjamin Otte
2007-Mar-13 13:44 UTC
[Swfdec] 3 commits - libswfdec/js libswfdec/swfdec_script.c
libswfdec/js/jsgc.c | 7 ++++--- libswfdec/js/jsinterp.h | 6 ++++++ libswfdec/swfdec_script.c | 8 ++++---- 3 files changed, 14 insertions(+), 7 deletions(-) New commits: diff-tree 467707141d1d5daa08fe9ebff8bcdfb7ed0abac1 (from 2cb65b20ea0ecae2b718fa01f80b0098965e5703) Author: Benjamin Otte <otte@gnome.org> Date: Tue Mar 13 21:34:31 2007 +0100 use js_Free/AllocRawStack instead of js_Free/AllocStack This fixes the GC (yay!) diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index e261d61..210235e 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -2843,7 +2843,7 @@ swfdec_script_interpret (SwfdecScript *s endpc = startpc + script->buffer->length; fp->pc = pc; /* set up stack */ - startsp = js_AllocStack (cx, STACKSIZE, &mark); + startsp = js_AllocRawStack (cx, STACKSIZE, &mark); if (!startsp) { ok = JS_FALSE; goto out; @@ -2987,7 +2987,7 @@ no_catch: /* Reset sp before freeing stack slots, because our caller may GC soon. */ fp->sp = fp->spbase; fp->spbase = NULL; - js_FreeStack(cx, mark); + js_FreeRawStack(cx, mark); cx->interpLevel--; swfdec_script_unref (script); return ok; @@ -3068,7 +3068,7 @@ swfdec_script_execute (SwfdecScript *scr frame.varobj = obj; /* allocate stack for variables */ frame.nvars = 4; - frame.vars = js_AllocStack (cx, frame.nvars, &mark); + frame.vars = js_AllocRawStack (cx, frame.nvars, &mark); if (frame.vars == NULL) { return JS_FALSE; } @@ -3087,7 +3087,7 @@ swfdec_script_execute (SwfdecScript *scr */ ok = swfdec_script_interpret (script, cx, &frame.rval); - js_FreeStack (cx, mark); + js_FreeRawStack (cx, mark); if (frame.constant_pool) swfdec_constant_pool_free (frame.constant_pool); diff-tree 2cb65b20ea0ecae2b718fa01f80b0098965e5703 (from 77b9d003d542b050ec3c536bf7b33d551395df78) Author: Benjamin Otte <otte@gnome.org> Date: Tue Mar 13 21:32:17 2007 +0100 export js_AllocRawStack and js_FreeRawStack diff --git a/libswfdec/js/jsinterp.h b/libswfdec/js/jsinterp.h index 32bb3a1..1a9e39d 100644 --- a/libswfdec/js/jsinterp.h +++ b/libswfdec/js/jsinterp.h @@ -238,6 +238,12 @@ js_AllocStack(JSContext *cx, uintN nslot extern JS_FRIEND_API(void) js_FreeStack(JSContext *cx, void *mark); +extern JS_FRIEND_API(jsval *) +js_AllocRawStack(JSContext *cx, uintN nslots, void **markp); + +extern JS_FRIEND_API(void) +js_FreeRawStack(JSContext *cx, void *mark); + extern JSBool js_GetArgument(JSContext *cx, JSObject *obj, jsval id, jsval *vp); diff-tree 77b9d003d542b050ec3c536bf7b33d551395df78 (from 20ece7c7093cd5d405f791db433249f8f62c7ad6) Author: Benjamin Otte <otte@gnome.org> Date: Tue Mar 13 21:31:34 2007 +0100 compute number of stack slots correctly also dump stats to stderr automatically if GC_MARK_DEBUG is defined diff --git a/libswfdec/js/jsgc.c b/libswfdec/js/jsgc.c index 88d64ca..fb463f0 100644 --- a/libswfdec/js/jsgc.c +++ b/libswfdec/js/jsgc.c @@ -847,8 +847,9 @@ js_MarkGCThing(JSContext *cx, void *thin rt->gcStats.maxdepth = rt->gcStats.depth); #ifdef GC_MARK_DEBUG - if (js_DumpGCHeap) - gc_dump_thing(thing, flags, arg, js_DumpGCHeap); + if (!js_DumpGCHeap) + js_DumpGCHeap = stderr; + gc_dump_thing(thing, flags, arg, js_DumpGCHeap); #endif switch (flags & GCF_TYPEMASK) { @@ -1228,7 +1229,7 @@ restart: ? (uintN)(fp->sp - fp->spbase) : depth; } else { - nslots = JS_UPTRDIFF(fp->sp, fp->spbase); + nslots = (uintN) (fp->sp - fp->spbase); } GC_MARK_JSVALS(cx, nslots, fp->spbase, "operand"); }