📄 stub-cache-arm.cc.svn-base
字号:
__ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset)); __ cmp(r1, Operand(Handle<Map>(object->map()))); __ b(ne, &miss); // Perform global security token check if needed. if (object->IsJSGlobalObject()) { __ CheckAccessGlobal(r3, r1, &miss); } // Stub never generated for non-global objects that require access // checks. ASSERT(object->IsJSGlobalObject() || !object->IsAccessCheckNeeded()); // Get the properties array __ ldr(r1, FieldMemOperand(r3, JSObject::kPropertiesOffset)); // Perform map transition for the receiver if necessary. if (transition != NULL) { // Update the map of the object; no write barrier updating is // needed because the map is never in new space. __ mov(ip, Operand(Handle<Map>(transition))); __ str(ip, FieldMemOperand(r3, HeapObject::kMapOffset)); } // Write to the properties array. int offset = index * kPointerSize + Array::kHeaderSize; __ str(r0, FieldMemOperand(r1, offset)); // Skip updating write barrier if storing a smi. __ tst(r0, Operand(kSmiTagMask)); __ b(eq, &exit); // Update the write barrier for the array address. __ mov(r3, Operand(offset)); __ RecordWrite(r1, r3, r2); // OK to clobber r2, since we return // Return the value (register r0). __ bind(&exit); __ Ret(); // Handle store cache miss. __ bind(&miss); __ mov(r2, Operand(Handle<String>(name))); // restore name Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(transition == NULL ? FIELD : MAP_TRANSITION);}Object* StoreStubCompiler::CompileStoreCallback(JSObject* object, AccessorInfo* callback, String* name) { // ----------- S t a t e ------------- // -- r0 : value // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; // Get the object from the stack. __ ldr(r3, MemOperand(sp, 0 * kPointerSize)); // Check that the object isn't a smi. __ tst(r3, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the map of the object hasn't changed. __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset)); __ cmp(r1, Operand(Handle<Map>(object->map()))); __ b(ne, &miss); // Perform global security token check if needed. if (object->IsJSGlobalObject()) { __ CheckAccessGlobal(r3, r1, &miss); } // Stub never generated for non-global objects that require access // checks. ASSERT(object->IsJSGlobalObject() || !object->IsAccessCheckNeeded()); __ ldr(ip, MemOperand(sp)); // receiver __ push(ip); __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback info __ push(ip); __ push(r2); // name __ push(r0); // value // Do tail-call to the runtime system. ExternalReference store_callback_property = ExternalReference(IC_Utility(IC::kStoreCallbackProperty)); __ TailCallRuntime(store_callback_property, 4); // Handle store cache miss. __ bind(&miss); __ mov(r2, Operand(Handle<String>(name))); // restore name Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(CALLBACKS);}Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, String* name) { // ----------- S t a t e ------------- // -- r0 : value // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; // Get the object from the stack. __ ldr(r3, MemOperand(sp, 0 * kPointerSize)); // Check that the object isn't a smi. __ tst(r3, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the map of the object hasn't changed. __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset)); __ cmp(r1, Operand(Handle<Map>(receiver->map()))); __ b(ne, &miss); // Perform global security token check if needed. if (receiver->IsJSGlobalObject()) { __ CheckAccessGlobal(r3, r1, &miss); } // Stub never generated for non-global objects that require access // checks. ASSERT(receiver->IsJSGlobalObject() || !receiver->IsAccessCheckNeeded()); __ ldr(ip, MemOperand(sp)); // receiver __ push(ip); __ push(r2); // name __ push(r0); // value // Do tail-call to the runtime system. ExternalReference store_ic_property = ExternalReference(IC_Utility(IC::kStoreInterceptorProperty)); __ TailCallRuntime(store_ic_property, 3); // Handle store cache miss. __ bind(&miss); __ mov(r2, Operand(Handle<String>(name))); // restore name Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(INTERCEPTOR);}Object* LoadStubCompiler::CompileLoadField(JSObject* object, JSObject* holder, int index) { // ----------- S t a t e ------------- // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; __ ldr(r0, MemOperand(sp, 0)); // Check that the receiver isn't a smi. __ tst(r0, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the maps haven't changed. Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); // Get the properties array of the holder. __ ldr(r3, FieldMemOperand(reg, JSObject::kPropertiesOffset)); // Return the value from the properties array. int offset = index * kPointerSize + Array::kHeaderSize; __ ldr(r0, FieldMemOperand(r3, offset)); __ Ret(); // Handle load cache miss. __ bind(&miss); __ ldr(r0, MemOperand(sp)); // restore receiver Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(FIELD);}Object* LoadStubCompiler::CompileLoadCallback(JSObject* object, JSObject* holder, AccessorInfo* callback) { // ----------- S t a t e ------------- // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; __ ldr(r0, MemOperand(sp, 0)); // Check that the receiver isn't a smi. __ tst(r0, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the maps haven't changed. Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); // Push the arguments on the JS stack of the caller. __ push(r0); // receiver __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback data __ push(ip); __ push(r2); // name __ push(reg); // holder // Do tail-call to the runtime system. ExternalReference load_callback_property = ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); __ TailCallRuntime(load_callback_property, 4); // Handle load cache miss. __ bind(&miss); Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(CALLBACKS);}Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, JSObject* holder, Object* value) { // ----------- S t a t e ------------- // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; __ ldr(r0, MemOperand(sp, 0)); // Check that the receiver isn't a smi. __ tst(r0, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the maps haven't changed. Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); // Return the constant value. __ mov(r0, Operand(Handle<Object>(value))); __ Ret(); // Handle load cache miss. __ bind(&miss); Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(CONSTANT_FUNCTION);}Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object, JSObject* holder, String* name) { // ----------- S t a t e ------------- // -- r2 : name // -- lr : return address // -- [sp] : receiver // ----------------------------------- HandleScope scope; Label miss; __ ldr(r0, MemOperand(sp, 0)); // Check that the receiver isn't a smi. __ tst(r0, Operand(kSmiTagMask)); __ b(eq, &miss); // Check that the maps haven't changed. Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); // Push the arguments on the JS stack of the caller. __ push(r0); // receiver __ push(reg); // holder __ push(r2); // name // Do tail-call to the runtime system. ExternalReference load_ic_property = ExternalReference(IC_Utility(IC::kLoadInterceptorProperty)); __ TailCallRuntime(load_ic_property, 3); // Handle load cache miss. __ bind(&miss); Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); __ Jump(ic, RelocInfo::CODE_TARGET); // Return the generated code. return GetCode(INTERCEPTOR);}// TODO(1224671): IC stubs for keyed loads have not been implemented// for ARM.Object* KeyedLoadStubCompiler::CompileLoadField(String* name, JSObject* receiver, JSObject* holder, int index) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, JSObject* receiver, JSObject* holder, AccessorInfo* callback) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, JSObject* receiver, JSObject* holder, Object* value) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, JSObject* holder, String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadShortStringLength(String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadMediumStringLength(String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadLongStringLength(String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, int index, Map* transition, String* name) { UNIMPLEMENTED(); return Heap::undefined_value();}#undef __} } // namespace v8::internal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -