mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-12-02 16:07:20 +00:00
!6368 Opt array.with
Merge pull request !6368 from liujia178/ArrayWithIR
This commit is contained in:
commit
6b0af375ac
@ -109,7 +109,7 @@
|
|||||||
/* Array.prototype.values ( ) */ \
|
/* Array.prototype.values ( ) */ \
|
||||||
V("values", Values, 0, ArrayValues) \
|
V("values", Values, 0, ArrayValues) \
|
||||||
/* Array.prototype.with ( index, value ) */ \
|
/* Array.prototype.with ( index, value ) */ \
|
||||||
V("with", With, 2, INVALID)
|
V("with", With, 2, ArrayWith)
|
||||||
|
|
||||||
namespace panda::ecmascript::builtins {
|
namespace panda::ecmascript::builtins {
|
||||||
static constexpr uint8_t INDEX_TWO = 2;
|
static constexpr uint8_t INDEX_TWO = 2;
|
||||||
|
@ -26,6 +26,128 @@
|
|||||||
#include "ecmascript/base/array_helper.h"
|
#include "ecmascript/base/array_helper.h"
|
||||||
|
|
||||||
namespace panda::ecmascript::kungfu {
|
namespace panda::ecmascript::kungfu {
|
||||||
|
void BuiltinsArrayStubBuilder::With(GateRef glue, GateRef thisValue, GateRef numArgs,
|
||||||
|
Variable *result, Label *exit, Label *slowPath)
|
||||||
|
{
|
||||||
|
auto env = GetEnvironment();
|
||||||
|
DEFVARIABLE(relativeIndex, VariableType::INT64(), Int64(0));
|
||||||
|
DEFVARIABLE(actualIndex, VariableType::INT64(), Int64(0));
|
||||||
|
Label isHeapObject(env);
|
||||||
|
Label isJsArray(env);
|
||||||
|
Label isStableArray(env);
|
||||||
|
Label defaultConstr(env);
|
||||||
|
Label notCOWArray(env);
|
||||||
|
BRANCH(TaggedIsHeapObject(thisValue), &isHeapObject, slowPath);
|
||||||
|
Bind(&isHeapObject);
|
||||||
|
BRANCH(IsJsArray(thisValue), &isJsArray, slowPath);
|
||||||
|
Bind(&isJsArray);
|
||||||
|
BRANCH(HasConstructor(thisValue), slowPath, &defaultConstr);
|
||||||
|
Bind(&defaultConstr);
|
||||||
|
BRANCH(IsStableJSArray(glue, thisValue), &isStableArray, slowPath);
|
||||||
|
Bind(&isStableArray);
|
||||||
|
BRANCH(IsJsCOWArray(thisValue), slowPath, ¬COWArray);
|
||||||
|
Bind(¬COWArray);
|
||||||
|
|
||||||
|
GateRef thisLen = ZExtInt32ToInt64(GetArrayLength(thisValue));
|
||||||
|
GateRef index = GetCallArg0(numArgs);
|
||||||
|
Label taggedIsInt(env);
|
||||||
|
BRANCH(TaggedIsInt(index), &taggedIsInt, slowPath);
|
||||||
|
Bind(&taggedIsInt);
|
||||||
|
{
|
||||||
|
relativeIndex = GetInt64OfTInt(index);
|
||||||
|
DEFVARIABLE(value, VariableType::JS_ANY(), Hole());
|
||||||
|
Label twoArg(env);
|
||||||
|
Label ifOneArg(env);
|
||||||
|
Label getIndex(env);
|
||||||
|
// 2 : means there are two args
|
||||||
|
BRANCH(Int64Equal(numArgs, IntPtr(2)), &twoArg, &ifOneArg);
|
||||||
|
Bind(&twoArg);
|
||||||
|
{
|
||||||
|
value = GetCallArg1(numArgs);
|
||||||
|
Jump(&getIndex);
|
||||||
|
}
|
||||||
|
Bind(&ifOneArg);
|
||||||
|
{
|
||||||
|
// 1 : means there are only one arg
|
||||||
|
BRANCH(Int64Equal(numArgs, IntPtr(1)), &getIndex, slowPath);
|
||||||
|
}
|
||||||
|
Bind(&getIndex);
|
||||||
|
{
|
||||||
|
Label indexGreaterOrEqualZero(env);
|
||||||
|
Label indexLessZero(env);
|
||||||
|
Label next(env);
|
||||||
|
Label notOutOfRange(env);
|
||||||
|
BRANCH(Int64GreaterThanOrEqual(*relativeIndex, Int64(0)), &indexGreaterOrEqualZero, &indexLessZero);
|
||||||
|
Bind(&indexGreaterOrEqualZero);
|
||||||
|
{
|
||||||
|
actualIndex = *relativeIndex;
|
||||||
|
Jump(&next);
|
||||||
|
}
|
||||||
|
Bind(&indexLessZero);
|
||||||
|
{
|
||||||
|
actualIndex = Int64Add(thisLen, *relativeIndex);
|
||||||
|
Jump(&next);
|
||||||
|
}
|
||||||
|
Bind(&next);
|
||||||
|
{
|
||||||
|
BRANCH(BoolOr(Int64GreaterThanOrEqual(*actualIndex, thisLen), Int64LessThan(*actualIndex, Int64(0))),
|
||||||
|
slowPath, ¬OutOfRange);
|
||||||
|
Bind(¬OutOfRange);
|
||||||
|
{
|
||||||
|
GateRef newArray = NewArray(glue, Int32(0));
|
||||||
|
GrowElementsCapacity(glue, newArray, TruncInt64ToInt32(thisLen));
|
||||||
|
DEFVARIABLE(k, VariableType::INT64(), Int64(0));
|
||||||
|
Label loopHead(env);
|
||||||
|
Label loopEnd(env);
|
||||||
|
Label loopExit(env);
|
||||||
|
Label loopNext(env);
|
||||||
|
Label replaceIndex(env);
|
||||||
|
Label notReplaceIndex(env);
|
||||||
|
Jump(&loopHead);
|
||||||
|
LoopBegin(&loopHead);
|
||||||
|
{
|
||||||
|
BRANCH(Int64LessThan(*k, thisLen), &loopNext, &loopExit);
|
||||||
|
Bind(&loopNext);
|
||||||
|
BRANCH(Int64Equal(*k, *actualIndex), &replaceIndex, ¬ReplaceIndex);
|
||||||
|
Bind(&replaceIndex);
|
||||||
|
{
|
||||||
|
SetValueWithElementsKind(glue, newArray, *value, *k, Boolean(true),
|
||||||
|
Int32(static_cast<uint32_t>(ElementsKind::NONE)));
|
||||||
|
Jump(&loopEnd);
|
||||||
|
}
|
||||||
|
Bind(¬ReplaceIndex);
|
||||||
|
{
|
||||||
|
GateRef ele = GetTaggedValueWithElementsKind(thisValue, *k);
|
||||||
|
Label eleIsHole(env);
|
||||||
|
Label eleNotHole(env);
|
||||||
|
BRANCH(TaggedIsHole(ele), &eleIsHole, &eleNotHole);
|
||||||
|
Bind(&eleIsHole);
|
||||||
|
{
|
||||||
|
SetValueWithElementsKind(glue, newArray, Undefined(), *k, Boolean(true),
|
||||||
|
Int32(static_cast<uint32_t>(ElementsKind::NONE)));
|
||||||
|
Jump(&loopEnd);
|
||||||
|
}
|
||||||
|
Bind(&eleNotHole);
|
||||||
|
{
|
||||||
|
SetValueWithElementsKind(glue, newArray, ele, *k, Boolean(true),
|
||||||
|
Int32(static_cast<uint32_t>(ElementsKind::NONE)));
|
||||||
|
Jump(&loopEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Bind(&loopEnd);
|
||||||
|
k = Int64Add(*k, Int64(1));
|
||||||
|
LoopEnd(&loopHead);
|
||||||
|
Bind(&loopExit);
|
||||||
|
SetArrayLength(glue, newArray, thisLen);
|
||||||
|
result->WriteVariable(newArray);
|
||||||
|
Jump(exit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BuiltinsArrayStubBuilder::Unshift(GateRef glue, GateRef thisValue, GateRef numArgs,
|
void BuiltinsArrayStubBuilder::Unshift(GateRef glue, GateRef thisValue, GateRef numArgs,
|
||||||
Variable *result, Label *exit, Label *slowPath)
|
Variable *result, Label *exit, Label *slowPath)
|
||||||
{
|
{
|
||||||
|
@ -67,6 +67,7 @@ namespace panda::ecmascript::kungfu {
|
|||||||
V(Keys, Object, Undefined())
|
V(Keys, Object, Undefined())
|
||||||
|
|
||||||
#define BUILTINS_WITH_ARRAY_STUB_BUILDER(V) \
|
#define BUILTINS_WITH_ARRAY_STUB_BUILDER(V) \
|
||||||
|
V(With, Array, Undefined()) \
|
||||||
V(Unshift, Array, Undefined()) \
|
V(Unshift, Array, Undefined()) \
|
||||||
V(Shift, Array, Undefined()) \
|
V(Shift, Array, Undefined()) \
|
||||||
V(Concat, Array, Undefined()) \
|
V(Concat, Array, Undefined()) \
|
||||||
|
@ -30,3 +30,12 @@ const arr2 = new Array(1025);
|
|||||||
for(let i = 0; i < 1025; i = i + 1)
|
for(let i = 0; i < 1025; i = i + 1)
|
||||||
arr2[i] = i;
|
arr2[i] = i;
|
||||||
const arr3 = arr2.with(0, 0);
|
const arr3 = arr2.with(0, 0);
|
||||||
|
|
||||||
|
var arr4 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
var arr5 = new Array();
|
||||||
|
for (let i = 0; i < 10; i++) arr5[i] = i;
|
||||||
|
|
||||||
|
var result1 = arr4.with(4, 100);
|
||||||
|
print(result1);
|
||||||
|
var result2 = arr5.with(4, 100);
|
||||||
|
print(result2);
|
||||||
|
@ -14,3 +14,5 @@
|
|||||||
2
|
2
|
||||||
2
|
2
|
||||||
1
|
1
|
||||||
|
0,1,2,3,100,5,6,7,8,9
|
||||||
|
0,1,2,3,100,5,6,7,8,9
|
||||||
|
Loading…
Reference in New Issue
Block a user