OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 | 1824 |
1825 #undef TRACE_IC | 1825 #undef TRACE_IC |
1826 | 1826 |
1827 | 1827 |
1828 // ---------------------------------------------------------------------------- | 1828 // ---------------------------------------------------------------------------- |
1829 // Static IC stub generators. | 1829 // Static IC stub generators. |
1830 // | 1830 // |
1831 | 1831 |
1832 // Used from ic-<arch>.cc. | 1832 // Used from ic-<arch>.cc. |
1833 // Used from ic-<arch>.cc. | 1833 // Used from ic-<arch>.cc. |
1834 RUNTIME_FUNCTION(MaybeObject*, LoadIC_Miss) { | 1834 RUNTIME_FUNCTION(LoadIC_Miss) { |
1835 HandleScope scope(isolate); | 1835 HandleScope scope(isolate); |
1836 ASSERT(args.length() == 2); | 1836 ASSERT(args.length() == 2); |
1837 LoadIC ic(IC::NO_EXTRA_FRAME, isolate); | 1837 LoadIC ic(IC::NO_EXTRA_FRAME, isolate); |
1838 Handle<Object> receiver = args.at<Object>(0); | 1838 Handle<Object> receiver = args.at<Object>(0); |
1839 Handle<String> key = args.at<String>(1); | 1839 Handle<String> key = args.at<String>(1); |
1840 ic.UpdateState(receiver, key); | 1840 ic.UpdateState(receiver, key); |
1841 Handle<Object> result; | 1841 Handle<Object> result; |
1842 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 1842 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
1843 return *result; | 1843 return *result; |
1844 } | 1844 } |
1845 | 1845 |
1846 | 1846 |
1847 // Used from ic-<arch>.cc | 1847 // Used from ic-<arch>.cc |
1848 RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_Miss) { | 1848 RUNTIME_FUNCTION(KeyedLoadIC_Miss) { |
1849 HandleScope scope(isolate); | 1849 HandleScope scope(isolate); |
1850 ASSERT(args.length() == 2); | 1850 ASSERT(args.length() == 2); |
1851 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate); | 1851 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate); |
1852 Handle<Object> receiver = args.at<Object>(0); | 1852 Handle<Object> receiver = args.at<Object>(0); |
1853 Handle<Object> key = args.at<Object>(1); | 1853 Handle<Object> key = args.at<Object>(1); |
1854 ic.UpdateState(receiver, key); | 1854 ic.UpdateState(receiver, key); |
1855 Handle<Object> result; | 1855 Handle<Object> result; |
1856 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 1856 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
1857 return *result; | 1857 return *result; |
1858 } | 1858 } |
1859 | 1859 |
1860 | 1860 |
1861 RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_MissFromStubFailure) { | 1861 RUNTIME_FUNCTION(KeyedLoadIC_MissFromStubFailure) { |
1862 HandleScope scope(isolate); | 1862 HandleScope scope(isolate); |
1863 ASSERT(args.length() == 2); | 1863 ASSERT(args.length() == 2); |
1864 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate); | 1864 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate); |
1865 Handle<Object> receiver = args.at<Object>(0); | 1865 Handle<Object> receiver = args.at<Object>(0); |
1866 Handle<Object> key = args.at<Object>(1); | 1866 Handle<Object> key = args.at<Object>(1); |
1867 ic.UpdateState(receiver, key); | 1867 ic.UpdateState(receiver, key); |
1868 Handle<Object> result; | 1868 Handle<Object> result; |
1869 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 1869 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
1870 return *result; | 1870 return *result; |
1871 } | 1871 } |
1872 | 1872 |
1873 | 1873 |
1874 // Used from ic-<arch>.cc. | 1874 // Used from ic-<arch>.cc. |
1875 RUNTIME_FUNCTION(MaybeObject*, StoreIC_Miss) { | 1875 RUNTIME_FUNCTION(StoreIC_Miss) { |
1876 HandleScope scope(isolate); | 1876 HandleScope scope(isolate); |
1877 ASSERT(args.length() == 3); | 1877 ASSERT(args.length() == 3); |
1878 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 1878 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
1879 Handle<Object> receiver = args.at<Object>(0); | 1879 Handle<Object> receiver = args.at<Object>(0); |
1880 Handle<String> key = args.at<String>(1); | 1880 Handle<String> key = args.at<String>(1); |
1881 ic.UpdateState(receiver, key); | 1881 ic.UpdateState(receiver, key); |
1882 Handle<Object> result; | 1882 Handle<Object> result; |
1883 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1883 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1884 isolate, | 1884 isolate, |
1885 result, | 1885 result, |
1886 ic.Store(receiver, key, args.at<Object>(2))); | 1886 ic.Store(receiver, key, args.at<Object>(2))); |
1887 return *result; | 1887 return *result; |
1888 } | 1888 } |
1889 | 1889 |
1890 | 1890 |
1891 RUNTIME_FUNCTION(MaybeObject*, StoreIC_MissFromStubFailure) { | 1891 RUNTIME_FUNCTION(StoreIC_MissFromStubFailure) { |
1892 HandleScope scope(isolate); | 1892 HandleScope scope(isolate); |
1893 ASSERT(args.length() == 3); | 1893 ASSERT(args.length() == 3); |
1894 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 1894 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
1895 Handle<Object> receiver = args.at<Object>(0); | 1895 Handle<Object> receiver = args.at<Object>(0); |
1896 Handle<String> key = args.at<String>(1); | 1896 Handle<String> key = args.at<String>(1); |
1897 ic.UpdateState(receiver, key); | 1897 ic.UpdateState(receiver, key); |
1898 Handle<Object> result; | 1898 Handle<Object> result; |
1899 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1899 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1900 isolate, | 1900 isolate, |
1901 result, | 1901 result, |
1902 ic.Store(receiver, key, args.at<Object>(2))); | 1902 ic.Store(receiver, key, args.at<Object>(2))); |
1903 return *result; | 1903 return *result; |
1904 } | 1904 } |
1905 | 1905 |
1906 | 1906 |
1907 RUNTIME_FUNCTION(MaybeObject*, StoreIC_ArrayLength) { | 1907 RUNTIME_FUNCTION(StoreIC_ArrayLength) { |
1908 HandleScope scope(isolate); | 1908 HandleScope scope(isolate); |
1909 | 1909 |
1910 ASSERT(args.length() == 2); | 1910 ASSERT(args.length() == 2); |
1911 Handle<JSArray> receiver = args.at<JSArray>(0); | 1911 Handle<JSArray> receiver = args.at<JSArray>(0); |
1912 Handle<Object> len = args.at<Object>(1); | 1912 Handle<Object> len = args.at<Object>(1); |
1913 | 1913 |
1914 // The generated code should filter out non-Smis before we get here. | 1914 // The generated code should filter out non-Smis before we get here. |
1915 ASSERT(len->IsSmi()); | 1915 ASSERT(len->IsSmi()); |
1916 | 1916 |
1917 #ifdef DEBUG | 1917 #ifdef DEBUG |
1918 // The length property has to be a writable callback property. | 1918 // The length property has to be a writable callback property. |
1919 LookupResult debug_lookup(isolate); | 1919 LookupResult debug_lookup(isolate); |
1920 receiver->LocalLookup(isolate->heap()->length_string(), &debug_lookup); | 1920 receiver->LocalLookup(isolate->heap()->length_string(), &debug_lookup); |
1921 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); | 1921 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); |
1922 #endif | 1922 #endif |
1923 | 1923 |
1924 RETURN_FAILURE_ON_EXCEPTION( | 1924 RETURN_FAILURE_ON_EXCEPTION( |
1925 isolate, JSArray::SetElementsLength(receiver, len)); | 1925 isolate, JSArray::SetElementsLength(receiver, len)); |
1926 return *len; | 1926 return *len; |
1927 } | 1927 } |
1928 | 1928 |
1929 | 1929 |
1930 // Extend storage is called in a store inline cache when | 1930 // Extend storage is called in a store inline cache when |
1931 // it is necessary to extend the properties array of a | 1931 // it is necessary to extend the properties array of a |
1932 // JSObject. | 1932 // JSObject. |
1933 RUNTIME_FUNCTION(MaybeObject*, SharedStoreIC_ExtendStorage) { | 1933 RUNTIME_FUNCTION(SharedStoreIC_ExtendStorage) { |
1934 HandleScope shs(isolate); | 1934 HandleScope shs(isolate); |
1935 ASSERT(args.length() == 3); | 1935 ASSERT(args.length() == 3); |
1936 | 1936 |
1937 // Convert the parameters | 1937 // Convert the parameters |
1938 Handle<JSObject> object = args.at<JSObject>(0); | 1938 Handle<JSObject> object = args.at<JSObject>(0); |
1939 Handle<Map> transition = args.at<Map>(1); | 1939 Handle<Map> transition = args.at<Map>(1); |
1940 Handle<Object> value = args.at<Object>(2); | 1940 Handle<Object> value = args.at<Object>(2); |
1941 | 1941 |
1942 // Check the object has run out out property space. | 1942 // Check the object has run out out property space. |
1943 ASSERT(object->HasFastProperties()); | 1943 ASSERT(object->HasFastProperties()); |
(...skipping 20 matching lines...) Expand all Loading... |
1964 // Set the new property value and do the map transition. | 1964 // Set the new property value and do the map transition. |
1965 object->set_properties(*new_storage); | 1965 object->set_properties(*new_storage); |
1966 object->set_map(*transition); | 1966 object->set_map(*transition); |
1967 | 1967 |
1968 // Return the stored value. | 1968 // Return the stored value. |
1969 return *value; | 1969 return *value; |
1970 } | 1970 } |
1971 | 1971 |
1972 | 1972 |
1973 // Used from ic-<arch>.cc. | 1973 // Used from ic-<arch>.cc. |
1974 RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Miss) { | 1974 RUNTIME_FUNCTION(KeyedStoreIC_Miss) { |
1975 HandleScope scope(isolate); | 1975 HandleScope scope(isolate); |
1976 ASSERT(args.length() == 3); | 1976 ASSERT(args.length() == 3); |
1977 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 1977 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
1978 Handle<Object> receiver = args.at<Object>(0); | 1978 Handle<Object> receiver = args.at<Object>(0); |
1979 Handle<Object> key = args.at<Object>(1); | 1979 Handle<Object> key = args.at<Object>(1); |
1980 ic.UpdateState(receiver, key); | 1980 ic.UpdateState(receiver, key); |
1981 Handle<Object> result; | 1981 Handle<Object> result; |
1982 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1982 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1983 isolate, | 1983 isolate, |
1984 result, | 1984 result, |
1985 ic.Store(receiver, key, args.at<Object>(2))); | 1985 ic.Store(receiver, key, args.at<Object>(2))); |
1986 return *result; | 1986 return *result; |
1987 } | 1987 } |
1988 | 1988 |
1989 | 1989 |
1990 RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissFromStubFailure) { | 1990 RUNTIME_FUNCTION(KeyedStoreIC_MissFromStubFailure) { |
1991 HandleScope scope(isolate); | 1991 HandleScope scope(isolate); |
1992 ASSERT(args.length() == 3); | 1992 ASSERT(args.length() == 3); |
1993 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 1993 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
1994 Handle<Object> receiver = args.at<Object>(0); | 1994 Handle<Object> receiver = args.at<Object>(0); |
1995 Handle<Object> key = args.at<Object>(1); | 1995 Handle<Object> key = args.at<Object>(1); |
1996 ic.UpdateState(receiver, key); | 1996 ic.UpdateState(receiver, key); |
1997 Handle<Object> result; | 1997 Handle<Object> result; |
1998 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1998 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1999 isolate, | 1999 isolate, |
2000 result, | 2000 result, |
2001 ic.Store(receiver, key, args.at<Object>(2))); | 2001 ic.Store(receiver, key, args.at<Object>(2))); |
2002 return *result; | 2002 return *result; |
2003 } | 2003 } |
2004 | 2004 |
2005 | 2005 |
2006 RUNTIME_FUNCTION(MaybeObject*, StoreIC_Slow) { | 2006 RUNTIME_FUNCTION(StoreIC_Slow) { |
2007 HandleScope scope(isolate); | 2007 HandleScope scope(isolate); |
2008 ASSERT(args.length() == 3); | 2008 ASSERT(args.length() == 3); |
2009 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2009 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
2010 Handle<Object> object = args.at<Object>(0); | 2010 Handle<Object> object = args.at<Object>(0); |
2011 Handle<Object> key = args.at<Object>(1); | 2011 Handle<Object> key = args.at<Object>(1); |
2012 Handle<Object> value = args.at<Object>(2); | 2012 Handle<Object> value = args.at<Object>(2); |
2013 StrictMode strict_mode = ic.strict_mode(); | 2013 StrictMode strict_mode = ic.strict_mode(); |
2014 Handle<Object> result; | 2014 Handle<Object> result; |
2015 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2015 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2016 isolate, result, | 2016 isolate, result, |
2017 Runtime::SetObjectProperty( | 2017 Runtime::SetObjectProperty( |
2018 isolate, object, key, value, NONE, strict_mode)); | 2018 isolate, object, key, value, NONE, strict_mode)); |
2019 return *result; | 2019 return *result; |
2020 } | 2020 } |
2021 | 2021 |
2022 | 2022 |
2023 RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Slow) { | 2023 RUNTIME_FUNCTION(KeyedStoreIC_Slow) { |
2024 HandleScope scope(isolate); | 2024 HandleScope scope(isolate); |
2025 ASSERT(args.length() == 3); | 2025 ASSERT(args.length() == 3); |
2026 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2026 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
2027 Handle<Object> object = args.at<Object>(0); | 2027 Handle<Object> object = args.at<Object>(0); |
2028 Handle<Object> key = args.at<Object>(1); | 2028 Handle<Object> key = args.at<Object>(1); |
2029 Handle<Object> value = args.at<Object>(2); | 2029 Handle<Object> value = args.at<Object>(2); |
2030 StrictMode strict_mode = ic.strict_mode(); | 2030 StrictMode strict_mode = ic.strict_mode(); |
2031 Handle<Object> result; | 2031 Handle<Object> result; |
2032 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2032 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2033 isolate, result, | 2033 isolate, result, |
2034 Runtime::SetObjectProperty( | 2034 Runtime::SetObjectProperty( |
2035 isolate, object, key, value, NONE, strict_mode)); | 2035 isolate, object, key, value, NONE, strict_mode)); |
2036 return *result; | 2036 return *result; |
2037 } | 2037 } |
2038 | 2038 |
2039 | 2039 |
2040 RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss) { | 2040 RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss) { |
2041 HandleScope scope(isolate); | 2041 HandleScope scope(isolate); |
2042 ASSERT(args.length() == 4); | 2042 ASSERT(args.length() == 4); |
2043 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2043 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
2044 Handle<Object> value = args.at<Object>(0); | 2044 Handle<Object> value = args.at<Object>(0); |
2045 Handle<Map> map = args.at<Map>(1); | 2045 Handle<Map> map = args.at<Map>(1); |
2046 Handle<Object> key = args.at<Object>(2); | 2046 Handle<Object> key = args.at<Object>(2); |
2047 Handle<Object> object = args.at<Object>(3); | 2047 Handle<Object> object = args.at<Object>(3); |
2048 StrictMode strict_mode = ic.strict_mode(); | 2048 StrictMode strict_mode = ic.strict_mode(); |
2049 if (object->IsJSObject()) { | 2049 if (object->IsJSObject()) { |
2050 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), | 2050 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2549 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { | 2549 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { |
2550 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2550 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
2551 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { | 2551 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { |
2552 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); | 2552 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); |
2553 } | 2553 } |
2554 | 2554 |
2555 return result; | 2555 return result; |
2556 } | 2556 } |
2557 | 2557 |
2558 | 2558 |
2559 RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_Miss) { | 2559 RUNTIME_FUNCTION(BinaryOpIC_Miss) { |
2560 HandleScope scope(isolate); | 2560 HandleScope scope(isolate); |
2561 ASSERT_EQ(2, args.length()); | 2561 ASSERT_EQ(2, args.length()); |
2562 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); | 2562 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); |
2563 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); | 2563 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); |
2564 BinaryOpIC ic(isolate); | 2564 BinaryOpIC ic(isolate); |
2565 Handle<Object> result; | 2565 Handle<Object> result; |
2566 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2566 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2567 isolate, | 2567 isolate, |
2568 result, | 2568 result, |
2569 ic.Transition(Handle<AllocationSite>::null(), left, right)); | 2569 ic.Transition(Handle<AllocationSite>::null(), left, right)); |
2570 return *result; | 2570 return *result; |
2571 } | 2571 } |
2572 | 2572 |
2573 | 2573 |
2574 RUNTIME_FUNCTION(MaybeObject*, BinaryOpIC_MissWithAllocationSite) { | 2574 RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite) { |
2575 HandleScope scope(isolate); | 2575 HandleScope scope(isolate); |
2576 ASSERT_EQ(3, args.length()); | 2576 ASSERT_EQ(3, args.length()); |
2577 Handle<AllocationSite> allocation_site = args.at<AllocationSite>( | 2577 Handle<AllocationSite> allocation_site = args.at<AllocationSite>( |
2578 BinaryOpWithAllocationSiteStub::kAllocationSite); | 2578 BinaryOpWithAllocationSiteStub::kAllocationSite); |
2579 Handle<Object> left = args.at<Object>( | 2579 Handle<Object> left = args.at<Object>( |
2580 BinaryOpWithAllocationSiteStub::kLeft); | 2580 BinaryOpWithAllocationSiteStub::kLeft); |
2581 Handle<Object> right = args.at<Object>( | 2581 Handle<Object> right = args.at<Object>( |
2582 BinaryOpWithAllocationSiteStub::kRight); | 2582 BinaryOpWithAllocationSiteStub::kRight); |
2583 BinaryOpIC ic(isolate); | 2583 BinaryOpIC ic(isolate); |
2584 Handle<Object> result; | 2584 Handle<Object> result; |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2797 // Activate inlined smi code. | 2797 // Activate inlined smi code. |
2798 if (previous_state == UNINITIALIZED) { | 2798 if (previous_state == UNINITIALIZED) { |
2799 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2799 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
2800 } | 2800 } |
2801 | 2801 |
2802 return *new_target; | 2802 return *new_target; |
2803 } | 2803 } |
2804 | 2804 |
2805 | 2805 |
2806 // Used from ICCompareStub::GenerateMiss in code-stubs-<arch>.cc. | 2806 // Used from ICCompareStub::GenerateMiss in code-stubs-<arch>.cc. |
2807 RUNTIME_FUNCTION(Code*, CompareIC_Miss) { | 2807 RUNTIME_FUNCTION(CompareIC_Miss) { |
2808 HandleScope scope(isolate); | 2808 HandleScope scope(isolate); |
2809 ASSERT(args.length() == 3); | 2809 ASSERT(args.length() == 3); |
2810 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); | 2810 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); |
2811 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); | 2811 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); |
2812 } | 2812 } |
2813 | 2813 |
2814 | 2814 |
2815 void CompareNilIC::Clear(Address address, | 2815 void CompareNilIC::Clear(Address address, |
2816 Code* target, | 2816 Code* target, |
2817 ConstantPoolArray* constant_pool) { | 2817 ConstantPoolArray* constant_pool) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2859 : HeapObject::cast(*object)->map()); | 2859 : HeapObject::cast(*object)->map()); |
2860 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); | 2860 code = isolate()->stub_cache()->ComputeCompareNil(monomorphic_map, stub); |
2861 } else { | 2861 } else { |
2862 code = stub.GetCode(isolate()); | 2862 code = stub.GetCode(isolate()); |
2863 } | 2863 } |
2864 set_target(*code); | 2864 set_target(*code); |
2865 return DoCompareNilSlow(isolate(), nil, object); | 2865 return DoCompareNilSlow(isolate(), nil, object); |
2866 } | 2866 } |
2867 | 2867 |
2868 | 2868 |
2869 RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss) { | 2869 RUNTIME_FUNCTION(CompareNilIC_Miss) { |
2870 HandleScope scope(isolate); | 2870 HandleScope scope(isolate); |
2871 Handle<Object> object = args.at<Object>(0); | 2871 Handle<Object> object = args.at<Object>(0); |
2872 CompareNilIC ic(isolate); | 2872 CompareNilIC ic(isolate); |
2873 return *ic.CompareNil(object); | 2873 return *ic.CompareNil(object); |
2874 } | 2874 } |
2875 | 2875 |
2876 | 2876 |
2877 RUNTIME_FUNCTION(MaybeObject*, Unreachable) { | 2877 RUNTIME_FUNCTION(Unreachable) { |
2878 UNREACHABLE(); | 2878 UNREACHABLE(); |
2879 CHECK(false); | 2879 CHECK(false); |
2880 return isolate->heap()->undefined_value(); | 2880 return isolate->heap()->undefined_value(); |
2881 } | 2881 } |
2882 | 2882 |
2883 | 2883 |
2884 Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op) { | 2884 Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op) { |
2885 switch (op) { | 2885 switch (op) { |
2886 default: | 2886 default: |
2887 UNREACHABLE(); | 2887 UNREACHABLE(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2924 | 2924 |
2925 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { | 2925 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { |
2926 ToBooleanStub stub(target()->extra_ic_state()); | 2926 ToBooleanStub stub(target()->extra_ic_state()); |
2927 bool to_boolean_value = stub.UpdateStatus(object); | 2927 bool to_boolean_value = stub.UpdateStatus(object); |
2928 Handle<Code> code = stub.GetCode(isolate()); | 2928 Handle<Code> code = stub.GetCode(isolate()); |
2929 set_target(*code); | 2929 set_target(*code); |
2930 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); | 2930 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); |
2931 } | 2931 } |
2932 | 2932 |
2933 | 2933 |
2934 RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss) { | 2934 RUNTIME_FUNCTION(ToBooleanIC_Miss) { |
2935 ASSERT(args.length() == 1); | 2935 ASSERT(args.length() == 1); |
2936 HandleScope scope(isolate); | 2936 HandleScope scope(isolate); |
2937 Handle<Object> object = args.at<Object>(0); | 2937 Handle<Object> object = args.at<Object>(0); |
2938 ToBooleanIC ic(isolate); | 2938 ToBooleanIC ic(isolate); |
2939 return *ic.ToBoolean(object); | 2939 return *ic.ToBoolean(object); |
2940 } | 2940 } |
2941 | 2941 |
2942 | 2942 |
2943 static const Address IC_utilities[] = { | 2943 static const Address IC_utilities[] = { |
2944 #define ADDR(name) FUNCTION_ADDR(name), | 2944 #define ADDR(name) FUNCTION_ADDR(name), |
2945 IC_UTIL_LIST(ADDR) | 2945 IC_UTIL_LIST(ADDR) |
2946 NULL | 2946 NULL |
2947 #undef ADDR | 2947 #undef ADDR |
2948 }; | 2948 }; |
2949 | 2949 |
2950 | 2950 |
2951 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2951 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2952 return IC_utilities[id]; | 2952 return IC_utilities[id]; |
2953 } | 2953 } |
2954 | 2954 |
2955 | 2955 |
2956 } } // namespace v8::internal | 2956 } } // namespace v8::internal |
OLD | NEW |