OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 __ SmiUntag(r0); | 1082 __ SmiUntag(r0); |
1083 | 1083 |
1084 // Exit the internal frame. | 1084 // Exit the internal frame. |
1085 } | 1085 } |
1086 | 1086 |
1087 // Restore the function to r1, and the flag to r4. | 1087 // Restore the function to r1, and the flag to r4. |
1088 __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); | 1088 __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
1089 __ mov(r4, Operand::Zero()); | 1089 __ mov(r4, Operand::Zero()); |
1090 __ jmp(&patch_receiver); | 1090 __ jmp(&patch_receiver); |
1091 | 1091 |
1092 // Use the global receiver object from the called function as the | |
1093 // receiver. | |
1094 __ bind(&use_global_receiver); | 1092 __ bind(&use_global_receiver); |
1095 __ ldr(r2, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); | 1093 __ ldr(r2, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); |
1096 __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalReceiverOffset)); | 1094 __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalReceiverOffset)); |
1097 | 1095 |
1098 __ bind(&patch_receiver); | 1096 __ bind(&patch_receiver); |
1099 __ add(r3, sp, Operand(r0, LSL, kPointerSizeLog2)); | 1097 __ add(r3, sp, Operand(r0, LSL, kPointerSizeLog2)); |
1100 __ str(r2, MemOperand(r3, -kPointerSize)); | 1098 __ str(r2, MemOperand(r3, -kPointerSize)); |
1101 | 1099 |
1102 __ jmp(&shift_arguments); | 1100 __ jmp(&shift_arguments); |
1103 } | 1101 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 // 5b. Get the code to call from the function and check that the number of | 1171 // 5b. Get the code to call from the function and check that the number of |
1174 // expected arguments matches what we're providing. If so, jump | 1172 // expected arguments matches what we're providing. If so, jump |
1175 // (tail-call) to the code in register edx without checking arguments. | 1173 // (tail-call) to the code in register edx without checking arguments. |
1176 // r0: actual number of arguments | 1174 // r0: actual number of arguments |
1177 // r1: function | 1175 // r1: function |
1178 __ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 1176 __ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
1179 __ ldr(r2, | 1177 __ ldr(r2, |
1180 FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); | 1178 FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); |
1181 __ SmiUntag(r2); | 1179 __ SmiUntag(r2); |
1182 __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); | 1180 __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset)); |
1183 __ SetCallKind(r5, CALL_AS_METHOD); | 1181 __ SetCallKind(r5, CALL_AS_FUNCTION); |
1184 __ cmp(r2, r0); // Check formal and actual parameter counts. | 1182 __ cmp(r2, r0); // Check formal and actual parameter counts. |
1185 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 1183 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
1186 RelocInfo::CODE_TARGET, | 1184 RelocInfo::CODE_TARGET, |
1187 ne); | 1185 ne); |
1188 | 1186 |
1189 ParameterCount expected(0); | 1187 ParameterCount expected(0); |
1190 __ InvokeCode(r3, expected, expected, JUMP_FUNCTION, | 1188 __ InvokeCode(r3, expected, expected, JUMP_FUNCTION, |
1191 NullCallWrapper(), CALL_AS_METHOD); | 1189 NullCallWrapper(), CALL_AS_FUNCTION); |
1192 } | 1190 } |
1193 | 1191 |
1194 | 1192 |
1195 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { | 1193 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
1196 const int kIndexOffset = | 1194 const int kIndexOffset = |
1197 StandardFrameConstants::kExpressionsOffset - (2 * kPointerSize); | 1195 StandardFrameConstants::kExpressionsOffset - (2 * kPointerSize); |
1198 const int kLimitOffset = | 1196 const int kLimitOffset = |
1199 StandardFrameConstants::kExpressionsOffset - (1 * kPointerSize); | 1197 StandardFrameConstants::kExpressionsOffset - (1 * kPointerSize); |
1200 const int kArgsOffset = 2 * kPointerSize; | 1198 const int kArgsOffset = 2 * kPointerSize; |
1201 const int kRecvOffset = 3 * kPointerSize; | 1199 const int kRecvOffset = 3 * kPointerSize; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1275 __ CompareObjectType(r0, r1, r1, FIRST_SPEC_OBJECT_TYPE); | 1273 __ CompareObjectType(r0, r1, r1, FIRST_SPEC_OBJECT_TYPE); |
1276 __ b(ge, &push_receiver); | 1274 __ b(ge, &push_receiver); |
1277 | 1275 |
1278 // Convert the receiver to a regular object. | 1276 // Convert the receiver to a regular object. |
1279 // r0: receiver | 1277 // r0: receiver |
1280 __ bind(&call_to_object); | 1278 __ bind(&call_to_object); |
1281 __ push(r0); | 1279 __ push(r0); |
1282 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); | 1280 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); |
1283 __ b(&push_receiver); | 1281 __ b(&push_receiver); |
1284 | 1282 |
1285 // Use the current global receiver object as the receiver. | |
1286 __ bind(&use_global_receiver); | 1283 __ bind(&use_global_receiver); |
1287 __ ldr(r0, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); | 1284 __ ldr(r0, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX)); |
1288 __ ldr(r0, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset)); | 1285 __ ldr(r0, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset)); |
1289 | 1286 |
1290 // Push the receiver. | 1287 // Push the receiver. |
1291 // r0: receiver | 1288 // r0: receiver |
1292 __ bind(&push_receiver); | 1289 __ bind(&push_receiver); |
1293 __ push(r0); | 1290 __ push(r0); |
1294 | 1291 |
1295 // Copy all arguments from the array to the stack. | 1292 // Copy all arguments from the array to the stack. |
(...skipping 17 matching lines...) Expand all Loading... |
1313 __ add(r0, r0, Operand(1 << kSmiTagSize)); | 1310 __ add(r0, r0, Operand(1 << kSmiTagSize)); |
1314 __ str(r0, MemOperand(fp, kIndexOffset)); | 1311 __ str(r0, MemOperand(fp, kIndexOffset)); |
1315 | 1312 |
1316 // Test if the copy loop has finished copying all the elements from the | 1313 // Test if the copy loop has finished copying all the elements from the |
1317 // arguments object. | 1314 // arguments object. |
1318 __ bind(&entry); | 1315 __ bind(&entry); |
1319 __ ldr(r1, MemOperand(fp, kLimitOffset)); | 1316 __ ldr(r1, MemOperand(fp, kLimitOffset)); |
1320 __ cmp(r0, r1); | 1317 __ cmp(r0, r1); |
1321 __ b(ne, &loop); | 1318 __ b(ne, &loop); |
1322 | 1319 |
1323 // Invoke the function. | 1320 // Call the function. |
1324 Label call_proxy; | 1321 Label call_proxy; |
1325 ParameterCount actual(r0); | 1322 ParameterCount actual(r0); |
1326 __ SmiUntag(r0); | 1323 __ SmiUntag(r0); |
1327 __ ldr(r1, MemOperand(fp, kFunctionOffset)); | 1324 __ ldr(r1, MemOperand(fp, kFunctionOffset)); |
1328 __ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE); | 1325 __ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE); |
1329 __ b(ne, &call_proxy); | 1326 __ b(ne, &call_proxy); |
1330 __ InvokeFunction(r1, actual, CALL_FUNCTION, | 1327 __ InvokeFunction(r1, actual, CALL_FUNCTION, |
1331 NullCallWrapper(), CALL_AS_METHOD); | 1328 NullCallWrapper(), CALL_AS_FUNCTION); |
1332 | 1329 |
1333 frame_scope.GenerateLeaveFrame(); | 1330 frame_scope.GenerateLeaveFrame(); |
1334 __ add(sp, sp, Operand(3 * kPointerSize)); | 1331 __ add(sp, sp, Operand(3 * kPointerSize)); |
1335 __ Jump(lr); | 1332 __ Jump(lr); |
1336 | 1333 |
1337 // Invoke the function proxy. | 1334 // Call the function proxy. |
1338 __ bind(&call_proxy); | 1335 __ bind(&call_proxy); |
1339 __ push(r1); // add function proxy as last argument | 1336 __ push(r1); // add function proxy as last argument |
1340 __ add(r0, r0, Operand(1)); | 1337 __ add(r0, r0, Operand(1)); |
1341 __ mov(r2, Operand::Zero()); | 1338 __ mov(r2, Operand::Zero()); |
1342 __ SetCallKind(r5, CALL_AS_METHOD); | 1339 __ SetCallKind(r5, CALL_AS_FUNCTION); |
1343 __ GetBuiltinEntry(r3, Builtins::CALL_FUNCTION_PROXY); | 1340 __ GetBuiltinEntry(r3, Builtins::CALL_FUNCTION_PROXY); |
1344 __ Call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 1341 __ Call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
1345 RelocInfo::CODE_TARGET); | 1342 RelocInfo::CODE_TARGET); |
1346 | 1343 |
1347 // Tear down the internal frame and remove function, receiver and args. | 1344 // Tear down the internal frame and remove function, receiver and args. |
1348 } | 1345 } |
1349 __ add(sp, sp, Operand(3 * kPointerSize)); | 1346 __ add(sp, sp, Operand(3 * kPointerSize)); |
1350 __ Jump(lr); | 1347 __ Jump(lr); |
1351 } | 1348 } |
1352 | 1349 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1485 __ bind(&dont_adapt_arguments); | 1482 __ bind(&dont_adapt_arguments); |
1486 __ Jump(r3); | 1483 __ Jump(r3); |
1487 } | 1484 } |
1488 | 1485 |
1489 | 1486 |
1490 #undef __ | 1487 #undef __ |
1491 | 1488 |
1492 } } // namespace v8::internal | 1489 } } // namespace v8::internal |
1493 | 1490 |
1494 #endif // V8_TARGET_ARCH_ARM | 1491 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |