mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 18:55:30 +00:00
Bug 1281253 - Clean up MNewCallObject a bit and fix a TSan race. r=bhackett
This commit is contained in:
parent
8806e32742
commit
a7c0c2b5df
@ -6225,9 +6225,9 @@ IonBuilder::createCallObject(MDefinition* callee, MDefinition* scope)
|
||||
|
||||
// Allocate the object. Run-once scripts need a singleton type, so always do
|
||||
// a VM call in such cases.
|
||||
MNullaryInstruction* callObj;
|
||||
if (script()->treatAsRunOnce())
|
||||
callObj = MNewRunOnceCallObject::New(alloc(), templateObj);
|
||||
MNewCallObjectBase* callObj;
|
||||
if (script()->treatAsRunOnce() || templateObj->isSingleton())
|
||||
callObj = MNewSingletonCallObject::New(alloc(), templateObj);
|
||||
else
|
||||
callObj = MNewCallObject::New(alloc(), templateObj);
|
||||
current->add(callObj);
|
||||
|
@ -265,22 +265,13 @@ LIRGenerator::visitNewDeclEnvObject(MNewDeclEnvObject* ins)
|
||||
void
|
||||
LIRGenerator::visitNewCallObject(MNewCallObject* ins)
|
||||
{
|
||||
LInstruction* lir;
|
||||
if (ins->templateObject()->isSingleton()) {
|
||||
LNewSingletonCallObject* singletonLir = new(alloc()) LNewSingletonCallObject(temp());
|
||||
define(singletonLir, ins);
|
||||
lir = singletonLir;
|
||||
} else {
|
||||
LNewCallObject* normalLir = new(alloc()) LNewCallObject(temp());
|
||||
define(normalLir, ins);
|
||||
lir = normalLir;
|
||||
}
|
||||
|
||||
LNewCallObject* lir = new(alloc()) LNewCallObject(temp());
|
||||
define(lir, ins);
|
||||
assignSafepoint(lir, ins);
|
||||
}
|
||||
|
||||
void
|
||||
LIRGenerator::visitNewRunOnceCallObject(MNewRunOnceCallObject* ins)
|
||||
LIRGenerator::visitNewSingletonCallObject(MNewSingletonCallObject* ins)
|
||||
{
|
||||
LNewSingletonCallObject* lir = new(alloc()) LNewSingletonCallObject(temp());
|
||||
define(lir, ins);
|
||||
|
@ -78,7 +78,7 @@ class LIRGenerator : public LIRGeneratorSpecific
|
||||
void visitNewTypedObject(MNewTypedObject* ins);
|
||||
void visitNewDeclEnvObject(MNewDeclEnvObject* ins);
|
||||
void visitNewCallObject(MNewCallObject* ins);
|
||||
void visitNewRunOnceCallObject(MNewRunOnceCallObject* ins);
|
||||
void visitNewSingletonCallObject(MNewSingletonCallObject* ins);
|
||||
void visitNewStringObject(MNewStringObject* ins);
|
||||
void visitNewDerivedTypedObject(MNewDerivedTypedObject* ins);
|
||||
void visitInitElem(MInitElem* ins);
|
||||
|
@ -12271,7 +12271,9 @@ class MNewCallObject : public MNewCallObjectBase
|
||||
|
||||
explicit MNewCallObject(CallObject* templateObj)
|
||||
: MNewCallObjectBase(templateObj)
|
||||
{}
|
||||
{
|
||||
MOZ_ASSERT(!templateObj->isSingleton());
|
||||
}
|
||||
|
||||
static MNewCallObject*
|
||||
New(TempAllocator& alloc, CallObject* templateObj)
|
||||
@ -12280,19 +12282,19 @@ class MNewCallObject : public MNewCallObjectBase
|
||||
}
|
||||
};
|
||||
|
||||
class MNewRunOnceCallObject : public MNewCallObjectBase
|
||||
class MNewSingletonCallObject : public MNewCallObjectBase
|
||||
{
|
||||
public:
|
||||
INSTRUCTION_HEADER(NewRunOnceCallObject)
|
||||
INSTRUCTION_HEADER(NewSingletonCallObject)
|
||||
|
||||
explicit MNewRunOnceCallObject(CallObject* templateObj)
|
||||
explicit MNewSingletonCallObject(CallObject* templateObj)
|
||||
: MNewCallObjectBase(templateObj)
|
||||
{}
|
||||
|
||||
static MNewRunOnceCallObject*
|
||||
static MNewSingletonCallObject*
|
||||
New(TempAllocator& alloc, CallObject* templateObj)
|
||||
{
|
||||
return new(alloc) MNewRunOnceCallObject(templateObj);
|
||||
return new(alloc) MNewSingletonCallObject(templateObj);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -133,7 +133,7 @@ namespace jit {
|
||||
_(NewTypedObject) \
|
||||
_(NewDeclEnvObject) \
|
||||
_(NewCallObject) \
|
||||
_(NewRunOnceCallObject) \
|
||||
_(NewSingletonCallObject) \
|
||||
_(NewStringObject) \
|
||||
_(ObjectState) \
|
||||
_(ArrayState) \
|
||||
|
@ -1151,13 +1151,7 @@ class LNewCallObject : public LInstructionHelper<1, 0, 1>
|
||||
}
|
||||
};
|
||||
|
||||
// Allocates a new CallObject with singleton type.
|
||||
//
|
||||
// This instruction generates two possible instruction sets:
|
||||
// (1) If the call object is extensible, this is a callVM to create the
|
||||
// call object.
|
||||
// (2) Otherwise, an inline allocation of the call object is attempted.
|
||||
//
|
||||
// Performs a callVM to allocate a new CallObject with singleton type.
|
||||
class LNewSingletonCallObject : public LInstructionHelper<1, 0, 1>
|
||||
{
|
||||
public:
|
||||
@ -1171,9 +1165,8 @@ class LNewSingletonCallObject : public LInstructionHelper<1, 0, 1>
|
||||
return getTemp(0);
|
||||
}
|
||||
|
||||
MNewCallObjectBase* mir() const {
|
||||
MOZ_ASSERT(mir_->isNewCallObject() || mir_->isNewRunOnceCallObject());
|
||||
return static_cast<MNewCallObjectBase*>(mir_);
|
||||
MNewSingletonCallObject* mir() const {
|
||||
return mir_->toNewSingletonCallObject();
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user