bool JSCompartment::putWrapper(const CrossCompartmentKey &wrapped, const js::Value &wrapper) { JS_ASSERT(wrapped.wrapped); JS_ASSERT(!IsPoisonedPtr(wrapped.wrapped)); JS_ASSERT(!IsPoisonedPtr(wrapped.debugger)); JS_ASSERT(!IsPoisonedPtr(wrapper.toGCThing())); JS_ASSERT_IF(wrapped.kind == CrossCompartmentKey::StringWrapper, wrapper.isString()); JS_ASSERT_IF(wrapped.kind != CrossCompartmentKey::StringWrapper, wrapper.isObject()); return crossCompartmentWrappers.put(wrapped, wrapper); }
bool JSCompartment::putWrapper(JSContext *cx, const CrossCompartmentKey &wrapped, const js::Value &wrapper) { MOZ_ASSERT(wrapped.wrapped); MOZ_ASSERT(!IsPoisonedPtr(wrapped.wrapped)); MOZ_ASSERT(!IsPoisonedPtr(wrapped.debugger)); MOZ_ASSERT(!IsPoisonedPtr(wrapper.toGCThing())); MOZ_ASSERT_IF(wrapped.kind == CrossCompartmentKey::StringWrapper, wrapper.isString()); MOZ_ASSERT_IF(wrapped.kind != CrossCompartmentKey::StringWrapper, wrapper.isObject()); bool success = crossCompartmentWrappers.put(wrapped, ReadBarriered<Value>(wrapper)); /* There's no point allocating wrappers in the nursery since we will tenure them anyway. */ MOZ_ASSERT(!IsInsideNursery(static_cast<gc::Cell *>(wrapper.toGCThing()))); if (success && (IsInsideNursery(wrapped.wrapped) || IsInsideNursery(wrapped.debugger))) { WrapperMapRef ref(&crossCompartmentWrappers, wrapped); cx->runtime()->gc.storeBuffer.putGeneric(ref); } return success; }
bool JSCompartment::putWrapper(const CrossCompartmentKey &wrapped, const js::Value &wrapper) { JS_ASSERT(wrapped.wrapped); JS_ASSERT(!IsPoisonedPtr(wrapped.wrapped)); JS_ASSERT(!IsPoisonedPtr(wrapped.debugger)); JS_ASSERT(!IsPoisonedPtr(wrapper.toGCThing())); JS_ASSERT_IF(wrapped.kind == CrossCompartmentKey::StringWrapper, wrapper.isString()); JS_ASSERT_IF(wrapped.kind != CrossCompartmentKey::StringWrapper, wrapper.isObject()); // todo: uncomment when bug 815999 is fixed: // JS_ASSERT(!wrapped.wrapped->isMarked(gc::GRAY)); return crossCompartmentWrappers.put(wrapped, wrapper); }
bool JSCompartment::putWrapper(JSContext *cx, const CrossCompartmentKey &wrapped, const js::Value &wrapper) { JS_ASSERT(wrapped.wrapped); JS_ASSERT(!IsPoisonedPtr(wrapped.wrapped)); JS_ASSERT(!IsPoisonedPtr(wrapped.debugger)); JS_ASSERT(!IsPoisonedPtr(wrapper.toGCThing())); JS_ASSERT_IF(wrapped.kind == CrossCompartmentKey::StringWrapper, wrapper.isString()); JS_ASSERT_IF(wrapped.kind != CrossCompartmentKey::StringWrapper, wrapper.isObject()); bool success = crossCompartmentWrappers.put(wrapped, wrapper); #ifdef JSGC_GENERATIONAL /* There's no point allocating wrappers in the nursery since we will tenure them anyway. */ Nursery &nursery = cx->nursery(); JS_ASSERT(!nursery.isInside(wrapper.toGCThing())); if (success && (nursery.isInside(wrapped.wrapped) || nursery.isInside(wrapped.debugger))) { WrapperMapRef ref(&crossCompartmentWrappers, wrapped); cx->runtime()->gcStoreBuffer.putGeneric(ref); } #endif return success; }
bool JSCompartment::putWrapper(JSContext* cx, const CrossCompartmentKey& wrapped, const js::Value& wrapper) { MOZ_ASSERT(wrapped.is<JSString*>() == wrapper.isString()); MOZ_ASSERT_IF(!wrapped.is<JSString*>(), wrapper.isObject()); /* There's no point allocating wrappers in the nursery since we will tenure them anyway. */ MOZ_ASSERT(!IsInsideNursery(static_cast<gc::Cell*>(wrapper.toGCThing()))); if (!crossCompartmentWrappers.put(wrapped, ReadBarriered<Value>(wrapper))) { ReportOutOfMemory(cx); return false; } if (const_cast<CrossCompartmentKey&>(wrapped).applyToWrapped(IsInsideNurseryFunctor()) || const_cast<CrossCompartmentKey&>(wrapped).applyToDebugger(IsInsideNurseryFunctor())) { WrapperMapRef ref(&crossCompartmentWrappers, wrapped); cx->runtime()->gc.storeBuffer.putGeneric(ref); } return true; }