2021-09-04 08:06:49 +00:00
|
|
|
/*
|
2022-05-13 07:42:19 +00:00
|
|
|
* Copyright (c) 2022 Huawei Device Co., Ltd.
|
2021-09-04 08:06:49 +00:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2022-07-25 01:48:46 +00:00
|
|
|
#ifndef ECMASCRIPT_COMPILER_STUB_BUILDER_H
|
|
|
|
#define ECMASCRIPT_COMPILER_STUB_BUILDER_H
|
2021-09-04 08:06:49 +00:00
|
|
|
|
2022-11-08 09:05:30 +00:00
|
|
|
#include "ecmascript/base/config.h"
|
2022-07-25 01:48:46 +00:00
|
|
|
#include "ecmascript/compiler/call_signature.h"
|
2022-03-03 09:22:12 +00:00
|
|
|
#include "ecmascript/compiler/circuit_builder-inl.h"
|
2022-03-01 08:31:08 +00:00
|
|
|
#include "ecmascript/compiler/variable_type.h"
|
2021-09-04 08:06:49 +00:00
|
|
|
|
2021-12-23 06:55:22 +00:00
|
|
|
namespace panda::ecmascript::kungfu {
|
2021-10-08 06:45:08 +00:00
|
|
|
using namespace panda::ecmascript;
|
2021-09-04 08:06:49 +00:00
|
|
|
// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
|
2022-05-10 12:52:16 +00:00
|
|
|
#define DEFVARIABLE(varname, type, val) Variable varname(GetEnvironment(), type, NextVariableId(), val)
|
2022-05-15 02:41:02 +00:00
|
|
|
|
2022-11-08 09:05:30 +00:00
|
|
|
#ifndef NDEBUG
|
|
|
|
#define ASM_ASSERT(messageId, glue, condition, nextLabel) \
|
|
|
|
Label nextLabel(env); \
|
|
|
|
Assert(messageId, __LINE__, glue, condition, &nextLabel); \
|
|
|
|
Bind(&nextLabel)
|
|
|
|
#elif ECMASCRIPT_ENABLE_ASM_ASSERT
|
|
|
|
#define ASM_ASSERT(messageId, glue, condition, nextLabel) \
|
|
|
|
Label nextLabel(env); \
|
|
|
|
Assert(messageId, __LINE__, glue, condition, &nextLabel); \
|
|
|
|
Bind(&nextLabel)
|
|
|
|
#else
|
|
|
|
#define ASM_ASSERT(messageId, ...) ((void)0)
|
|
|
|
#endif
|
|
|
|
|
2022-07-22 02:27:59 +00:00
|
|
|
class StubBuilder {
|
2021-09-04 08:06:49 +00:00
|
|
|
public:
|
2022-07-29 07:26:04 +00:00
|
|
|
explicit StubBuilder(StubBuilder *parent)
|
|
|
|
: callSignature_(parent->GetCallSignature()), env_(parent->GetEnvironment()) {}
|
2022-07-25 01:48:46 +00:00
|
|
|
explicit StubBuilder(CallSignature *callSignature, Environment *env)
|
|
|
|
: callSignature_(callSignature), env_(env) {}
|
2022-11-08 08:42:34 +00:00
|
|
|
explicit StubBuilder(Environment *env)
|
|
|
|
: env_(env) {}
|
2022-07-22 02:27:59 +00:00
|
|
|
virtual ~StubBuilder() = default;
|
|
|
|
NO_MOVE_SEMANTIC(StubBuilder);
|
|
|
|
NO_COPY_SEMANTIC(StubBuilder);
|
2022-07-25 01:48:46 +00:00
|
|
|
virtual void GenerateCircuit() = 0;
|
|
|
|
Environment *GetEnvironment() const
|
2022-05-15 02:41:02 +00:00
|
|
|
{
|
2022-07-25 01:48:46 +00:00
|
|
|
return env_;
|
2021-09-04 08:06:49 +00:00
|
|
|
}
|
2022-07-21 01:51:36 +00:00
|
|
|
CallSignature *GetCallSignature() const
|
|
|
|
{
|
|
|
|
return callSignature_;
|
|
|
|
}
|
2021-12-17 09:18:10 +00:00
|
|
|
int NextVariableId()
|
2021-09-04 08:06:49 +00:00
|
|
|
{
|
2022-07-25 01:48:46 +00:00
|
|
|
return env_->NextVariableId();
|
2021-09-26 06:47:20 +00:00
|
|
|
}
|
2021-12-17 09:18:10 +00:00
|
|
|
// constant
|
2022-03-31 09:26:17 +00:00
|
|
|
GateRef Int8(int8_t value);
|
|
|
|
GateRef Int16(int16_t value);
|
|
|
|
GateRef Int32(int32_t value);
|
|
|
|
GateRef Int64(int64_t value);
|
|
|
|
GateRef IntPtr(int64_t value);
|
|
|
|
GateRef IntPtrSize();
|
|
|
|
GateRef RelocatableData(uint64_t value);
|
|
|
|
GateRef True();
|
|
|
|
GateRef False();
|
|
|
|
GateRef Boolean(bool value);
|
|
|
|
GateRef Double(double value);
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef Undefined();
|
|
|
|
GateRef Hole();
|
|
|
|
GateRef Null();
|
|
|
|
GateRef Exception();
|
2021-09-04 08:06:49 +00:00
|
|
|
// parameter
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Argument(size_t index);
|
|
|
|
GateRef Int1Argument(size_t index);
|
|
|
|
GateRef Int32Argument(size_t index);
|
|
|
|
GateRef Int64Argument(size_t index);
|
|
|
|
GateRef TaggedArgument(size_t index);
|
2022-07-21 01:51:36 +00:00
|
|
|
GateRef TaggedPointerArgument(size_t index);
|
|
|
|
GateRef PtrArgument(size_t index);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Float32Argument(size_t index);
|
|
|
|
GateRef Float64Argument(size_t index);
|
|
|
|
GateRef Alloca(int size);
|
2021-09-04 08:06:49 +00:00
|
|
|
// control flow
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Return(GateRef value);
|
|
|
|
GateRef Return();
|
|
|
|
void Bind(Label *label);
|
2021-09-04 08:06:49 +00:00
|
|
|
void Jump(Label *label);
|
2021-12-17 09:18:10 +00:00
|
|
|
void Branch(GateRef condition, Label *trueLabel, Label *falseLabel);
|
2022-01-04 11:30:40 +00:00
|
|
|
void Switch(GateRef index, Label *defaultLabel, int64_t *keysValue, Label *keysLabel, int numberOfKeys);
|
2021-09-04 08:06:49 +00:00
|
|
|
void LoopBegin(Label *loopHead);
|
|
|
|
void LoopEnd(Label *loopHead);
|
|
|
|
// call operation
|
2022-05-15 02:41:02 +00:00
|
|
|
GateRef CallRuntime(GateRef glue, int index, const std::initializer_list<GateRef>& args);
|
Implement Proxy Lowering on x86
when function need call another js function, it will lowering to call "JSCall" trampoline function
JSCall trampoline function will check calltarget function, then correct the arguments, finally jump
the native or optimized code address of the target function.
JSCall(glue, argc, calltarget, ....)
then proxy call(glue, argc, callTarget, argv[])
if proxy->GetHandler is function
tail call JSCall(glue, argc, callTarget, argv); // consider performance
else
//Call(trap, handler, «target, thisArgument, argArray»)
call CreateArrayFromList(glue, argc, argv[]) ---> arrHandle // maybe trigger GC, construct OptimizedWithArgvLeaveFrame, visitor argv[0]..argv[argc-1]
call JSCall(glue, argc, method, argv[])
issue:https://gitee.com/openharmony/ark_js_runtime/issues/I52T6B?from=project-issue
Signed-off-by: songzhengchao <songzhengchao@huawei.com>
Change-Id: I994aae1eb9cbf51982348ae6e203c24c326f617e
2022-04-14 13:54:03 +00:00
|
|
|
GateRef CallRuntime(GateRef glue, int index, GateRef argc, GateRef argv);
|
2022-05-15 02:41:02 +00:00
|
|
|
GateRef CallNGCRuntime(GateRef glue, int index, const std::initializer_list<GateRef>& args);
|
2022-06-29 01:43:42 +00:00
|
|
|
GateRef UpdateLeaveFrameAndCallNGCRuntime(GateRef glue, int index, const std::initializer_list<GateRef>& args);
|
2022-05-15 02:41:02 +00:00
|
|
|
GateRef CallStub(GateRef glue, int index, const std::initializer_list<GateRef>& args);
|
2022-03-16 10:12:15 +00:00
|
|
|
void DebugPrint(GateRef thread, std::initializer_list<GateRef> args);
|
2022-03-21 07:18:47 +00:00
|
|
|
void FatalPrint(GateRef thread, std::initializer_list<GateRef> args);
|
2021-09-04 08:06:49 +00:00
|
|
|
// memory
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Load(VariableType type, GateRef base, GateRef offset);
|
|
|
|
GateRef Load(VariableType type, GateRef base);
|
2022-03-22 09:00:19 +00:00
|
|
|
void Store(VariableType type, GateRef glue, GateRef base, GateRef offset, GateRef value);
|
2021-09-04 08:06:49 +00:00
|
|
|
// arithmetic
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef TaggedCastToIntPtr(GateRef x);
|
|
|
|
GateRef Int16Add(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Add(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Add(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleAdd(GateRef x, GateRef y);
|
2022-04-21 12:08:23 +00:00
|
|
|
GateRef PtrAdd(GateRef x, GateRef y);
|
|
|
|
GateRef PtrSub(GateRef x, GateRef y);
|
2022-08-31 09:21:19 +00:00
|
|
|
GateRef PtrMul(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IntPtrEqual(GateRef x, GateRef y);
|
|
|
|
GateRef Int16Sub(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Sub(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Sub(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleSub(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Mul(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Mul(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleMul(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleDiv(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Div(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Mod(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleMod(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Div(GateRef x, GateRef y);
|
|
|
|
GateRef IntPtrDiv(GateRef x, GateRef y);
|
2021-09-04 08:06:49 +00:00
|
|
|
// bit operation
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Int32Or(GateRef x, GateRef y);
|
|
|
|
GateRef Int8And(GateRef x, GateRef y);
|
|
|
|
GateRef Int32And(GateRef x, GateRef y);
|
|
|
|
GateRef IntPtrAnd(GateRef x, GateRef y);
|
|
|
|
GateRef BoolAnd(GateRef x, GateRef y);
|
|
|
|
GateRef BoolOr(GateRef x, GateRef y);
|
|
|
|
GateRef Int32Not(GateRef x);
|
2022-08-19 07:23:06 +00:00
|
|
|
GateRef IntPtrNot(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef BoolNot(GateRef x);
|
|
|
|
GateRef Int32Xor(GateRef x, GateRef y);
|
|
|
|
GateRef FixLoadType(GateRef x);
|
|
|
|
GateRef Int64Or(GateRef x, GateRef y);
|
|
|
|
GateRef IntPtrOr(GateRef x, GateRef y);
|
|
|
|
GateRef Int64And(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Xor(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Not(GateRef x);
|
|
|
|
GateRef Int16LSL(GateRef x, GateRef y);
|
|
|
|
GateRef Int32LSL(GateRef x, GateRef y);
|
|
|
|
GateRef Int64LSL(GateRef x, GateRef y);
|
|
|
|
GateRef IntPtrLSL(GateRef x, GateRef y);
|
|
|
|
GateRef Int8LSR(GateRef x, GateRef y);
|
2022-04-21 12:08:23 +00:00
|
|
|
GateRef Int32LSR(GateRef x, GateRef y);
|
|
|
|
GateRef Int64LSR(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IntPtrLSR(GateRef x, GateRef y);
|
2022-03-21 12:06:33 +00:00
|
|
|
GateRef Int32ASR(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef TaggedIsInt(GateRef x);
|
|
|
|
GateRef TaggedIsDouble(GateRef x);
|
|
|
|
GateRef TaggedIsObject(GateRef x);
|
|
|
|
GateRef TaggedIsNumber(GateRef x);
|
2022-07-30 03:49:38 +00:00
|
|
|
GateRef TaggedIsNumeric(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef TaggedIsHole(GateRef x);
|
|
|
|
GateRef TaggedIsNotHole(GateRef x);
|
|
|
|
GateRef TaggedIsUndefined(GateRef x);
|
|
|
|
GateRef TaggedIsException(GateRef x);
|
|
|
|
GateRef TaggedIsSpecial(GateRef x);
|
|
|
|
GateRef TaggedIsHeapObject(GateRef x);
|
2022-10-24 11:32:00 +00:00
|
|
|
GateRef TaggedIsAccessor(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef ObjectAddressToRange(GateRef x);
|
2022-10-26 02:39:13 +00:00
|
|
|
GateRef InYoungGeneration(GateRef region);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef TaggedIsGeneratorObject(GateRef x);
|
2022-07-29 03:13:50 +00:00
|
|
|
GateRef TaggedIsAsyncGeneratorObject(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef TaggedIsPropertyBox(GateRef x);
|
|
|
|
GateRef TaggedIsWeak(GateRef x);
|
|
|
|
GateRef TaggedIsPrototypeHandler(GateRef x);
|
|
|
|
GateRef TaggedIsTransitionHandler(GateRef x);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef TaggedIsString(GateRef obj);
|
2022-08-11 03:18:30 +00:00
|
|
|
GateRef BothAreString(GateRef x, GateRef y);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef TaggedIsStringOrSymbol(GateRef obj);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetNextPositionForHash(GateRef last, GateRef count, GateRef size);
|
|
|
|
GateRef DoubleIsNAN(GateRef x);
|
|
|
|
GateRef DoubleIsINF(GateRef x);
|
|
|
|
GateRef TaggedIsNull(GateRef x);
|
|
|
|
GateRef TaggedIsUndefinedOrNull(GateRef x);
|
|
|
|
GateRef TaggedIsTrue(GateRef x);
|
|
|
|
GateRef TaggedIsFalse(GateRef x);
|
|
|
|
GateRef TaggedIsBoolean(GateRef x);
|
|
|
|
GateRef TaggedGetInt(GateRef x);
|
2022-08-29 07:10:59 +00:00
|
|
|
GateRef Int8ToTaggedInt(GateRef x);
|
|
|
|
GateRef Int16ToTaggedInt(GateRef x);
|
|
|
|
GateRef IntToTaggedPtr(GateRef x);
|
|
|
|
GateRef IntToTaggedInt(GateRef x);
|
|
|
|
GateRef DoubleToTaggedDoublePtr(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef CastDoubleToInt64(GateRef x);
|
|
|
|
GateRef TaggedTrue();
|
|
|
|
GateRef TaggedFalse();
|
2021-09-04 08:06:49 +00:00
|
|
|
// compare operation
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Int8Equal(GateRef x, GateRef y);
|
2022-08-31 09:21:19 +00:00
|
|
|
GateRef Equal(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Int32Equal(GateRef x, GateRef y);
|
|
|
|
GateRef Int32NotEqual(GateRef x, GateRef y);
|
|
|
|
GateRef Int64Equal(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleEqual(GateRef x, GateRef y);
|
2022-09-20 09:32:59 +00:00
|
|
|
GateRef DoubleNotEqual(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Int64NotEqual(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleLessThan(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleLessThanOrEqual(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleGreaterThan(GateRef x, GateRef y);
|
|
|
|
GateRef DoubleGreaterThanOrEqual(GateRef x, GateRef y);
|
|
|
|
GateRef Int32GreaterThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int32LessThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int32GreaterThanOrEqual(GateRef x, GateRef y);
|
|
|
|
GateRef Int32LessThanOrEqual(GateRef x, GateRef y);
|
2022-04-21 12:08:23 +00:00
|
|
|
GateRef Int32UnsignedGreaterThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int32UnsignedLessThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int32UnsignedGreaterThanOrEqual(GateRef x, GateRef y);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef Int64GreaterThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int64LessThan(GateRef x, GateRef y);
|
|
|
|
GateRef Int64LessThanOrEqual(GateRef x, GateRef y);
|
|
|
|
GateRef Int64GreaterThanOrEqual(GateRef x, GateRef y);
|
2022-04-21 12:08:23 +00:00
|
|
|
GateRef Int64UnsignedLessThanOrEqual(GateRef x, GateRef y);
|
2022-05-19 04:48:40 +00:00
|
|
|
GateRef IntPtrGreaterThan(GateRef x, GateRef y);
|
2021-09-04 08:06:49 +00:00
|
|
|
// cast operation
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef ChangeInt64ToIntPtr(GateRef val);
|
2022-10-26 02:22:15 +00:00
|
|
|
GateRef ZExtInt32ToPtr(GateRef val);
|
2022-06-10 07:35:16 +00:00
|
|
|
GateRef ChangeIntPtrToInt32(GateRef val);
|
2021-09-04 08:06:49 +00:00
|
|
|
// math operation
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef Sqrt(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetSetterFromAccessor(GateRef accessor);
|
|
|
|
GateRef GetElementsArray(GateRef object);
|
2022-06-10 07:35:16 +00:00
|
|
|
void SetElementsArray(VariableType type, GateRef glue, GateRef object, GateRef elementsArray);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetPropertiesArray(GateRef object);
|
2021-12-17 09:18:10 +00:00
|
|
|
// SetProperties in js_object.h
|
2022-06-10 07:35:16 +00:00
|
|
|
void SetPropertiesArray(VariableType type, GateRef glue, GateRef object, GateRef propsArray);
|
|
|
|
void SetHash(GateRef glue, GateRef object, GateRef hash);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetLengthOfTaggedArray(GateRef array);
|
2021-09-04 08:06:49 +00:00
|
|
|
// object operation
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsJSHClass(GateRef obj);
|
|
|
|
GateRef LoadHClass(GateRef object);
|
2022-08-16 15:48:09 +00:00
|
|
|
void StoreHClass(GateRef glue, GateRef object, GateRef hClass);
|
2021-12-17 09:18:10 +00:00
|
|
|
void CopyAllHClass(GateRef glue, GateRef dstHClass, GateRef scrHClass);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetObjectType(GateRef hClass);
|
|
|
|
GateRef IsDictionaryMode(GateRef object);
|
|
|
|
GateRef IsDictionaryModeByHClass(GateRef hClass);
|
|
|
|
GateRef IsDictionaryElement(GateRef hClass);
|
2022-05-20 09:24:45 +00:00
|
|
|
GateRef IsClassConstructorFromBitField(GateRef bitfield);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsClassConstructor(GateRef object);
|
|
|
|
GateRef IsClassPrototype(GateRef object);
|
|
|
|
GateRef IsExtensible(GateRef object);
|
2022-06-08 03:57:26 +00:00
|
|
|
GateRef TaggedObjectIsEcmaObject(GateRef obj);
|
2022-08-08 13:05:10 +00:00
|
|
|
GateRef IsEcmaObject(GateRef obj);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsSymbol(GateRef obj);
|
|
|
|
GateRef IsString(GateRef obj);
|
2022-10-23 15:17:44 +00:00
|
|
|
GateRef IsLineString(GateRef obj);
|
|
|
|
GateRef IsTreeString(GateRef obj);
|
|
|
|
GateRef TreeStringIsFlat(GateRef string);
|
2022-04-28 01:16:30 +00:00
|
|
|
GateRef TaggedIsBigInt(GateRef obj);
|
2022-07-30 03:49:38 +00:00
|
|
|
GateRef TaggedObjectIsBigInt(GateRef obj);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsJsProxy(GateRef obj);
|
|
|
|
GateRef IsJSFunctionBase(GateRef obj);
|
2022-04-26 01:06:56 +00:00
|
|
|
GateRef IsConstructor(GateRef object);
|
|
|
|
GateRef IsBase(GateRef func);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsJsArray(GateRef obj);
|
2022-10-26 02:39:13 +00:00
|
|
|
GateRef IsJsCOWArray(GateRef obj);
|
|
|
|
GateRef IsCOWArray(GateRef obj);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsJSObject(GateRef obj);
|
|
|
|
GateRef IsWritable(GateRef attr);
|
|
|
|
GateRef IsAccessor(GateRef attr);
|
|
|
|
GateRef IsInlinedProperty(GateRef attr);
|
|
|
|
GateRef IsField(GateRef attr);
|
|
|
|
GateRef IsNonExist(GateRef attr);
|
2022-10-13 06:44:04 +00:00
|
|
|
GateRef IsJSAPIVector(GateRef attr);
|
2022-10-24 13:04:12 +00:00
|
|
|
GateRef IsJSAPIStack(GateRef obj);
|
|
|
|
GateRef IsJSAPIPlainArray(GateRef obj);
|
|
|
|
GateRef IsJSAPIQueue(GateRef obj);
|
|
|
|
GateRef IsJSAPIDeque(GateRef obj);
|
2022-10-28 08:12:17 +00:00
|
|
|
GateRef IsJSAPILightWeightMap(GateRef obj);
|
|
|
|
GateRef IsJSAPILightWeightSet(GateRef obj);
|
|
|
|
GateRef IsLinkedNode(GateRef obj);
|
|
|
|
GateRef IsJSAPIHashMap(GateRef obj);
|
|
|
|
GateRef IsJSAPIHashSet(GateRef obj);
|
|
|
|
GateRef IsJSAPILinkedList(GateRef obj);
|
|
|
|
GateRef IsJSAPIList(GateRef obj);
|
2022-10-26 08:06:06 +00:00
|
|
|
GateRef IsJSAPIArrayList(GateRef obj);
|
2022-10-13 06:44:04 +00:00
|
|
|
GateRef GetTarget(GateRef proxyObj);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef HandlerBaseIsAccessor(GateRef attr);
|
|
|
|
GateRef HandlerBaseIsJSArray(GateRef attr);
|
|
|
|
GateRef HandlerBaseIsInlinedProperty(GateRef attr);
|
|
|
|
GateRef HandlerBaseGetOffset(GateRef attr);
|
|
|
|
GateRef IsInvalidPropertyBox(GateRef obj);
|
|
|
|
GateRef GetValueFromPropertyBox(GateRef obj);
|
|
|
|
void SetValueToPropertyBox(GateRef glue, GateRef obj, GateRef value);
|
|
|
|
GateRef GetTransitionFromHClass(GateRef obj);
|
|
|
|
GateRef GetTransitionHandlerInfo(GateRef obj);
|
|
|
|
GateRef IsInternalAccessor(GateRef attr);
|
|
|
|
GateRef GetProtoCell(GateRef object);
|
|
|
|
GateRef GetPrototypeHandlerHolder(GateRef object);
|
|
|
|
GateRef GetPrototypeHandlerHandlerInfo(GateRef object);
|
2022-09-22 11:49:34 +00:00
|
|
|
GateRef GetPrototype(GateRef glue, GateRef object);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetHasChanged(GateRef object);
|
2022-08-16 15:48:09 +00:00
|
|
|
GateRef HclassIsPrototypeHandler(GateRef hClass);
|
|
|
|
GateRef HclassIsTransitionHandler(GateRef hClass);
|
|
|
|
GateRef HclassIsPropertyBox(GateRef hClass);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef PropAttrGetOffset(GateRef attr);
|
2022-09-22 11:49:34 +00:00
|
|
|
GateRef InstanceOf(GateRef glue, GateRef object, GateRef target);
|
|
|
|
GateRef OrdinaryHasInstance(GateRef glue, GateRef target, GateRef obj);
|
|
|
|
GateRef SameValue(GateRef glue, GateRef left, GateRef right);
|
|
|
|
|
2021-10-28 07:06:25 +00:00
|
|
|
// SetDictionaryOrder func in property_attribute.h
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef SetDictionaryOrderFieldInPropAttr(GateRef attr, GateRef value);
|
|
|
|
GateRef GetPrototypeFromHClass(GateRef hClass);
|
|
|
|
GateRef GetLayoutFromHClass(GateRef hClass);
|
|
|
|
GateRef GetBitFieldFromHClass(GateRef hClass);
|
2022-04-06 09:02:18 +00:00
|
|
|
GateRef GetLengthFromString(GateRef value);
|
2022-04-28 01:16:30 +00:00
|
|
|
GateRef GetHashcodeFromString(GateRef glue, GateRef value);
|
2022-10-23 15:17:44 +00:00
|
|
|
GateRef TryGetHashcodeFromString(GateRef string);
|
|
|
|
GateRef GetFirstFromTreeString(GateRef string);
|
|
|
|
GateRef GetSecondFromTreeString(GateRef string);
|
2022-03-21 03:38:21 +00:00
|
|
|
void SetBitFieldToHClass(GateRef glue, GateRef hClass, GateRef bitfield);
|
|
|
|
void SetPrototypeToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef proto);
|
|
|
|
void SetProtoChangeDetailsToHClass(VariableType type, GateRef glue, GateRef hClass,
|
2022-08-08 13:05:10 +00:00
|
|
|
GateRef protoChange);
|
2022-03-21 03:38:21 +00:00
|
|
|
void SetLayoutToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef attr);
|
|
|
|
void SetEnumCacheToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef key);
|
|
|
|
void SetTransitionsToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef transition);
|
2022-03-16 10:12:15 +00:00
|
|
|
void SetIsProtoTypeToHClass(GateRef glue, GateRef hClass, GateRef value);
|
|
|
|
GateRef IsProtoTypeHClass(GateRef hClass);
|
|
|
|
void SetPropertyInlinedProps(GateRef glue, GateRef obj, GateRef hClass,
|
|
|
|
GateRef value, GateRef attrOffset, VariableType type = VariableType::JS_ANY());
|
2022-08-10 04:07:46 +00:00
|
|
|
GateRef GetPropertyInlinedProps(GateRef obj, GateRef hClass,
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef index);
|
2021-12-17 09:18:10 +00:00
|
|
|
|
2022-03-16 10:12:15 +00:00
|
|
|
void IncNumberOfProps(GateRef glue, GateRef hClass);
|
|
|
|
GateRef GetNumberOfPropsFromHClass(GateRef hClass);
|
|
|
|
void SetNumberOfPropsToHClass(GateRef glue, GateRef hClass, GateRef value);
|
|
|
|
GateRef GetObjectSizeFromHClass(GateRef hClass);
|
|
|
|
GateRef GetInlinedPropsStartFromHClass(GateRef hClass);
|
|
|
|
GateRef GetInlinedPropertiesFromHClass(GateRef hClass);
|
2021-12-17 09:18:10 +00:00
|
|
|
void ThrowTypeAndReturn(GateRef glue, int messageId, GateRef val);
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef GetValueFromTaggedArray(GateRef elements, GateRef index);
|
2022-03-16 10:12:15 +00:00
|
|
|
void SetValueToTaggedArray(VariableType valType, GateRef glue, GateRef array, GateRef index, GateRef val);
|
|
|
|
void UpdateValueAndAttributes(GateRef glue, GateRef elements, GateRef index, GateRef value, GateRef attr);
|
|
|
|
GateRef IsSpecialIndexedObj(GateRef jsType);
|
|
|
|
GateRef IsSpecialContainer(GateRef jsType);
|
|
|
|
GateRef IsAccessorInternal(GateRef value);
|
|
|
|
template<typename DictionaryT>
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef GetAttributesFromDictionary(GateRef elements, GateRef entry);
|
2022-03-16 10:12:15 +00:00
|
|
|
template<typename DictionaryT>
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef GetValueFromDictionary(GateRef elements, GateRef entry);
|
2022-03-16 10:12:15 +00:00
|
|
|
template<typename DictionaryT>
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef GetKeyFromDictionary(GateRef elements, GateRef entry);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetPropAttrFromLayoutInfo(GateRef layout, GateRef entry);
|
|
|
|
GateRef GetPropertiesAddrFromLayoutInfo(GateRef layout);
|
|
|
|
GateRef GetPropertyMetaDataFromAttr(GateRef attr);
|
|
|
|
GateRef GetKeyFromLayoutInfo(GateRef layout, GateRef entry);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef FindElementWithCache(GateRef glue, GateRef layoutInfo, GateRef hClass,
|
|
|
|
GateRef key, GateRef propsNum);
|
2022-02-19 02:09:52 +00:00
|
|
|
GateRef FindElementFromNumberDictionary(GateRef glue, GateRef elements, GateRef index);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef FindEntryFromNameDictionary(GateRef glue, GateRef elements, GateRef key);
|
|
|
|
GateRef IsMatchInTransitionDictionary(GateRef element, GateRef key, GateRef metaData, GateRef attr);
|
|
|
|
GateRef FindEntryFromTransitionDictionary(GateRef glue, GateRef elements, GateRef key, GateRef metaData);
|
2022-09-19 07:39:56 +00:00
|
|
|
GateRef JSObjectGetProperty(GateRef obj, GateRef hClass, GateRef propAttr);
|
2021-12-17 09:18:10 +00:00
|
|
|
void JSObjectSetProperty(GateRef glue, GateRef obj, GateRef hClass, GateRef attr, GateRef value);
|
|
|
|
GateRef ShouldCallSetter(GateRef receiver, GateRef holder, GateRef accessor, GateRef attr);
|
2022-05-30 02:41:07 +00:00
|
|
|
GateRef CallSetterHelper(GateRef glue, GateRef holder, GateRef accessor, GateRef value);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef SetHasConstructorCondition(GateRef glue, GateRef receiver, GateRef key);
|
|
|
|
GateRef AddPropertyByName(GateRef glue, GateRef receiver, GateRef key, GateRef value, GateRef propertyAttributes);
|
|
|
|
GateRef IsUtf16String(GateRef string);
|
|
|
|
GateRef IsUtf8String(GateRef string);
|
|
|
|
GateRef IsInternalString(GateRef string);
|
|
|
|
GateRef IsDigit(GateRef ch);
|
2022-10-23 15:17:44 +00:00
|
|
|
GateRef StringToElementIndex(GateRef glue, GateRef string);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef ComputePropertyCapacityInJSObj(GateRef oldLength);
|
2022-08-16 15:48:09 +00:00
|
|
|
GateRef FindTransitions(GateRef glue, GateRef receiver, GateRef hClass, GateRef key, GateRef attr);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef TaggedToRepresentation(GateRef value);
|
2022-10-24 11:32:00 +00:00
|
|
|
GateRef LdGlobalRecord(GateRef glue, GateRef key);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef LoadFromField(GateRef receiver, GateRef handlerInfo);
|
|
|
|
GateRef LoadGlobal(GateRef cell);
|
2022-10-23 15:17:44 +00:00
|
|
|
GateRef LoadElement(GateRef glue, GateRef receiver, GateRef key);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef TryToElementsIndex(GateRef glue, GateRef key);
|
2022-08-16 15:48:09 +00:00
|
|
|
GateRef CheckPolyHClass(GateRef cachedValue, GateRef hClass);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef LoadICWithHandler(GateRef glue, GateRef receiver, GateRef holder, GateRef handler);
|
|
|
|
GateRef StoreICWithHandler(GateRef glue, GateRef receiver, GateRef holder,
|
|
|
|
GateRef value, GateRef handler);
|
|
|
|
GateRef ICStoreElement(GateRef glue, GateRef receiver, GateRef key,
|
|
|
|
GateRef value, GateRef handlerInfo);
|
|
|
|
GateRef GetArrayLength(GateRef object);
|
2022-03-07 06:42:40 +00:00
|
|
|
GateRef DoubleToInt(GateRef glue, GateRef x);
|
2021-12-17 09:18:10 +00:00
|
|
|
void StoreField(GateRef glue, GateRef receiver, GateRef value, GateRef handler);
|
|
|
|
void StoreWithTransition(GateRef glue, GateRef receiver, GateRef value, GateRef handler);
|
|
|
|
GateRef StoreGlobal(GateRef glue, GateRef value, GateRef cell);
|
|
|
|
void JSHClassAddProperty(GateRef glue, GateRef receiver, GateRef key, GateRef attr);
|
|
|
|
void NotifyHClassChanged(GateRef glue, GateRef oldHClass, GateRef newHClass);
|
2022-09-27 08:05:20 +00:00
|
|
|
GateRef GetInt64OfTInt(GateRef x);
|
|
|
|
GateRef GetInt32OfTInt(GateRef x);
|
|
|
|
GateRef GetDoubleOfTDouble(GateRef x);
|
2022-08-31 09:21:19 +00:00
|
|
|
GateRef LoadObjectFromWeakRef(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef ChangeInt32ToFloat64(GateRef x);
|
2022-03-21 02:09:13 +00:00
|
|
|
GateRef ChangeUInt32ToFloat64(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef ChangeFloat64ToInt32(GateRef x);
|
|
|
|
GateRef ChangeTaggedPointerToInt64(GateRef x);
|
2022-08-29 07:10:59 +00:00
|
|
|
GateRef Int64ToTaggedPtr(GateRef x);
|
2022-10-26 02:22:15 +00:00
|
|
|
GateRef TruncInt16ToInt8(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef CastInt64ToFloat64(GateRef x);
|
|
|
|
GateRef SExtInt32ToInt64(GateRef x);
|
2022-06-28 08:16:35 +00:00
|
|
|
GateRef SExtInt16ToInt64(GateRef x);
|
|
|
|
GateRef SExtInt8ToInt64(GateRef x);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef SExtInt1ToInt64(GateRef x);
|
|
|
|
GateRef SExtInt1ToInt32(GateRef x);
|
|
|
|
GateRef ZExtInt8ToInt16(GateRef x);
|
|
|
|
GateRef ZExtInt32ToInt64(GateRef x);
|
|
|
|
GateRef ZExtInt1ToInt64(GateRef x);
|
|
|
|
GateRef ZExtInt1ToInt32(GateRef x);
|
|
|
|
GateRef ZExtInt8ToInt32(GateRef x);
|
|
|
|
GateRef ZExtInt8ToInt64(GateRef x);
|
|
|
|
GateRef ZExtInt8ToPtr(GateRef x);
|
|
|
|
GateRef ZExtInt16ToPtr(GateRef x);
|
|
|
|
GateRef SExtInt32ToPtr(GateRef x);
|
|
|
|
GateRef ZExtInt16ToInt32(GateRef x);
|
|
|
|
GateRef ZExtInt16ToInt64(GateRef x);
|
|
|
|
GateRef TruncInt64ToInt32(GateRef x);
|
|
|
|
GateRef TruncPtrToInt32(GateRef x);
|
|
|
|
GateRef TruncInt64ToInt1(GateRef x);
|
|
|
|
GateRef TruncInt32ToInt1(GateRef x);
|
|
|
|
GateRef GetGlobalConstantAddr(GateRef index);
|
|
|
|
GateRef GetGlobalConstantString(ConstantIndex index);
|
2022-05-20 09:24:45 +00:00
|
|
|
GateRef IsCallableFromBitField(GateRef bitfield);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef IsCallable(GateRef obj);
|
|
|
|
GateRef GetOffsetFieldInPropAttr(GateRef attr);
|
|
|
|
GateRef SetOffsetFieldInPropAttr(GateRef attr, GateRef value);
|
|
|
|
GateRef SetIsInlinePropsFieldInPropAttr(GateRef attr, GateRef value);
|
|
|
|
void SetHasConstructorToHClass(GateRef glue, GateRef hClass, GateRef value);
|
|
|
|
void UpdateValueInDict(GateRef glue, GateRef elements, GateRef index, GateRef value);
|
|
|
|
GateRef GetBitMask(GateRef bitoffset);
|
2022-05-19 04:48:40 +00:00
|
|
|
GateRef IntPtrEuqal(GateRef x, GateRef y);
|
2021-12-17 09:18:10 +00:00
|
|
|
void SetValueWithBarrier(GateRef glue, GateRef obj, GateRef offset, GateRef value);
|
|
|
|
GateRef GetPropertyByIndex(GateRef glue, GateRef receiver, GateRef index);
|
|
|
|
GateRef GetPropertyByName(GateRef glue, GateRef receiver, GateRef key);
|
2022-09-22 11:49:34 +00:00
|
|
|
GateRef FastGetPropertyByName(GateRef glue, GateRef obj, GateRef key);
|
2022-06-14 12:19:18 +00:00
|
|
|
GateRef GetPropertyByValue(GateRef glue, GateRef receiver, GateRef keyValue);
|
2022-04-07 13:45:47 +00:00
|
|
|
GateRef SetPropertyByIndex(GateRef glue, GateRef receiver, GateRef index, GateRef value, bool useOwn);
|
2021-12-17 09:18:10 +00:00
|
|
|
GateRef SetPropertyByName(GateRef glue, GateRef receiver, GateRef key,
|
2022-04-07 13:45:47 +00:00
|
|
|
GateRef value, bool useOwn); // Crawl prototype chain
|
|
|
|
GateRef SetPropertyByValue(GateRef glue, GateRef receiver, GateRef key, GateRef value, bool useOwn);
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef GetParentEnv(GateRef object);
|
|
|
|
GateRef GetPropertiesFromLexicalEnv(GateRef object, GateRef index);
|
|
|
|
void SetPropertiesToLexicalEnv(GateRef glue, GateRef object, GateRef index, GateRef value);
|
|
|
|
GateRef GetHomeObjectFromJSFunction(GateRef object);
|
2022-03-23 11:41:22 +00:00
|
|
|
GateRef GetCallFieldFromMethod(GateRef method);
|
2022-08-04 06:58:57 +00:00
|
|
|
inline GateRef GetBuiltinId(GateRef method);
|
2022-03-16 10:12:15 +00:00
|
|
|
void SetLexicalEnvToFunction(GateRef glue, GateRef object, GateRef lexicalEnv);
|
|
|
|
GateRef GetGlobalObject(GateRef glue);
|
|
|
|
GateRef GetEntryIndexOfGlobalDictionary(GateRef entry);
|
|
|
|
GateRef GetBoxFromGlobalDictionary(GateRef object, GateRef entry);
|
|
|
|
GateRef GetValueFromGlobalDictionary(GateRef object, GateRef entry);
|
|
|
|
GateRef GetPropertiesFromJSObject(GateRef object);
|
2022-03-14 03:50:02 +00:00
|
|
|
template<OpCode::Op Op, MachineType Type>
|
2022-03-16 10:12:15 +00:00
|
|
|
GateRef BinaryOp(GateRef x, GateRef y);
|
2022-02-19 02:09:52 +00:00
|
|
|
GateRef GetGlobalOwnProperty(GateRef glue, GateRef receiver, GateRef key);
|
2022-10-24 11:32:00 +00:00
|
|
|
|
|
|
|
inline GateRef GetObjectFromConstPool(GateRef constpool, GateRef index);
|
|
|
|
GateRef GetStringFromConstPool(GateRef glue, GateRef constpool, GateRef index);
|
2022-11-01 12:42:20 +00:00
|
|
|
GateRef GetMethodFromConstPool(GateRef glue, GateRef constpool, GateRef index);
|
|
|
|
GateRef GetArrayLiteralFromConstPool(GateRef glue, GateRef constpool, GateRef index, GateRef module);
|
|
|
|
GateRef GetObjectLiteralFromConstPool(GateRef glue, GateRef constpool, GateRef index, GateRef module);
|
2022-10-24 11:32:00 +00:00
|
|
|
|
2022-02-19 02:09:52 +00:00
|
|
|
// fast path
|
|
|
|
GateRef FastEqual(GateRef left, GateRef right);
|
2022-04-28 01:16:30 +00:00
|
|
|
GateRef FastStrictEqual(GateRef glue, GateRef left, GateRef right);
|
2022-09-22 11:49:34 +00:00
|
|
|
GateRef FastStringEqual(GateRef glue, GateRef left, GateRef right);
|
2022-03-14 03:50:02 +00:00
|
|
|
GateRef FastMod(GateRef gule, GateRef left, GateRef right);
|
|
|
|
GateRef FastTypeOf(GateRef left, GateRef right);
|
2022-02-19 02:09:52 +00:00
|
|
|
GateRef FastMul(GateRef left, GateRef right);
|
|
|
|
GateRef FastDiv(GateRef left, GateRef right);
|
2022-03-14 03:50:02 +00:00
|
|
|
GateRef FastAdd(GateRef left, GateRef right);
|
|
|
|
GateRef FastSub(GateRef left, GateRef right);
|
2022-04-06 09:02:18 +00:00
|
|
|
GateRef FastToBoolean(GateRef value);
|
2021-10-15 02:20:54 +00:00
|
|
|
|
2022-01-04 11:30:40 +00:00
|
|
|
// Add SpecialContainer
|
|
|
|
GateRef GetContainerProperty(GateRef glue, GateRef receiver, GateRef index, GateRef jsType);
|
2022-05-23 01:49:27 +00:00
|
|
|
GateRef JSAPIContainerGet(GateRef glue, GateRef receiver, GateRef index);
|
2022-04-08 05:26:13 +00:00
|
|
|
|
|
|
|
// Exception handle
|
2022-05-20 09:24:45 +00:00
|
|
|
GateRef HasPendingException(GateRef glue);
|
2022-04-08 05:26:13 +00:00
|
|
|
void ReturnExceptionIfAbruptCompletion(GateRef glue);
|
|
|
|
|
|
|
|
// method operator
|
|
|
|
GateRef IsJSFunction(GateRef obj);
|
|
|
|
GateRef IsBoundFunction(GateRef obj);
|
|
|
|
GateRef GetMethodFromJSFunction(GateRef jsfunc);
|
|
|
|
GateRef IsNativeMethod(GateRef method);
|
|
|
|
GateRef HasAotCode(GateRef method);
|
|
|
|
GateRef GetExpectedNumOfArgs(GateRef method);
|
2022-09-22 11:49:34 +00:00
|
|
|
GateRef GetMethod(GateRef glue, GateRef obj, GateRef key);
|
Implement Proxy Lowering on x86
when function need call another js function, it will lowering to call "JSCall" trampoline function
JSCall trampoline function will check calltarget function, then correct the arguments, finally jump
the native or optimized code address of the target function.
JSCall(glue, argc, calltarget, ....)
then proxy call(glue, argc, callTarget, argv[])
if proxy->GetHandler is function
tail call JSCall(glue, argc, callTarget, argv); // consider performance
else
//Call(trap, handler, «target, thisArgument, argArray»)
call CreateArrayFromList(glue, argc, argv[]) ---> arrHandle // maybe trigger GC, construct OptimizedWithArgvLeaveFrame, visitor argv[0]..argv[argc-1]
call JSCall(glue, argc, method, argv[])
issue:https://gitee.com/openharmony/ark_js_runtime/issues/I52T6B?from=project-issue
Signed-off-by: songzhengchao <songzhengchao@huawei.com>
Change-Id: I994aae1eb9cbf51982348ae6e203c24c326f617e
2022-04-14 13:54:03 +00:00
|
|
|
// proxy operator
|
|
|
|
GateRef GetMethodFromJSProxy(GateRef proxy);
|
|
|
|
GateRef GetHandlerFromJSProxy(GateRef proxy);
|
|
|
|
GateRef GetTargetFromJSProxy(GateRef proxy);
|
2022-04-20 08:56:34 +00:00
|
|
|
inline void SavePcIfNeeded(GateRef glue);
|
2022-08-29 12:21:59 +00:00
|
|
|
inline void SaveJumpSizeIfNeeded(GateRef glue, GateRef jumpSize);
|
2022-05-19 04:48:40 +00:00
|
|
|
inline GateRef ComputeTaggedArraySize(GateRef length);
|
|
|
|
inline GateRef GetGlobalConstantValue(
|
|
|
|
VariableType type, GateRef glue, ConstantIndex index);
|
2022-07-22 08:50:08 +00:00
|
|
|
inline GateRef GetGlobalEnvValue(VariableType type, GateRef env, size_t index);
|
2022-05-30 02:41:07 +00:00
|
|
|
GateRef CallGetterHelper(GateRef glue, GateRef receiver, GateRef holder, GateRef accessor);
|
2022-06-30 02:22:52 +00:00
|
|
|
GateRef ConstructorCheck(GateRef glue, GateRef ctor, GateRef outPut, GateRef thisObj);
|
2022-08-29 12:21:59 +00:00
|
|
|
GateRef JSCallDispatch(GateRef glue, GateRef func, GateRef actualNumArgs, GateRef jumpSize,
|
2022-05-30 02:41:07 +00:00
|
|
|
JSCallMode mode, std::initializer_list<GateRef> args);
|
2022-06-10 07:33:31 +00:00
|
|
|
GateRef IsFastTypeArray(GateRef jsType);
|
|
|
|
GateRef GetTypeArrayPropertyByName(GateRef glue, GateRef receiver, GateRef holder, GateRef key, GateRef jsType);
|
|
|
|
GateRef SetTypeArrayPropertyByName(GateRef glue, GateRef receiver, GateRef holder, GateRef key, GateRef value,
|
|
|
|
GateRef jsType);
|
2022-10-23 15:17:44 +00:00
|
|
|
GateRef TryStringOrSymbolToElementIndex(GateRef glue, GateRef string);
|
2022-08-04 06:58:57 +00:00
|
|
|
inline GateRef DispatchBuiltins(GateRef glue, GateRef builtinsId, const std::initializer_list<GateRef>& args);
|
2022-08-19 07:23:06 +00:00
|
|
|
GateRef ComputeSizeUtf8(GateRef length);
|
|
|
|
GateRef ComputeSizeUtf16(GateRef length);
|
|
|
|
GateRef AlignUp(GateRef x, GateRef alignment);
|
2022-10-18 12:59:34 +00:00
|
|
|
void CallFastPath(GateRef glue, GateRef nativeCode, GateRef func, GateRef thisValue, GateRef actualNumArgs,
|
|
|
|
GateRef callField, GateRef method, Label* notFastBuiltins, Label* exit, Variable* result,
|
|
|
|
std::initializer_list<GateRef> args, JSCallMode mode);
|
2022-08-19 07:23:06 +00:00
|
|
|
inline void SetLength(GateRef glue, GateRef str, GateRef length, bool compressed);
|
|
|
|
inline void SetRawHashcode(GateRef glue, GateRef str, GateRef rawHashcode);
|
2022-11-08 09:05:30 +00:00
|
|
|
void Assert(int messageId, int line, GateRef glue, GateRef condition, Label *nextLabel);
|
2022-11-10 06:29:12 +00:00
|
|
|
void PGOProfiler(GateRef glue, GateRef func);
|
2022-10-23 15:17:44 +00:00
|
|
|
|
|
|
|
GateRef FlattenString(GateRef glue, GateRef str);
|
2021-09-04 08:06:49 +00:00
|
|
|
private:
|
2022-03-21 12:06:33 +00:00
|
|
|
using BinaryOperation = std::function<GateRef(Environment*, GateRef, GateRef)>;
|
|
|
|
template<OpCode::Op Op>
|
|
|
|
GateRef FastAddSubAndMul(GateRef left, GateRef right);
|
|
|
|
GateRef FastBinaryOp(GateRef left, GateRef right,
|
|
|
|
const BinaryOperation& intOp, const BinaryOperation& floatOp);
|
2022-07-21 01:51:36 +00:00
|
|
|
void InitializeArguments();
|
2022-11-25 07:22:42 +00:00
|
|
|
CallSignature *callSignature_ {nullptr};
|
2022-07-25 01:48:46 +00:00
|
|
|
Environment *env_;
|
2021-09-04 08:06:49 +00:00
|
|
|
};
|
2021-12-23 06:55:22 +00:00
|
|
|
} // namespace panda::ecmascript::kungfu
|
2022-07-25 01:48:46 +00:00
|
|
|
#endif // ECMASCRIPT_COMPILER_STUB_BUILDER_H
|