| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 1194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 | 1205 |
| 1206 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, | 1206 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, |
| 1207 Register function_template_info, | 1207 Register function_template_info, |
| 1208 Register scratch0, Register scratch1, | 1208 Register scratch0, Register scratch1, |
| 1209 Register scratch2, | 1209 Register scratch2, |
| 1210 Label* receiver_check_failed) { | 1210 Label* receiver_check_failed) { |
| 1211 Register signature = scratch0; | 1211 Register signature = scratch0; |
| 1212 Register map = scratch1; | 1212 Register map = scratch1; |
| 1213 Register constructor = scratch2; | 1213 Register constructor = scratch2; |
| 1214 | 1214 |
| 1215 // If the receiver is not an object, jump to receiver_check_failed. | |
| 1216 __ CompareObjectType(receiver, map, ip, FIRST_JS_OBJECT_TYPE); | |
| 1217 __ b(lo, receiver_check_failed); | |
| 1218 | |
| 1219 // If there is no signature, return the holder. | 1215 // If there is no signature, return the holder. |
| 1220 __ ldr(signature, FieldMemOperand(function_template_info, | 1216 __ ldr(signature, FieldMemOperand(function_template_info, |
| 1221 FunctionTemplateInfo::kSignatureOffset)); | 1217 FunctionTemplateInfo::kSignatureOffset)); |
| 1222 __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); | 1218 __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); |
| 1223 Label receiver_check_passed; | 1219 Label receiver_check_passed; |
| 1224 __ b(eq, &receiver_check_passed); | 1220 __ b(eq, &receiver_check_passed); |
| 1225 | 1221 |
| 1226 // Walk the prototype chain. | 1222 // Walk the prototype chain. |
| 1227 Label prototype_loop_start; | 1223 Label prototype_loop_start; |
| 1228 __ bind(&prototype_loop_start); | 1224 __ bind(&prototype_loop_start); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1277 // ----------- S t a t e ------------- | 1273 // ----------- S t a t e ------------- |
| 1278 // -- r0 : number of arguments excluding receiver | 1274 // -- r0 : number of arguments excluding receiver |
| 1279 // -- r1 : callee | 1275 // -- r1 : callee |
| 1280 // -- lr : return address | 1276 // -- lr : return address |
| 1281 // -- sp[0] : last argument | 1277 // -- sp[0] : last argument |
| 1282 // -- ... | 1278 // -- ... |
| 1283 // -- sp[4 * (argc - 1)] : first argument | 1279 // -- sp[4 * (argc - 1)] : first argument |
| 1284 // -- sp[4 * argc] : receiver | 1280 // -- sp[4 * argc] : receiver |
| 1285 // ----------------------------------- | 1281 // ----------------------------------- |
| 1286 | 1282 |
| 1287 // Load the receiver. | |
| 1288 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2)); | |
| 1289 | |
| 1290 // Update the receiver if this is a contextual call. | |
| 1291 Label set_global_proxy, valid_receiver; | |
| 1292 __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); | |
| 1293 __ b(eq, &set_global_proxy); | |
| 1294 __ bind(&valid_receiver); | |
| 1295 | |
| 1296 // Load the FunctionTemplateInfo. | 1283 // Load the FunctionTemplateInfo. |
| 1297 __ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 1284 __ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
| 1298 __ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kFunctionDataOffset)); | 1285 __ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kFunctionDataOffset)); |
| 1299 | 1286 |
| 1300 // Do the compatible receiver check. | 1287 // Do the compatible receiver check. |
| 1301 Label receiver_check_failed; | 1288 Label receiver_check_failed; |
| 1289 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 1302 CompatibleReceiverCheck(masm, r2, r3, r4, r5, r6, &receiver_check_failed); | 1290 CompatibleReceiverCheck(masm, r2, r3, r4, r5, r6, &receiver_check_failed); |
| 1303 | 1291 |
| 1304 // Get the callback offset from the FunctionTemplateInfo, and jump to the | 1292 // Get the callback offset from the FunctionTemplateInfo, and jump to the |
| 1305 // beginning of the code. | 1293 // beginning of the code. |
| 1306 __ ldr(r4, FieldMemOperand(r3, FunctionTemplateInfo::kCallCodeOffset)); | 1294 __ ldr(r4, FieldMemOperand(r3, FunctionTemplateInfo::kCallCodeOffset)); |
| 1307 __ ldr(r4, FieldMemOperand(r4, CallHandlerInfo::kFastHandlerOffset)); | 1295 __ ldr(r4, FieldMemOperand(r4, CallHandlerInfo::kFastHandlerOffset)); |
| 1308 __ add(r4, r4, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1296 __ add(r4, r4, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 1309 __ Jump(r4); | 1297 __ Jump(r4); |
| 1310 | 1298 |
| 1311 __ bind(&set_global_proxy); | |
| 1312 __ LoadGlobalProxy(r2); | |
| 1313 __ str(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2)); | |
| 1314 __ b(&valid_receiver); | |
| 1315 | |
| 1316 // Compatible receiver check failed: throw an Illegal Invocation exception. | 1299 // Compatible receiver check failed: throw an Illegal Invocation exception. |
| 1317 __ bind(&receiver_check_failed); | 1300 __ bind(&receiver_check_failed); |
| 1318 // Drop the arguments (including the receiver) | 1301 // Drop the arguments (including the receiver) |
| 1319 __ add(r0, r0, Operand(1)); | 1302 __ add(r0, r0, Operand(1)); |
| 1320 __ add(sp, sp, Operand(r0, LSL, kPointerSizeLog2)); | 1303 __ add(sp, sp, Operand(r0, LSL, kPointerSizeLog2)); |
| 1321 __ TailCallRuntime(Runtime::kThrowIllegalInvocation); | 1304 __ TailCallRuntime(Runtime::kThrowIllegalInvocation); |
| 1322 } | 1305 } |
| 1323 | 1306 |
| 1324 | 1307 |
| 1325 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { | 1308 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { |
| (...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2361 } | 2344 } |
| 2362 } | 2345 } |
| 2363 | 2346 |
| 2364 | 2347 |
| 2365 #undef __ | 2348 #undef __ |
| 2366 | 2349 |
| 2367 } // namespace internal | 2350 } // namespace internal |
| 2368 } // namespace v8 | 2351 } // namespace v8 |
| 2369 | 2352 |
| 2370 #endif // V8_TARGET_ARCH_ARM | 2353 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |