| 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 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1299   Register constructor = scratch2; |  1299   Register constructor = scratch2; | 
|  1300  |  1300  | 
|  1301   // If there is no signature, return the holder. |  1301   // If there is no signature, return the holder. | 
|  1302   __ ldr(signature, FieldMemOperand(function_template_info, |  1302   __ ldr(signature, FieldMemOperand(function_template_info, | 
|  1303                                     FunctionTemplateInfo::kSignatureOffset)); |  1303                                     FunctionTemplateInfo::kSignatureOffset)); | 
|  1304   __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); |  1304   __ CompareRoot(signature, Heap::kUndefinedValueRootIndex); | 
|  1305   Label receiver_check_passed; |  1305   Label receiver_check_passed; | 
|  1306   __ b(eq, &receiver_check_passed); |  1306   __ b(eq, &receiver_check_passed); | 
|  1307  |  1307  | 
|  1308   // Walk the prototype chain. |  1308   // Walk the prototype chain. | 
 |  1309   __ ldr(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 
|  1309   Label prototype_loop_start; |  1310   Label prototype_loop_start; | 
|  1310   __ bind(&prototype_loop_start); |  1311   __ bind(&prototype_loop_start); | 
|  1311  |  1312  | 
|  1312   // End if the receiver is null or if it's a hidden type. |  | 
|  1313   __ CompareRoot(receiver, Heap::kNullValueRootIndex); |  | 
|  1314   __ b(eq, receiver_check_failed); |  | 
|  1315   __ ldr(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); |  | 
|  1316   __ ldr(ip, FieldMemOperand(map, Map::kBitField3Offset)); |  | 
|  1317   __ tst(ip, Operand(Map::IsHiddenPrototype::kMask)); |  | 
|  1318   __ b(ne, receiver_check_failed); |  | 
|  1319  |  | 
|  1320   // Get the constructor, if any. |  1313   // Get the constructor, if any. | 
|  1321   __ GetMapConstructor(constructor, map, ip, ip); |  1314   __ GetMapConstructor(constructor, map, ip, ip); | 
|  1322   __ cmp(ip, Operand(JS_FUNCTION_TYPE)); |  1315   __ cmp(ip, Operand(JS_FUNCTION_TYPE)); | 
|  1323   Label next_prototype; |  1316   Label next_prototype; | 
|  1324   __ b(ne, &next_prototype); |  1317   __ b(ne, &next_prototype); | 
|  1325   Register type = constructor; |  1318   Register type = constructor; | 
|  1326   __ ldr(type, |  1319   __ ldr(type, | 
|  1327          FieldMemOperand(constructor, JSFunction::kSharedFunctionInfoOffset)); |  1320          FieldMemOperand(constructor, JSFunction::kSharedFunctionInfoOffset)); | 
|  1328   __ ldr(type, FieldMemOperand(type, SharedFunctionInfo::kFunctionDataOffset)); |  1321   __ ldr(type, FieldMemOperand(type, SharedFunctionInfo::kFunctionDataOffset)); | 
|  1329  |  1322  | 
|  1330   // Loop through the chain of inheriting function templates. |  1323   // Loop through the chain of inheriting function templates. | 
|  1331   Label function_template_loop; |  1324   Label function_template_loop; | 
|  1332   __ bind(&function_template_loop); |  1325   __ bind(&function_template_loop); | 
|  1333  |  1326  | 
|  1334   // If the signatures match, we have a compatible receiver. |  1327   // If the signatures match, we have a compatible receiver. | 
|  1335   __ cmp(signature, type); |  1328   __ cmp(signature, type); | 
|  1336   __ b(eq, &receiver_check_passed); |  1329   __ b(eq, &receiver_check_passed); | 
|  1337  |  1330  | 
|  1338   // If the current type is not a FunctionTemplateInfo, load the next prototype |  1331   // If the current type is not a FunctionTemplateInfo, load the next prototype | 
|  1339   // in the chain. |  1332   // in the chain. | 
|  1340   __ JumpIfSmi(type, &next_prototype); |  1333   __ JumpIfSmi(type, &next_prototype); | 
|  1341   __ CompareObjectType(type, ip, ip, FUNCTION_TEMPLATE_INFO_TYPE); |  1334   __ CompareObjectType(type, ip, ip, FUNCTION_TEMPLATE_INFO_TYPE); | 
|  1342  |  1335  | 
|  1343   // Otherwise load the parent function template and iterate. |  1336   // Otherwise load the parent function template and iterate. | 
|  1344   __ ldr(type, |  1337   __ ldr(type, | 
|  1345          FieldMemOperand(type, FunctionTemplateInfo::kParentTemplateOffset), |  1338          FieldMemOperand(type, FunctionTemplateInfo::kParentTemplateOffset), | 
|  1346          eq); |  1339          eq); | 
|  1347   __ b(&function_template_loop, eq); |  1340   __ b(&function_template_loop, eq); | 
|  1348  |  1341  | 
|  1349   // Load the next prototype and iterate. |  1342   // Load the next prototype. | 
|  1350   __ bind(&next_prototype); |  1343   __ bind(&next_prototype); | 
|  1351   __ ldr(receiver, FieldMemOperand(map, Map::kPrototypeOffset)); |  1344   __ ldr(receiver, FieldMemOperand(map, Map::kPrototypeOffset)); | 
 |  1345   // End if the prototype is null or not hidden. | 
 |  1346   __ CompareRoot(receiver, Heap::kNullValueRootIndex); | 
 |  1347   __ b(eq, receiver_check_failed); | 
 |  1348   __ ldr(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 
 |  1349   __ ldr(ip, FieldMemOperand(map, Map::kBitField3Offset)); | 
 |  1350   __ tst(ip, Operand(Map::IsHiddenPrototype::kMask)); | 
 |  1351   __ b(eq, receiver_check_failed); | 
 |  1352   // Iterate. | 
|  1352   __ b(&prototype_loop_start); |  1353   __ b(&prototype_loop_start); | 
|  1353  |  1354  | 
|  1354   __ bind(&receiver_check_passed); |  1355   __ bind(&receiver_check_passed); | 
|  1355 } |  1356 } | 
|  1356  |  1357  | 
|  1357  |  1358  | 
|  1358 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) { |  1359 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) { | 
|  1359   // ----------- S t a t e ------------- |  1360   // ----------- S t a t e ------------- | 
|  1360   //  -- r0                 : number of arguments excluding receiver |  1361   //  -- r0                 : number of arguments excluding receiver | 
|  1361   //  -- r1                 : callee |  1362   //  -- r1                 : callee | 
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2430   } |  2431   } | 
|  2431 } |  2432 } | 
|  2432  |  2433  | 
|  2433  |  2434  | 
|  2434 #undef __ |  2435 #undef __ | 
|  2435  |  2436  | 
|  2436 }  // namespace internal |  2437 }  // namespace internal | 
|  2437 }  // namespace v8 |  2438 }  // namespace v8 | 
|  2438  |  2439  | 
|  2439 #endif  // V8_TARGET_ARCH_ARM |  2440 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW |