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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/field-index.h" | 9 #include "src/field-index.h" |
10 #include "src/hydrogen.h" | 10 #include "src/hydrogen.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 HValue* GetArgumentsLength() { | 55 HValue* GetArgumentsLength() { |
56 // This is initialized in BuildGraph() | 56 // This is initialized in BuildGraph() |
57 DCHECK(arguments_length_ != NULL); | 57 DCHECK(arguments_length_ != NULL); |
58 return arguments_length_; | 58 return arguments_length_; |
59 } | 59 } |
60 CompilationInfo* info() { return info_; } | 60 CompilationInfo* info() { return info_; } |
61 CodeStub* stub() { return info_->code_stub(); } | 61 CodeStub* stub() { return info_->code_stub(); } |
62 HContext* context() { return context_; } | 62 HContext* context() { return context_; } |
63 Isolate* isolate() { return info_->isolate(); } | 63 Isolate* isolate() { return info_->isolate(); } |
64 | 64 |
65 HLoadNamedField* BuildLoadNamedField(HValue* object, | 65 HLoadNamedField* BuildLoadNamedField(HValue* object, FieldIndex index); |
66 FieldIndex index); | |
67 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, | 66 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, |
68 Representation representation, | 67 Representation representation, |
69 bool transition_to_field); | 68 bool transition_to_field); |
70 | 69 |
71 enum ArgumentClass { | 70 enum ArgumentClass { |
72 NONE, | 71 NONE, |
73 SINGLE, | 72 SINGLE, |
74 MULTIPLE | 73 MULTIPLE |
75 }; | 74 }; |
76 | 75 |
(...skipping 1817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1894 HValue* CodeStubGraphBuilder<LoadDictionaryElementStub>::BuildCodeStub() { | 1893 HValue* CodeStubGraphBuilder<LoadDictionaryElementStub>::BuildCodeStub() { |
1895 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); | 1894 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); |
1896 HValue* key = GetParameter(LoadDescriptor::kNameIndex); | 1895 HValue* key = GetParameter(LoadDescriptor::kNameIndex); |
1897 | 1896 |
1898 Add<HCheckSmi>(key); | 1897 Add<HCheckSmi>(key); |
1899 | 1898 |
1900 HValue* elements = AddLoadElements(receiver); | 1899 HValue* elements = AddLoadElements(receiver); |
1901 | 1900 |
1902 HValue* hash = BuildElementIndexHash(key); | 1901 HValue* hash = BuildElementIndexHash(key); |
1903 | 1902 |
1904 return BuildUncheckedDictionaryElementLoad(receiver, elements, key, hash); | 1903 return BuildUncheckedDictionaryElementLoad(receiver, elements, key, hash, |
| 1904 casted_stub()->language_mode()); |
1905 } | 1905 } |
1906 | 1906 |
1907 | 1907 |
1908 Handle<Code> LoadDictionaryElementStub::GenerateCode() { | 1908 Handle<Code> LoadDictionaryElementStub::GenerateCode() { |
1909 return DoGenerateCode(this); | 1909 return DoGenerateCode(this); |
1910 } | 1910 } |
1911 | 1911 |
1912 | 1912 |
1913 template<> | 1913 template<> |
1914 HValue* CodeStubGraphBuilder<RegExpConstructResultStub>::BuildCodeStub() { | 1914 HValue* CodeStubGraphBuilder<RegExpConstructResultStub>::BuildCodeStub() { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2008 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, | 2008 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, |
2009 false, kind, | 2009 false, kind, |
2010 LOAD, NEVER_RETURN_HOLE, | 2010 LOAD, NEVER_RETURN_HOLE, |
2011 STANDARD_STORE)); | 2011 STANDARD_STORE)); |
2012 } | 2012 } |
2013 | 2013 |
2014 | 2014 |
2015 HValue* CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildCodeStub() { | 2015 HValue* CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildCodeStub() { |
2016 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); | 2016 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); |
2017 HValue* key = GetParameter(LoadDescriptor::kNameIndex); | 2017 HValue* key = GetParameter(LoadDescriptor::kNameIndex); |
2018 | |
2019 // Split into a smi/integer case and unique string case. | 2018 // Split into a smi/integer case and unique string case. |
2020 HIfContinuation index_name_split_continuation(graph()->CreateBasicBlock(), | 2019 HIfContinuation index_name_split_continuation(graph()->CreateBasicBlock(), |
2021 graph()->CreateBasicBlock()); | 2020 graph()->CreateBasicBlock()); |
2022 | 2021 |
2023 BuildKeyedIndexCheck(key, &index_name_split_continuation); | 2022 BuildKeyedIndexCheck(key, &index_name_split_continuation); |
2024 | 2023 |
2025 IfBuilder index_name_split(this, &index_name_split_continuation); | 2024 IfBuilder index_name_split(this, &index_name_split_continuation); |
2026 index_name_split.Then(); | 2025 index_name_split.Then(); |
2027 { | 2026 { |
2028 // Key is an index (number) | 2027 // Key is an index (number) |
(...skipping 23 matching lines...) Expand all Loading... |
2052 } | 2051 } |
2053 kind_if.Else(); | 2052 kind_if.Else(); |
2054 | 2053 |
2055 // The DICTIONARY_ELEMENTS check generates a "kind_if.Then" | 2054 // The DICTIONARY_ELEMENTS check generates a "kind_if.Then" |
2056 BuildElementsKindLimitCheck(&kind_if, bit_field2, DICTIONARY_ELEMENTS); | 2055 BuildElementsKindLimitCheck(&kind_if, bit_field2, DICTIONARY_ELEMENTS); |
2057 { | 2056 { |
2058 HValue* elements = AddLoadElements(receiver); | 2057 HValue* elements = AddLoadElements(receiver); |
2059 | 2058 |
2060 HValue* hash = BuildElementIndexHash(key); | 2059 HValue* hash = BuildElementIndexHash(key); |
2061 | 2060 |
2062 Push(BuildUncheckedDictionaryElementLoad(receiver, elements, key, hash)); | 2061 Push(BuildUncheckedDictionaryElementLoad(receiver, elements, key, hash, |
| 2062 casted_stub()->language_mode())); |
2063 } | 2063 } |
2064 kind_if.Else(); | 2064 kind_if.Else(); |
2065 | 2065 |
2066 // The SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then" | 2066 // The SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then" |
2067 BuildElementsKindLimitCheck(&kind_if, bit_field2, | 2067 BuildElementsKindLimitCheck(&kind_if, bit_field2, |
2068 SLOPPY_ARGUMENTS_ELEMENTS); | 2068 SLOPPY_ARGUMENTS_ELEMENTS); |
2069 // Non-strict elements are not handled. | 2069 // Non-strict elements are not handled. |
2070 Add<HDeoptimize>(Deoptimizer::kNonStrictElementsInKeyedLoadGenericStub, | 2070 Add<HDeoptimize>(Deoptimizer::kNonStrictElementsInKeyedLoadGenericStub, |
2071 Deoptimizer::EAGER); | 2071 Deoptimizer::EAGER); |
2072 Push(graph()->GetConstant0()); | 2072 Push(graph()->GetConstant0()); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2130 BuildNonGlobalObjectCheck(receiver); | 2130 BuildNonGlobalObjectCheck(receiver); |
2131 | 2131 |
2132 HValue* properties = Add<HLoadNamedField>( | 2132 HValue* properties = Add<HLoadNamedField>( |
2133 receiver, nullptr, HObjectAccess::ForPropertiesPointer()); | 2133 receiver, nullptr, HObjectAccess::ForPropertiesPointer()); |
2134 | 2134 |
2135 HValue* hash = | 2135 HValue* hash = |
2136 Add<HLoadNamedField>(key, nullptr, HObjectAccess::ForNameHashField()); | 2136 Add<HLoadNamedField>(key, nullptr, HObjectAccess::ForNameHashField()); |
2137 | 2137 |
2138 hash = AddUncasted<HShr>(hash, Add<HConstant>(Name::kHashShift)); | 2138 hash = AddUncasted<HShr>(hash, Add<HConstant>(Name::kHashShift)); |
2139 | 2139 |
2140 HValue* value = BuildUncheckedDictionaryElementLoad(receiver, | 2140 HValue* value = BuildUncheckedDictionaryElementLoad( |
2141 properties, | 2141 receiver, properties, key, hash, casted_stub()->language_mode()); |
2142 key, | |
2143 hash); | |
2144 Push(value); | 2142 Push(value); |
2145 } | 2143 } |
2146 if_dict_properties.Else(); | 2144 if_dict_properties.Else(); |
2147 { | 2145 { |
2148 // TODO(dcarney): don't use keyed lookup cache, but convert to use | 2146 // TODO(dcarney): don't use keyed lookup cache, but convert to use |
2149 // megamorphic stub cache. | 2147 // megamorphic stub cache. |
2150 UNREACHABLE(); | 2148 UNREACHABLE(); |
2151 // Key is string, properties are fast mode | 2149 // Key is string, properties are fast mode |
2152 HValue* hash = BuildKeyedLookupCacheHash(receiver, key); | 2150 HValue* hash = BuildKeyedLookupCacheHash(receiver, key); |
2153 | 2151 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2208 | 2206 |
2209 IfBuilder inline_or_runtime(this, &inline_or_runtime_continuation); | 2207 IfBuilder inline_or_runtime(this, &inline_or_runtime_continuation); |
2210 inline_or_runtime.Then(); | 2208 inline_or_runtime.Then(); |
2211 { | 2209 { |
2212 // Found a cached index, load property inline. | 2210 // Found a cached index, load property inline. |
2213 Push(Add<HLoadFieldByIndex>(receiver, Pop())); | 2211 Push(Add<HLoadFieldByIndex>(receiver, Pop())); |
2214 } | 2212 } |
2215 inline_or_runtime.Else(); | 2213 inline_or_runtime.Else(); |
2216 { | 2214 { |
2217 // KeyedLookupCache miss; call runtime. | 2215 // KeyedLookupCache miss; call runtime. |
2218 Add<HPushArguments>(receiver, key); | 2216 Add<HPushArguments>(receiver, key, |
| 2217 Add<HConstant>(casted_stub()->language_mode())); |
2219 Push(Add<HCallRuntime>( | 2218 Push(Add<HCallRuntime>( |
2220 isolate()->factory()->empty_string(), | 2219 isolate()->factory()->empty_string(), |
2221 Runtime::FunctionForId(Runtime::kKeyedGetProperty), 2)); | 2220 Runtime::FunctionForId(Runtime::kKeyedGetProperty), 3)); |
2222 } | 2221 } |
2223 inline_or_runtime.End(); | 2222 inline_or_runtime.End(); |
2224 } | 2223 } |
2225 if_dict_properties.End(); | 2224 if_dict_properties.End(); |
2226 } | 2225 } |
2227 index_name_split.End(); | 2226 index_name_split.End(); |
2228 | 2227 |
2229 return Pop(); | 2228 return Pop(); |
2230 } | 2229 } |
2231 | 2230 |
2232 | 2231 |
2233 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2232 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2234 return DoGenerateCode(this); | 2233 return DoGenerateCode(this); |
2235 } | 2234 } |
2236 | 2235 |
2237 } // namespace internal | 2236 } // namespace internal |
2238 } // namespace v8 | 2237 } // namespace v8 |
OLD | NEW |