Handlify StubCompiler::CompileCallInitialize.

CallIC::GenerateInitialize and KeyedCallIC::GenerateInitialize are
verified safe for GC.

R=ulan@chromium.org
BUG=
TEST=

Review URL: http://codereview.chromium.org/8361028

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9733 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 171846db
......@@ -486,10 +486,10 @@ static void GenerateCallNormal(MacroAssembler* masm, int argc) {
}
static void GenerateCallMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_ic_state) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
......@@ -541,7 +541,7 @@ static void GenerateCallMiss(MacroAssembler* masm,
}
// Invoke the function.
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
CallKind call_kind = CallICBase::Contextual::decode(extra_state)
? CALL_AS_FUNCTION
: CALL_AS_METHOD;
ParameterCount actual(argc);
......@@ -553,18 +553,6 @@ static void GenerateCallMiss(MacroAssembler* masm,
}
void CallIC::GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kCallIC_Miss, extra_ic_state);
}
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
......@@ -591,16 +579,6 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- r2 : name
// -- lr : return address
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss, Code::kNoExtraICState);
}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- r2 : name
......
......@@ -969,10 +969,10 @@ static void GenerateCallNormal(MacroAssembler* masm, int argc) {
}
static void GenerateCallMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_ic_state) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
......@@ -1029,7 +1029,7 @@ static void GenerateCallMiss(MacroAssembler* masm,
}
// Invoke the function.
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
CallKind call_kind = CallICBase::Contextual::decode(extra_state)
? CALL_AS_FUNCTION
: CALL_AS_METHOD;
ParameterCount actual(argc);
......@@ -1074,21 +1074,6 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void CallIC::GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
// -- esp[(argc - n) * 4] : arg[n] (zero-based)
// -- ...
// -- esp[(argc + 1) * 4] : receiver
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kCallIC_Miss, extra_ic_state);
}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- ecx : name
......@@ -1259,19 +1244,6 @@ void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- ecx : name
// -- esp[0] : return address
// -- esp[(argc - n) * 4] : arg[n] (zero-based)
// -- ...
// -- esp[(argc + 1) * 4] : receiver
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss, Code::kNoExtraICState);
}
void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
// ----------- S t a t e -------------
// -- eax : receiver
......
......@@ -198,11 +198,6 @@ class CallICBase: public IC {
class Contextual: public BitField<bool, 0, 1> {};
class StringStubState: public BitField<StringStubFeedback, 1, 1> {};
protected:
CallICBase(Code::Kind kind, Isolate* isolate)
: IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
public:
// Returns a JSFunction or a Failure.
MUST_USE_RESULT MaybeObject* LoadFunction(State state,
Code::ExtraICState extra_ic_state,
......@@ -210,7 +205,8 @@ class CallICBase: public IC {
Handle<String> name);
protected:
Code::Kind kind_;
CallICBase(Code::Kind kind, Isolate* isolate)
: IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
bool TryUpdateExtraICState(LookupResult* lookup,
Handle<Object> object,
......@@ -240,6 +236,14 @@ class CallICBase: public IC {
static void Clear(Address address, Code* target);
// Platform-specific generation of misses for call and keyed call.
static void GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state);
Code::Kind kind_;
friend class IC;
};
......@@ -253,15 +257,20 @@ class CallIC: public CallICBase {
// Code generator routines.
static void GenerateInitialize(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
GenerateMiss(masm, argc, extra_ic_state);
Code::ExtraICState extra_state) {
GenerateMiss(masm, argc, extra_state);
}
static void GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state);
Code::ExtraICState extra_state) {
CallICBase::GenerateMiss(masm, argc, IC::kCallIC_Miss, extra_state);
}
static void GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state);
static void GenerateNormal(MacroAssembler* masm, int argc);
};
......@@ -281,7 +290,12 @@ class KeyedCallIC: public CallICBase {
static void GenerateInitialize(MacroAssembler* masm, int argc) {
GenerateMiss(masm, argc);
}
static void GenerateMiss(MacroAssembler* masm, int argc);
static void GenerateMiss(MacroAssembler* masm, int argc) {
CallICBase::GenerateMiss(masm, argc, IC::kKeyedCallIC_Miss,
Code::kNoExtraICState);
}
static void GenerateMegamorphic(MacroAssembler* masm, int argc);
static void GenerateNormal(MacroAssembler* masm, int argc);
static void GenerateNonStrictArguments(MacroAssembler* masm, int argc);
......
......@@ -486,10 +486,10 @@ static void GenerateCallNormal(MacroAssembler* masm, int argc) {
}
static void GenerateCallMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_ic_state) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
......@@ -540,7 +540,7 @@ static void GenerateCallMiss(MacroAssembler* masm,
__ bind(&invoke);
}
// Invoke the function.
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
CallKind call_kind = CallICBase::Contextual::decode(extra_state)
? CALL_AS_FUNCTION
: CALL_AS_METHOD;
ParameterCount actual(argc);
......@@ -552,18 +552,6 @@ static void GenerateCallMiss(MacroAssembler* masm,
}
void CallIC::GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kCallIC_Miss, extra_ic_state);
}
void CallIC::GenerateMegamorphic(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
......@@ -590,16 +578,6 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- a2 : name
// -- ra : return address
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss, Code::kNoExtraICState);
}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// -- a2 : name
......
......@@ -1402,14 +1402,6 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor) {
Handle<Code> StubCompiler::CompileCallInitialize(Code::Flags flags) {
CALL_HEAP_FUNCTION(isolate(),
(set_failure(NULL), TryCompileCallInitialize(flags)),
Code);
}
MaybeObject* StubCompiler::TryCompileCallInitialize(Code::Flags flags) {
HandleScope scope(isolate());
int argc = Code::ExtractArgumentsCountFromFlags(flags);
Code::Kind kind = Code::ExtractKindFromFlags(flags);
Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags);
......@@ -1418,19 +1410,13 @@ MaybeObject* StubCompiler::TryCompileCallInitialize(Code::Flags flags) {
} else {
KeyedCallIC::GenerateInitialize(masm(), argc);
}
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallInitialize");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
Handle<Code> code = GetCodeWithFlags(flags, "CompileCallInitialize");
isolate()->counters()->call_initialize_stubs()->Increment();
Code* code = Code::cast(result);
USE(code);
PROFILE(isolate(),
CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG),
code, code->arguments_count()));
GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code)));
return result;
*code, code->arguments_count()));
GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, *code));
return code;
}
......@@ -1455,7 +1441,7 @@ MaybeObject* StubCompiler::TryCompileCallPreMonomorphic(Code::Flags flags) {
}
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallPreMonomorphic");
TryGetCodeWithFlags(flags, "CompileCallPreMonomorphic");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
isolate()->counters()->call_premonomorphic_stubs()->Increment();
......@@ -1489,7 +1475,7 @@ MaybeObject* StubCompiler::TryCompileCallNormal(Code::Flags flags) {
KeyedCallIC::GenerateNormal(masm(), argc);
}
Object* result;
{ MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal");
{ MaybeObject* maybe_result = TryGetCodeWithFlags(flags, "CompileCallNormal");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
isolate()->counters()->call_normal_stubs()->Increment();
......@@ -1522,7 +1508,7 @@ MaybeObject* StubCompiler::TryCompileCallMegamorphic(Code::Flags flags) {
}
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallMegamorphic");
TryGetCodeWithFlags(flags, "CompileCallMegamorphic");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
isolate()->counters()->call_megamorphic_stubs()->Increment();
......@@ -1550,7 +1536,7 @@ MaybeObject* StubCompiler::TryCompileCallArguments(Code::Flags flags) {
Code::Kind kind = Code::ExtractKindFromFlags(flags);
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallArguments");
TryGetCodeWithFlags(flags, "CompileCallArguments");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
Code* code = Code::cast(result);
......@@ -1581,7 +1567,7 @@ MaybeObject* StubCompiler::TryCompileCallMiss(Code::Flags flags) {
KeyedCallIC::GenerateMiss(masm(), argc);
}
Object* result;
{ MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss");
{ MaybeObject* maybe_result = TryGetCodeWithFlags(flags, "CompileCallMiss");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
isolate()->counters()->call_megamorphic_stubs()->Increment();
......@@ -1608,7 +1594,7 @@ MaybeObject* StubCompiler::TryCompileCallDebugBreak(Code::Flags flags) {
Debug::GenerateCallICDebugBreak(masm());
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallDebugBreak");
TryGetCodeWithFlags(flags, "CompileCallDebugBreak");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
Code* code = Code::cast(result);
......@@ -1644,7 +1630,7 @@ MaybeObject* StubCompiler::TryCompileCallDebugPrepareStepIn(Code::Flags flags) {
}
Object* result;
{ MaybeObject* maybe_result =
GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn");
TryGetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
Code* code = Code::cast(result);
......@@ -1660,8 +1646,21 @@ MaybeObject* StubCompiler::TryCompileCallDebugPrepareStepIn(Code::Flags flags) {
#undef CALL_LOGGER_TAG
MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags,
Handle<Code> StubCompiler::GetCodeWithFlags(Code::Flags flags,
const char* name) {
// Create code object in the heap.
CodeDesc desc;
masm_.GetCode(&desc);
Handle<Code> code = factory()->NewCode(desc, flags, masm_.CodeObject());
#ifdef ENABLE_DISASSEMBLER
if (FLAG_print_code_stubs) code->Disassemble(name);
#endif
return code;
}
MaybeObject* StubCompiler::TryGetCodeWithFlags(Code::Flags flags,
const char* name) {
// Check for allocation failures during stub compilation.
if (failure_->IsFailure()) return failure_;
......@@ -1678,11 +1677,12 @@ MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags,
}
MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) {
MaybeObject* StubCompiler::TryGetCodeWithFlags(Code::Flags flags,
String* name) {
if (FLAG_print_code_stubs && (name != NULL)) {
return GetCodeWithFlags(flags, *name->ToCString());
return TryGetCodeWithFlags(flags, *name->ToCString());
}
return GetCodeWithFlags(flags, reinterpret_cast<char*>(NULL));
return TryGetCodeWithFlags(flags, reinterpret_cast<char*>(NULL));
}
......@@ -1703,7 +1703,7 @@ void StubCompiler::LookupPostInterceptor(JSObject* holder,
MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) {
Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type);
MaybeObject* result = GetCodeWithFlags(flags, name);
MaybeObject* result = TryGetCodeWithFlags(flags, name);
if (!result->IsFailure()) {
PROFILE(isolate(),
CodeCreateEvent(Logger::LOAD_IC_TAG,
......@@ -1722,7 +1722,7 @@ MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type,
InlineCacheState state) {
Code::Flags flags = Code::ComputeFlags(
Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type);
MaybeObject* result = GetCodeWithFlags(flags, name);
MaybeObject* result = TryGetCodeWithFlags(flags, name);
if (!result->IsFailure()) {
PROFILE(isolate(),
CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG,
......@@ -1739,7 +1739,7 @@ MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type,
MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) {
Code::Flags flags =
Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_);
MaybeObject* result = GetCodeWithFlags(flags, name);
MaybeObject* result = TryGetCodeWithFlags(flags, name);
if (!result->IsFailure()) {
PROFILE(isolate(),
CodeCreateEvent(Logger::STORE_IC_TAG,
......@@ -1758,7 +1758,7 @@ MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type,
InlineCacheState state) {
Code::Flags flags =
Code::ComputeFlags(Code::KEYED_STORE_IC, state, strict_mode_, type);
MaybeObject* result = GetCodeWithFlags(flags, name);
MaybeObject* result = TryGetCodeWithFlags(flags, name);
if (!result->IsFailure()) {
PROFILE(isolate(),
CodeCreateEvent(Logger::KEYED_STORE_IC_TAG,
......@@ -1846,7 +1846,7 @@ MaybeObject* CallStubCompiler::GetCode(PropertyType type, String* name) {
extra_state_,
cache_holder_,
argc);
return GetCodeWithFlags(flags, name);
return TryGetCodeWithFlags(flags, name);
}
......@@ -1862,7 +1862,7 @@ MaybeObject* CallStubCompiler::GetCode(JSFunction* function) {
MaybeObject* ConstructStubCompiler::GetCode() {
Code::Flags flags = Code::ComputeFlags(Code::STUB);
Object* result;
{ MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub");
{ MaybeObject* maybe_result = TryGetCodeWithFlags(flags, "ConstructStub");
if (!maybe_result->ToObject(&result)) return maybe_result;
}
Code* code = Code::cast(result);
......
......@@ -378,35 +378,32 @@ DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty);
DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor);
// The stub compiler compiles stubs for the stub cache.
// The stub compilers compile stubs for the stub cache.
class StubCompiler BASE_EMBEDDED {
public:
explicit StubCompiler(Isolate* isolate)
: isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { }
// Functions to compile either CallIC or KeyedCallIC. The specific kind
// is extracted from the code flags.
Handle<Code> CompileCallInitialize(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallInitialize(Code::Flags flags);
Handle<Code> CompileCallPreMonomorphic(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallPreMonomorphic(Code::Flags flags);
Handle<Code> CompileCallNormal(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallNormal(Code::Flags flags);
Handle<Code> CompileCallMegamorphic(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallMegamorphic(Code::Flags flags);
Handle<Code> CompileCallArguments(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallArguments(Code::Flags flags);
Handle<Code> CompileCallMiss(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallPreMonomorphic(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallNormal(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallMegamorphic(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallArguments(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallMiss(Code::Flags flags);
#ifdef ENABLE_DEBUGGER_SUPPORT
Handle<Code> CompileCallDebugBreak(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallDebugBreak(Code::Flags flags);
Handle<Code> CompileCallDebugPrepareStepIn(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallDebugBreak(Code::Flags flags);
MUST_USE_RESULT MaybeObject* TryCompileCallDebugPrepareStepIn(
Code::Flags flags);
#endif
......@@ -502,8 +499,12 @@ class StubCompiler BASE_EMBEDDED {
Label* miss);
protected:
MaybeObject* GetCodeWithFlags(Code::Flags flags, const char* name);
MaybeObject* GetCodeWithFlags(Code::Flags flags, String* name);
Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name);
MUST_USE_RESULT MaybeObject* TryGetCodeWithFlags(Code::Flags flags,
const char* name);
MUST_USE_RESULT MaybeObject* TryGetCodeWithFlags(Code::Flags flags,
String* name);
MacroAssembler* masm() { return &masm_; }
void set_failure(Failure* failure) { failure_ = failure; }
......
......@@ -848,10 +848,10 @@ static void GenerateCallNormal(MacroAssembler* masm, int argc) {
}
static void GenerateCallMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_ic_state) {
void CallICBase::GenerateMiss(MacroAssembler* masm,
int argc,
IC::UtilityId id,
Code::ExtraICState extra_state) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
......@@ -909,7 +909,7 @@ static void GenerateCallMiss(MacroAssembler* masm,
}
// Invoke the function.
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
CallKind call_kind = CallICBase::Contextual::decode(extra_state)
? CALL_AS_FUNCTION
: CALL_AS_METHOD;
ParameterCount actual(argc);
......@@ -957,23 +957,6 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void CallIC::GenerateMiss(MacroAssembler* masm,
int argc,
Code::ExtraICState extra_ic_state) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
// rsp[8] : argument argc
// rsp[16] : argument argc - 1
// ...
// rsp[argc * 8] : argument 1
// rsp[(argc + 1) * 8] : argument 0 = receiver
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kCallIC_Miss, extra_ic_state);
}
void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// rcx : function name
......@@ -1107,21 +1090,6 @@ void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) {
}
void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) {
// ----------- S t a t e -------------
// rcx : function name
// rsp[0] : return address
// rsp[8] : argument argc
// rsp[16] : argument argc - 1
// ...
// rsp[argc * 8] : argument 1
// rsp[(argc + 1) * 8] : argument 0 = receiver
// -----------------------------------
GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss, Code::kNoExtraICState);
}
static Operand GenerateMappedArgumentsLookup(MacroAssembler* masm,
Register object,
Register key,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment