| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" | 
| 6 | 6 | 
| 7 #include <sstream> | 7 #include <sstream> | 
| 8 | 8 | 
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" | 
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" | 
| (...skipping 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1770                    &if_keyisinvalid); | 1770                    &if_keyisinvalid); | 
| 1771   assembler.Bind(&if_keyispositivesmi); | 1771   assembler.Bind(&if_keyispositivesmi); | 
| 1772   assembler.TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 1772   assembler.TailCallRuntime(Runtime::kLoadElementWithInterceptor, context, | 
| 1773                             receiver, key); | 1773                             receiver, key); | 
| 1774 | 1774 | 
| 1775   assembler.Bind(&if_keyisinvalid); | 1775   assembler.Bind(&if_keyisinvalid); | 
| 1776   assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 1776   assembler.TailCallRuntime(Runtime::kKeyedLoadIC_Miss, context, receiver, key, | 
| 1777                             slot, vector); | 1777                             slot, vector); | 
| 1778 } | 1778 } | 
| 1779 | 1779 | 
| 1780 // static |  | 
| 1781 int FastCloneShallowObjectStub::PropertiesCount(int literal_length) { |  | 
| 1782   // This heuristic of setting empty literals to have |  | 
| 1783   // kInitialGlobalObjectUnusedPropertiesCount must remain in-sync with the |  | 
| 1784   // runtime. |  | 
| 1785   // TODO(verwaest): Unify this with the heuristic in the runtime. |  | 
| 1786   return literal_length == 0 |  | 
| 1787              ? JSObject::kInitialGlobalObjectUnusedPropertiesCount |  | 
| 1788              : literal_length; |  | 
| 1789 } |  | 
| 1790 |  | 
| 1791 // static |  | 
| 1792 compiler::Node* FastCloneShallowObjectStub::GenerateFastPath( |  | 
| 1793     CodeStubAssembler* assembler, compiler::CodeAssembler::Label* call_runtime, |  | 
| 1794     compiler::Node* closure, compiler::Node* literals_index, |  | 
| 1795     compiler::Node* properties_count) { |  | 
| 1796   typedef compiler::Node Node; |  | 
| 1797   typedef compiler::CodeAssembler::Label Label; |  | 
| 1798   typedef compiler::CodeAssembler::Variable Variable; |  | 
| 1799 |  | 
| 1800   Node* literals_array = |  | 
| 1801       assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset); |  | 
| 1802   Node* allocation_site = assembler->LoadFixedArrayElement( |  | 
| 1803       literals_array, literals_index, |  | 
| 1804       LiteralsArray::kFirstLiteralIndex * kPointerSize, |  | 
| 1805       CodeStubAssembler::SMI_PARAMETERS); |  | 
| 1806   assembler->GotoIf(assembler->IsUndefined(allocation_site), call_runtime); |  | 
| 1807 |  | 
| 1808   // Calculate the object and allocation size based on the properties count. |  | 
| 1809   Node* object_size = assembler->IntPtrAdd( |  | 
| 1810       assembler->WordShl(properties_count, kPointerSizeLog2), |  | 
| 1811       assembler->IntPtrConstant(JSObject::kHeaderSize)); |  | 
| 1812   Node* allocation_size = object_size; |  | 
| 1813   if (FLAG_allocation_site_pretenuring) { |  | 
| 1814     allocation_size = assembler->IntPtrAdd( |  | 
| 1815         object_size, assembler->IntPtrConstant(AllocationMemento::kSize)); |  | 
| 1816   } |  | 
| 1817   Node* boilerplate = assembler->LoadObjectField( |  | 
| 1818       allocation_site, AllocationSite::kTransitionInfoOffset); |  | 
| 1819   Node* boilerplate_map = assembler->LoadMap(boilerplate); |  | 
| 1820   Node* instance_size = assembler->LoadMapInstanceSize(boilerplate_map); |  | 
| 1821   Node* size_in_words = assembler->WordShr(object_size, kPointerSizeLog2); |  | 
| 1822   assembler->GotoUnless(assembler->WordEqual(instance_size, size_in_words), |  | 
| 1823                         call_runtime); |  | 
| 1824 |  | 
| 1825   Node* copy = assembler->Allocate(allocation_size); |  | 
| 1826 |  | 
| 1827   // Copy boilerplate elements. |  | 
| 1828   Variable offset(assembler, MachineType::PointerRepresentation()); |  | 
| 1829   offset.Bind(assembler->IntPtrConstant(-kHeapObjectTag)); |  | 
| 1830   Node* end_offset = assembler->IntPtrAdd(object_size, offset.value()); |  | 
| 1831   Label loop_body(assembler, &offset), loop_check(assembler, &offset); |  | 
| 1832   // We should always have an object size greater than zero. |  | 
| 1833   assembler->Goto(&loop_body); |  | 
| 1834   assembler->Bind(&loop_body); |  | 
| 1835   { |  | 
| 1836     // The Allocate above guarantees that the copy lies in new space. This |  | 
| 1837     // allows us to skip write barriers. This is necessary since we may also be |  | 
| 1838     // copying unboxed doubles. |  | 
| 1839     Node* field = |  | 
| 1840         assembler->Load(MachineType::IntPtr(), boilerplate, offset.value()); |  | 
| 1841     assembler->StoreNoWriteBarrier(MachineType::PointerRepresentation(), copy, |  | 
| 1842                                    offset.value(), field); |  | 
| 1843     assembler->Goto(&loop_check); |  | 
| 1844   } |  | 
| 1845   assembler->Bind(&loop_check); |  | 
| 1846   { |  | 
| 1847     offset.Bind(assembler->IntPtrAdd(offset.value(), |  | 
| 1848                                      assembler->IntPtrConstant(kPointerSize))); |  | 
| 1849     assembler->GotoUnless( |  | 
| 1850         assembler->IntPtrGreaterThanOrEqual(offset.value(), end_offset), |  | 
| 1851         &loop_body); |  | 
| 1852   } |  | 
| 1853 |  | 
| 1854   if (FLAG_allocation_site_pretenuring) { |  | 
| 1855     Node* memento = assembler->InnerAllocate(copy, object_size); |  | 
| 1856     assembler->StoreMapNoWriteBarrier(memento, |  | 
| 1857                                       Heap::kAllocationMementoMapRootIndex); |  | 
| 1858     assembler->StoreObjectFieldNoWriteBarrier( |  | 
| 1859         memento, AllocationMemento::kAllocationSiteOffset, allocation_site); |  | 
| 1860     Node* memento_create_count = assembler->LoadObjectField( |  | 
| 1861         allocation_site, AllocationSite::kPretenureCreateCountOffset); |  | 
| 1862     memento_create_count = assembler->SmiAdd( |  | 
| 1863         memento_create_count, assembler->SmiConstant(Smi::FromInt(1))); |  | 
| 1864     assembler->StoreObjectFieldNoWriteBarrier( |  | 
| 1865         allocation_site, AllocationSite::kPretenureCreateCountOffset, |  | 
| 1866         memento_create_count); |  | 
| 1867   } |  | 
| 1868 |  | 
| 1869   // TODO(verwaest): Allocate and fill in double boxes. |  | 
| 1870   return copy; |  | 
| 1871 } |  | 
| 1872 |  | 
| 1873 void FastCloneShallowObjectStub::GenerateAssembly( |  | 
| 1874     compiler::CodeAssemblerState* state) const { |  | 
| 1875   typedef CodeStubAssembler::Label Label; |  | 
| 1876   typedef compiler::Node Node; |  | 
| 1877   CodeStubAssembler assembler(state); |  | 
| 1878 |  | 
| 1879   Label call_runtime(&assembler); |  | 
| 1880   Node* closure = assembler.Parameter(0); |  | 
| 1881   Node* literals_index = assembler.Parameter(1); |  | 
| 1882 |  | 
| 1883   Node* properties_count = |  | 
| 1884       assembler.IntPtrConstant(PropertiesCount(this->length())); |  | 
| 1885   Node* copy = GenerateFastPath(&assembler, &call_runtime, closure, |  | 
| 1886                                 literals_index, properties_count); |  | 
| 1887   assembler.Return(copy); |  | 
| 1888 |  | 
| 1889   assembler.Bind(&call_runtime); |  | 
| 1890   Node* constant_properties = assembler.Parameter(2); |  | 
| 1891   Node* flags = assembler.Parameter(3); |  | 
| 1892   Node* context = assembler.Parameter(4); |  | 
| 1893   assembler.TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, |  | 
| 1894                             literals_index, constant_properties, flags); |  | 
| 1895 } |  | 
| 1896 |  | 
| 1897 template<class StateType> | 1780 template<class StateType> | 
| 1898 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { | 1781 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { | 
| 1899   // Note: Although a no-op transition is semantically OK, it is hinting at a | 1782   // Note: Although a no-op transition is semantically OK, it is hinting at a | 
| 1900   // bug somewhere in our state transition machinery. | 1783   // bug somewhere in our state transition machinery. | 
| 1901   DCHECK(from != to); | 1784   DCHECK(from != to); | 
| 1902   if (V8_LIKELY(!FLAG_ic_stats)) return; | 1785   if (V8_LIKELY(!FLAG_ic_stats)) return; | 
| 1903   if (FLAG_ic_stats & | 1786   if (FLAG_ic_stats & | 
| 1904       v8::tracing::TracingCategoryObserver::ENABLED_BY_TRACING) { | 1787       v8::tracing::TracingCategoryObserver::ENABLED_BY_TRACING) { | 
| 1905     auto ic_stats = ICStats::instance(); | 1788     auto ic_stats = ICStats::instance(); | 
| 1906     ic_stats->Begin(); | 1789     ic_stats->Begin(); | 
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2046   { | 1929   { | 
| 2047     var_result.Bind( | 1930     var_result.Bind( | 
| 2048         assembler.CallRuntime(Runtime::kGetProperty, context, object, key)); | 1931         assembler.CallRuntime(Runtime::kGetProperty, context, object, key)); | 
| 2049     assembler.Goto(&end); | 1932     assembler.Goto(&end); | 
| 2050   } | 1933   } | 
| 2051 | 1934 | 
| 2052   assembler.Bind(&end); | 1935   assembler.Bind(&end); | 
| 2053   assembler.Return(var_result.value()); | 1936   assembler.Return(var_result.value()); | 
| 2054 } | 1937 } | 
| 2055 | 1938 | 
| 2056 // static |  | 
| 2057 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, |  | 
| 2058                                               compiler::Node* closure, |  | 
| 2059                                               compiler::Node* literal_index, |  | 
| 2060                                               compiler::Node* pattern, |  | 
| 2061                                               compiler::Node* flags, |  | 
| 2062                                               compiler::Node* context) { |  | 
| 2063   typedef CodeStubAssembler::Label Label; |  | 
| 2064   typedef CodeStubAssembler::Variable Variable; |  | 
| 2065   typedef compiler::Node Node; |  | 
| 2066 |  | 
| 2067   Label call_runtime(assembler, Label::kDeferred), end(assembler); |  | 
| 2068 |  | 
| 2069   Variable result(assembler, MachineRepresentation::kTagged); |  | 
| 2070 |  | 
| 2071   Node* literals_array = |  | 
| 2072       assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset); |  | 
| 2073   Node* boilerplate = assembler->LoadFixedArrayElement( |  | 
| 2074       literals_array, literal_index, |  | 
| 2075       LiteralsArray::kFirstLiteralIndex * kPointerSize, |  | 
| 2076       CodeStubAssembler::SMI_PARAMETERS); |  | 
| 2077   assembler->GotoIf(assembler->IsUndefined(boilerplate), &call_runtime); |  | 
| 2078 |  | 
| 2079   { |  | 
| 2080     int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; |  | 
| 2081     Node* copy = assembler->Allocate(size); |  | 
| 2082     for (int offset = 0; offset < size; offset += kPointerSize) { |  | 
| 2083       Node* value = assembler->LoadObjectField(boilerplate, offset); |  | 
| 2084       assembler->StoreObjectFieldNoWriteBarrier(copy, offset, value); |  | 
| 2085     } |  | 
| 2086     result.Bind(copy); |  | 
| 2087     assembler->Goto(&end); |  | 
| 2088   } |  | 
| 2089 |  | 
| 2090   assembler->Bind(&call_runtime); |  | 
| 2091   { |  | 
| 2092     result.Bind(assembler->CallRuntime(Runtime::kCreateRegExpLiteral, context, |  | 
| 2093                                        closure, literal_index, pattern, flags)); |  | 
| 2094     assembler->Goto(&end); |  | 
| 2095   } |  | 
| 2096 |  | 
| 2097   assembler->Bind(&end); |  | 
| 2098   return result.value(); |  | 
| 2099 } |  | 
| 2100 |  | 
| 2101 void FastCloneRegExpStub::GenerateAssembly( |  | 
| 2102     compiler::CodeAssemblerState* state) const { |  | 
| 2103   typedef compiler::Node Node; |  | 
| 2104   CodeStubAssembler assembler(state); |  | 
| 2105   Node* closure = assembler.Parameter(Descriptor::kClosure); |  | 
| 2106   Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex); |  | 
| 2107   Node* pattern = assembler.Parameter(Descriptor::kPattern); |  | 
| 2108   Node* flags = assembler.Parameter(Descriptor::kFlags); |  | 
| 2109   Node* context = assembler.Parameter(Descriptor::kContext); |  | 
| 2110 |  | 
| 2111   assembler.Return( |  | 
| 2112       Generate(&assembler, closure, literal_index, pattern, flags, context)); |  | 
| 2113 } |  | 
| 2114 |  | 
| 2115 namespace { |  | 
| 2116 |  | 
| 2117 compiler::Node* NonEmptyShallowClone(CodeStubAssembler* assembler, |  | 
| 2118                                      compiler::Node* boilerplate, |  | 
| 2119                                      compiler::Node* boilerplate_map, |  | 
| 2120                                      compiler::Node* boilerplate_elements, |  | 
| 2121                                      compiler::Node* allocation_site, |  | 
| 2122                                      compiler::Node* capacity, |  | 
| 2123                                      ElementsKind kind) { |  | 
| 2124   typedef compiler::Node Node; |  | 
| 2125   typedef CodeStubAssembler::ParameterMode ParameterMode; |  | 
| 2126 |  | 
| 2127   ParameterMode param_mode = assembler->OptimalParameterMode(); |  | 
| 2128 |  | 
| 2129   Node* length = assembler->LoadJSArrayLength(boilerplate); |  | 
| 2130   capacity = assembler->TaggedToParameter(capacity, param_mode); |  | 
| 2131 |  | 
| 2132   Node *array, *elements; |  | 
| 2133   std::tie(array, elements) = |  | 
| 2134       assembler->AllocateUninitializedJSArrayWithElements( |  | 
| 2135           kind, boilerplate_map, length, allocation_site, capacity, param_mode); |  | 
| 2136 |  | 
| 2137   assembler->Comment("copy elements header"); |  | 
| 2138   // Header consists of map and length. |  | 
| 2139   STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize); |  | 
| 2140   assembler->StoreMap(elements, assembler->LoadMap(boilerplate_elements)); |  | 
| 2141   { |  | 
| 2142     int offset = FixedArrayBase::kLengthOffset; |  | 
| 2143     assembler->StoreObjectFieldNoWriteBarrier( |  | 
| 2144         elements, offset, |  | 
| 2145         assembler->LoadObjectField(boilerplate_elements, offset)); |  | 
| 2146   } |  | 
| 2147 |  | 
| 2148   length = assembler->TaggedToParameter(length, param_mode); |  | 
| 2149 |  | 
| 2150   assembler->Comment("copy boilerplate elements"); |  | 
| 2151   assembler->CopyFixedArrayElements(kind, boilerplate_elements, elements, |  | 
| 2152                                     length, SKIP_WRITE_BARRIER, param_mode); |  | 
| 2153   assembler->IncrementCounter( |  | 
| 2154       assembler->isolate()->counters()->inlined_copied_elements(), 1); |  | 
| 2155 |  | 
| 2156   return array; |  | 
| 2157 } |  | 
| 2158 |  | 
| 2159 }  // namespace |  | 
| 2160 |  | 
| 2161 // static |  | 
| 2162 compiler::Node* FastCloneShallowArrayStub::Generate( |  | 
| 2163     CodeStubAssembler* assembler, compiler::Node* closure, |  | 
| 2164     compiler::Node* literal_index, compiler::Node* context, |  | 
| 2165     CodeStubAssembler::Label* call_runtime, |  | 
| 2166     AllocationSiteMode allocation_site_mode) { |  | 
| 2167   typedef CodeStubAssembler::Label Label; |  | 
| 2168   typedef CodeStubAssembler::Variable Variable; |  | 
| 2169   typedef compiler::Node Node; |  | 
| 2170 |  | 
| 2171   Label zero_capacity(assembler), cow_elements(assembler), |  | 
| 2172       fast_elements(assembler), return_result(assembler); |  | 
| 2173   Variable result(assembler, MachineRepresentation::kTagged); |  | 
| 2174 |  | 
| 2175   Node* literals_array = |  | 
| 2176       assembler->LoadObjectField(closure, JSFunction::kLiteralsOffset); |  | 
| 2177   Node* allocation_site = assembler->LoadFixedArrayElement( |  | 
| 2178       literals_array, literal_index, |  | 
| 2179       LiteralsArray::kFirstLiteralIndex * kPointerSize, |  | 
| 2180       CodeStubAssembler::SMI_PARAMETERS); |  | 
| 2181 |  | 
| 2182   assembler->GotoIf(assembler->IsUndefined(allocation_site), call_runtime); |  | 
| 2183   allocation_site = assembler->LoadFixedArrayElement( |  | 
| 2184       literals_array, literal_index, |  | 
| 2185       LiteralsArray::kFirstLiteralIndex * kPointerSize, |  | 
| 2186       CodeStubAssembler::SMI_PARAMETERS); |  | 
| 2187 |  | 
| 2188   Node* boilerplate = assembler->LoadObjectField( |  | 
| 2189       allocation_site, AllocationSite::kTransitionInfoOffset); |  | 
| 2190   Node* boilerplate_map = assembler->LoadMap(boilerplate); |  | 
| 2191   Node* boilerplate_elements = assembler->LoadElements(boilerplate); |  | 
| 2192   Node* capacity = assembler->LoadFixedArrayBaseLength(boilerplate_elements); |  | 
| 2193   allocation_site = |  | 
| 2194       allocation_site_mode == TRACK_ALLOCATION_SITE ? allocation_site : nullptr; |  | 
| 2195 |  | 
| 2196   Node* zero = assembler->SmiConstant(Smi::kZero); |  | 
| 2197   assembler->GotoIf(assembler->SmiEqual(capacity, zero), &zero_capacity); |  | 
| 2198 |  | 
| 2199   Node* elements_map = assembler->LoadMap(boilerplate_elements); |  | 
| 2200   assembler->GotoIf(assembler->IsFixedCOWArrayMap(elements_map), &cow_elements); |  | 
| 2201 |  | 
| 2202   assembler->GotoIf(assembler->IsFixedArrayMap(elements_map), &fast_elements); |  | 
| 2203   { |  | 
| 2204     assembler->Comment("fast double elements path"); |  | 
| 2205     if (FLAG_debug_code) { |  | 
| 2206       Label correct_elements_map(assembler), abort(assembler, Label::kDeferred); |  | 
| 2207       assembler->Branch(assembler->IsFixedDoubleArrayMap(elements_map), |  | 
| 2208                         &correct_elements_map, &abort); |  | 
| 2209 |  | 
| 2210       assembler->Bind(&abort); |  | 
| 2211       { |  | 
| 2212         Node* abort_id = assembler->SmiConstant( |  | 
| 2213             Smi::FromInt(BailoutReason::kExpectedFixedDoubleArrayMap)); |  | 
| 2214         assembler->CallRuntime(Runtime::kAbort, context, abort_id); |  | 
| 2215         result.Bind(assembler->UndefinedConstant()); |  | 
| 2216         assembler->Goto(&return_result); |  | 
| 2217       } |  | 
| 2218       assembler->Bind(&correct_elements_map); |  | 
| 2219     } |  | 
| 2220 |  | 
| 2221     Node* array = NonEmptyShallowClone(assembler, boilerplate, boilerplate_map, |  | 
| 2222                                        boilerplate_elements, allocation_site, |  | 
| 2223                                        capacity, FAST_DOUBLE_ELEMENTS); |  | 
| 2224     result.Bind(array); |  | 
| 2225     assembler->Goto(&return_result); |  | 
| 2226   } |  | 
| 2227 |  | 
| 2228   assembler->Bind(&fast_elements); |  | 
| 2229   { |  | 
| 2230     assembler->Comment("fast elements path"); |  | 
| 2231     Node* array = NonEmptyShallowClone(assembler, boilerplate, boilerplate_map, |  | 
| 2232                                        boilerplate_elements, allocation_site, |  | 
| 2233                                        capacity, FAST_ELEMENTS); |  | 
| 2234     result.Bind(array); |  | 
| 2235     assembler->Goto(&return_result); |  | 
| 2236   } |  | 
| 2237 |  | 
| 2238   Variable length(assembler, MachineRepresentation::kTagged), |  | 
| 2239       elements(assembler, MachineRepresentation::kTagged); |  | 
| 2240   Label allocate_without_elements(assembler); |  | 
| 2241 |  | 
| 2242   assembler->Bind(&cow_elements); |  | 
| 2243   { |  | 
| 2244     assembler->Comment("fixed cow path"); |  | 
| 2245     length.Bind(assembler->LoadJSArrayLength(boilerplate)); |  | 
| 2246     elements.Bind(boilerplate_elements); |  | 
| 2247 |  | 
| 2248     assembler->Goto(&allocate_without_elements); |  | 
| 2249   } |  | 
| 2250 |  | 
| 2251   assembler->Bind(&zero_capacity); |  | 
| 2252   { |  | 
| 2253     assembler->Comment("zero capacity path"); |  | 
| 2254     length.Bind(zero); |  | 
| 2255     elements.Bind(assembler->LoadRoot(Heap::kEmptyFixedArrayRootIndex)); |  | 
| 2256 |  | 
| 2257     assembler->Goto(&allocate_without_elements); |  | 
| 2258   } |  | 
| 2259 |  | 
| 2260   assembler->Bind(&allocate_without_elements); |  | 
| 2261   { |  | 
| 2262     Node* array = assembler->AllocateUninitializedJSArrayWithoutElements( |  | 
| 2263         FAST_ELEMENTS, boilerplate_map, length.value(), allocation_site); |  | 
| 2264     assembler->StoreObjectField(array, JSObject::kElementsOffset, |  | 
| 2265                                 elements.value()); |  | 
| 2266     result.Bind(array); |  | 
| 2267     assembler->Goto(&return_result); |  | 
| 2268   } |  | 
| 2269 |  | 
| 2270   assembler->Bind(&return_result); |  | 
| 2271   return result.value(); |  | 
| 2272 } |  | 
| 2273 |  | 
| 2274 void FastCloneShallowArrayStub::GenerateAssembly( |  | 
| 2275     compiler::CodeAssemblerState* state) const { |  | 
| 2276   typedef compiler::Node Node; |  | 
| 2277   typedef CodeStubAssembler::Label Label; |  | 
| 2278   CodeStubAssembler assembler(state); |  | 
| 2279 |  | 
| 2280   Node* closure = assembler.Parameter(Descriptor::kClosure); |  | 
| 2281   Node* literal_index = assembler.Parameter(Descriptor::kLiteralIndex); |  | 
| 2282   Node* constant_elements = assembler.Parameter(Descriptor::kConstantElements); |  | 
| 2283   Node* context = assembler.Parameter(Descriptor::kContext); |  | 
| 2284   Label call_runtime(&assembler, Label::kDeferred); |  | 
| 2285   assembler.Return(Generate(&assembler, closure, literal_index, context, |  | 
| 2286                             &call_runtime, allocation_site_mode())); |  | 
| 2287 |  | 
| 2288   assembler.Bind(&call_runtime); |  | 
| 2289   { |  | 
| 2290     assembler.Comment("call runtime"); |  | 
| 2291     Node* flags = assembler.SmiConstant( |  | 
| 2292         Smi::FromInt(ArrayLiteral::kShallowElements | |  | 
| 2293                      (allocation_site_mode() == TRACK_ALLOCATION_SITE |  | 
| 2294                           ? 0 |  | 
| 2295                           : ArrayLiteral::kDisableMementos))); |  | 
| 2296     assembler.Return(assembler.CallRuntime(Runtime::kCreateArrayLiteral, |  | 
| 2297                                            context, closure, literal_index, |  | 
| 2298                                            constant_elements, flags)); |  | 
| 2299   } |  | 
| 2300 } |  | 
| 2301 |  | 
| 2302 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { | 1939 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { | 
| 2303   CreateAllocationSiteStub stub(isolate); | 1940   CreateAllocationSiteStub stub(isolate); | 
| 2304   stub.GetCode(); | 1941   stub.GetCode(); | 
| 2305 } | 1942 } | 
| 2306 | 1943 | 
| 2307 | 1944 | 
| 2308 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { | 1945 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { | 
| 2309   CreateWeakCellStub stub(isolate); | 1946   CreateWeakCellStub stub(isolate); | 
| 2310   stub.GetCode(); | 1947   stub.GetCode(); | 
| 2311 } | 1948 } | 
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2605 } | 2242 } | 
| 2606 | 2243 | 
| 2607 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 2244 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 
| 2608     : PlatformCodeStub(isolate) {} | 2245     : PlatformCodeStub(isolate) {} | 
| 2609 | 2246 | 
| 2610 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 2247 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 
| 2611     : PlatformCodeStub(isolate) {} | 2248     : PlatformCodeStub(isolate) {} | 
| 2612 | 2249 | 
| 2613 }  // namespace internal | 2250 }  // namespace internal | 
| 2614 }  // namespace v8 | 2251 }  // namespace v8 | 
| OLD | NEW | 
|---|