| OLD | NEW |
| 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 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 } | 804 } |
| 805 | 805 |
| 806 | 806 |
| 807 // Generate code to check that a global property cell is empty. Create | 807 // Generate code to check that a global property cell is empty. Create |
| 808 // the property cell at compilation time if no cell exists for the | 808 // the property cell at compilation time if no cell exists for the |
| 809 // property. | 809 // property. |
| 810 static Object* GenerateCheckPropertyCell(MacroAssembler* masm, | 810 static Object* GenerateCheckPropertyCell(MacroAssembler* masm, |
| 811 GlobalObject* global, | 811 GlobalObject* global, |
| 812 String* name, | 812 String* name, |
| 813 Register scratch, | 813 Register scratch, |
| 814 Object* probe; |
| 815 { TryAllocation t = global->EnsurePropertyCell(name); |
| 816 if (!t->ToObject(&probe)) return t; |
| 817 } |
| 814 Label* miss) { | 818 Label* miss) { |
| 815 Object* probe = global->EnsurePropertyCell(name); | |
| 816 if (probe->IsFailure()) return probe; | |
| 817 JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(probe); | 819 JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(probe); |
| 818 ASSERT(cell->value()->IsTheHole()); | 820 ASSERT(cell->value()->IsTheHole()); |
| 819 __ mov(scratch, Immediate(Handle<Object>(cell))); | 821 __ mov(scratch, Immediate(Handle<Object>(cell))); |
| 820 __ cmp(FieldOperand(scratch, JSGlobalPropertyCell::kValueOffset), | 822 __ cmp(FieldOperand(scratch, JSGlobalPropertyCell::kValueOffset), |
| 821 Immediate(Factory::the_hole_value())); | 823 Immediate(Factory::the_hole_value())); |
| 822 __ j(not_equal, miss, not_taken); | 824 __ j(not_equal, miss, not_taken); |
| 823 return cell; | 825 return cell; |
| 824 } | 826 } |
| 825 | 827 |
| 826 | 828 |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 __ cmp(FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset), | 1309 __ cmp(FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset), |
| 1308 Immediate(Handle<SharedFunctionInfo>(function->shared()))); | 1310 Immediate(Handle<SharedFunctionInfo>(function->shared()))); |
| 1309 __ j(not_equal, miss, not_taken); | 1311 __ j(not_equal, miss, not_taken); |
| 1310 } else { | 1312 } else { |
| 1311 __ cmp(Operand(edi), Immediate(Handle<JSFunction>(function))); | 1313 __ cmp(Operand(edi), Immediate(Handle<JSFunction>(function))); |
| 1312 __ j(not_equal, miss, not_taken); | 1314 __ j(not_equal, miss, not_taken); |
| 1313 } | 1315 } |
| 1314 } | 1316 } |
| 1315 | 1317 |
| 1316 | 1318 |
| 1319 Object* obj; |
| 1320 { TryAllocation t = |
| 1321 StubCache::ComputeCallMiss(arguments().immediate(), kind_); |
| 1322 if (!t->ToObject(&obj)) return t; |
| 1323 } |
| 1317 Object* CallStubCompiler::GenerateMissBranch() { | 1324 Object* CallStubCompiler::GenerateMissBranch() { |
| 1318 Object* obj = StubCache::ComputeCallMiss(arguments().immediate(), kind_); | |
| 1319 if (obj->IsFailure()) return obj; | |
| 1320 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); | 1325 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); |
| 1321 return obj; | 1326 return obj; |
| 1322 } | 1327 } |
| 1323 | 1328 |
| 1324 | 1329 |
| 1325 Object* CallStubCompiler::CompileCallField(JSObject* object, | 1330 Object* CallStubCompiler::CompileCallField(JSObject* object, |
| 1326 JSObject* holder, | 1331 JSObject* holder, |
| 1327 int index, | 1332 int index, |
| 1328 String* name) { | 1333 String* name) { |
| 1329 // ----------- S t a t e ------------- | 1334 // ----------- S t a t e ------------- |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 // necessary. | 1366 // necessary. |
| 1362 if (object->IsGlobalObject()) { | 1367 if (object->IsGlobalObject()) { |
| 1363 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1368 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 1364 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1369 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 1365 } | 1370 } |
| 1366 | 1371 |
| 1367 // Invoke the function. | 1372 // Invoke the function. |
| 1368 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); | 1373 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); |
| 1369 | 1374 |
| 1370 // Handle call cache miss. | 1375 // Handle call cache miss. |
| 1376 Object* obj; |
| 1377 { TryAllocation t = GenerateMissBranch(); |
| 1378 if (!t->ToObject(&obj)) return t; |
| 1379 } |
| 1371 __ bind(&miss); | 1380 __ bind(&miss); |
| 1372 Object* obj = GenerateMissBranch(); | |
| 1373 if (obj->IsFailure()) return obj; | |
| 1374 | 1381 |
| 1375 // Return the generated code. | 1382 // Return the generated code. |
| 1376 return GetCode(FIELD, name); | 1383 return GetCode(FIELD, name); |
| 1377 } | 1384 } |
| 1378 | 1385 |
| 1379 | 1386 |
| 1380 Object* CallStubCompiler::CompileArrayPushCall(Object* object, | 1387 Object* CallStubCompiler::CompileArrayPushCall(Object* object, |
| 1381 JSObject* holder, | 1388 JSObject* holder, |
| 1382 JSGlobalPropertyCell* cell, | 1389 JSGlobalPropertyCell* cell, |
| 1383 JSFunction* function, | 1390 JSFunction* function, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1507 // Elements are in new space, so write barrier is not required. | 1514 // Elements are in new space, so write barrier is not required. |
| 1508 __ ret((argc + 1) * kPointerSize); | 1515 __ ret((argc + 1) * kPointerSize); |
| 1509 } | 1516 } |
| 1510 | 1517 |
| 1511 __ bind(&call_builtin); | 1518 __ bind(&call_builtin); |
| 1512 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush), | 1519 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush), |
| 1513 argc + 1, | 1520 argc + 1, |
| 1514 1); | 1521 1); |
| 1515 } | 1522 } |
| 1516 | 1523 |
| 1524 Object* obj; |
| 1525 { TryAllocation t = GenerateMissBranch(); |
| 1526 if (!t->ToObject(&obj)) return t; |
| 1527 } |
| 1517 __ bind(&miss); | 1528 __ bind(&miss); |
| 1518 Object* obj = GenerateMissBranch(); | |
| 1519 if (obj->IsFailure()) return obj; | |
| 1520 | 1529 |
| 1521 // Return the generated code. | 1530 // Return the generated code. |
| 1522 return GetCode(function); | 1531 return GetCode(function); |
| 1523 } | 1532 } |
| 1524 | 1533 |
| 1525 | 1534 |
| 1526 Object* CallStubCompiler::CompileArrayPopCall(Object* object, | 1535 Object* CallStubCompiler::CompileArrayPopCall(Object* object, |
| 1527 JSObject* holder, | 1536 JSObject* holder, |
| 1528 JSGlobalPropertyCell* cell, | 1537 JSGlobalPropertyCell* cell, |
| 1529 JSFunction* function, | 1538 JSFunction* function, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1588 | 1597 |
| 1589 __ bind(&return_undefined); | 1598 __ bind(&return_undefined); |
| 1590 __ mov(eax, Immediate(Factory::undefined_value())); | 1599 __ mov(eax, Immediate(Factory::undefined_value())); |
| 1591 __ ret((argc + 1) * kPointerSize); | 1600 __ ret((argc + 1) * kPointerSize); |
| 1592 | 1601 |
| 1593 __ bind(&call_builtin); | 1602 __ bind(&call_builtin); |
| 1594 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop), | 1603 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop), |
| 1595 argc + 1, | 1604 argc + 1, |
| 1596 1); | 1605 1); |
| 1597 | 1606 |
| 1607 Object* obj; |
| 1608 { TryAllocation t = GenerateMissBranch(); |
| 1609 if (!t->ToObject(&obj)) return t; |
| 1610 } |
| 1598 __ bind(&miss); | 1611 __ bind(&miss); |
| 1599 Object* obj = GenerateMissBranch(); | |
| 1600 if (obj->IsFailure()) return obj; | |
| 1601 | 1612 |
| 1602 // Return the generated code. | 1613 // Return the generated code. |
| 1603 return GetCode(function); | 1614 return GetCode(function); |
| 1604 } | 1615 } |
| 1605 | 1616 |
| 1606 | 1617 |
| 1607 Object* CallStubCompiler::CompileStringCharCodeAtCall( | 1618 Object* CallStubCompiler::CompileStringCharCodeAtCall( |
| 1608 Object* object, | 1619 Object* object, |
| 1609 JSObject* holder, | 1620 JSObject* holder, |
| 1610 JSGlobalPropertyCell* cell, | 1621 JSGlobalPropertyCell* cell, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1658 char_code_at_generator.GenerateFast(masm()); | 1669 char_code_at_generator.GenerateFast(masm()); |
| 1659 __ ret((argc + 1) * kPointerSize); | 1670 __ ret((argc + 1) * kPointerSize); |
| 1660 | 1671 |
| 1661 ICRuntimeCallHelper call_helper; | 1672 ICRuntimeCallHelper call_helper; |
| 1662 char_code_at_generator.GenerateSlow(masm(), call_helper); | 1673 char_code_at_generator.GenerateSlow(masm(), call_helper); |
| 1663 | 1674 |
| 1664 __ bind(&index_out_of_range); | 1675 __ bind(&index_out_of_range); |
| 1665 __ Set(eax, Immediate(Factory::nan_value())); | 1676 __ Set(eax, Immediate(Factory::nan_value())); |
| 1666 __ ret((argc + 1) * kPointerSize); | 1677 __ ret((argc + 1) * kPointerSize); |
| 1667 | 1678 |
| 1679 Object* obj; |
| 1680 { TryAllocation t = GenerateMissBranch(); |
| 1681 if (!t->ToObject(&obj)) return t; |
| 1682 } |
| 1668 __ bind(&miss); | 1683 __ bind(&miss); |
| 1669 Object* obj = GenerateMissBranch(); | |
| 1670 if (obj->IsFailure()) return obj; | |
| 1671 | 1684 |
| 1672 // Return the generated code. | 1685 // Return the generated code. |
| 1673 return GetCode(function); | 1686 return GetCode(function); |
| 1674 } | 1687 } |
| 1675 | 1688 |
| 1676 | 1689 |
| 1677 Object* CallStubCompiler::CompileStringCharAtCall(Object* object, | 1690 Object* CallStubCompiler::CompileStringCharAtCall(Object* object, |
| 1678 JSObject* holder, | 1691 JSObject* holder, |
| 1679 JSGlobalPropertyCell* cell, | 1692 JSGlobalPropertyCell* cell, |
| 1680 JSFunction* function, | 1693 JSFunction* function, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1730 char_at_generator.GenerateFast(masm()); | 1743 char_at_generator.GenerateFast(masm()); |
| 1731 __ ret((argc + 1) * kPointerSize); | 1744 __ ret((argc + 1) * kPointerSize); |
| 1732 | 1745 |
| 1733 ICRuntimeCallHelper call_helper; | 1746 ICRuntimeCallHelper call_helper; |
| 1734 char_at_generator.GenerateSlow(masm(), call_helper); | 1747 char_at_generator.GenerateSlow(masm(), call_helper); |
| 1735 | 1748 |
| 1736 __ bind(&index_out_of_range); | 1749 __ bind(&index_out_of_range); |
| 1737 __ Set(eax, Immediate(Factory::empty_string())); | 1750 __ Set(eax, Immediate(Factory::empty_string())); |
| 1738 __ ret((argc + 1) * kPointerSize); | 1751 __ ret((argc + 1) * kPointerSize); |
| 1739 | 1752 |
| 1753 Object* obj; |
| 1754 { TryAllocation t = GenerateMissBranch(); |
| 1755 if (!t->ToObject(&obj)) return t; |
| 1756 } |
| 1740 __ bind(&miss); | 1757 __ bind(&miss); |
| 1741 Object* obj = GenerateMissBranch(); | |
| 1742 if (obj->IsFailure()) return obj; | |
| 1743 | 1758 |
| 1744 // Return the generated code. | 1759 // Return the generated code. |
| 1745 return GetCode(function); | 1760 return GetCode(function); |
| 1746 } | 1761 } |
| 1747 | 1762 |
| 1748 | 1763 |
| 1749 Object* CallStubCompiler::CompileStringFromCharCodeCall( | 1764 Object* CallStubCompiler::CompileStringFromCharCodeCall( |
| 1750 Object* object, | 1765 Object* object, |
| 1751 JSObject* holder, | 1766 JSObject* holder, |
| 1752 JSGlobalPropertyCell* cell, | 1767 JSGlobalPropertyCell* cell, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 | 1818 |
| 1804 ICRuntimeCallHelper call_helper; | 1819 ICRuntimeCallHelper call_helper; |
| 1805 char_from_code_generator.GenerateSlow(masm(), call_helper); | 1820 char_from_code_generator.GenerateSlow(masm(), call_helper); |
| 1806 | 1821 |
| 1807 // Tail call the full function. We do not have to patch the receiver | 1822 // Tail call the full function. We do not have to patch the receiver |
| 1808 // because the function makes no use of it. | 1823 // because the function makes no use of it. |
| 1809 __ bind(&slow); | 1824 __ bind(&slow); |
| 1810 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 1825 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
| 1811 | 1826 |
| 1812 __ bind(&miss); | 1827 __ bind(&miss); |
| 1828 Object* obj; |
| 1829 { TryAllocation t = GenerateMissBranch(); |
| 1830 if (!t->ToObject(&obj)) return t; |
| 1831 } |
| 1813 // ecx: function name. | 1832 // ecx: function name. |
| 1814 Object* obj = GenerateMissBranch(); | |
| 1815 if (obj->IsFailure()) return obj; | |
| 1816 | 1833 |
| 1817 // Return the generated code. | 1834 // Return the generated code. |
| 1818 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 1835 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 1819 } | 1836 } |
| 1820 | 1837 |
| 1821 | 1838 |
| 1822 Object* CallStubCompiler::CompileMathFloorCall(Object* object, | 1839 Object* CallStubCompiler::CompileMathFloorCall(Object* object, |
| 1823 JSObject* holder, | 1840 JSObject* holder, |
| 1824 JSGlobalPropertyCell* cell, | 1841 JSGlobalPropertyCell* cell, |
| 1825 JSFunction* function, | 1842 JSFunction* function, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1928 __ bind(&already_round); | 1945 __ bind(&already_round); |
| 1929 __ mov(eax, Operand(esp, 1 * kPointerSize)); | 1946 __ mov(eax, Operand(esp, 1 * kPointerSize)); |
| 1930 __ ret(2 * kPointerSize); | 1947 __ ret(2 * kPointerSize); |
| 1931 | 1948 |
| 1932 // Tail call the full function. We do not have to patch the receiver | 1949 // Tail call the full function. We do not have to patch the receiver |
| 1933 // because the function makes no use of it. | 1950 // because the function makes no use of it. |
| 1934 __ bind(&slow); | 1951 __ bind(&slow); |
| 1935 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 1952 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
| 1936 | 1953 |
| 1937 __ bind(&miss); | 1954 __ bind(&miss); |
| 1955 Object* obj; |
| 1956 { TryAllocation t = GenerateMissBranch(); |
| 1957 if (!t->ToObject(&obj)) return t; |
| 1958 } |
| 1938 // ecx: function name. | 1959 // ecx: function name. |
| 1939 Object* obj = GenerateMissBranch(); | |
| 1940 if (obj->IsFailure()) return obj; | |
| 1941 | 1960 |
| 1942 // Return the generated code. | 1961 // Return the generated code. |
| 1943 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 1962 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 1944 } | 1963 } |
| 1945 | 1964 |
| 1946 | 1965 |
| 1947 Object* CallStubCompiler::CompileMathAbsCall(Object* object, | 1966 Object* CallStubCompiler::CompileMathAbsCall(Object* object, |
| 1948 JSObject* holder, | 1967 JSObject* holder, |
| 1949 JSGlobalPropertyCell* cell, | 1968 JSGlobalPropertyCell* cell, |
| 1950 JSFunction* function, | 1969 JSFunction* function, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2031 __ mov(FieldOperand(eax, HeapNumber::kExponentOffset), ebx); | 2050 __ mov(FieldOperand(eax, HeapNumber::kExponentOffset), ebx); |
| 2032 __ mov(FieldOperand(eax, HeapNumber::kMantissaOffset), ecx); | 2051 __ mov(FieldOperand(eax, HeapNumber::kMantissaOffset), ecx); |
| 2033 __ ret(2 * kPointerSize); | 2052 __ ret(2 * kPointerSize); |
| 2034 | 2053 |
| 2035 // Tail call the full function. We do not have to patch the receiver | 2054 // Tail call the full function. We do not have to patch the receiver |
| 2036 // because the function makes no use of it. | 2055 // because the function makes no use of it. |
| 2037 __ bind(&slow); | 2056 __ bind(&slow); |
| 2038 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2057 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
| 2039 | 2058 |
| 2040 __ bind(&miss); | 2059 __ bind(&miss); |
| 2060 Object* obj; |
| 2061 { TryAllocation t = GenerateMissBranch(); |
| 2062 if (!t->ToObject(&obj)) return t; |
| 2063 } |
| 2041 // ecx: function name. | 2064 // ecx: function name. |
| 2042 Object* obj = GenerateMissBranch(); | |
| 2043 if (obj->IsFailure()) return obj; | |
| 2044 | 2065 |
| 2045 // Return the generated code. | 2066 // Return the generated code. |
| 2046 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2067 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
| 2047 } | 2068 } |
| 2048 | 2069 |
| 2049 | 2070 |
| 2050 Object* CallStubCompiler::CompileCallConstant(Object* object, | 2071 Object* CallStubCompiler::CompileCallConstant(Object* object, |
| 2051 JSObject* holder, | 2072 JSObject* holder, |
| 2052 JSFunction* function, | 2073 JSFunction* function, |
| 2053 String* name, | 2074 String* name, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2184 GenerateFastApiCall(masm(), optimization, argc); | 2205 GenerateFastApiCall(masm(), optimization, argc); |
| 2185 } else { | 2206 } else { |
| 2186 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2207 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
| 2187 } | 2208 } |
| 2188 | 2209 |
| 2189 // Handle call cache miss. | 2210 // Handle call cache miss. |
| 2190 __ bind(&miss); | 2211 __ bind(&miss); |
| 2191 if (depth != kInvalidProtoDepth) { | 2212 if (depth != kInvalidProtoDepth) { |
| 2192 FreeSpaceForFastApiCall(masm(), eax); | 2213 FreeSpaceForFastApiCall(masm(), eax); |
| 2193 } | 2214 } |
| 2215 Object* obj; |
| 2216 { TryAllocation t = GenerateMissBranch(); |
| 2217 if (!t->ToObject(&obj)) return t; |
| 2218 } |
| 2194 __ bind(&miss_in_smi_check); | 2219 __ bind(&miss_in_smi_check); |
| 2195 Object* obj = GenerateMissBranch(); | |
| 2196 if (obj->IsFailure()) return obj; | |
| 2197 | 2220 |
| 2198 // Return the generated code. | 2221 // Return the generated code. |
| 2199 return GetCode(function); | 2222 return GetCode(function); |
| 2200 } | 2223 } |
| 2201 | 2224 |
| 2202 | 2225 |
| 2203 Object* CallStubCompiler::CompileCallInterceptor(JSObject* object, | 2226 Object* CallStubCompiler::CompileCallInterceptor(JSObject* object, |
| 2204 JSObject* holder, | 2227 JSObject* holder, |
| 2205 String* name) { | 2228 String* name) { |
| 2206 // ----------- S t a t e ------------- | 2229 // ----------- S t a t e ------------- |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2249 if (object->IsGlobalObject()) { | 2272 if (object->IsGlobalObject()) { |
| 2250 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2273 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 2251 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2274 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 2252 } | 2275 } |
| 2253 | 2276 |
| 2254 // Invoke the function. | 2277 // Invoke the function. |
| 2255 __ mov(edi, eax); | 2278 __ mov(edi, eax); |
| 2256 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); | 2279 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); |
| 2257 | 2280 |
| 2258 // Handle load cache miss. | 2281 // Handle load cache miss. |
| 2282 Object* obj; |
| 2283 { TryAllocation t = GenerateMissBranch(); |
| 2284 if (!t->ToObject(&obj)) return t; |
| 2285 } |
| 2259 __ bind(&miss); | 2286 __ bind(&miss); |
| 2260 Object* obj = GenerateMissBranch(); | |
| 2261 if (obj->IsFailure()) return obj; | |
| 2262 | 2287 |
| 2263 // Return the generated code. | 2288 // Return the generated code. |
| 2264 return GetCode(INTERCEPTOR, name); | 2289 return GetCode(INTERCEPTOR, name); |
| 2265 } | 2290 } |
| 2266 | 2291 |
| 2267 | 2292 |
| 2268 Object* CallStubCompiler::CompileCallGlobal(JSObject* object, | 2293 Object* CallStubCompiler::CompileCallGlobal(JSObject* object, |
| 2269 GlobalObject* holder, | 2294 GlobalObject* holder, |
| 2270 JSGlobalPropertyCell* cell, | 2295 JSGlobalPropertyCell* cell, |
| 2271 JSFunction* function, | 2296 JSFunction* function, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2310 // Jump to the cached code (tail call). | 2335 // Jump to the cached code (tail call). |
| 2311 __ IncrementCounter(&Counters::call_global_inline, 1); | 2336 __ IncrementCounter(&Counters::call_global_inline, 1); |
| 2312 ASSERT(function->is_compiled()); | 2337 ASSERT(function->is_compiled()); |
| 2313 Handle<Code> code(function->code()); | 2338 Handle<Code> code(function->code()); |
| 2314 ParameterCount expected(function->shared()->formal_parameter_count()); | 2339 ParameterCount expected(function->shared()->formal_parameter_count()); |
| 2315 __ InvokeCode(code, expected, arguments(), | 2340 __ InvokeCode(code, expected, arguments(), |
| 2316 RelocInfo::CODE_TARGET, JUMP_FUNCTION); | 2341 RelocInfo::CODE_TARGET, JUMP_FUNCTION); |
| 2317 | 2342 |
| 2318 // Handle call cache miss. | 2343 // Handle call cache miss. |
| 2319 __ bind(&miss); | 2344 __ bind(&miss); |
| 2345 Object* obj; |
| 2346 { TryAllocation t = GenerateMissBranch(); |
| 2347 if (!t->ToObject(&obj)) return t; |
| 2348 } |
| 2320 __ IncrementCounter(&Counters::call_global_inline_miss, 1); | 2349 __ IncrementCounter(&Counters::call_global_inline_miss, 1); |
| 2321 Object* obj = GenerateMissBranch(); | |
| 2322 if (obj->IsFailure()) return obj; | |
| 2323 | 2350 |
| 2324 // Return the generated code. | 2351 // Return the generated code. |
| 2325 return GetCode(NORMAL, name); | 2352 return GetCode(NORMAL, name); |
| 2326 } | 2353 } |
| 2327 | 2354 |
| 2328 | 2355 |
| 2329 Object* StoreStubCompiler::CompileStoreField(JSObject* object, | 2356 Object* StoreStubCompiler::CompileStoreField(JSObject* object, |
| 2330 int index, | 2357 int index, |
| 2331 Map* transition, | 2358 Map* transition, |
| 2332 String* name) { | 2359 String* name) { |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3064 // Return the generated code. | 3091 // Return the generated code. |
| 3065 return GetCode(); | 3092 return GetCode(); |
| 3066 } | 3093 } |
| 3067 | 3094 |
| 3068 | 3095 |
| 3069 #undef __ | 3096 #undef __ |
| 3070 | 3097 |
| 3071 } } // namespace v8::internal | 3098 } } // namespace v8::internal |
| 3072 | 3099 |
| 3073 #endif // V8_TARGET_ARCH_IA32 | 3100 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |