Bug 1296688 - Add JSCLASS_FOREGROUND_FINALIZE flag r=sfink r=smaug

This commit is contained in:
Jon Coppeard
2016-08-24 14:18:10 +01:00
parent 36f24c16c5
commit 66a80788eb
31 changed files with 133 additions and 86 deletions

View File

@@ -414,7 +414,7 @@ class CGDOMJSClass(CGThing):
callHook = LEGACYCALLER_HOOK_NAME if self.descriptor.operations["LegacyCaller"] else 'nullptr'
objectMovedHook = OBJECT_MOVED_HOOK_NAME if self.descriptor.wrapperCache else 'nullptr'
slotCount = INSTANCE_RESERVED_SLOTS + self.descriptor.interface.totalMembersInSlots
classFlags = "JSCLASS_IS_DOMJSCLASS | "
classFlags = "JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | "
if self.descriptor.isGlobal():
classFlags += "JSCLASS_DOM_GLOBAL | JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(DOM_GLOBAL_SLOTS)"
traceHook = "JS_GlobalObjectTraceHook"

View File

@@ -81,7 +81,10 @@ static const js::ClassExtension SimpleGlobalClassExtension = {
const js::Class SimpleGlobalClass = {
"",
JSCLASS_GLOBAL_FLAGS | JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS,
JSCLASS_GLOBAL_FLAGS |
JSCLASS_HAS_PRIVATE |
JSCLASS_PRIVATE_IS_NSISUPPORTS |
JSCLASS_FOREGROUND_FINALIZE,
&SimpleGlobalClassOps,
JS_NULL_CLASS_SPEC,
&SimpleGlobalClassExtension,

View File

@@ -255,7 +255,8 @@ const static js::ObjectOps sNPObjectJSWrapperObjectOps = {
const static js::Class sNPObjectJSWrapperClass = {
NPRUNTIME_JSCLASS_NAME,
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&sNPObjectJSWrapperClassOps,
JS_NULL_CLASS_SPEC,
&sNPObjectJSWrapperClassExtension,
@@ -293,7 +294,9 @@ static const JSClassOps sNPObjectMemberClassOps = {
};
static const JSClass sNPObjectMemberClass = {
"NPObject Ambiguous Member class", JSCLASS_HAS_PRIVATE,
"NPObject Ambiguous Member class",
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&sNPObjectMemberClassOps
};

View File

@@ -96,7 +96,9 @@ static const JSClassOps gPrototypeJSClassOps = {
static const JSClass gPrototypeJSClass = {
"XBL prototype JSClass",
JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS |
JSCLASS_HAS_PRIVATE |
JSCLASS_PRIVATE_IS_NSISUPPORTS |
JSCLASS_FOREGROUND_FINALIZE |
// Our one reserved slot holds the relevant nsXBLPrototypeBinding
JSCLASS_HAS_RESERVED_SLOTS(1),
&gPrototypeJSClassOps

View File

@@ -767,6 +767,7 @@ struct JSClass {
#define JSCLASS_USERBIT3 (1<<(JSCLASS_HIGH_FLAGS_SHIFT+7))
#define JSCLASS_BACKGROUND_FINALIZE (1<<(JSCLASS_HIGH_FLAGS_SHIFT+8))
#define JSCLASS_FOREGROUND_FINALIZE (1<<(JSCLASS_HIGH_FLAGS_SHIFT+9))
// Bits 26 through 31 are reserved for the CACHED_PROTO_KEY mechanism, see
// below.

View File

@@ -354,7 +354,8 @@ const Class WasmModuleObject::class_ =
{
"WebAssembly.Module",
JSCLASS_DELAY_METADATA_BUILDER |
JSCLASS_HAS_RESERVED_SLOTS(WasmModuleObject::RESERVED_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(WasmModuleObject::RESERVED_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&WasmModuleObject::classOps_,
};
@@ -487,7 +488,8 @@ const Class WasmInstanceObject::class_ =
{
"WebAssembly.Instance",
JSCLASS_DELAY_METADATA_BUILDER |
JSCLASS_HAS_RESERVED_SLOTS(WasmInstanceObject::RESERVED_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(WasmInstanceObject::RESERVED_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&WasmInstanceObject::classOps_,
};
@@ -833,7 +835,8 @@ const Class WasmTableObject::class_ =
{
"WebAssembly.Table",
JSCLASS_DELAY_METADATA_BUILDER |
JSCLASS_HAS_RESERVED_SLOTS(WasmTableObject::RESERVED_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(WasmTableObject::RESERVED_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&WasmTableObject::classOps_
};

View File

@@ -658,7 +658,8 @@ static const ClassOps CollatorClassOps = {
static const Class CollatorClass = {
js_Object_str,
JSCLASS_HAS_RESERVED_SLOTS(COLLATOR_SLOTS_COUNT),
JSCLASS_HAS_RESERVED_SLOTS(COLLATOR_SLOTS_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&CollatorClassOps
};
@@ -1147,7 +1148,8 @@ static const ClassOps NumberFormatClassOps = {
static const Class NumberFormatClass = {
js_Object_str,
JSCLASS_HAS_RESERVED_SLOTS(NUMBER_FORMAT_SLOTS_COUNT),
JSCLASS_HAS_RESERVED_SLOTS(NUMBER_FORMAT_SLOTS_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&NumberFormatClassOps
};
@@ -1611,7 +1613,8 @@ static const ClassOps DateTimeFormatClassOps = {
static const Class DateTimeFormatClass = {
js_Object_str,
JSCLASS_HAS_RESERVED_SLOTS(DATE_TIME_FORMAT_SLOTS_COUNT),
JSCLASS_HAS_RESERVED_SLOTS(DATE_TIME_FORMAT_SLOTS_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&DateTimeFormatClassOps
};

View File

@@ -117,7 +117,8 @@ static const ClassOps MapIteratorObjectClassOps = {
const Class MapIteratorObject::class_ = {
"Map Iterator",
JSCLASS_HAS_RESERVED_SLOTS(MapIteratorObject::SlotCount),
JSCLASS_HAS_RESERVED_SLOTS(MapIteratorObject::SlotCount) |
JSCLASS_FOREGROUND_FINALIZE,
&MapIteratorObjectClassOps
};
@@ -269,7 +270,8 @@ const ClassOps MapObject::classOps_ = {
const Class MapObject::class_ = {
"Map",
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_CACHED_PROTO(JSProto_Map),
JSCLASS_HAS_CACHED_PROTO(JSProto_Map) |
JSCLASS_FOREGROUND_FINALIZE,
&MapObject::classOps_
};
@@ -856,7 +858,8 @@ static const ClassOps SetIteratorObjectClassOps = {
const Class SetIteratorObject::class_ = {
"Set Iterator",
JSCLASS_HAS_RESERVED_SLOTS(SetIteratorObject::SlotCount),
JSCLASS_HAS_RESERVED_SLOTS(SetIteratorObject::SlotCount) |
JSCLASS_FOREGROUND_FINALIZE,
&SetIteratorObjectClassOps
};
@@ -1001,7 +1004,8 @@ const ClassOps SetObject::classOps_ = {
const Class SetObject::class_ = {
"Set",
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_CACHED_PROTO(JSProto_Set),
JSCLASS_HAS_CACHED_PROTO(JSProto_Set) |
JSCLASS_FOREGROUND_FINALIZE,
&SetObject::classOps_
};

View File

@@ -564,7 +564,8 @@ ModuleObject::classOps_ = {
ModuleObject::class_ = {
"Module",
JSCLASS_HAS_RESERVED_SLOTS(ModuleObject::SlotCount) |
JSCLASS_IS_ANONYMOUS,
JSCLASS_IS_ANONYMOUS |
JSCLASS_FOREGROUND_FINALIZE,
&ModuleObject::classOps_
};

View File

@@ -1508,7 +1508,9 @@ static const JSClassOps FinalizeCounterClassOps = {
};
static const JSClass FinalizeCounterClass = {
"FinalizeCounter", JSCLASS_IS_ANONYMOUS,
"FinalizeCounter",
JSCLASS_IS_ANONYMOUS |
JSCLASS_FOREGROUND_FINALIZE,
&FinalizeCounterClassOps
};
@@ -2192,7 +2194,9 @@ static const ClassOps CloneBufferObjectClassOps = {
};
const Class CloneBufferObject::class_ = {
"CloneBuffer", JSCLASS_HAS_RESERVED_SLOTS(CloneBufferObject::NUM_SLOTS),
"CloneBuffer",
JSCLASS_HAS_RESERVED_SLOTS(CloneBufferObject::NUM_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&CloneBufferObjectClassOps
};

View File

@@ -399,7 +399,8 @@ static const ClassOps WeakMapObjectClassOps = {
const Class WeakMapObject::class_ = {
"WeakMap",
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_CACHED_PROTO(JSProto_WeakMap),
JSCLASS_HAS_CACHED_PROTO(JSProto_WeakMap) |
JSCLASS_FOREGROUND_FINALIZE,
&WeakMapObjectClassOps
};

View File

@@ -573,7 +573,8 @@ static const JSClassOps sCTypeClassOps = {
};
static const JSClass sCTypeClass = {
"CType",
JSCLASS_HAS_RESERVED_SLOTS(CTYPE_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(CTYPE_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sCTypeClassOps
};
@@ -584,7 +585,8 @@ static const JSClassOps sCDataClassOps = {
};
static const JSClass sCDataClass = {
"CData",
JSCLASS_HAS_RESERVED_SLOTS(CDATA_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(CDATA_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sCDataClassOps
};
@@ -595,7 +597,8 @@ static const JSClassOps sCClosureClassOps = {
};
static const JSClass sCClosureClass = {
"CClosure",
JSCLASS_HAS_RESERVED_SLOTS(CCLOSURE_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(CCLOSURE_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sCClosureClassOps
};
@@ -619,7 +622,9 @@ static const JSClassOps sCDataFinalizerClassOps = {
};
static const JSClass sCDataFinalizerClass = {
"CDataFinalizer",
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(CDATAFINALIZER_SLOTS),
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_RESERVED_SLOTS(CDATAFINALIZER_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sCDataFinalizerClassOps
};
@@ -809,13 +814,15 @@ static const JSClassOps sInt64ClassOps = {
static const JSClass sInt64Class = {
"Int64",
JSCLASS_HAS_RESERVED_SLOTS(INT64_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(INT64_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sInt64ClassOps
};
static const JSClass sUInt64Class = {
"UInt64",
JSCLASS_HAS_RESERVED_SLOTS(INT64_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(INT64_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sInt64ClassOps
};

View File

@@ -39,7 +39,8 @@ static const JSClassOps sLibraryClassOps = {
static const JSClass sLibraryClass = {
"Library",
JSCLASS_HAS_RESERVED_SLOTS(LIBRARY_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(LIBRARY_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sLibraryClassOps
};

View File

@@ -37,7 +37,7 @@ static const JSClassOps BarkWhenTracedClassClassOps = {
const JSClass BarkWhenTracedClass::class_ = {
"BarkWhenTracedClass",
0,
JSCLASS_FOREGROUND_FINALIZE,
&BarkWhenTracedClassClassOps
};

View File

@@ -84,7 +84,8 @@ static const ClassOps ErrorObjectClassOps = {
{ \
js_Error_str, /* yes, really */ \
JSCLASS_HAS_CACHED_PROTO(JSProto_##name) | \
JSCLASS_HAS_RESERVED_SLOTS(ErrorObject::RESERVED_SLOTS), \
JSCLASS_HAS_RESERVED_SLOTS(ErrorObject::RESERVED_SLOTS) | \
JSCLASS_FOREGROUND_FINALIZE, \
&ErrorObjectClassOps, \
classSpecPtr \
}

View File

@@ -323,35 +323,50 @@ SetNewObjectMetadata(ExclusiveContext* cxArg, JSObject* obj)
JSObject::create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::InitialHeap heap,
js::HandleShape shape, js::HandleObjectGroup group)
{
const js::Class* clasp = group->clasp();
MOZ_ASSERT(shape && group);
MOZ_ASSERT(group->clasp() == shape->getObjectClass());
MOZ_ASSERT(group->clasp() != &js::ArrayObject::class_);
MOZ_ASSERT_IF(!js::ClassCanHaveFixedData(group->clasp()),
js::gc::GetGCKindSlots(kind, group->clasp()) == shape->numFixedSlots());
MOZ_ASSERT_IF(group->clasp()->flags & JSCLASS_BACKGROUND_FINALIZE,
IsBackgroundFinalized(kind));
MOZ_ASSERT_IF(group->clasp()->hasFinalize(),
heap == js::gc::TenuredHeap ||
(group->clasp()->flags & JSCLASS_SKIP_NURSERY_FINALIZE));
MOZ_ASSERT_IF(group->hasUnanalyzedPreliminaryObjects(),
heap == js::gc::TenuredHeap);
MOZ_ASSERT(clasp == shape->getObjectClass());
MOZ_ASSERT(clasp != &js::ArrayObject::class_);
MOZ_ASSERT_IF(!js::ClassCanHaveFixedData(clasp),
js::gc::GetGCKindSlots(kind, clasp) == shape->numFixedSlots());
#ifdef DEBUG
static const uint32_t FinalizeMask = JSCLASS_FOREGROUND_FINALIZE | JSCLASS_BACKGROUND_FINALIZE;
uint32_t flags = clasp->flags;
uint32_t finalizeFlags = flags & FinalizeMask;
// Classes with a finalizer must specify whether instances will be finalized
// on the main thread or in the background, except proxies whose behaviour
// depends on the target object.
if (clasp->hasFinalize() && !clasp->isProxy()) {
MOZ_ASSERT(finalizeFlags == JSCLASS_FOREGROUND_FINALIZE ||
finalizeFlags == JSCLASS_BACKGROUND_FINALIZE);
MOZ_ASSERT((finalizeFlags == JSCLASS_BACKGROUND_FINALIZE) == IsBackgroundFinalized(kind));
} else {
MOZ_ASSERT(finalizeFlags == 0);
}
MOZ_ASSERT_IF(clasp->hasFinalize(), heap == js::gc::TenuredHeap ||
(flags & JSCLASS_SKIP_NURSERY_FINALIZE));
MOZ_ASSERT_IF(group->hasUnanalyzedPreliminaryObjects(), heap == js::gc::TenuredHeap);
#endif
MOZ_ASSERT(!cx->compartment()->hasObjectPendingMetadata());
// Non-native classes cannot have reserved slots or private data, and the
// objects can't have any fixed slots, for compatibility with
// GetReservedOrProxyPrivateSlot.
MOZ_ASSERT_IF(!group->clasp()->isNative(), JSCLASS_RESERVED_SLOTS(group->clasp()) == 0);
MOZ_ASSERT_IF(!group->clasp()->isNative(), !group->clasp()->hasPrivate());
MOZ_ASSERT_IF(!group->clasp()->isNative(), shape->numFixedSlots() == 0);
MOZ_ASSERT_IF(!group->clasp()->isNative(), shape->slotSpan() == 0);
const js::Class* clasp = group->clasp();
MOZ_ASSERT_IF(!clasp->isNative(), JSCLASS_RESERVED_SLOTS(clasp) == 0);
MOZ_ASSERT_IF(!clasp->isNative(), !clasp->hasPrivate());
MOZ_ASSERT_IF(!clasp->isNative(), shape->numFixedSlots() == 0);
MOZ_ASSERT_IF(!clasp->isNative(), shape->slotSpan() == 0);
size_t nDynamicSlots = 0;
if (group->clasp()->isNative()) {
if (clasp->isNative()) {
nDynamicSlots = js::NativeObject::dynamicSlotsCount(shape->numFixedSlots(),
shape->slotSpan(), clasp);
} else if (group->clasp()->isProxy()) {
} else if (clasp->isProxy()) {
// Proxy objects overlay the |slots| field with a ProxyValueArray.
MOZ_ASSERT(sizeof(js::detail::ProxyValueArray) % sizeof(js::HeapSlot) == 0);
nDynamicSlots = sizeof(js::detail::ProxyValueArray) / sizeof(js::HeapSlot);
@@ -380,7 +395,7 @@ JSObject::create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::Initi
obj->as<js::NativeObject>().initializeSlotRange(0, span);
// JSFunction's fixed slots expect POD-style initialization.
if (group->clasp()->isJSFunction()) {
if (clasp->isJSFunction()) {
MOZ_ASSERT(kind == js::gc::AllocKind::FUNCTION ||
kind == js::gc::AllocKind::FUNCTION_EXTENDED);
size_t size =
@@ -393,7 +408,7 @@ JSObject::create(js::ExclusiveContext* cx, js::gc::AllocKind kind, js::gc::Initi
}
}
if (group->clasp()->shouldDelayMetadataBuilder())
if (clasp->shouldDelayMetadataBuilder())
cx->compartment()->setObjectPendingMetadata(cx, obj);
else
obj = SetNewObjectMetadata(cx, obj);

View File

@@ -1649,7 +1649,8 @@ static const ClassOps ScriptSourceObjectClassOps = {
const Class ScriptSourceObject::class_ = {
"ScriptSource",
JSCLASS_HAS_RESERVED_SLOTS(RESERVED_SLOTS) |
JSCLASS_IS_ANONYMOUS,
JSCLASS_IS_ANONYMOUS |
JSCLASS_FOREGROUND_FINALIZE,
&ScriptSourceObjectClassOps
};

View File

@@ -172,7 +172,8 @@ static const JSClassOps pm_classOps = {
static const JSClass pm_class = {
"PerfMeasurement",
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&pm_classOps
};

View File

@@ -412,7 +412,8 @@ static const js::ClassOps FileObjectClassOps = {
const js::Class FileObject::class_ = {
"File",
JSCLASS_HAS_RESERVED_SLOTS(FileObject::NUM_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(FileObject::NUM_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&FileObjectClassOps
};

View File

@@ -94,7 +94,9 @@ const ClassOps DebuggerFrame::classOps_ = {
const Class DebuggerFrame::class_ = {
"Frame",
JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_DEBUGFRAME_COUNT),
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_DEBUGFRAME_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&DebuggerFrame::classOps_
};
@@ -3127,7 +3129,8 @@ const ClassOps Debugger::classOps_ = {
const Class Debugger::class_ = {
"Debugger",
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_DEBUG_COUNT),
JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_DEBUG_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&Debugger::classOps_
};

View File

@@ -663,7 +663,9 @@ GlobalDebuggees_classOps = {
static const Class
GlobalDebuggees_class = {
"GlobalDebuggee", JSCLASS_HAS_PRIVATE,
"GlobalDebuggee",
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&GlobalDebuggees_classOps
};

View File

@@ -297,7 +297,9 @@ static const ClassOps ForOfPICClassOps = {
};
const Class ForOfPIC::class_ = {
"ForOfPIC", JSCLASS_HAS_PRIVATE,
"ForOfPIC",
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&ForOfPICClassOps
};

View File

@@ -51,7 +51,8 @@ static const ClassOps RegExpStaticsObjectClassOps = {
const Class RegExpStaticsObject::class_ = {
"RegExpStatics",
JSCLASS_HAS_PRIVATE,
JSCLASS_HAS_PRIVATE |
JSCLASS_FOREGROUND_FINALIZE,
&RegExpStaticsObjectClassOps
};

View File

@@ -334,7 +334,8 @@ const ClassSpec SavedFrame::classSpec_ = {
JSCLASS_HAS_PRIVATE |
JSCLASS_HAS_RESERVED_SLOTS(SavedFrame::JSSLOT_COUNT) |
JSCLASS_HAS_CACHED_PROTO(JSProto_SavedFrame) |
JSCLASS_IS_ANONYMOUS,
JSCLASS_IS_ANONYMOUS |
JSCLASS_FOREGROUND_FINALIZE,
&SavedFrameClassOps,
&SavedFrame::classSpec_
};

View File

@@ -351,7 +351,8 @@ const Class SharedArrayBufferObject::class_ = {
"SharedArrayBuffer",
JSCLASS_DELAY_METADATA_BUILDER |
JSCLASS_HAS_RESERVED_SLOTS(SharedArrayBufferObject::RESERVED_SLOTS) |
JSCLASS_HAS_CACHED_PROTO(JSProto_SharedArrayBuffer),
JSCLASS_HAS_CACHED_PROTO(JSProto_SharedArrayBuffer) |
JSCLASS_FOREGROUND_FINALIZE,
&SharedArrayBufferObjectClassOps,
JS_NULL_CLASS_SPEC,
JS_NULL_CLASS_EXT

View File

@@ -554,7 +554,8 @@ static const js::ClassExtension SandboxClassExtension = {
static const js::Class SandboxClass = {
"Sandbox",
XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1),
XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1) |
JSCLASS_FOREGROUND_FINALIZE,
&SandboxClassOps,
JS_NULL_CLASS_SPEC,
&SandboxClassExtension,
@@ -573,7 +574,8 @@ static const js::ClassOps SandboxWriteToProtoClassOps = {
static const js::Class SandboxWriteToProtoClass = {
"Sandbox",
XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1),
XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1) |
JSCLASS_FOREGROUND_FINALIZE,
&SandboxWriteToProtoClassOps,
JS_NULL_CLASS_SPEC,
&SandboxClassExtension,

View File

@@ -1387,30 +1387,10 @@ nsXPCWrappedJSClass::GetInterfaceName()
return mName;
}
static void
FinalizeStub(JSFreeOp* fop, JSObject* obj)
{
}
static const JSClassOps XPCOutParamClassOps = {
nullptr, /* addProperty */
nullptr, /* delProperty */
nullptr, /* getProperty */
nullptr, /* setProperty */
nullptr, /* enumerate */
nullptr, /* resolve */
nullptr, /* mayResolve */
FinalizeStub,
nullptr, /* call */
nullptr, /* hasInstance */
nullptr, /* construct */
nullptr /* trace */
};
static const JSClass XPCOutParamClass = {
"XPCOutParam",
0,
&XPCOutParamClassOps
JS_NULL_CLASS_OPS
};
bool

View File

@@ -645,7 +645,8 @@ const js::Class XPC_WN_NoHelper_JSClass = {
"XPCWrappedNative_NoHelper",
WRAPPER_FLAGS |
JSCLASS_IS_WRAPPED_NATIVE |
JSCLASS_PRIVATE_IS_NSISUPPORTS,
JSCLASS_PRIVATE_IS_NSISUPPORTS |
JSCLASS_FOREGROUND_FINALIZE,
&XPC_WN_NoHelper_JSClassOps,
JS_NULL_CLASS_SPEC,
&XPC_WN_JSClassExtension,

View File

@@ -209,7 +209,7 @@ extern const char XPC_XPCONNECT_CONTRACTID[];
return (result || !src) ? NS_OK : NS_ERROR_OUT_OF_MEMORY
#define WRAPPER_FLAGS JSCLASS_HAS_PRIVATE
#define WRAPPER_FLAGS (JSCLASS_HAS_PRIVATE | JSCLASS_FOREGROUND_FINALIZE)
// If IS_WN_CLASS for the JSClass of an object is true, the object is a
// wrappednative wrapper, holding the XPCWrappedNative in its private slot.

View File

@@ -1062,7 +1062,8 @@ static const JSClassOps ExpandoObjectClassOps = {
const JSClass ExpandoObjectClass = {
"XrayExpandoObject",
JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_EXPANDO_COUNT),
JSCLASS_HAS_RESERVED_SLOTS(JSSLOT_EXPANDO_COUNT) |
JSCLASS_FOREGROUND_FINALIZE,
&ExpandoObjectClassOps
};

View File

@@ -129,7 +129,8 @@ static const JSClassOps sWitnessClassOps = {
static const JSClass sWitnessClass = {
"FinalizationWitness",
JSCLASS_HAS_RESERVED_SLOTS(WITNESS_INSTANCES_SLOTS),
JSCLASS_HAS_RESERVED_SLOTS(WITNESS_INSTANCES_SLOTS) |
JSCLASS_FOREGROUND_FINALIZE,
&sWitnessClassOps
};