Bug 1331092 - Part 6: Support JSOP_TOASYNCGEN in JIT.

Tag #1287
This commit is contained in:
Gaming4JC 2019-12-14 09:13:04 -05:00 committed by Roy Tam
commit 67b8cd621a
12 changed files with 94 additions and 0 deletions

View file

@ -25,6 +25,7 @@
#include "jit/VMFunctions.h"
#include "js/UniquePtr.h"
#include "vm/AsyncFunction.h"
#include "vm/AsyncIteration.h"
#include "vm/EnvironmentObject.h"
#include "vm/Interpreter.h"
#include "vm/TraceLogging.h"
@ -3914,6 +3915,28 @@ BaselineCompiler::emit_JSOP_TOASYNC()
return true;
}
typedef JSObject* (*ToAsyncGenFn)(JSContext*, HandleFunction);
static const VMFunction ToAsyncGenInfo =
FunctionInfo<ToAsyncGenFn>(js::WrapAsyncGenerator, "ToAsyncGen");
bool
BaselineCompiler::emit_JSOP_TOASYNCGEN()
{
frame.syncStack(0);
masm.unboxObject(frame.addressOfStackValue(frame.peek(-1)), R0.scratchReg());
prepareVMCall();
pushArg(R0.scratchReg());
if (!callVM(ToAsyncGenInfo))
return false;
masm.tagValue(JSVAL_TYPE_OBJECT, ReturnReg, R0);
frame.pop();
frame.push(R0);
return true;
}
typedef bool (*ThrowObjectCoercibleFn)(JSContext*, HandleValue);
static const VMFunction ThrowObjectCoercibleInfo =
FunctionInfo<ThrowObjectCoercibleFn>(ThrowObjectCoercible, "ThrowObjectCoercible");

View file

@ -197,6 +197,7 @@ namespace jit {
_(JSOP_RUNONCE) \
_(JSOP_REST) \
_(JSOP_TOASYNC) \
_(JSOP_TOASYNCGEN) \
_(JSOP_TOID) \
_(JSOP_TOSTRING) \
_(JSOP_TABLESWITCH) \

View file

@ -41,6 +41,7 @@
#include "jit/RangeAnalysis.h"
#include "jit/SharedICHelpers.h"
#include "vm/AsyncFunction.h"
#include "vm/AsyncIteration.h"
#include "vm/MatchPairs.h"
#include "vm/RegExpObject.h"
#include "vm/RegExpStatics.h"
@ -10213,6 +10214,17 @@ CodeGenerator::visitToAsync(LToAsync* lir)
callVM(ToAsyncInfo, lir);
}
typedef JSObject* (*ToAsyncGenFn)(JSContext*, HandleFunction);
static const VMFunction ToAsyncGenInfo =
FunctionInfo<ToAsyncGenFn>(js::WrapAsyncGenerator, "ToAsyncGen");
void
CodeGenerator::visitToAsyncGen(LToAsyncGen* lir)
{
pushArg(ToRegister(lir->unwrapped()));
callVM(ToAsyncGenInfo, lir);
}
typedef bool (*ToIdFn)(JSContext*, HandleScript, jsbytecode*, HandleValue,
MutableHandleValue);
static const VMFunction ToIdInfo = FunctionInfo<ToIdFn>(ToIdOperation, "ToIdOperation");

View file

@ -286,6 +286,7 @@ class CodeGenerator final : public CodeGeneratorSpecific
void visitTypeOfV(LTypeOfV* lir);
void visitOutOfLineTypeOfV(OutOfLineTypeOfV* ool);
void visitToAsync(LToAsync* lir);
void visitToAsyncGen(LToAsyncGen* lir);
void visitToIdV(LToIdV* lir);
template<typename T> void emitLoadElementT(LLoadElementT* lir, const T& source);
void visitLoadElementT(LLoadElementT* lir);

View file

@ -2130,6 +2130,9 @@ IonBuilder::inspectOpcode(JSOp op)
case JSOP_TOASYNC:
return jsop_toasync();
case JSOP_TOASYNCGEN:
return jsop_toasyncgen();
case JSOP_TOID:
return jsop_toid();
@ -13193,6 +13196,20 @@ IonBuilder::jsop_toasync()
return resumeAfter(ins);
}
bool
IonBuilder::jsop_toasyncgen()
{
MDefinition* unwrapped = current->pop();
MOZ_ASSERT(unwrapped->type() == MIRType::Object);
MToAsyncGen* ins = MToAsyncGen::New(alloc(), unwrapped);
current->add(ins);
current->push(ins);
return resumeAfter(ins);
}
bool
IonBuilder::jsop_toid()
{

View file

@ -762,6 +762,7 @@ class IonBuilder
MOZ_MUST_USE bool jsop_globalthis();
MOZ_MUST_USE bool jsop_typeof();
MOZ_MUST_USE bool jsop_toasync();
MOZ_MUST_USE bool jsop_toasyncgen();
MOZ_MUST_USE bool jsop_toid();
MOZ_MUST_USE bool jsop_iter(uint8_t flags);
MOZ_MUST_USE bool jsop_itermore();

View file

@ -1175,6 +1175,14 @@ LIRGenerator::visitToAsync(MToAsync* ins)
assignSafepoint(lir, ins);
}
void
LIRGenerator::visitToAsyncGen(MToAsyncGen* ins)
{
LToAsyncGen* lir = new(alloc()) LToAsyncGen(useRegisterAtStart(ins->input()));
defineReturn(lir, ins);
assignSafepoint(lir, ins);
}
void
LIRGenerator::visitToId(MToId* ins)
{

View file

@ -121,6 +121,7 @@ class LIRGenerator : public LIRGeneratorSpecific
void visitCompare(MCompare* comp);
void visitTypeOf(MTypeOf* ins);
void visitToAsync(MToAsync* ins);
void visitToAsyncGen(MToAsyncGen* ins);
void visitToId(MToId* ins);
void visitBitNot(MBitNot* ins);
void visitBitAnd(MBitAnd* ins);

View file

@ -5784,6 +5784,21 @@ class MToAsync
TRIVIAL_NEW_WRAPPERS
};
class MToAsyncGen
: public MUnaryInstruction,
public SingleObjectPolicy::Data
{
explicit MToAsyncGen(MDefinition* unwrapped)
: MUnaryInstruction(unwrapped)
{
setResultType(MIRType::Object);
}
public:
INSTRUCTION_HEADER(ToAsyncGen)
TRIVIAL_NEW_WRAPPERS
};
class MToId
: public MUnaryInstruction,
public BoxInputsPolicy::Data

View file

@ -79,6 +79,7 @@ namespace jit {
_(BitNot) \
_(TypeOf) \
_(ToAsync) \
_(ToAsyncGen) \
_(ToId) \
_(BitAnd) \
_(BitOr) \

View file

@ -1606,6 +1606,19 @@ class LToAsync : public LCallInstructionHelper<1, 1, 0>
}
};
class LToAsyncGen : public LCallInstructionHelper<1, 1, 0>
{
public:
LIR_HEADER(ToAsyncGen)
explicit LToAsyncGen(const LAllocation& input) {
setOperand(0, input);
}
const LAllocation* unwrapped() {
return getOperand(0);
}
};
class LToIdV : public LInstructionHelper<BOX_PIECES, BOX_PIECES, 1>
{
public:

View file

@ -353,6 +353,7 @@
_(Rest) \
_(TypeOfV) \
_(ToAsync) \
_(ToAsyncGen) \
_(ToIdV) \
_(Floor) \
_(FloorF) \