mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
Reason:fix number ic
Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I9JBVX?from=project-issue Signed-off-by: wupengyong <wupengyong@huawei.com> Change-Id: I71f023725deef598fad97c48d2a1aba2621df0eb
This commit is contained in:
parent
6f2d77f581
commit
da962744ca
@ -74,8 +74,9 @@ void ICStubBuilder::NamedICAccessor(Variable* cachedHandler, Label *tryICHandler
|
||||
GateRef glueGlobalEnv = Load(VariableType::NATIVE_POINTER(), glue_, glueGlobalEnvOffset);
|
||||
auto numberFunction = GetGlobalEnvValue(VariableType::JS_ANY(),
|
||||
glueGlobalEnv, GlobalEnv::NUMBER_FUNCTION_INDEX);
|
||||
GateRef hclass = LoadHClass(numberFunction);
|
||||
BRANCH(BoolAnd(TaggedIsHeapObject(firstValue), Equal(LoadObjectFromWeakRef(firstValue), hclass)),
|
||||
GateRef ctorProtoOrHC =
|
||||
Load(VariableType::JS_POINTER(), numberFunction, IntPtr(JSFunction::PROTO_OR_DYNCLASS_OFFSET));
|
||||
BRANCH(BoolAnd(TaggedIsHeapObject(firstValue), Equal(LoadObjectFromWeakRef(firstValue), ctorProtoOrHC)),
|
||||
tryICHandler, slowPath_);
|
||||
}
|
||||
}
|
||||
@ -147,29 +148,15 @@ void ICStubBuilder::LoadICByName(
|
||||
{
|
||||
auto env = GetEnvironment();
|
||||
Label loadWithHandler(env);
|
||||
Label isNumber(env);
|
||||
Label notNumber(env);
|
||||
|
||||
SetLabels(tryFastPath, slowPath, success);
|
||||
DEFVARIABLE(cachedHandler, VariableType::JS_ANY(), Undefined());
|
||||
NamedICAccessor(&cachedHandler, &loadWithHandler);
|
||||
Bind(&loadWithHandler);
|
||||
{
|
||||
BRANCH(TaggedIsNumber(receiver_), &isNumber, ¬Number);
|
||||
Bind(&isNumber);
|
||||
{
|
||||
GateRef primitive = NewJSPrimitiveRef(glue_, GlobalEnv::NUMBER_FUNCTION_INDEX, receiver_);
|
||||
GateRef ret = LoadICWithHandler(glue_, primitive, primitive, *cachedHandler, callback);
|
||||
result->WriteVariable(ret);
|
||||
BRANCH(TaggedIsHole(ret), slowPath_, success_);
|
||||
}
|
||||
Bind(¬Number);
|
||||
{
|
||||
GateRef ret = LoadICWithHandler(glue_, receiver_, receiver_, *cachedHandler, callback);
|
||||
result->WriteVariable(ret);
|
||||
BRANCH(TaggedIsHole(ret), slowPath_, success_);
|
||||
}
|
||||
|
||||
GateRef ret = LoadICWithHandler(glue_, receiver_, receiver_, *cachedHandler, callback);
|
||||
result->WriteVariable(ret);
|
||||
BRANCH(TaggedIsHole(ret), slowPath_, success_);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -387,7 +387,6 @@ GateRef StubBuilder::BinarySearch(GateRef glue, GateRef layoutInfo, GateRef key,
|
||||
BRANCH(Int32LessThanOrEqual(*low, *high), &next, &exit);
|
||||
Bind(&next);
|
||||
mid = Int32Add(*low, Int32Div(Int32Sub(*high, *low), Int32(2))); // 2: half
|
||||
DebugPrint(glue, { Int32(GET_MESSAGE_STRING_ID(INT32_VALUE)), *mid });
|
||||
GateRef midKey = GetSortedKey(layoutInfo, *mid);
|
||||
GateRef midHash = GetKeyHashCode(glue, midKey);
|
||||
BRANCH(Int32UnsignedGreaterThan(midHash, keyHash), &midGreaterKey, &midnotGreaterKey);
|
||||
|
@ -98,12 +98,11 @@ ARK_INLINE JSTaggedValue ICRuntimeStub::TryLoadICByName(JSThread *thread, JSTagg
|
||||
return LoadICWithHandler(thread, receiver, receiver, cachedHandler);
|
||||
}
|
||||
} else if (receiver.IsNumber()) {
|
||||
auto factory = thread->GetEcmaVM()->GetFactory();
|
||||
JSHandle<JSTaggedValue> handler = JSHandle<JSTaggedValue>(thread, secondValue);
|
||||
JSHandle<JSPrimitiveRef> primitive =
|
||||
factory->NewJSPrimitiveRef(PrimitiveType::PRIMITIVE_NUMBER, JSHandle<JSTaggedValue>(thread, receiver));
|
||||
JSTaggedValue primitiveValue = primitive.GetTaggedValue();
|
||||
return LoadICWithHandler(thread, primitiveValue, primitiveValue, handler.GetTaggedValue());
|
||||
JSHandle<JSFunction> function(thread->GetEcmaVM()->GetGlobalEnv()->GetNumberFunction());
|
||||
auto hclass = reinterpret_cast<JSHClass *>(function->GetProtoOrHClass().GetTaggedObject());
|
||||
if (firstValue.GetWeakReferentUnChecked() == hclass) {
|
||||
return LoadICWithHandler(thread, receiver, receiver, secondValue);
|
||||
}
|
||||
}
|
||||
return JSTaggedValue::Hole();
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "ecmascript/js_array.h"
|
||||
#include "ecmascript/js_object.h"
|
||||
#include "ecmascript/js_tagged_value.h"
|
||||
#include "ecmascript/object_operator.h"
|
||||
#include "ecmascript/tests/test_helper.h"
|
||||
|
||||
using namespace panda::ecmascript;
|
||||
@ -235,6 +236,18 @@ HWTEST_F_L0(ICRuntimeStubTest, TryStoreICAndLoadIC_ByName)
|
||||
JSTaggedValue resultValue2 = ICRuntimeStub::TryLoadICByName(thread, handleObj.GetTaggedValue(),
|
||||
handleFirstArrVal, handleSecondPropertyBoxVal);
|
||||
EXPECT_TRUE(resultValue2.IsHole());
|
||||
// receiver is number
|
||||
int a = 32;
|
||||
JSHandle<JSTaggedValue> numReceiver(thread, JSTaggedValue(a));
|
||||
JSHandle<JSTaggedValue> receiver =
|
||||
JSHandle<JSTaggedValue>::Cast(factory->NewJSPrimitiveRef(PrimitiveType::PRIMITIVE_NUMBER, numReceiver));
|
||||
JSHandle<JSHClass> hclass(thread, receiver->GetTaggedObject()->GetClass());
|
||||
JSHandle<JSTaggedValue> key = thread->GlobalConstants()->GetHandledValueOfString();
|
||||
ObjectOperator op(thread, numReceiver, key);
|
||||
JSHandle<JSTaggedValue> handlerValue = PrototypeHandler::LoadPrototype(thread, op, hclass);
|
||||
JSTaggedValue resultValue3 = ICRuntimeStub::TryLoadICByName(thread, numReceiver.GetTaggedValue(),
|
||||
hclass.GetTaggedValue(), handlerValue.GetTaggedValue());
|
||||
EXPECT_EQ(op.GetValue(), resultValue3);
|
||||
}
|
||||
|
||||
HWTEST_F_L0(ICRuntimeStubTest, TryStoreICAndLoadIC_ByValue1)
|
||||
|
@ -14,3 +14,4 @@
|
||||
primitiveic load success
|
||||
load ic by name test2 success!
|
||||
load Number ic by name success!
|
||||
load Number ic by name success1!
|
||||
|
@ -83,3 +83,15 @@ for (let i = 0; i < 100; i++) {
|
||||
f(Number, 1);
|
||||
}
|
||||
print("load Number ic by name success!")
|
||||
|
||||
function f(a, b) {
|
||||
a.valueOf();
|
||||
}
|
||||
|
||||
for (let i = 0; i < 100; i++) {
|
||||
f(Number.prototype, 1);
|
||||
}
|
||||
for (let i = 0; i < 100; i++) {
|
||||
f(120, 1);
|
||||
}
|
||||
print("load Number ic by name success1!")
|
||||
|
Loading…
Reference in New Issue
Block a user