Bug 503343 - Change JSScope macros to methods. r=jorendorff
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user