Bug 739512: Patch 10: add JSScripts::hasConsts() et al. r=dvander.

This commit is contained in:
Nicholas Nethercote 2012-04-10 23:51:10 -07:00
parent f6ceffe212
commit 0449d38c5c
11 changed files with 39 additions and 33 deletions

View File

@ -112,7 +112,7 @@ DefineGlobals(JSContext *cx, GlobalScope &globalScope, JSScript* script)
JSScript *outer = worklist.back();
worklist.popBack();
if (JSScript::isValidOffset(outer->objectsOffset)) {
if (outer->hasObjects()) {
JSObjectArray *arr = outer->objects();
/*
@ -132,16 +132,14 @@ DefineGlobals(JSContext *cx, GlobalScope &globalScope, JSScript* script)
outer->isOuterFunction = true;
inner->isInnerFunction = true;
}
if (!JSScript::isValidOffset(inner->globalsOffset) &&
!JSScript::isValidOffset(inner->objectsOffset)) {
if (!inner->hasGlobals() && !inner->hasObjects())
continue;
}
if (!worklist.append(inner))
return false;
}
}
if (!JSScript::isValidOffset(outer->globalsOffset))
if (!outer->hasGlobals())
continue;
GlobalSlotArray *globalUses = outer->globals();

View File

@ -1017,7 +1017,7 @@ JS_GetScriptTotalSize(JSContext *cx, JSScript *script)
continue;
nbytes += (sn - notes + 1) * sizeof *sn;
if (JSScript::isValidOffset(script->objectsOffset)) {
if (script->hasObjects()) {
objarray = script->objects();
size_t i = objarray->length;
nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
@ -1026,7 +1026,7 @@ JS_GetScriptTotalSize(JSContext *cx, JSScript *script)
} while (i != 0);
}
if (JSScript::isValidOffset(script->regexpsOffset)) {
if (script->hasRegexps()) {
objarray = script->regexps();
size_t i = objarray->length;
nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
@ -1035,7 +1035,7 @@ JS_GetScriptTotalSize(JSContext *cx, JSScript *script)
} while (i != 0);
}
if (JSScript::isValidOffset(script->trynotesOffset)) {
if (script->hasTrynotes()) {
nbytes += sizeof(JSTryNoteArray) +
script->trynotes()->length * sizeof(JSTryNote);
}

View File

@ -1017,7 +1017,7 @@ TryNoteIter::TryNoteIter(const FrameRegs &regs)
script(regs.fp()->script()),
pcOffset(regs.pc - script->main())
{
if (JSScript::isValidOffset(script->trynotesOffset)) {
if (script->hasTrynotes()) {
tn = script->trynotes()->vector;
tnEnd = tn + script->trynotes()->length;
} else {

View File

@ -817,7 +817,7 @@ EvalCacheLookup(JSContext *cx, JSLinearString *str, StackFrame *caller, unsigned
*/
JS_ASSERT(script->objects()->length >= 1);
if (script->objects()->length == 1 &&
!JSScript::isValidOffset(script->regexpsOffset)) {
!script->hasRegexps()) {
JS_ASSERT(staticLevel == script->staticLevel);
*scriptp = script->evalHashLink();
script->evalHashLink() = NULL;

View File

@ -1822,7 +1822,7 @@ GetLocal(SprintStack *ss, int i)
* not in a block. In either case, return GetStr(ss, i).
*/
JSScript *script = ss->printer->script;
if (!JSScript::isValidOffset(script->objectsOffset))
if (!script->hasObjects())
return GetStr(ss, i);
// In case of a let variable, the stack points to a JSOP_ENTERBLOCK opcode.

View File

@ -428,7 +428,7 @@ js::XDRScript(XDRState<mode> *xdr, JSScript **scriptp, JSScript *parentScript)
JS_ASSERT_IF(parentScript, parentScript->compartment() == script->compartment());
/* Should not XDR scripts optimized for a single global object. */
JS_ASSERT(!JSScript::isValidOffset(script->globalsOffset));
JS_ASSERT(!script->hasGlobals());
nargs = script->bindings.numArgs();
nvars = script->bindings.numVars();
@ -535,13 +535,13 @@ js::XDRScript(XDRState<mode> *xdr, JSScript **scriptp, JSScript *parentScript)
notes = script->notes();
nsrcnotes = script->numNotes();
if (JSScript::isValidOffset(script->constsOffset))
if (script->hasConsts())
nconsts = script->consts()->length;
if (JSScript::isValidOffset(script->objectsOffset))
if (script->hasObjects())
nobjects = script->objects()->length;
if (JSScript::isValidOffset(script->regexpsOffset))
if (script->hasRegexps())
nregexps = script->regexps()->length;
if (JSScript::isValidOffset(script->trynotesOffset))
if (script->hasTrynotes())
ntrynotes = script->trynotes()->length;
/* no globals when encoding; see assertion above */
nClosedArgs = script->numClosedArgs();
@ -1993,17 +1993,17 @@ JSScript::markChildren(JSTracer *trc)
MarkString(trc, &atoms[i], "atom");
}
if (JSScript::isValidOffset(objectsOffset)) {
if (hasObjects()) {
JSObjectArray *objarray = objects();
MarkObjectRange(trc, objarray->length, objarray->vector, "objects");
}
if (JSScript::isValidOffset(regexpsOffset)) {
if (hasRegexps()) {
JSObjectArray *objarray = regexps();
MarkObjectRange(trc, objarray->length, objarray->vector, "objects");
}
if (JSScript::isValidOffset(constsOffset)) {
if (hasConsts()) {
JSConstArray *constarray = consts();
MarkValueRange(trc, constarray->length, constarray->vector, "consts");
}

View File

@ -736,47 +736,55 @@ struct JSScript : public js::gc::Cell
static const uint8_t INVALID_OFFSET = 0xFF;
static bool isValidOffset(uint8_t offset) { return offset != INVALID_OFFSET; }
bool hasConsts() { return isValidOffset(constsOffset); }
bool hasObjects() { return isValidOffset(objectsOffset); }
bool hasRegexps() { return isValidOffset(regexpsOffset); }
bool hasTrynotes() { return isValidOffset(trynotesOffset); }
bool hasGlobals() { return isValidOffset(globalsOffset); }
bool hasClosedArgs() { return isValidOffset(closedArgsOffset); }
bool hasClosedVars() { return isValidOffset(closedVarsOffset); }
JSConstArray *consts() {
JS_ASSERT(isValidOffset(constsOffset));
JS_ASSERT(hasConsts());
return reinterpret_cast<JSConstArray *>(data + constsOffset);
}
JSObjectArray *objects() {
JS_ASSERT(isValidOffset(objectsOffset));
JS_ASSERT(hasObjects());
return reinterpret_cast<JSObjectArray *>(data + objectsOffset);
}
JSObjectArray *regexps() {
JS_ASSERT(isValidOffset(regexpsOffset));
JS_ASSERT(hasRegexps());
return reinterpret_cast<JSObjectArray *>(data + regexpsOffset);
}
JSTryNoteArray *trynotes() {
JS_ASSERT(isValidOffset(trynotesOffset));
JS_ASSERT(hasTrynotes());
return reinterpret_cast<JSTryNoteArray *>(data + trynotesOffset);
}
js::GlobalSlotArray *globals() {
JS_ASSERT(isValidOffset(globalsOffset));
JS_ASSERT(hasGlobals());
return reinterpret_cast<js::GlobalSlotArray *>(data + globalsOffset);
}
js::ClosedSlotArray *closedArgs() {
JS_ASSERT(isValidOffset(closedArgsOffset));
JS_ASSERT(hasClosedArgs());
return reinterpret_cast<js::ClosedSlotArray *>(data + closedArgsOffset);
}
js::ClosedSlotArray *closedVars() {
JS_ASSERT(isValidOffset(closedVarsOffset));
JS_ASSERT(hasClosedVars());
return reinterpret_cast<js::ClosedSlotArray *>(data + closedVarsOffset);
}
uint32_t numClosedArgs() {
return isValidOffset(closedArgsOffset) ? closedArgs()->length : 0;
return hasClosedArgs() ? closedArgs()->length : 0;
}
uint32_t numClosedVars() {
return isValidOffset(closedVarsOffset) ? closedVars()->length : 0;
return hasClosedVars() ? closedVars()->length : 0;
}
js::HeapPtrAtom &getAtom(size_t index) const {

View File

@ -78,7 +78,7 @@ FindExceptionHandler(JSContext *cx)
StackFrame *fp = cx->fp();
JSScript *script = fp->script();
if (!JSScript::isValidOffset(script->trynotesOffset))
if (!script->hasTrynotes())
return NULL;
error:

View File

@ -1661,7 +1661,7 @@ TryNotes(JSContext *cx, JSScript *script, Sprinter *sp)
{
JSTryNote *tn, *tnlimit;
if (!JSScript::isValidOffset(script->trynotesOffset))
if (!script->hasTrynotes())
return JS_TRUE;
tn = script->trynotes()->vector;
@ -1705,7 +1705,7 @@ DisassembleScript(JSContext *cx, JSScript *script, JSFunction *fun, bool lines,
SrcNotes(cx, script, sp);
TryNotes(cx, script, sp);
if (recursive && JSScript::isValidOffset(script->objectsOffset)) {
if (recursive && script->hasObjects()) {
JSObjectArray *objects = script->objects();
for (unsigned i = 0; i != objects->length; ++i) {
JSObject *obj = objects->vector[i];

View File

@ -2531,7 +2531,7 @@ DebuggerScript_getChildScripts(JSContext *cx, unsigned argc, Value *vp)
JSObject *result = NewDenseEmptyArray(cx);
if (!result)
return false;
if (JSScript::isValidOffset(script->objectsOffset)) {
if (script->hasObjects()) {
/*
* script->savedCallerFun indicates that this is a direct eval script
* and the calling function is stored as script->objects()->vector[0].

View File

@ -906,7 +906,7 @@ js::XDRStaticBlockObject(XDRState<mode> *xdr, JSScript *script, StaticBlockObjec
uint32_t depthAndCount = 0;
if (mode == XDR_ENCODE) {
obj = *objp;
parentId = JSScript::isValidOffset(script->objectsOffset)
parentId = script->hasObjects()
? FindObjectIndex(script->objects(), obj->enclosingBlock())
: NO_PARENT_INDEX;
uint32_t depth = obj->stackDepth();