mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-07 08:18:41 +09:00
parent
b5bcbfe58c
commit
67b8cd621a
12 changed files with 94 additions and 0 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ namespace jit {
|
|||
_(JSOP_RUNONCE) \
|
||||
_(JSOP_REST) \
|
||||
_(JSOP_TOASYNC) \
|
||||
_(JSOP_TOASYNCGEN) \
|
||||
_(JSOP_TOID) \
|
||||
_(JSOP_TOSTRING) \
|
||||
_(JSOP_TABLESWITCH) \
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ namespace jit {
|
|||
_(BitNot) \
|
||||
_(TypeOf) \
|
||||
_(ToAsync) \
|
||||
_(ToAsyncGen) \
|
||||
_(ToId) \
|
||||
_(BitAnd) \
|
||||
_(BitOr) \
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -353,6 +353,7 @@
|
|||
_(Rest) \
|
||||
_(TypeOfV) \
|
||||
_(ToAsync) \
|
||||
_(ToAsyncGen) \
|
||||
_(ToIdV) \
|
||||
_(Floor) \
|
||||
_(FloorF) \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue