Bug 503343 - Change JSScope macros to methods. r=jorendorff

This commit is contained in:
Brendan Eich
2009-07-09 15:27:21 -05:00
parent 6006029ec0
commit b94b8f38f5
16 changed files with 578 additions and 559 deletions

View File

@@ -297,13 +297,13 @@ js_SetProtoOrParent(JSContext *cx, JSObject *obj, uint32 slot, JSObject *pobj,
/*
* Regenerate property cache shape ids for all of the scopes along the
* old prototype chain to invalidate their property cache entries, in
* case any entries were filled by looking up starting from obj.
* case any entries were filled by looking up through obj.
*/
JSObject *oldproto = obj;
while (oldproto && OBJ_IS_NATIVE(oldproto)) {
JS_LOCK_OBJ(cx, oldproto);
JSScope *scope = OBJ_SCOPE(oldproto);
js_MakeScopeShapeUnique(cx, scope);
scope->protoShapeChange(cx);
JSObject *tmp = STOBJ_GET_PROTO(scope->object);
JS_UNLOCK_OBJ(cx, oldproto);
oldproto = tmp;
@@ -2058,20 +2058,20 @@ InitScopeForObject(JSContext* cx, JSObject* obj, JSObject* proto,
(JSCLASS_RESERVED_SLOTS_MASK << JSCLASS_RESERVED_SLOTS_SHIFT))) &&
protoclasp->reserveSlots == clasp->reserveSlots)))
{
js_HoldScope(OBJ_SCOPE(proto));
OBJ_SCOPE(proto)->hold();
obj->map = proto->map;
return true;
}
JSScope *scope = js_NewScope(cx, ops, clasp, obj);
JSScope *scope = JSScope::create(cx, ops, clasp, obj);
if (!scope)
goto bad;
/* Let js_NewScope set freeslot so as to reserve slots. */
/* Let JSScope::create set freeslot so as to reserve slots. */
JS_ASSERT(scope->freeslot >= JSSLOT_PRIVATE);
if (scope->freeslot > JS_INITIAL_NSLOTS &&
!js_ReallocSlots(cx, obj, scope->freeslot, JS_TRUE)) {
js_DestroyScope(cx, scope);
JSScope::destroy(cx, scope);
goto bad;
}
obj->map = &scope->map;
@@ -2130,7 +2130,7 @@ js_NewInstance(JSContext *cx, JSClass *clasp, JSObject *ctor)
return NULL;
}
JSScopeProperty *sprop = SCOPE_GET_PROPERTY(scope, ATOM_TO_JSID(atom));
JSScopeProperty *sprop = scope->lookup(ATOM_TO_JSID(atom));
jsval pval = sprop ? STOBJ_GET_SLOT(ctor, sprop->slot) : JSVAL_HOLE;
JSObject *proto;
@@ -3148,7 +3148,7 @@ js_NewNativeObject(JSContext *cx, JSClass *clasp, JSObject *proto, uint32 slot)
if (!obj)
return NULL;
js_HoldScope(OBJ_SCOPE(proto));
OBJ_SCOPE(proto)->hold();
obj->map = proto->map;
obj->classword = jsuword(clasp);
obj->fslots[JSSLOT_PROTO] = OBJECT_TO_JSVAL(proto);
@@ -3426,7 +3426,7 @@ js_FinalizeObject(JSContext *cx, JSObject *obj)
#endif
if (OBJ_IS_NATIVE(obj))
js_DropScope(cx, OBJ_SCOPE(obj), obj);
OBJ_SCOPE(obj)->drop(cx, obj);
FreeSlots(cx, obj);
}
@@ -3515,10 +3515,10 @@ PurgeProtoChain(JSContext *cx, JSObject *obj, jsid id)
}
JS_LOCK_OBJ(cx, obj);
scope = OBJ_SCOPE(obj);
sprop = SCOPE_GET_PROPERTY(scope, id);
sprop = scope->lookup(id);
if (sprop) {
PCMETER(JS_PROPERTY_CACHE(cx).pcpurges++);
js_MakeScopeShapeUnique(cx, scope);
scope->shadowingShapeChange(cx, sprop);
JS_UNLOCK_SCOPE(cx, scope);
if (!STOBJ_GET_PARENT(scope->object)) {
@@ -3579,8 +3579,7 @@ js_AddNativeProperty(JSContext *cx, JSObject *obj, jsid id,
} else {
/* Convert string indices to integers if appropriate. */
CHECK_FOR_STRING_INDEX(id);
sprop = js_AddScopeProperty(cx, scope, id, getter, setter, slot, attrs,
flags, shortid);
sprop = scope->add(cx, id, getter, setter, slot, attrs, flags, shortid);
}
JS_UNLOCK_OBJ(cx, obj);
return sprop;
@@ -3598,8 +3597,7 @@ js_ChangeNativePropertyAttrs(JSContext *cx, JSObject *obj,
if (!scope) {
sprop = NULL;
} else {
sprop = js_ChangeScopePropertyAttrs(cx, scope, sprop, attrs, mask,
getter, setter);
sprop = scope->change(cx, sprop, attrs, mask, getter, setter);
}
JS_UNLOCK_OBJ(cx, obj);
return sprop;
@@ -3632,7 +3630,7 @@ js_DefineProperty(JSContext *cx, JSObject *obj, jsid id, jsval value,
} \
if (*(vp) != nominal_) { \
if (SPROP_HAS_VALID_SLOT(sprop, scope)) \
LOCKED_OBJ_WRITE_BARRIER(cx, obj, (sprop)->slot, *(vp)); \
LOCKED_OBJ_WRITE_SLOT(cx, obj, (sprop)->slot, *(vp)); \
} \
} \
JS_END_MACRO
@@ -3679,14 +3677,13 @@ js_DefineNativeProperty(JSContext *cx, JSObject *obj, jsid id, jsval value,
if (sprop &&
pobj == obj &&
(sprop->attrs & (JSPROP_GETTER | JSPROP_SETTER))) {
sprop = js_ChangeScopePropertyAttrs(cx, OBJ_SCOPE(obj), sprop,
attrs, sprop->attrs,
(attrs & JSPROP_GETTER)
? getter
: sprop->getter,
(attrs & JSPROP_SETTER)
? setter
: sprop->setter);
sprop = OBJ_SCOPE(obj)->change(cx, sprop, attrs, sprop->attrs,
(attrs & JSPROP_GETTER)
? getter
: sprop->getter,
(attrs & JSPROP_SETTER)
? setter
: sprop->setter);
/* NB: obj == pobj, so we can share unlock code at the bottom. */
if (!sprop)
@@ -3736,9 +3733,8 @@ js_DefineNativeProperty(JSContext *cx, JSObject *obj, jsid id, jsval value,
/* Add a new property, or replace an existing one of the same id. */
if (clasp->flags & JSCLASS_SHARE_ALL_PROPERTIES)
attrs |= JSPROP_SHARED;
sprop = js_AddScopeProperty(cx, scope, id, getter, setter,
SPROP_INVALID_SLOT, attrs, flags,
shortid);
sprop = scope->add(cx, id, getter, setter, SPROP_INVALID_SLOT, attrs,
flags, shortid);
if (!sprop)
goto error;
added = true;
@@ -3746,11 +3742,11 @@ js_DefineNativeProperty(JSContext *cx, JSObject *obj, jsid id, jsval value,
/* Store value before calling addProperty, in case the latter GC's. */
if (SPROP_HAS_VALID_SLOT(sprop, scope))
LOCKED_OBJ_WRITE_BARRIER(cx, obj, sprop->slot, value);
LOCKED_OBJ_WRITE_SLOT(cx, obj, sprop->slot, value);
/* XXXbe called with lock held */
ADD_PROPERTY_HELPER(cx, clasp, obj, scope, sprop, &value,
js_RemoveScopeProperty(cx, scope, id);
scope->remove(cx, id);
goto error);
if (defineHow & JSDNP_CACHE_RESULT) {
@@ -3806,7 +3802,7 @@ js_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, jsid id, uintN flags,
JS_LOCK_OBJ(cx, obj);
scope = OBJ_SCOPE(obj);
if (scope->object == obj) {
sprop = SCOPE_GET_PROPERTY(scope, id);
sprop = scope->lookup(id);
} else {
/* Shared prototype scope: try resolve before lookup. */
sprop = NULL;
@@ -3888,7 +3884,7 @@ js_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, jsid id, uintN flags,
*/
scope = OBJ_SCOPE(obj2);
if (scope->object == obj2)
sprop = SCOPE_GET_PROPERTY(scope, id);
sprop = scope->lookup(id);
}
if (sprop) {
JS_ASSERT(obj2 == scope->object);
@@ -3912,7 +3908,7 @@ js_LookupPropertyWithFlags(JSContext *cx, JSObject *obj, jsid id, uintN flags,
JS_ASSERT(OBJ_IS_NATIVE(obj));
scope = OBJ_SCOPE(obj);
if (scope->object == obj)
sprop = SCOPE_GET_PROPERTY(scope, id);
sprop = scope->lookup(id);
}
cleanup:
@@ -4178,7 +4174,7 @@ js_NativeGet(JSContext *cx, JSObject *obj, JSObject *pobj,
JS_ASSERT(scope->object == pobj);
if (SLOT_IN_SCOPE(slot, scope) &&
(JS_LIKELY(cx->runtime->propertyRemovals == sample) ||
SCOPE_GET_PROPERTY(scope, sprop->id) == sprop)) {
scope->has(sprop))) {
LOCKED_OBJ_SET_SLOT(pobj, slot, *vp);
}
@@ -4236,9 +4232,9 @@ js_NativeSet(JSContext *cx, JSObject *obj, JSScopeProperty *sprop, jsval *vp)
JS_ASSERT(scope->object == obj || (sprop->attrs & JSPROP_SHARED));
if (SLOT_IN_SCOPE(slot, scope) &&
(JS_LIKELY(cx->runtime->propertyRemovals == sample) ||
SCOPE_GET_PROPERTY(scope, sprop->id) == sprop)) {
scope->has(sprop))) {
set_slot:
LOCKED_OBJ_WRITE_BARRIER(cx, obj, slot, *vp);
LOCKED_OBJ_WRITE_SLOT(cx, obj, slot, *vp);
}
return JS_TRUE;
@@ -4415,7 +4411,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, JSBool cacheResult,
* We peek at OBJ_SCOPE(obj) without locking obj. Any race means a failure
* to seal before sharing, which is inherently ambiguous.
*/
if (SCOPE_IS_SEALED(OBJ_SCOPE(obj)) && OBJ_SCOPE(obj)->object == obj) {
if (OBJ_SCOPE(obj)->sealed() && OBJ_SCOPE(obj)->object == obj) {
flags = JSREPORT_ERROR;
goto read_only_error;
}
@@ -4463,7 +4459,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, JSBool cacheResult,
attrs = sprop->attrs;
if ((attrs & JSPROP_READONLY) ||
(SCOPE_IS_SEALED(scope) && (attrs & JSPROP_SHARED))) {
(scope->sealed() && (attrs & JSPROP_SHARED))) {
JS_UNLOCK_SCOPE(cx, scope);
/*
@@ -4564,8 +4560,8 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, JSBool cacheResult,
}
if (clasp->flags & JSCLASS_SHARE_ALL_PROPERTIES)
attrs |= JSPROP_SHARED;
sprop = js_AddScopeProperty(cx, scope, id, getter, setter,
SPROP_INVALID_SLOT, attrs, flags, shortid);
sprop = scope->add(cx, id, getter, setter, SPROP_INVALID_SLOT, attrs,
flags, shortid);
if (!sprop) {
JS_UNLOCK_SCOPE(cx, scope);
return JS_FALSE;
@@ -4581,7 +4577,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, JSBool cacheResult,
/* XXXbe called with obj locked */
ADD_PROPERTY_HELPER(cx, clasp, obj, scope, sprop, vp,
js_RemoveScopeProperty(cx, scope, id);
scope->remove(cx, id);
JS_UNLOCK_SCOPE(cx, scope);
return JS_FALSE);
added = true;
@@ -4727,7 +4723,7 @@ js_DeleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *rval)
if (SPROP_HAS_VALID_SLOT(sprop, scope))
GC_POKE(cx, LOCKED_OBJ_GET_SLOT(obj, sprop->slot));
ok = js_RemoveScopeProperty(cx, scope, id);
ok = scope->remove(cx, id);
OBJ_DROP_PROPERTY(cx, obj, prop);
return ok;
}
@@ -4931,8 +4927,7 @@ js_Enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op,
for (sprop = SCOPE_LAST_PROP(scope); sprop; sprop = sprop->parent) {
if ((sprop->attrs & JSPROP_ENUMERATE) &&
!(sprop->flags & SPROP_IS_ALIAS) &&
(!SCOPE_HAD_MIDDLE_DELETE(scope) ||
SCOPE_HAS_PROPERTY(scope, sprop))) {
(!scope->hadMiddleDelete() || scope->has(sprop))) {
length++;
}
}
@@ -4955,8 +4950,7 @@ js_Enumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op,
for (sprop = SCOPE_LAST_PROP(scope); sprop; sprop = sprop->parent) {
if ((sprop->attrs & JSPROP_ENUMERATE) &&
!(sprop->flags & SPROP_IS_ALIAS) &&
(!SCOPE_HAD_MIDDLE_DELETE(scope) ||
SCOPE_HAS_PROPERTY(scope, sprop))) {
(!scope->hadMiddleDelete() || scope->has(sprop))) {
JS_ASSERT(ids < ne->ids + length);
*ids++ = sprop->id;
}
@@ -5759,7 +5753,7 @@ js_TraceObject(JSTracer *trc, JSObject *obj)
sprop = SCOPE_LAST_PROP(scope);
if (sprop) {
JS_ASSERT(SCOPE_HAS_PROPERTY(scope, sprop));
JS_ASSERT(scope->has(sprop));
/* Regenerate property cache shape ids if GC'ing. */
if (IS_GC_MARKING_TRACER(trc)) {
@@ -5779,10 +5773,8 @@ js_TraceObject(JSTracer *trc, JSObject *obj)
/* Trace scope's property tree ancestor line. */
do {
if (SCOPE_HAD_MIDDLE_DELETE(scope) &&
!SCOPE_HAS_PROPERTY(scope, sprop)) {
if (scope->hadMiddleDelete() && !scope->has(sprop))
continue;
}
TRACE_SCOPE_PROPERTY(trc, sprop);
} while ((sprop = sprop->parent) != NULL);
}
@@ -5838,7 +5830,7 @@ js_Clear(JSContext *cx, JSObject *obj)
scope = OBJ_SCOPE(obj);
if (scope->object == obj) {
/* Now that we're done using scope->lastProp/table, clear scope. */
js_ClearScope(cx, scope);
scope->clear(cx);
/* Clear slot values and reset freeslot so we're consistent. */
i = STOBJ_NSLOTS(obj);
@@ -6123,7 +6115,7 @@ js_DumpObject(JSObject *obj)
JSScope *scope = OBJ_SCOPE(obj);
JSObject *proto = STOBJ_GET_PROTO(obj);
if (SCOPE_IS_SEALED(scope))
if (scope->sealed())
fprintf(stderr, "sealed\n");
sharesScope = (scope->object != obj);
@@ -6138,10 +6130,8 @@ js_DumpObject(JSObject *obj)
fprintf(stderr, "properties:\n");
for (JSScopeProperty *sprop = SCOPE_LAST_PROP(scope); sprop;
sprop = sprop->parent) {
if (!SCOPE_HAD_MIDDLE_DELETE(scope) ||
SCOPE_HAS_PROPERTY(scope, sprop)) {
if (!scope->hadMiddleDelete() || scope->has(sprop))
dumpScopeProp(sprop);
}
}
}
} else {