⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stub-cache-arm.cc.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
  __ 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 + -