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 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 if (object->IsGlobalObject()) { | 1402 if (object->IsGlobalObject()) { |
1403 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1403 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
1404 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1404 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
1405 } | 1405 } |
1406 | 1406 |
1407 // Invoke the function. | 1407 // Invoke the function. |
1408 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); | 1408 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); |
1409 | 1409 |
1410 // Handle call cache miss. | 1410 // Handle call cache miss. |
1411 __ bind(&miss); | 1411 __ bind(&miss); |
1412 Object* obj; | 1412 MaybeObject* maybe_result = GenerateMissBranch(); |
1413 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1413 if (maybe_result->IsFailure()) return maybe_result; |
1414 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1415 } | |
1416 | 1414 |
1417 // Return the generated code. | 1415 // Return the generated code. |
1418 return GetCode(FIELD, name); | 1416 return GetCode(FIELD, name); |
1419 } | 1417 } |
1420 | 1418 |
1421 | 1419 |
1422 MaybeObject* CallStubCompiler::CompileArrayPushCall(Object* object, | 1420 MaybeObject* CallStubCompiler::CompileArrayPushCall(Object* object, |
1423 JSObject* holder, | 1421 JSObject* holder, |
1424 JSGlobalPropertyCell* cell, | 1422 JSGlobalPropertyCell* cell, |
1425 JSFunction* function, | 1423 JSFunction* function, |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 __ ret((argc + 1) * kPointerSize); | 1552 __ ret((argc + 1) * kPointerSize); |
1555 } | 1553 } |
1556 | 1554 |
1557 __ bind(&call_builtin); | 1555 __ bind(&call_builtin); |
1558 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush), | 1556 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPush), |
1559 argc + 1, | 1557 argc + 1, |
1560 1); | 1558 1); |
1561 } | 1559 } |
1562 | 1560 |
1563 __ bind(&miss); | 1561 __ bind(&miss); |
1564 Object* obj; | 1562 MaybeObject* maybe_result = GenerateMissBranch(); |
1565 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1563 if (maybe_result->IsFailure()) return maybe_result; |
1566 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1567 } | |
1568 | 1564 |
1569 // Return the generated code. | 1565 // Return the generated code. |
1570 return GetCode(function); | 1566 return GetCode(function); |
1571 } | 1567 } |
1572 | 1568 |
1573 | 1569 |
1574 MaybeObject* CallStubCompiler::CompileArrayPopCall(Object* object, | 1570 MaybeObject* CallStubCompiler::CompileArrayPopCall(Object* object, |
1575 JSObject* holder, | 1571 JSObject* holder, |
1576 JSGlobalPropertyCell* cell, | 1572 JSGlobalPropertyCell* cell, |
1577 JSFunction* function, | 1573 JSFunction* function, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1637 __ bind(&return_undefined); | 1633 __ bind(&return_undefined); |
1638 __ mov(eax, Immediate(FACTORY->undefined_value())); | 1634 __ mov(eax, Immediate(FACTORY->undefined_value())); |
1639 __ ret((argc + 1) * kPointerSize); | 1635 __ ret((argc + 1) * kPointerSize); |
1640 | 1636 |
1641 __ bind(&call_builtin); | 1637 __ bind(&call_builtin); |
1642 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop), | 1638 __ TailCallExternalReference(ExternalReference(Builtins::c_ArrayPop), |
1643 argc + 1, | 1639 argc + 1, |
1644 1); | 1640 1); |
1645 | 1641 |
1646 __ bind(&miss); | 1642 __ bind(&miss); |
1647 Object* obj; | 1643 MaybeObject* maybe_result = GenerateMissBranch(); |
1648 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1644 if (maybe_result->IsFailure()) return maybe_result; |
1649 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1650 } | |
1651 | 1645 |
1652 // Return the generated code. | 1646 // Return the generated code. |
1653 return GetCode(function); | 1647 return GetCode(function); |
1654 } | 1648 } |
1655 | 1649 |
1656 | 1650 |
1657 MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall( | 1651 MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall( |
1658 Object* object, | 1652 Object* object, |
1659 JSObject* holder, | 1653 JSObject* holder, |
1660 JSGlobalPropertyCell* cell, | 1654 JSGlobalPropertyCell* cell, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 if (index_out_of_range.is_linked()) { | 1715 if (index_out_of_range.is_linked()) { |
1722 __ bind(&index_out_of_range); | 1716 __ bind(&index_out_of_range); |
1723 __ Set(eax, Immediate(FACTORY->nan_value())); | 1717 __ Set(eax, Immediate(FACTORY->nan_value())); |
1724 __ ret((argc + 1) * kPointerSize); | 1718 __ ret((argc + 1) * kPointerSize); |
1725 } | 1719 } |
1726 | 1720 |
1727 __ bind(&miss); | 1721 __ bind(&miss); |
1728 // Restore function name in ecx. | 1722 // Restore function name in ecx. |
1729 __ Set(ecx, Immediate(Handle<String>(name))); | 1723 __ Set(ecx, Immediate(Handle<String>(name))); |
1730 __ bind(&name_miss); | 1724 __ bind(&name_miss); |
1731 Object* obj; | 1725 MaybeObject* maybe_result = GenerateMissBranch(); |
1732 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1726 if (maybe_result->IsFailure()) return maybe_result; |
1733 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1734 } | |
1735 | 1727 |
1736 // Return the generated code. | 1728 // Return the generated code. |
1737 return GetCode(function); | 1729 return GetCode(function); |
1738 } | 1730 } |
1739 | 1731 |
1740 | 1732 |
1741 MaybeObject* CallStubCompiler::CompileStringCharAtCall( | 1733 MaybeObject* CallStubCompiler::CompileStringCharAtCall( |
1742 Object* object, | 1734 Object* object, |
1743 JSObject* holder, | 1735 JSObject* holder, |
1744 JSGlobalPropertyCell* cell, | 1736 JSGlobalPropertyCell* cell, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1807 if (index_out_of_range.is_linked()) { | 1799 if (index_out_of_range.is_linked()) { |
1808 __ bind(&index_out_of_range); | 1800 __ bind(&index_out_of_range); |
1809 __ Set(eax, Immediate(FACTORY->empty_string())); | 1801 __ Set(eax, Immediate(FACTORY->empty_string())); |
1810 __ ret((argc + 1) * kPointerSize); | 1802 __ ret((argc + 1) * kPointerSize); |
1811 } | 1803 } |
1812 | 1804 |
1813 __ bind(&miss); | 1805 __ bind(&miss); |
1814 // Restore function name in ecx. | 1806 // Restore function name in ecx. |
1815 __ Set(ecx, Immediate(Handle<String>(name))); | 1807 __ Set(ecx, Immediate(Handle<String>(name))); |
1816 __ bind(&name_miss); | 1808 __ bind(&name_miss); |
1817 Object* obj; | 1809 MaybeObject* maybe_result = GenerateMissBranch(); |
1818 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1810 if (maybe_result->IsFailure()) return maybe_result; |
1819 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1820 } | |
1821 | 1811 |
1822 // Return the generated code. | 1812 // Return the generated code. |
1823 return GetCode(function); | 1813 return GetCode(function); |
1824 } | 1814 } |
1825 | 1815 |
1826 | 1816 |
1827 MaybeObject* CallStubCompiler::CompileStringFromCharCodeCall( | 1817 MaybeObject* CallStubCompiler::CompileStringFromCharCodeCall( |
1828 Object* object, | 1818 Object* object, |
1829 JSObject* holder, | 1819 JSObject* holder, |
1830 JSGlobalPropertyCell* cell, | 1820 JSGlobalPropertyCell* cell, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1882 StubRuntimeCallHelper call_helper; | 1872 StubRuntimeCallHelper call_helper; |
1883 char_from_code_generator.GenerateSlow(masm(), call_helper); | 1873 char_from_code_generator.GenerateSlow(masm(), call_helper); |
1884 | 1874 |
1885 // Tail call the full function. We do not have to patch the receiver | 1875 // Tail call the full function. We do not have to patch the receiver |
1886 // because the function makes no use of it. | 1876 // because the function makes no use of it. |
1887 __ bind(&slow); | 1877 __ bind(&slow); |
1888 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 1878 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
1889 | 1879 |
1890 __ bind(&miss); | 1880 __ bind(&miss); |
1891 // ecx: function name. | 1881 // ecx: function name. |
1892 Object* obj; | 1882 MaybeObject* maybe_result = GenerateMissBranch(); |
1893 { MaybeObject* maybe_obj = GenerateMissBranch(); | 1883 if (maybe_result->IsFailure()) return maybe_result; |
1894 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
1895 } | |
1896 | 1884 |
1897 // Return the generated code. | 1885 // Return the generated code. |
1898 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 1886 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
1899 } | 1887 } |
1900 | 1888 |
1901 | 1889 |
1902 MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object, | 1890 MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object, |
1903 JSObject* holder, | 1891 JSObject* holder, |
1904 JSGlobalPropertyCell* cell, | 1892 JSGlobalPropertyCell* cell, |
1905 JSFunction* function, | 1893 JSFunction* function, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2010 __ mov(eax, Operand(esp, 1 * kPointerSize)); | 1998 __ mov(eax, Operand(esp, 1 * kPointerSize)); |
2011 __ ret(2 * kPointerSize); | 1999 __ ret(2 * kPointerSize); |
2012 | 2000 |
2013 // Tail call the full function. We do not have to patch the receiver | 2001 // Tail call the full function. We do not have to patch the receiver |
2014 // because the function makes no use of it. | 2002 // because the function makes no use of it. |
2015 __ bind(&slow); | 2003 __ bind(&slow); |
2016 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2004 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
2017 | 2005 |
2018 __ bind(&miss); | 2006 __ bind(&miss); |
2019 // ecx: function name. | 2007 // ecx: function name. |
2020 Object* obj; | 2008 MaybeObject* maybe_result = GenerateMissBranch(); |
2021 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2009 if (maybe_result->IsFailure()) return maybe_result; |
2022 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2023 } | |
2024 | 2010 |
2025 // Return the generated code. | 2011 // Return the generated code. |
2026 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2012 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
2027 } | 2013 } |
2028 | 2014 |
2029 | 2015 |
2030 MaybeObject* CallStubCompiler::CompileMathAbsCall(Object* object, | 2016 MaybeObject* CallStubCompiler::CompileMathAbsCall(Object* object, |
2031 JSObject* holder, | 2017 JSObject* holder, |
2032 JSGlobalPropertyCell* cell, | 2018 JSGlobalPropertyCell* cell, |
2033 JSFunction* function, | 2019 JSFunction* function, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 __ mov(FieldOperand(eax, HeapNumber::kMantissaOffset), ecx); | 2101 __ mov(FieldOperand(eax, HeapNumber::kMantissaOffset), ecx); |
2116 __ ret(2 * kPointerSize); | 2102 __ ret(2 * kPointerSize); |
2117 | 2103 |
2118 // Tail call the full function. We do not have to patch the receiver | 2104 // Tail call the full function. We do not have to patch the receiver |
2119 // because the function makes no use of it. | 2105 // because the function makes no use of it. |
2120 __ bind(&slow); | 2106 __ bind(&slow); |
2121 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2107 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
2122 | 2108 |
2123 __ bind(&miss); | 2109 __ bind(&miss); |
2124 // ecx: function name. | 2110 // ecx: function name. |
2125 Object* obj; | 2111 MaybeObject* maybe_result = GenerateMissBranch(); |
2126 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2112 if (maybe_result->IsFailure()) return maybe_result; |
2127 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2128 } | |
2129 | 2113 |
2130 // Return the generated code. | 2114 // Return the generated code. |
2131 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); | 2115 return (cell == NULL) ? GetCode(function) : GetCode(NORMAL, name); |
2132 } | 2116 } |
2133 | 2117 |
2134 | 2118 |
2135 MaybeObject* CallStubCompiler::CompileFastApiCall( | 2119 MaybeObject* CallStubCompiler::CompileFastApiCall( |
2136 const CallOptimization& optimization, | 2120 const CallOptimization& optimization, |
2137 Object* object, | 2121 Object* object, |
2138 JSObject* holder, | 2122 JSObject* holder, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2177 | 2161 |
2178 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains | 2162 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains |
2179 // duplicate of return address and will be overwritten. | 2163 // duplicate of return address and will be overwritten. |
2180 MaybeObject* result = GenerateFastApiCall(masm(), optimization, argc); | 2164 MaybeObject* result = GenerateFastApiCall(masm(), optimization, argc); |
2181 if (result->IsFailure()) return result; | 2165 if (result->IsFailure()) return result; |
2182 | 2166 |
2183 __ bind(&miss); | 2167 __ bind(&miss); |
2184 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); | 2168 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); |
2185 | 2169 |
2186 __ bind(&miss_before_stack_reserved); | 2170 __ bind(&miss_before_stack_reserved); |
2187 Object* obj; | 2171 MaybeObject* maybe_result = GenerateMissBranch(); |
2188 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2172 if (maybe_result->IsFailure()) return maybe_result; |
2189 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2190 } | |
2191 | 2173 |
2192 // Return the generated code. | 2174 // Return the generated code. |
2193 return GetCode(function); | 2175 return GetCode(function); |
2194 } | 2176 } |
2195 | 2177 |
2196 | 2178 |
2197 MaybeObject* CallStubCompiler::CompileCallConstant(Object* object, | 2179 MaybeObject* CallStubCompiler::CompileCallConstant(Object* object, |
2198 JSObject* holder, | 2180 JSObject* holder, |
2199 JSFunction* function, | 2181 JSFunction* function, |
2200 String* name, | 2182 String* name, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 } | 2295 } |
2314 | 2296 |
2315 default: | 2297 default: |
2316 UNREACHABLE(); | 2298 UNREACHABLE(); |
2317 } | 2299 } |
2318 | 2300 |
2319 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2301 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
2320 | 2302 |
2321 // Handle call cache miss. | 2303 // Handle call cache miss. |
2322 __ bind(&miss); | 2304 __ bind(&miss); |
2323 Object* obj; | 2305 MaybeObject* maybe_result = GenerateMissBranch(); |
2324 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2306 if (maybe_result->IsFailure()) return maybe_result; |
2325 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2326 } | |
2327 | 2307 |
2328 // Return the generated code. | 2308 // Return the generated code. |
2329 return GetCode(function); | 2309 return GetCode(function); |
2330 } | 2310 } |
2331 | 2311 |
2332 | 2312 |
2333 MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object, | 2313 MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object, |
2334 JSObject* holder, | 2314 JSObject* holder, |
2335 String* name) { | 2315 String* name) { |
2336 // ----------- S t a t e ------------- | 2316 // ----------- S t a t e ------------- |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2381 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2361 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
2382 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2362 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
2383 } | 2363 } |
2384 | 2364 |
2385 // Invoke the function. | 2365 // Invoke the function. |
2386 __ mov(edi, eax); | 2366 __ mov(edi, eax); |
2387 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); | 2367 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION); |
2388 | 2368 |
2389 // Handle load cache miss. | 2369 // Handle load cache miss. |
2390 __ bind(&miss); | 2370 __ bind(&miss); |
2391 Object* obj; | 2371 MaybeObject* maybe_result = GenerateMissBranch(); |
2392 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2372 if (maybe_result->IsFailure()) return maybe_result; |
2393 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2394 } | |
2395 | 2373 |
2396 // Return the generated code. | 2374 // Return the generated code. |
2397 return GetCode(INTERCEPTOR, name); | 2375 return GetCode(INTERCEPTOR, name); |
2398 } | 2376 } |
2399 | 2377 |
2400 | 2378 |
2401 MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object, | 2379 MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object, |
2402 GlobalObject* holder, | 2380 GlobalObject* holder, |
2403 JSGlobalPropertyCell* cell, | 2381 JSGlobalPropertyCell* cell, |
2404 JSFunction* function, | 2382 JSFunction* function, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2452 expected, arguments(), JUMP_FUNCTION); | 2430 expected, arguments(), JUMP_FUNCTION); |
2453 } else { | 2431 } else { |
2454 Handle<Code> code(function->code()); | 2432 Handle<Code> code(function->code()); |
2455 __ InvokeCode(code, expected, arguments(), | 2433 __ InvokeCode(code, expected, arguments(), |
2456 RelocInfo::CODE_TARGET, JUMP_FUNCTION); | 2434 RelocInfo::CODE_TARGET, JUMP_FUNCTION); |
2457 } | 2435 } |
2458 | 2436 |
2459 // Handle call cache miss. | 2437 // Handle call cache miss. |
2460 __ bind(&miss); | 2438 __ bind(&miss); |
2461 __ IncrementCounter(COUNTERS->call_global_inline_miss(), 1); | 2439 __ IncrementCounter(COUNTERS->call_global_inline_miss(), 1); |
2462 Object* obj; | 2440 MaybeObject* maybe_result = GenerateMissBranch(); |
2463 { MaybeObject* maybe_obj = GenerateMissBranch(); | 2441 if (maybe_result->IsFailure()) return maybe_result; |
2464 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
2465 } | |
2466 | 2442 |
2467 // Return the generated code. | 2443 // Return the generated code. |
2468 return GetCode(NORMAL, name); | 2444 return GetCode(NORMAL, name); |
2469 } | 2445 } |
2470 | 2446 |
2471 | 2447 |
2472 MaybeObject* StoreStubCompiler::CompileStoreField(JSObject* object, | 2448 MaybeObject* StoreStubCompiler::CompileStoreField(JSObject* object, |
2473 int index, | 2449 int index, |
2474 Map* transition, | 2450 Map* transition, |
2475 String* name) { | 2451 String* name) { |
(...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3691 | 3667 |
3692 return GetCode(flags); | 3668 return GetCode(flags); |
3693 } | 3669 } |
3694 | 3670 |
3695 | 3671 |
3696 #undef __ | 3672 #undef __ |
3697 | 3673 |
3698 } } // namespace v8::internal | 3674 } } // namespace v8::internal |
3699 | 3675 |
3700 #endif // V8_TARGET_ARCH_IA32 | 3676 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |