зеркало из https://github.com/mozilla/pjs.git
Bug 390078: Avoiding unnecessary GC-tracing of JSStackFrame members. r=brendan
This commit is contained in:
Родитель
ff199b0a6e
Коммит
a22f223915
|
@ -1944,6 +1944,7 @@ void
|
||||||
js_TraceStackFrame(JSTracer *trc, JSStackFrame *fp)
|
js_TraceStackFrame(JSTracer *trc, JSStackFrame *fp)
|
||||||
{
|
{
|
||||||
uintN depth, nslots, minargs;
|
uintN depth, nslots, minargs;
|
||||||
|
jsval *vp;
|
||||||
|
|
||||||
if (fp->callobj)
|
if (fp->callobj)
|
||||||
JS_CALL_OBJECT_TRACER(trc, fp->callobj, "call");
|
JS_CALL_OBJECT_TRACER(trc, fp->callobj, "call");
|
||||||
|
@ -1976,6 +1977,7 @@ js_TraceStackFrame(JSTracer *trc, JSStackFrame *fp)
|
||||||
JS_CALL_OBJECT_TRACER(trc, fp->callee, "callee");
|
JS_CALL_OBJECT_TRACER(trc, fp->callee, "callee");
|
||||||
|
|
||||||
if (fp->argv) {
|
if (fp->argv) {
|
||||||
|
/* Trace argv including callee and thisp slots. */
|
||||||
nslots = fp->argc;
|
nslots = fp->argc;
|
||||||
if (fp->fun) {
|
if (fp->fun) {
|
||||||
minargs = FUN_MINARGS(fp->fun);
|
minargs = FUN_MINARGS(fp->fun);
|
||||||
|
@ -1984,7 +1986,23 @@ js_TraceStackFrame(JSTracer *trc, JSStackFrame *fp)
|
||||||
if (!FUN_INTERPRETED(fp->fun))
|
if (!FUN_INTERPRETED(fp->fun))
|
||||||
nslots += fp->fun->u.n.extra;
|
nslots += fp->fun->u.n.extra;
|
||||||
}
|
}
|
||||||
TRACE_JSVALS(trc, nslots + 2, fp->argv - 2, "arg");
|
nslots += 2;
|
||||||
|
vp = fp->argv - 2;
|
||||||
|
if (fp->down && fp->down->spbase) {
|
||||||
|
/*
|
||||||
|
* Avoid unnecessary tracing in the common case when args overlaps
|
||||||
|
* with the stack segment of the previous frame. That segment is
|
||||||
|
* traced via the above spbase code and, when sp > spbase + depth,
|
||||||
|
* during tracing of the stack headers in js_TraceContext.
|
||||||
|
*/
|
||||||
|
if (JS_UPTRDIFF(vp, fp->down->spbase) <
|
||||||
|
JS_UPTRDIFF(fp->down->sp, fp->down->spbase)) {
|
||||||
|
JS_ASSERT((size_t)nslots >= (size_t)(fp->down->sp - vp));
|
||||||
|
nslots -= (uintN)(fp->down->sp - vp);
|
||||||
|
vp = fp->down->sp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TRACE_JSVALS(trc, nslots, vp, "arg");
|
||||||
}
|
}
|
||||||
JS_CALL_VALUE_TRACER(trc, fp->rval, "rval");
|
JS_CALL_VALUE_TRACER(trc, fp->rval, "rval");
|
||||||
if (fp->vars)
|
if (fp->vars)
|
||||||
|
|
|
@ -679,8 +679,11 @@ generator_trace(JSTracer *trc, JSObject *obj)
|
||||||
JSGenerator *gen;
|
JSGenerator *gen;
|
||||||
|
|
||||||
gen = (JSGenerator *) JS_GetPrivate(trc->context, obj);
|
gen = (JSGenerator *) JS_GetPrivate(trc->context, obj);
|
||||||
if (gen)
|
if (gen) {
|
||||||
|
/* js_TraceStackFrame does not trace recursively the down chain. */
|
||||||
|
JS_ASSERT(!gen->frame.down);
|
||||||
js_TraceStackFrame(trc, &gen->frame);
|
js_TraceStackFrame(trc, &gen->frame);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JSClass js_GeneratorClass = {
|
JSClass js_GeneratorClass = {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче