Bug 1281253 - Clean up MNewCallObject a bit and fix a TSan race. r=bhackett

This commit is contained in:
Jan de Mooij 2016-06-30 08:33:55 +02:00
parent 8806e32742
commit a7c0c2b5df
6 changed files with 19 additions and 33 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
};

View File

@ -133,7 +133,7 @@ namespace jit {
_(NewTypedObject) \
_(NewDeclEnvObject) \
_(NewCallObject) \
_(NewRunOnceCallObject) \
_(NewSingletonCallObject) \
_(NewStringObject) \
_(ObjectState) \
_(ArrayState) \

View File

@ -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();
}
};