Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 3970005: Make Failure inherit from MaybeObject instead of Object. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | src/bootstrapper.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 816 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 827
828 StubCompiler* stub_compiler_; 828 StubCompiler* stub_compiler_;
829 const ParameterCount& arguments_; 829 const ParameterCount& arguments_;
830 Register name_; 830 Register name_;
831 }; 831 };
832 832
833 833
834 // Generate code to check that a global property cell is empty. Create 834 // Generate code to check that a global property cell is empty. Create
835 // the property cell at compilation time if no cell exists for the 835 // the property cell at compilation time if no cell exists for the
836 // property. 836 // property.
837 static Object* GenerateCheckPropertyCell(MacroAssembler* masm, 837 MUST_USE_RESULT static MaybeObject* GenerateCheckPropertyCell(
838 GlobalObject* global, 838 MacroAssembler* masm,
839 String* name, 839 GlobalObject* global,
840 Register scratch, 840 String* name,
841 Label* miss) { 841 Register scratch,
842 Object* probe = global->EnsurePropertyCell(name); 842 Label* miss) {
843 if (probe->IsFailure()) return probe; 843 Object* probe;
844 { MaybeObject* maybe_probe = global->EnsurePropertyCell(name);
845 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
846 }
844 JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(probe); 847 JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(probe);
845 ASSERT(cell->value()->IsTheHole()); 848 ASSERT(cell->value()->IsTheHole());
846 __ mov(scratch, Operand(Handle<Object>(cell))); 849 __ mov(scratch, Operand(Handle<Object>(cell)));
847 __ ldr(scratch, 850 __ ldr(scratch,
848 FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset)); 851 FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset));
849 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); 852 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
850 __ cmp(scratch, ip); 853 __ cmp(scratch, ip);
851 __ b(ne, miss); 854 __ b(ne, miss);
852 return cell; 855 return cell;
853 } 856 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 890
888 // Only global objects and objects that do not require access 891 // Only global objects and objects that do not require access
889 // checks are allowed in stubs. 892 // checks are allowed in stubs.
890 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded()); 893 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded());
891 894
892 JSObject* prototype = JSObject::cast(current->GetPrototype()); 895 JSObject* prototype = JSObject::cast(current->GetPrototype());
893 if (!current->HasFastProperties() && 896 if (!current->HasFastProperties() &&
894 !current->IsJSGlobalObject() && 897 !current->IsJSGlobalObject() &&
895 !current->IsJSGlobalProxy()) { 898 !current->IsJSGlobalProxy()) {
896 if (!name->IsSymbol()) { 899 if (!name->IsSymbol()) {
897 Object* lookup_result = Heap::LookupSymbol(name); 900 MaybeObject* lookup_result = Heap::LookupSymbol(name);
898 if (lookup_result->IsFailure()) { 901 if (lookup_result->IsFailure()) {
899 set_failure(Failure::cast(lookup_result)); 902 set_failure(Failure::cast(lookup_result));
900 return reg; 903 return reg;
901 } else { 904 } else {
902 name = String::cast(lookup_result); 905 name = String::cast(lookup_result->ToObjectUnchecked());
903 } 906 }
904 } 907 }
905 ASSERT(current->property_dictionary()->FindEntry(name) == 908 ASSERT(current->property_dictionary()->FindEntry(name) ==
906 StringDictionary::kNotFound); 909 StringDictionary::kNotFound);
907 910
908 GenerateDictionaryNegativeLookup(masm(), 911 GenerateDictionaryNegativeLookup(masm(),
909 miss, 912 miss,
910 reg, 913 reg,
911 name, 914 name,
912 scratch1, 915 scratch1,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 if (current->IsJSGlobalProxy()) { 970 if (current->IsJSGlobalProxy()) {
968 __ CheckAccessGlobalProxy(reg, scratch1, miss); 971 __ CheckAccessGlobalProxy(reg, scratch1, miss);
969 } 972 }
970 973
971 // If we've skipped any global objects, it's not enough to verify 974 // If we've skipped any global objects, it's not enough to verify
972 // that their maps haven't changed. We also need to check that the 975 // that their maps haven't changed. We also need to check that the
973 // property cell for the property is still empty. 976 // property cell for the property is still empty.
974 current = object; 977 current = object;
975 while (current != holder) { 978 while (current != holder) {
976 if (current->IsGlobalObject()) { 979 if (current->IsGlobalObject()) {
977 Object* cell = GenerateCheckPropertyCell(masm(), 980 MaybeObject* cell = GenerateCheckPropertyCell(masm(),
978 GlobalObject::cast(current), 981 GlobalObject::cast(current),
979 name, 982 name,
980 scratch1, 983 scratch1,
981 miss); 984 miss);
982 if (cell->IsFailure()) { 985 if (cell->IsFailure()) {
983 set_failure(Failure::cast(cell)); 986 set_failure(Failure::cast(cell));
984 return reg; 987 return reg;
985 } 988 }
986 } 989 }
987 current = JSObject::cast(current->GetPrototype()); 990 current = JSObject::cast(current->GetPrototype());
988 } 991 }
989 992
990 // Return the register containing the holder. 993 // Return the register containing the holder.
991 return reg; 994 return reg;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1274 __ ldr(r4, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); 1277 __ ldr(r4, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
1275 __ cmp(r4, r3); 1278 __ cmp(r4, r3);
1276 __ b(ne, miss); 1279 __ b(ne, miss);
1277 } else { 1280 } else {
1278 __ cmp(r1, Operand(Handle<JSFunction>(function))); 1281 __ cmp(r1, Operand(Handle<JSFunction>(function)));
1279 __ b(ne, miss); 1282 __ b(ne, miss);
1280 } 1283 }
1281 } 1284 }
1282 1285
1283 1286
1284 Object* CallStubCompiler::GenerateMissBranch() { 1287 MaybeObject* CallStubCompiler::GenerateMissBranch() {
1285 Object* obj = StubCache::ComputeCallMiss(arguments().immediate(), kind_); 1288 Object* obj;
1286 if (obj->IsFailure()) return obj; 1289 { MaybeObject* maybe_obj =
1290 StubCache::ComputeCallMiss(arguments().immediate(), kind_);
1291 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1292 }
1287 __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); 1293 __ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
1288 return obj; 1294 return obj;
1289 } 1295 }
1290 1296
1291 1297
1292 Object* CallStubCompiler::CompileCallField(JSObject* object, 1298 MaybeObject* CallStubCompiler::CompileCallField(JSObject* object,
1293 JSObject* holder, 1299 JSObject* holder,
1294 int index, 1300 int index,
1295 String* name) { 1301 String* name) {
1296 // ----------- S t a t e ------------- 1302 // ----------- S t a t e -------------
1297 // -- r2 : name 1303 // -- r2 : name
1298 // -- lr : return address 1304 // -- lr : return address
1299 // ----------------------------------- 1305 // -----------------------------------
1300 Label miss; 1306 Label miss;
1301 1307
1302 GenerateNameCheck(name, &miss); 1308 GenerateNameCheck(name, &miss);
1303 1309
1304 const int argc = arguments().immediate(); 1310 const int argc = arguments().immediate();
1305 1311
1306 // Get the receiver of the function from the stack into r0. 1312 // Get the receiver of the function from the stack into r0.
1307 __ ldr(r0, MemOperand(sp, argc * kPointerSize)); 1313 __ ldr(r0, MemOperand(sp, argc * kPointerSize));
1308 // Check that the receiver isn't a smi. 1314 // Check that the receiver isn't a smi.
1309 __ tst(r0, Operand(kSmiTagMask)); 1315 __ tst(r0, Operand(kSmiTagMask));
1310 __ b(eq, &miss); 1316 __ b(eq, &miss);
1311 1317
1312 // Do the right check and compute the holder register. 1318 // Do the right check and compute the holder register.
1313 Register reg = CheckPrototypes(object, r0, holder, r1, r3, r4, name, &miss); 1319 Register reg = CheckPrototypes(object, r0, holder, r1, r3, r4, name, &miss);
1314 GenerateFastPropertyLoad(masm(), r1, reg, holder, index); 1320 GenerateFastPropertyLoad(masm(), r1, reg, holder, index);
1315 1321
1316 GenerateCallFunction(masm(), object, arguments(), &miss); 1322 GenerateCallFunction(masm(), object, arguments(), &miss);
1317 1323
1318 // Handle call cache miss. 1324 // Handle call cache miss.
1319 __ bind(&miss); 1325 __ bind(&miss);
1320 Object* obj = GenerateMissBranch(); 1326 Object* obj;
1321 if (obj->IsFailure()) return obj; 1327 { MaybeObject* maybe_obj = GenerateMissBranch();
1328 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1329 }
1322 1330
1323 // Return the generated code. 1331 // Return the generated code.
1324 return GetCode(FIELD, name); 1332 return GetCode(FIELD, name);
1325 } 1333 }
1326 1334
1327 1335
1328 Object* CallStubCompiler::CompileArrayPushCall(Object* object, 1336 MaybeObject* CallStubCompiler::CompileArrayPushCall(Object* object,
1329 JSObject* holder, 1337 JSObject* holder,
1330 JSGlobalPropertyCell* cell, 1338 JSGlobalPropertyCell* cell,
1331 JSFunction* function, 1339 JSFunction* function,
1332 String* name) { 1340 String* name) {
1333 // ----------- S t a t e ------------- 1341 // ----------- S t a t e -------------
1334 // -- r2 : name 1342 // -- r2 : name
1335 // -- lr : return address 1343 // -- lr : return address
1336 // ----------------------------------- 1344 // -----------------------------------
1337 1345
1338 // TODO(639): faster implementation. 1346 // TODO(639): faster implementation.
1339 1347
1340 // If object is not an array, bail out to regular call. 1348 // If object is not an array, bail out to regular call.
1341 if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value(); 1349 if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value();
1342 1350
(...skipping 11 matching lines...) Expand all
1354 1362
1355 // Check that the maps haven't changed. 1363 // Check that the maps haven't changed.
1356 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r0, r4, name, &miss); 1364 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r0, r4, name, &miss);
1357 1365
1358 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush), 1366 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush),
1359 argc + 1, 1367 argc + 1,
1360 1); 1368 1);
1361 1369
1362 // Handle call cache miss. 1370 // Handle call cache miss.
1363 __ bind(&miss); 1371 __ bind(&miss);
1364 Object* obj = GenerateMissBranch(); 1372 Object* obj;
1365 if (obj->IsFailure()) return obj; 1373 { MaybeObject* maybe_obj = GenerateMissBranch();
1374 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1375 }
1366 1376
1367 // Return the generated code. 1377 // Return the generated code.
1368 return GetCode(function); 1378 return GetCode(function);
1369 } 1379 }
1370 1380
1371 1381
1372 Object* CallStubCompiler::CompileArrayPopCall(Object* object, 1382 MaybeObject* CallStubCompiler::CompileArrayPopCall(Object* object,
1373 JSObject* holder, 1383 JSObject* holder,
1374 JSGlobalPropertyCell* cell, 1384 JSGlobalPropertyCell* cell,
1375 JSFunction* function, 1385 JSFunction* function,
1376 String* name) { 1386 String* name) {
1377 // ----------- S t a t e ------------- 1387 // ----------- S t a t e -------------
1378 // -- r2 : name 1388 // -- r2 : name
1379 // -- lr : return address 1389 // -- lr : return address
1380 // ----------------------------------- 1390 // -----------------------------------
1381 1391
1382 // TODO(642): faster implementation. 1392 // TODO(642): faster implementation.
1383 1393
1384 // If object is not an array, bail out to regular call. 1394 // If object is not an array, bail out to regular call.
1385 if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value(); 1395 if (!object->IsJSArray() || cell != NULL) return Heap::undefined_value();
1386 1396
(...skipping 11 matching lines...) Expand all
1398 1408
1399 // Check that the maps haven't changed. 1409 // Check that the maps haven't changed.
1400 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r0, r4, name, &miss); 1410 CheckPrototypes(JSObject::cast(object), r1, holder, r3, r0, r4, name, &miss);
1401 1411
1402 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop), 1412 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop),
1403 argc + 1, 1413 argc + 1,
1404 1); 1414 1);
1405 1415
1406 // Handle call cache miss. 1416 // Handle call cache miss.
1407 __ bind(&miss); 1417 __ bind(&miss);
1408 Object* obj = GenerateMissBranch(); 1418 Object* obj;
1409 if (obj->IsFailure()) return obj; 1419 { MaybeObject* maybe_obj = GenerateMissBranch();
1420 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1421 }
1410 1422
1411 // Return the generated code. 1423 // Return the generated code.
1412 return GetCode(function); 1424 return GetCode(function);
1413 } 1425 }
1414 1426
1415 1427
1416 Object* CallStubCompiler::CompileStringCharCodeAtCall( 1428 MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall(
1417 Object* object, 1429 Object* object,
1418 JSObject* holder, 1430 JSObject* holder,
1419 JSGlobalPropertyCell* cell, 1431 JSGlobalPropertyCell* cell,
1420 JSFunction* function, 1432 JSFunction* function,
1421 String* name) { 1433 String* name) {
1422 // ----------- S t a t e ------------- 1434 // ----------- S t a t e -------------
1423 // -- r2 : function name 1435 // -- r2 : function name
1424 // -- lr : return address 1436 // -- lr : return address
1425 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1437 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1426 // -- ... 1438 // -- ...
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 1482
1471 ICRuntimeCallHelper call_helper; 1483 ICRuntimeCallHelper call_helper;
1472 char_code_at_generator.GenerateSlow(masm(), call_helper); 1484 char_code_at_generator.GenerateSlow(masm(), call_helper);
1473 1485
1474 __ bind(&index_out_of_range); 1486 __ bind(&index_out_of_range);
1475 __ LoadRoot(r0, Heap::kNanValueRootIndex); 1487 __ LoadRoot(r0, Heap::kNanValueRootIndex);
1476 __ Drop(argc + 1); 1488 __ Drop(argc + 1);
1477 __ Ret(); 1489 __ Ret();
1478 1490
1479 __ bind(&miss); 1491 __ bind(&miss);
1480 Object* obj = GenerateMissBranch(); 1492 Object* obj;
1481 if (obj->IsFailure()) return obj; 1493 { MaybeObject* maybe_obj = GenerateMissBranch();
1494 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1495 }
1482 1496
1483 // Return the generated code. 1497 // Return the generated code.
1484 return GetCode(function); 1498 return GetCode(function);
1485 } 1499 }
1486 1500
1487 1501
1488 Object* CallStubCompiler::CompileStringCharAtCall(Object* object, 1502 MaybeObject* CallStubCompiler::CompileStringCharAtCall(
1489 JSObject* holder, 1503 Object* object,
1490 JSGlobalPropertyCell* cell, 1504 JSObject* holder,
1491 JSFunction* function, 1505 JSGlobalPropertyCell* cell,
1492 String* name) { 1506 JSFunction* function,
1507 String* name) {
1493 // ----------- S t a t e ------------- 1508 // ----------- S t a t e -------------
1494 // -- r2 : function name 1509 // -- r2 : function name
1495 // -- lr : return address 1510 // -- lr : return address
1496 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1511 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1497 // -- ... 1512 // -- ...
1498 // -- sp[argc * 4] : receiver 1513 // -- sp[argc * 4] : receiver
1499 // ----------------------------------- 1514 // -----------------------------------
1500 1515
1501 // If object is not a string, bail out to regular call. 1516 // If object is not a string, bail out to regular call.
1502 if (!object->IsString() || cell != NULL) return Heap::undefined_value(); 1517 if (!object->IsString() || cell != NULL) return Heap::undefined_value();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 1559
1545 ICRuntimeCallHelper call_helper; 1560 ICRuntimeCallHelper call_helper;
1546 char_at_generator.GenerateSlow(masm(), call_helper); 1561 char_at_generator.GenerateSlow(masm(), call_helper);
1547 1562
1548 __ bind(&index_out_of_range); 1563 __ bind(&index_out_of_range);
1549 __ LoadRoot(r0, Heap::kEmptyStringRootIndex); 1564 __ LoadRoot(r0, Heap::kEmptyStringRootIndex);
1550 __ Drop(argc + 1); 1565 __ Drop(argc + 1);
1551 __ Ret(); 1566 __ Ret();
1552 1567
1553 __ bind(&miss); 1568 __ bind(&miss);
1554 Object* obj = GenerateMissBranch(); 1569 Object* obj;
1555 if (obj->IsFailure()) return obj; 1570 { MaybeObject* maybe_obj = GenerateMissBranch();
1571 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1572 }
1556 1573
1557 // Return the generated code. 1574 // Return the generated code.
1558 return GetCode(function); 1575 return GetCode(function);
1559 } 1576 }
1560 1577
1561 1578
1562 Object* CallStubCompiler::CompileStringFromCharCodeCall( 1579 MaybeObject* CallStubCompiler::CompileStringFromCharCodeCall(
1563 Object* object, 1580 Object* object,
1564 JSObject* holder, 1581 JSObject* holder,
1565 JSGlobalPropertyCell* cell, 1582 JSGlobalPropertyCell* cell,
1566 JSFunction* function, 1583 JSFunction* function,
1567 String* name) { 1584 String* name) {
1568 // ----------- S t a t e ------------- 1585 // ----------- S t a t e -------------
1569 // -- r2 : function name 1586 // -- r2 : function name
1570 // -- lr : return address 1587 // -- lr : return address
1571 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1588 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1572 // -- ... 1589 // -- ...
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 ICRuntimeCallHelper call_helper; 1635 ICRuntimeCallHelper call_helper;
1619 char_from_code_generator.GenerateSlow(masm(), call_helper); 1636 char_from_code_generator.GenerateSlow(masm(), call_helper);
1620 1637
1621 // Tail call the full function. We do not have to patch the receiver 1638 // Tail call the full function. We do not have to patch the receiver
1622 // because the function makes no use of it. 1639 // because the function makes no use of it.
1623 __ bind(&slow); 1640 __ bind(&slow);
1624 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); 1641 __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
1625 1642
1626 __ bind(&miss); 1643 __ bind(&miss);
1627 // r2: function name. 1644 // r2: function name.
1628 Object* obj = GenerateMissBranch(); 1645 Object* obj;
1629 if (obj->IsFailure()) return obj; 1646 { MaybeObject* maybe_obj = GenerateMissBranch();
1647 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1648 }
1630 1649
1631 // Return the generated code. 1650 // Return the generated code.
1632 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); 1651 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name);
1633 } 1652 }
1634 1653
1635 1654
1636 Object* CallStubCompiler::CompileMathFloorCall(Object* object, 1655 MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object,
1637 JSObject* holder, 1656 JSObject* holder,
1638 JSGlobalPropertyCell* cell, 1657 JSGlobalPropertyCell* cell,
1639 JSFunction* function, 1658 JSFunction* function,
1640 String* name) { 1659 String* name) {
1641 // TODO(872): implement this. 1660 // TODO(872): implement this.
1642 return Heap::undefined_value(); 1661 return Heap::undefined_value();
1643 } 1662 }
1644 1663
1645 1664
1646 Object* CallStubCompiler::CompileMathAbsCall(Object* object, 1665 MaybeObject* CallStubCompiler::CompileMathAbsCall(Object* object,
1647 JSObject* holder, 1666 JSObject* holder,
1648 JSGlobalPropertyCell* cell, 1667 JSGlobalPropertyCell* cell,
1649 JSFunction* function, 1668 JSFunction* function,
1650 String* name) { 1669 String* name) {
1651 // ----------- S t a t e ------------- 1670 // ----------- S t a t e -------------
1652 // -- r2 : function name 1671 // -- r2 : function name
1653 // -- lr : return address 1672 // -- lr : return address
1654 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1673 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1655 // -- ... 1674 // -- ...
1656 // -- sp[argc * 4] : receiver 1675 // -- sp[argc * 4] : receiver
1657 // ----------------------------------- 1676 // -----------------------------------
1658 1677
1659 const int argc = arguments().immediate(); 1678 const int argc = arguments().immediate();
1660 1679
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1730 __ Drop(argc + 1); 1749 __ Drop(argc + 1);
1731 __ Ret(); 1750 __ Ret();
1732 1751
1733 // Tail call the full function. We do not have to patch the receiver 1752 // Tail call the full function. We do not have to patch the receiver
1734 // because the function makes no use of it. 1753 // because the function makes no use of it.
1735 __ bind(&slow); 1754 __ bind(&slow);
1736 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); 1755 __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
1737 1756
1738 __ bind(&miss); 1757 __ bind(&miss);
1739 // r2: function name. 1758 // r2: function name.
1740 Object* obj = GenerateMissBranch(); 1759 Object* obj;
1741 if (obj->IsFailure()) return obj; 1760 { MaybeObject* maybe_obj = GenerateMissBranch();
1761 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1762 }
1742 1763
1743 // Return the generated code. 1764 // Return the generated code.
1744 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); 1765 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name);
1745 } 1766 }
1746 1767
1747 1768
1748 Object* CallStubCompiler::CompileCallConstant(Object* object, 1769 MaybeObject* CallStubCompiler::CompileCallConstant(Object* object,
1749 JSObject* holder, 1770 JSObject* holder,
1750 JSFunction* function, 1771 JSFunction* function,
1751 String* name, 1772 String* name,
1752 CheckType check) { 1773 CheckType check) {
1753 // ----------- S t a t e ------------- 1774 // ----------- S t a t e -------------
1754 // -- r2 : name 1775 // -- r2 : name
1755 // -- lr : return address 1776 // -- lr : return address
1756 // ----------------------------------- 1777 // -----------------------------------
1757 SharedFunctionInfo* function_info = function->shared(); 1778 SharedFunctionInfo* function_info = function->shared();
1758 if (function_info->HasCustomCallGenerator()) { 1779 if (function_info->HasCustomCallGenerator()) {
1759 const int id = function_info->custom_call_generator_id(); 1780 const int id = function_info->custom_call_generator_id();
1760 Object* result = CompileCustomCall( 1781 MaybeObject* maybe_result = CompileCustomCall(
1761 id, object, holder, NULL, function, name); 1782 id, object, holder, NULL, function, name);
1783 Object* result;
1784 if (!maybe_result->ToObject(&result)) return maybe_result;
1762 // undefined means bail out to regular compiler. 1785 // undefined means bail out to regular compiler.
1763 if (!result->IsUndefined()) { 1786 if (!result->IsUndefined()) {
1764 return result; 1787 return result;
1765 } 1788 }
1766 } 1789 }
1767 1790
1768 Label miss_in_smi_check; 1791 Label miss_in_smi_check;
1769 1792
1770 GenerateNameCheck(name, &miss_in_smi_check); 1793 GenerateNameCheck(name, &miss_in_smi_check);
1771 1794
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); 1907 __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
1885 } 1908 }
1886 1909
1887 // Handle call cache miss. 1910 // Handle call cache miss.
1888 __ bind(&miss); 1911 __ bind(&miss);
1889 if (depth != kInvalidProtoDepth) { 1912 if (depth != kInvalidProtoDepth) {
1890 FreeSpaceForFastApiCall(masm()); 1913 FreeSpaceForFastApiCall(masm());
1891 } 1914 }
1892 1915
1893 __ bind(&miss_in_smi_check); 1916 __ bind(&miss_in_smi_check);
1894 Object* obj = GenerateMissBranch(); 1917 Object* obj;
1895 if (obj->IsFailure()) return obj; 1918 { MaybeObject* maybe_obj = GenerateMissBranch();
1919 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1920 }
1896 1921
1897 // Return the generated code. 1922 // Return the generated code.
1898 return GetCode(function); 1923 return GetCode(function);
1899 } 1924 }
1900 1925
1901 1926
1902 Object* CallStubCompiler::CompileCallInterceptor(JSObject* object, 1927 MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
1903 JSObject* holder, 1928 JSObject* holder,
1904 String* name) { 1929 String* name) {
1905 // ----------- S t a t e ------------- 1930 // ----------- S t a t e -------------
1906 // -- r2 : name 1931 // -- r2 : name
1907 // -- lr : return address 1932 // -- lr : return address
1908 // ----------------------------------- 1933 // -----------------------------------
1909 1934
1910 Label miss; 1935 Label miss;
1911 1936
1912 GenerateNameCheck(name, &miss); 1937 GenerateNameCheck(name, &miss);
1913 1938
1914 // Get the number of arguments. 1939 // Get the number of arguments.
(...skipping 19 matching lines...) Expand all
1934 1959
1935 // Move returned value, the function to call, to r1. 1960 // Move returned value, the function to call, to r1.
1936 __ mov(r1, r0); 1961 __ mov(r1, r0);
1937 // Restore receiver. 1962 // Restore receiver.
1938 __ ldr(r0, MemOperand(sp, argc * kPointerSize)); 1963 __ ldr(r0, MemOperand(sp, argc * kPointerSize));
1939 1964
1940 GenerateCallFunction(masm(), object, arguments(), &miss); 1965 GenerateCallFunction(masm(), object, arguments(), &miss);
1941 1966
1942 // Handle call cache miss. 1967 // Handle call cache miss.
1943 __ bind(&miss); 1968 __ bind(&miss);
1944 Object* obj = GenerateMissBranch(); 1969 Object* obj;
1945 if (obj->IsFailure()) return obj; 1970 { MaybeObject* maybe_obj = GenerateMissBranch();
1971 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1972 }
1946 1973
1947 // Return the generated code. 1974 // Return the generated code.
1948 return GetCode(INTERCEPTOR, name); 1975 return GetCode(INTERCEPTOR, name);
1949 } 1976 }
1950 1977
1951 1978
1952 Object* CallStubCompiler::CompileCallGlobal(JSObject* object, 1979 MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object,
1953 GlobalObject* holder, 1980 GlobalObject* holder,
1954 JSGlobalPropertyCell* cell, 1981 JSGlobalPropertyCell* cell,
1955 JSFunction* function, 1982 JSFunction* function,
1956 String* name) { 1983 String* name) {
1957 // ----------- S t a t e ------------- 1984 // ----------- S t a t e -------------
1958 // -- r2 : name 1985 // -- r2 : name
1959 // -- lr : return address 1986 // -- lr : return address
1960 // ----------------------------------- 1987 // -----------------------------------
1961 1988
1962 SharedFunctionInfo* function_info = function->shared(); 1989 SharedFunctionInfo* function_info = function->shared();
1963 if (function_info->HasCustomCallGenerator()) { 1990 if (function_info->HasCustomCallGenerator()) {
1964 const int id = function_info->custom_call_generator_id(); 1991 const int id = function_info->custom_call_generator_id();
1965 Object* result = CompileCustomCall( 1992 MaybeObject* maybe_result = CompileCustomCall(
1966 id, object, holder, cell, function, name); 1993 id, object, holder, cell, function, name);
1994 Object* result;
1995 if (!maybe_result->ToObject(&result)) return maybe_result;
1967 // undefined means bail out to regular compiler. 1996 // undefined means bail out to regular compiler.
1968 if (!result->IsUndefined()) return result; 1997 if (!result->IsUndefined()) return result;
1969 } 1998 }
1970 1999
1971 Label miss; 2000 Label miss;
1972 2001
1973 GenerateNameCheck(name, &miss); 2002 GenerateNameCheck(name, &miss);
1974 2003
1975 // Get the number of arguments. 2004 // Get the number of arguments.
1976 const int argc = arguments().immediate(); 2005 const int argc = arguments().immediate();
(...skipping 16 matching lines...) Expand all
1993 __ IncrementCounter(&Counters::call_global_inline, 1, r3, r4); 2022 __ IncrementCounter(&Counters::call_global_inline, 1, r3, r4);
1994 ASSERT(function->is_compiled()); 2023 ASSERT(function->is_compiled());
1995 Handle<Code> code(function->code()); 2024 Handle<Code> code(function->code());
1996 ParameterCount expected(function->shared()->formal_parameter_count()); 2025 ParameterCount expected(function->shared()->formal_parameter_count());
1997 __ InvokeCode(code, expected, arguments(), 2026 __ InvokeCode(code, expected, arguments(),
1998 RelocInfo::CODE_TARGET, JUMP_FUNCTION); 2027 RelocInfo::CODE_TARGET, JUMP_FUNCTION);
1999 2028
2000 // Handle call cache miss. 2029 // Handle call cache miss.
2001 __ bind(&miss); 2030 __ bind(&miss);
2002 __ IncrementCounter(&Counters::call_global_inline_miss, 1, r1, r3); 2031 __ IncrementCounter(&Counters::call_global_inline_miss, 1, r1, r3);
2003 Object* obj = GenerateMissBranch(); 2032 Object* obj;
2004 if (obj->IsFailure()) return obj; 2033 { MaybeObject* maybe_obj = GenerateMissBranch();
2034 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
2035 }
2005 2036
2006 // Return the generated code. 2037 // Return the generated code.
2007 return GetCode(NORMAL, name); 2038 return GetCode(NORMAL, name);
2008 } 2039 }
2009 2040
2010 2041
2011 Object* StoreStubCompiler::CompileStoreField(JSObject* object, 2042 MaybeObject* StoreStubCompiler::CompileStoreField(JSObject* object,
2012 int index, 2043 int index,
2013 Map* transition, 2044 Map* transition,
2014 String* name) { 2045 String* name) {
2015 // ----------- S t a t e ------------- 2046 // ----------- S t a t e -------------
2016 // -- r0 : value 2047 // -- r0 : value
2017 // -- r1 : receiver 2048 // -- r1 : receiver
2018 // -- r2 : name 2049 // -- r2 : name
2019 // -- lr : return address 2050 // -- lr : return address
2020 // ----------------------------------- 2051 // -----------------------------------
2021 Label miss; 2052 Label miss;
2022 2053
2023 GenerateStoreField(masm(), 2054 GenerateStoreField(masm(),
2024 object, 2055 object,
2025 index, 2056 index,
2026 transition, 2057 transition,
2027 r1, r2, r3, 2058 r1, r2, r3,
2028 &miss); 2059 &miss);
2029 __ bind(&miss); 2060 __ bind(&miss);
2030 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 2061 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
2031 __ Jump(ic, RelocInfo::CODE_TARGET); 2062 __ Jump(ic, RelocInfo::CODE_TARGET);
2032 2063
2033 // Return the generated code. 2064 // Return the generated code.
2034 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); 2065 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name);
2035 } 2066 }
2036 2067
2037 2068
2038 Object* StoreStubCompiler::CompileStoreCallback(JSObject* object, 2069 MaybeObject* StoreStubCompiler::CompileStoreCallback(JSObject* object,
2039 AccessorInfo* callback, 2070 AccessorInfo* callback,
2040 String* name) { 2071 String* name) {
2041 // ----------- S t a t e ------------- 2072 // ----------- S t a t e -------------
2042 // -- r0 : value 2073 // -- r0 : value
2043 // -- r1 : receiver 2074 // -- r1 : receiver
2044 // -- r2 : name 2075 // -- r2 : name
2045 // -- lr : return address 2076 // -- lr : return address
2046 // ----------------------------------- 2077 // -----------------------------------
2047 Label miss; 2078 Label miss;
2048 2079
2049 // Check that the object isn't a smi. 2080 // Check that the object isn't a smi.
2050 __ tst(r1, Operand(kSmiTagMask)); 2081 __ tst(r1, Operand(kSmiTagMask));
(...skipping 25 matching lines...) Expand all
2076 // Handle store cache miss. 2107 // Handle store cache miss.
2077 __ bind(&miss); 2108 __ bind(&miss);
2078 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 2109 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
2079 __ Jump(ic, RelocInfo::CODE_TARGET); 2110 __ Jump(ic, RelocInfo::CODE_TARGET);
2080 2111
2081 // Return the generated code. 2112 // Return the generated code.
2082 return GetCode(CALLBACKS, name); 2113 return GetCode(CALLBACKS, name);
2083 } 2114 }
2084 2115
2085 2116
2086 Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, 2117 MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver,
2087 String* name) { 2118 String* name) {
2088 // ----------- S t a t e ------------- 2119 // ----------- S t a t e -------------
2089 // -- r0 : value 2120 // -- r0 : value
2090 // -- r1 : receiver 2121 // -- r1 : receiver
2091 // -- r2 : name 2122 // -- r2 : name
2092 // -- lr : return address 2123 // -- lr : return address
2093 // ----------------------------------- 2124 // -----------------------------------
2094 Label miss; 2125 Label miss;
2095 2126
2096 // Check that the object isn't a smi. 2127 // Check that the object isn't a smi.
2097 __ tst(r1, Operand(kSmiTagMask)); 2128 __ tst(r1, Operand(kSmiTagMask));
(...skipping 23 matching lines...) Expand all
2121 // Handle store cache miss. 2152 // Handle store cache miss.
2122 __ bind(&miss); 2153 __ bind(&miss);
2123 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 2154 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
2124 __ Jump(ic, RelocInfo::CODE_TARGET); 2155 __ Jump(ic, RelocInfo::CODE_TARGET);
2125 2156
2126 // Return the generated code. 2157 // Return the generated code.
2127 return GetCode(INTERCEPTOR, name); 2158 return GetCode(INTERCEPTOR, name);
2128 } 2159 }
2129 2160
2130 2161
2131 Object* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object, 2162 MaybeObject* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object,
2132 JSGlobalPropertyCell* cell, 2163 JSGlobalPropertyCell* cell,
2133 String* name) { 2164 String* name) {
2134 // ----------- S t a t e ------------- 2165 // ----------- S t a t e -------------
2135 // -- r0 : value 2166 // -- r0 : value
2136 // -- r1 : receiver 2167 // -- r1 : receiver
2137 // -- r2 : name 2168 // -- r2 : name
2138 // -- lr : return address 2169 // -- lr : return address
2139 // ----------------------------------- 2170 // -----------------------------------
2140 Label miss; 2171 Label miss;
2141 2172
2142 // Check that the map of the global has not changed. 2173 // Check that the map of the global has not changed.
2143 __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset)); 2174 __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset));
(...skipping 11 matching lines...) Expand all
2155 __ bind(&miss); 2186 __ bind(&miss);
2156 __ IncrementCounter(&Counters::named_store_global_inline_miss, 1, r4, r3); 2187 __ IncrementCounter(&Counters::named_store_global_inline_miss, 1, r4, r3);
2157 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 2188 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
2158 __ Jump(ic, RelocInfo::CODE_TARGET); 2189 __ Jump(ic, RelocInfo::CODE_TARGET);
2159 2190
2160 // Return the generated code. 2191 // Return the generated code.
2161 return GetCode(NORMAL, name); 2192 return GetCode(NORMAL, name);
2162 } 2193 }
2163 2194
2164 2195
2165 Object* LoadStubCompiler::CompileLoadNonexistent(String* name, 2196 MaybeObject* LoadStubCompiler::CompileLoadNonexistent(String* name,
2166 JSObject* object, 2197 JSObject* object,
2167 JSObject* last) { 2198 JSObject* last) {
2168 // ----------- S t a t e ------------- 2199 // ----------- S t a t e -------------
2169 // -- r0 : receiver 2200 // -- r0 : receiver
2170 // -- lr : return address 2201 // -- lr : return address
2171 // ----------------------------------- 2202 // -----------------------------------
2172 Label miss; 2203 Label miss;
2173 2204
2174 // Check that receiver is not a smi. 2205 // Check that receiver is not a smi.
2175 __ tst(r0, Operand(kSmiTagMask)); 2206 __ tst(r0, Operand(kSmiTagMask));
2176 __ b(eq, &miss); 2207 __ b(eq, &miss);
2177 2208
2178 // Check the maps of the full prototype chain. 2209 // Check the maps of the full prototype chain.
2179 CheckPrototypes(object, r0, last, r3, r1, r4, name, &miss); 2210 CheckPrototypes(object, r0, last, r3, r1, r4, name, &miss);
2180 2211
2181 // If the last object in the prototype chain is a global object, 2212 // If the last object in the prototype chain is a global object,
2182 // check that the global property cell is empty. 2213 // check that the global property cell is empty.
2183 if (last->IsGlobalObject()) { 2214 if (last->IsGlobalObject()) {
2184 Object* cell = GenerateCheckPropertyCell(masm(), 2215 MaybeObject* cell = GenerateCheckPropertyCell(masm(),
2185 GlobalObject::cast(last), 2216 GlobalObject::cast(last),
2186 name, 2217 name,
2187 r1, 2218 r1,
2188 &miss); 2219 &miss);
2189 if (cell->IsFailure()) { 2220 if (cell->IsFailure()) {
2190 miss.Unuse(); 2221 miss.Unuse();
2191 return cell; 2222 return cell;
2192 } 2223 }
2193 } 2224 }
2194 2225
2195 // Return undefined if maps of the full prototype chain are still the 2226 // Return undefined if maps of the full prototype chain are still the
2196 // same and no global property with this name contains a value. 2227 // same and no global property with this name contains a value.
2197 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); 2228 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
2198 __ Ret(); 2229 __ Ret();
2199 2230
2200 __ bind(&miss); 2231 __ bind(&miss);
2201 GenerateLoadMiss(masm(), Code::LOAD_IC); 2232 GenerateLoadMiss(masm(), Code::LOAD_IC);
2202 2233
2203 // Return the generated code. 2234 // Return the generated code.
2204 return GetCode(NONEXISTENT, Heap::empty_string()); 2235 return GetCode(NONEXISTENT, Heap::empty_string());
2205 } 2236 }
2206 2237
2207 2238
2208 Object* LoadStubCompiler::CompileLoadField(JSObject* object, 2239 MaybeObject* LoadStubCompiler::CompileLoadField(JSObject* object,
2209 JSObject* holder, 2240 JSObject* holder,
2210 int index, 2241 int index,
2211 String* name) { 2242 String* name) {
2212 // ----------- S t a t e ------------- 2243 // ----------- S t a t e -------------
2213 // -- r0 : receiver 2244 // -- r0 : receiver
2214 // -- r2 : name 2245 // -- r2 : name
2215 // -- lr : return address 2246 // -- lr : return address
2216 // ----------------------------------- 2247 // -----------------------------------
2217 Label miss; 2248 Label miss;
2218 2249
2219 GenerateLoadField(object, holder, r0, r3, r1, r4, index, name, &miss); 2250 GenerateLoadField(object, holder, r0, r3, r1, r4, index, name, &miss);
2220 __ bind(&miss); 2251 __ bind(&miss);
2221 GenerateLoadMiss(masm(), Code::LOAD_IC); 2252 GenerateLoadMiss(masm(), Code::LOAD_IC);
2222 2253
2223 // Return the generated code. 2254 // Return the generated code.
2224 return GetCode(FIELD, name); 2255 return GetCode(FIELD, name);
2225 } 2256 }
2226 2257
2227 2258
2228 Object* LoadStubCompiler::CompileLoadCallback(String* name, 2259 MaybeObject* LoadStubCompiler::CompileLoadCallback(String* name,
2229 JSObject* object, 2260 JSObject* object,
2230 JSObject* holder, 2261 JSObject* holder,
2231 AccessorInfo* callback) { 2262 AccessorInfo* callback) {
2232 // ----------- S t a t e ------------- 2263 // ----------- S t a t e -------------
2233 // -- r0 : receiver 2264 // -- r0 : receiver
2234 // -- r2 : name 2265 // -- r2 : name
2235 // -- lr : return address 2266 // -- lr : return address
2236 // ----------------------------------- 2267 // -----------------------------------
2237 Label miss; 2268 Label miss;
2238 2269
2239 Failure* failure = Failure::InternalError(); 2270 Failure* failure = Failure::InternalError();
2240 bool success = GenerateLoadCallback(object, holder, r0, r2, r3, r1, r4, 2271 bool success = GenerateLoadCallback(object, holder, r0, r2, r3, r1, r4,
2241 callback, name, &miss, &failure); 2272 callback, name, &miss, &failure);
2242 if (!success) { 2273 if (!success) {
2243 miss.Unuse(); 2274 miss.Unuse();
2244 return failure; 2275 return failure;
2245 } 2276 }
2246 2277
2247 __ bind(&miss); 2278 __ bind(&miss);
2248 GenerateLoadMiss(masm(), Code::LOAD_IC); 2279 GenerateLoadMiss(masm(), Code::LOAD_IC);
2249 2280
2250 // Return the generated code. 2281 // Return the generated code.
2251 return GetCode(CALLBACKS, name); 2282 return GetCode(CALLBACKS, name);
2252 } 2283 }
2253 2284
2254 2285
2255 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, 2286 MaybeObject* LoadStubCompiler::CompileLoadConstant(JSObject* object,
2256 JSObject* holder, 2287 JSObject* holder,
2257 Object* value, 2288 Object* value,
2258 String* name) { 2289 String* name) {
2259 // ----------- S t a t e ------------- 2290 // ----------- S t a t e -------------
2260 // -- r0 : receiver 2291 // -- r0 : receiver
2261 // -- r2 : name 2292 // -- r2 : name
2262 // -- lr : return address 2293 // -- lr : return address
2263 // ----------------------------------- 2294 // -----------------------------------
2264 Label miss; 2295 Label miss;
2265 2296
2266 GenerateLoadConstant(object, holder, r0, r3, r1, r4, value, name, &miss); 2297 GenerateLoadConstant(object, holder, r0, r3, r1, r4, value, name, &miss);
2267 __ bind(&miss); 2298 __ bind(&miss);
2268 GenerateLoadMiss(masm(), Code::LOAD_IC); 2299 GenerateLoadMiss(masm(), Code::LOAD_IC);
2269 2300
2270 // Return the generated code. 2301 // Return the generated code.
2271 return GetCode(CONSTANT_FUNCTION, name); 2302 return GetCode(CONSTANT_FUNCTION, name);
2272 } 2303 }
2273 2304
2274 2305
2275 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object, 2306 MaybeObject* LoadStubCompiler::CompileLoadInterceptor(JSObject* object,
2276 JSObject* holder, 2307 JSObject* holder,
2277 String* name) { 2308 String* name) {
2278 // ----------- S t a t e ------------- 2309 // ----------- S t a t e -------------
2279 // -- r0 : receiver 2310 // -- r0 : receiver
2280 // -- r2 : name 2311 // -- r2 : name
2281 // -- lr : return address 2312 // -- lr : return address
2282 // ----------------------------------- 2313 // -----------------------------------
2283 Label miss; 2314 Label miss;
2284 2315
2285 LookupResult lookup; 2316 LookupResult lookup;
2286 LookupPostInterceptor(holder, name, &lookup); 2317 LookupPostInterceptor(holder, name, &lookup);
2287 GenerateLoadInterceptor(object, 2318 GenerateLoadInterceptor(object,
2288 holder, 2319 holder,
2289 &lookup, 2320 &lookup,
2290 r0, 2321 r0,
2291 r2, 2322 r2,
2292 r3, 2323 r3,
2293 r1, 2324 r1,
2294 r4, 2325 r4,
2295 name, 2326 name,
2296 &miss); 2327 &miss);
2297 __ bind(&miss); 2328 __ bind(&miss);
2298 GenerateLoadMiss(masm(), Code::LOAD_IC); 2329 GenerateLoadMiss(masm(), Code::LOAD_IC);
2299 2330
2300 // Return the generated code. 2331 // Return the generated code.
2301 return GetCode(INTERCEPTOR, name); 2332 return GetCode(INTERCEPTOR, name);
2302 } 2333 }
2303 2334
2304 2335
2305 Object* LoadStubCompiler::CompileLoadGlobal(JSObject* object, 2336 MaybeObject* LoadStubCompiler::CompileLoadGlobal(JSObject* object,
2306 GlobalObject* holder, 2337 GlobalObject* holder,
2307 JSGlobalPropertyCell* cell, 2338 JSGlobalPropertyCell* cell,
2308 String* name, 2339 String* name,
2309 bool is_dont_delete) { 2340 bool is_dont_delete) {
2310 // ----------- S t a t e ------------- 2341 // ----------- S t a t e -------------
2311 // -- r0 : receiver 2342 // -- r0 : receiver
2312 // -- r2 : name 2343 // -- r2 : name
2313 // -- lr : return address 2344 // -- lr : return address
2314 // ----------------------------------- 2345 // -----------------------------------
2315 Label miss; 2346 Label miss;
2316 2347
2317 // If the object is the holder then we know that it's a global 2348 // If the object is the holder then we know that it's a global
2318 // object which can only happen for contextual calls. In this case, 2349 // object which can only happen for contextual calls. In this case,
2319 // the receiver cannot be a smi. 2350 // the receiver cannot be a smi.
(...skipping 22 matching lines...) Expand all
2342 2373
2343 __ bind(&miss); 2374 __ bind(&miss);
2344 __ IncrementCounter(&Counters::named_load_global_stub_miss, 1, r1, r3); 2375 __ IncrementCounter(&Counters::named_load_global_stub_miss, 1, r1, r3);
2345 GenerateLoadMiss(masm(), Code::LOAD_IC); 2376 GenerateLoadMiss(masm(), Code::LOAD_IC);
2346 2377
2347 // Return the generated code. 2378 // Return the generated code.
2348 return GetCode(NORMAL, name); 2379 return GetCode(NORMAL, name);
2349 } 2380 }
2350 2381
2351 2382
2352 Object* KeyedLoadStubCompiler::CompileLoadField(String* name, 2383 MaybeObject* KeyedLoadStubCompiler::CompileLoadField(String* name,
2353 JSObject* receiver, 2384 JSObject* receiver,
2354 JSObject* holder, 2385 JSObject* holder,
2355 int index) { 2386 int index) {
2356 // ----------- S t a t e ------------- 2387 // ----------- S t a t e -------------
2357 // -- lr : return address 2388 // -- lr : return address
2358 // -- r0 : key 2389 // -- r0 : key
2359 // -- r1 : receiver 2390 // -- r1 : receiver
2360 // ----------------------------------- 2391 // -----------------------------------
2361 Label miss; 2392 Label miss;
2362 2393
2363 // Check the key is the cached one. 2394 // Check the key is the cached one.
2364 __ cmp(r0, Operand(Handle<String>(name))); 2395 __ cmp(r0, Operand(Handle<String>(name)));
2365 __ b(ne, &miss); 2396 __ b(ne, &miss);
2366 2397
2367 GenerateLoadField(receiver, holder, r1, r2, r3, r4, index, name, &miss); 2398 GenerateLoadField(receiver, holder, r1, r2, r3, r4, index, name, &miss);
2368 __ bind(&miss); 2399 __ bind(&miss);
2369 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2400 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2370 2401
2371 return GetCode(FIELD, name); 2402 return GetCode(FIELD, name);
2372 } 2403 }
2373 2404
2374 2405
2375 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, 2406 MaybeObject* KeyedLoadStubCompiler::CompileLoadCallback(
2376 JSObject* receiver, 2407 String* name,
2377 JSObject* holder, 2408 JSObject* receiver,
2378 AccessorInfo* callback) { 2409 JSObject* holder,
2410 AccessorInfo* callback) {
2379 // ----------- S t a t e ------------- 2411 // ----------- S t a t e -------------
2380 // -- lr : return address 2412 // -- lr : return address
2381 // -- r0 : key 2413 // -- r0 : key
2382 // -- r1 : receiver 2414 // -- r1 : receiver
2383 // ----------------------------------- 2415 // -----------------------------------
2384 Label miss; 2416 Label miss;
2385 2417
2386 // Check the key is the cached one. 2418 // Check the key is the cached one.
2387 __ cmp(r0, Operand(Handle<String>(name))); 2419 __ cmp(r0, Operand(Handle<String>(name)));
2388 __ b(ne, &miss); 2420 __ b(ne, &miss);
2389 2421
2390 Failure* failure = Failure::InternalError(); 2422 Failure* failure = Failure::InternalError();
2391 bool success = GenerateLoadCallback(receiver, holder, r1, r0, r2, r3, r4, 2423 bool success = GenerateLoadCallback(receiver, holder, r1, r0, r2, r3, r4,
2392 callback, name, &miss, &failure); 2424 callback, name, &miss, &failure);
2393 if (!success) { 2425 if (!success) {
2394 miss.Unuse(); 2426 miss.Unuse();
2395 return failure; 2427 return failure;
2396 } 2428 }
2397 2429
2398 __ bind(&miss); 2430 __ bind(&miss);
2399 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2431 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2400 2432
2401 return GetCode(CALLBACKS, name); 2433 return GetCode(CALLBACKS, name);
2402 } 2434 }
2403 2435
2404 2436
2405 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, 2437 MaybeObject* KeyedLoadStubCompiler::CompileLoadConstant(String* name,
2406 JSObject* receiver, 2438 JSObject* receiver,
2407 JSObject* holder, 2439 JSObject* holder,
2408 Object* value) { 2440 Object* value) {
2409 // ----------- S t a t e ------------- 2441 // ----------- S t a t e -------------
2410 // -- lr : return address 2442 // -- lr : return address
2411 // -- r0 : key 2443 // -- r0 : key
2412 // -- r1 : receiver 2444 // -- r1 : receiver
2413 // ----------------------------------- 2445 // -----------------------------------
2414 Label miss; 2446 Label miss;
2415 2447
2416 // Check the key is the cached one. 2448 // Check the key is the cached one.
2417 __ cmp(r0, Operand(Handle<String>(name))); 2449 __ cmp(r0, Operand(Handle<String>(name)));
2418 __ b(ne, &miss); 2450 __ b(ne, &miss);
2419 2451
2420 GenerateLoadConstant(receiver, holder, r1, r2, r3, r4, value, name, &miss); 2452 GenerateLoadConstant(receiver, holder, r1, r2, r3, r4, value, name, &miss);
2421 __ bind(&miss); 2453 __ bind(&miss);
2422 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2454 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2423 2455
2424 // Return the generated code. 2456 // Return the generated code.
2425 return GetCode(CONSTANT_FUNCTION, name); 2457 return GetCode(CONSTANT_FUNCTION, name);
2426 } 2458 }
2427 2459
2428 2460
2429 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, 2461 MaybeObject* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver,
2430 JSObject* holder, 2462 JSObject* holder,
2431 String* name) { 2463 String* name) {
2432 // ----------- S t a t e ------------- 2464 // ----------- S t a t e -------------
2433 // -- lr : return address 2465 // -- lr : return address
2434 // -- r0 : key 2466 // -- r0 : key
2435 // -- r1 : receiver 2467 // -- r1 : receiver
2436 // ----------------------------------- 2468 // -----------------------------------
2437 Label miss; 2469 Label miss;
2438 2470
2439 // Check the key is the cached one. 2471 // Check the key is the cached one.
2440 __ cmp(r0, Operand(Handle<String>(name))); 2472 __ cmp(r0, Operand(Handle<String>(name)));
2441 __ b(ne, &miss); 2473 __ b(ne, &miss);
(...skipping 10 matching lines...) Expand all
2452 r4, 2484 r4,
2453 name, 2485 name,
2454 &miss); 2486 &miss);
2455 __ bind(&miss); 2487 __ bind(&miss);
2456 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2488 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2457 2489
2458 return GetCode(INTERCEPTOR, name); 2490 return GetCode(INTERCEPTOR, name);
2459 } 2491 }
2460 2492
2461 2493
2462 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { 2494 MaybeObject* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) {
2463 // ----------- S t a t e ------------- 2495 // ----------- S t a t e -------------
2464 // -- lr : return address 2496 // -- lr : return address
2465 // -- r0 : key 2497 // -- r0 : key
2466 // -- r1 : receiver 2498 // -- r1 : receiver
2467 // ----------------------------------- 2499 // -----------------------------------
2468 Label miss; 2500 Label miss;
2469 2501
2470 // Check the key is the cached one. 2502 // Check the key is the cached one.
2471 __ cmp(r0, Operand(Handle<String>(name))); 2503 __ cmp(r0, Operand(Handle<String>(name)));
2472 __ b(ne, &miss); 2504 __ b(ne, &miss);
2473 2505
2474 GenerateLoadArrayLength(masm(), r1, r2, &miss); 2506 GenerateLoadArrayLength(masm(), r1, r2, &miss);
2475 __ bind(&miss); 2507 __ bind(&miss);
2476 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2508 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2477 2509
2478 return GetCode(CALLBACKS, name); 2510 return GetCode(CALLBACKS, name);
2479 } 2511 }
2480 2512
2481 2513
2482 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { 2514 MaybeObject* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) {
2483 // ----------- S t a t e ------------- 2515 // ----------- S t a t e -------------
2484 // -- lr : return address 2516 // -- lr : return address
2485 // -- r0 : key 2517 // -- r0 : key
2486 // -- r1 : receiver 2518 // -- r1 : receiver
2487 // ----------------------------------- 2519 // -----------------------------------
2488 Label miss; 2520 Label miss;
2489 __ IncrementCounter(&Counters::keyed_load_string_length, 1, r1, r3); 2521 __ IncrementCounter(&Counters::keyed_load_string_length, 1, r1, r3);
2490 2522
2491 // Check the key is the cached one. 2523 // Check the key is the cached one.
2492 __ cmp(r0, Operand(Handle<String>(name))); 2524 __ cmp(r0, Operand(Handle<String>(name)));
2493 __ b(ne, &miss); 2525 __ b(ne, &miss);
2494 2526
2495 GenerateLoadStringLength(masm(), r1, r2, r3, &miss); 2527 GenerateLoadStringLength(masm(), r1, r2, r3, &miss);
2496 __ bind(&miss); 2528 __ bind(&miss);
2497 __ DecrementCounter(&Counters::keyed_load_string_length, 1, r1, r3); 2529 __ DecrementCounter(&Counters::keyed_load_string_length, 1, r1, r3);
2498 2530
2499 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2531 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2500 2532
2501 return GetCode(CALLBACKS, name); 2533 return GetCode(CALLBACKS, name);
2502 } 2534 }
2503 2535
2504 2536
2505 // TODO(1224671): implement the fast case. 2537 // TODO(1224671): implement the fast case.
2506 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { 2538 MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) {
2507 // ----------- S t a t e ------------- 2539 // ----------- S t a t e -------------
2508 // -- lr : return address 2540 // -- lr : return address
2509 // -- r0 : key 2541 // -- r0 : key
2510 // -- r1 : receiver 2542 // -- r1 : receiver
2511 // ----------------------------------- 2543 // -----------------------------------
2512 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 2544 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2513 2545
2514 return GetCode(CALLBACKS, name); 2546 return GetCode(CALLBACKS, name);
2515 } 2547 }
2516 2548
2517 2549
2518 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, 2550 MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object,
2519 int index, 2551 int index,
2520 Map* transition, 2552 Map* transition,
2521 String* name) { 2553 String* name) {
2522 // ----------- S t a t e ------------- 2554 // ----------- S t a t e -------------
2523 // -- r0 : value 2555 // -- r0 : value
2524 // -- r1 : key 2556 // -- r1 : key
2525 // -- r2 : receiver 2557 // -- r2 : receiver
2526 // -- lr : return address 2558 // -- lr : return address
2527 // ----------------------------------- 2559 // -----------------------------------
2528 Label miss; 2560 Label miss;
2529 2561
2530 __ IncrementCounter(&Counters::keyed_store_field, 1, r3, r4); 2562 __ IncrementCounter(&Counters::keyed_store_field, 1, r3, r4);
2531 2563
(...skipping 14 matching lines...) Expand all
2546 __ DecrementCounter(&Counters::keyed_store_field, 1, r3, r4); 2578 __ DecrementCounter(&Counters::keyed_store_field, 1, r3, r4);
2547 Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Miss)); 2579 Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Miss));
2548 2580
2549 __ Jump(ic, RelocInfo::CODE_TARGET); 2581 __ Jump(ic, RelocInfo::CODE_TARGET);
2550 2582
2551 // Return the generated code. 2583 // Return the generated code.
2552 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); 2584 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name);
2553 } 2585 }
2554 2586
2555 2587
2556 Object* ConstructStubCompiler::CompileConstructStub( 2588 MaybeObject* ConstructStubCompiler::CompileConstructStub(
2557 SharedFunctionInfo* shared) { 2589 SharedFunctionInfo* shared) {
2558 // ----------- S t a t e ------------- 2590 // ----------- S t a t e -------------
2559 // -- r0 : argc 2591 // -- r0 : argc
2560 // -- r1 : constructor 2592 // -- r1 : constructor
2561 // -- lr : return address 2593 // -- lr : return address
2562 // -- [sp] : last argument 2594 // -- [sp] : last argument
2563 // ----------------------------------- 2595 // -----------------------------------
2564 Label generic_stub_call; 2596 Label generic_stub_call;
2565 2597
2566 // Use r7 for holding undefined which is used in several places below. 2598 // Use r7 for holding undefined which is used in several places below.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2694 // Return the generated code. 2726 // Return the generated code.
2695 return GetCode(); 2727 return GetCode();
2696 } 2728 }
2697 2729
2698 2730
2699 #undef __ 2731 #undef __
2700 2732
2701 } } // namespace v8::internal 2733 } } // namespace v8::internal
2702 2734
2703 #endif // V8_TARGET_ARCH_ARM 2735 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698