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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "accessors.h" | 7 #include "accessors.h" |
8 #include "api.h" | 8 #include "api.h" |
9 #include "arguments.h" | 9 #include "arguments.h" |
10 #include "codegen.h" | 10 #include "codegen.h" |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 return !object->GetNamedInterceptor()->setter()->IsUndefined(); | 185 return !object->GetNamedInterceptor()->setter()->IsUndefined(); |
186 } | 186 } |
187 | 187 |
188 | 188 |
189 static void LookupForRead(Handle<Object> object, | 189 static void LookupForRead(Handle<Object> object, |
190 Handle<String> name, | 190 Handle<String> name, |
191 LookupResult* lookup) { | 191 LookupResult* lookup) { |
192 // Skip all the objects with named interceptors, but | 192 // Skip all the objects with named interceptors, but |
193 // without actual getter. | 193 // without actual getter. |
194 while (true) { | 194 while (true) { |
195 object->Lookup(*name, lookup); | 195 object->Lookup(name, lookup); |
196 // Besides normal conditions (property not found or it's not | 196 // Besides normal conditions (property not found or it's not |
197 // an interceptor), bail out if lookup is not cacheable: we won't | 197 // an interceptor), bail out if lookup is not cacheable: we won't |
198 // be able to IC it anyway and regular lookup should work fine. | 198 // be able to IC it anyway and regular lookup should work fine. |
199 if (!lookup->IsInterceptor() || !lookup->IsCacheable()) { | 199 if (!lookup->IsInterceptor() || !lookup->IsCacheable()) { |
200 return; | 200 return; |
201 } | 201 } |
202 | 202 |
203 Handle<JSObject> holder(lookup->holder(), lookup->isolate()); | 203 Handle<JSObject> holder(lookup->holder(), lookup->isolate()); |
204 if (HasInterceptorGetter(*holder)) { | 204 if (HasInterceptorGetter(*holder)) { |
205 return; | 205 return; |
206 } | 206 } |
207 | 207 |
208 holder->LocalLookupRealNamedProperty(*name, lookup); | 208 holder->LocalLookupRealNamedProperty(name, lookup); |
209 if (lookup->IsFound()) { | 209 if (lookup->IsFound()) { |
210 ASSERT(!lookup->IsInterceptor()); | 210 ASSERT(!lookup->IsInterceptor()); |
211 return; | 211 return; |
212 } | 212 } |
213 | 213 |
214 Handle<Object> proto(holder->GetPrototype(), lookup->isolate()); | 214 Handle<Object> proto(holder->GetPrototype(), lookup->isolate()); |
215 if (proto->IsNull()) { | 215 if (proto->IsNull()) { |
216 ASSERT(!lookup->IsFound()); | 216 ASSERT(!lookup->IsFound()); |
217 return; | 217 return; |
218 } | 218 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 if (IsMoreGeneralElementsKindTransition(old_map->elements_kind(), | 276 if (IsMoreGeneralElementsKindTransition(old_map->elements_kind(), |
277 map->elements_kind())) { | 277 map->elements_kind())) { |
278 return true; | 278 return true; |
279 } | 279 } |
280 } | 280 } |
281 } | 281 } |
282 | 282 |
283 if (receiver->IsGlobalObject()) { | 283 if (receiver->IsGlobalObject()) { |
284 LookupResult lookup(isolate()); | 284 LookupResult lookup(isolate()); |
285 GlobalObject* global = GlobalObject::cast(*receiver); | 285 GlobalObject* global = GlobalObject::cast(*receiver); |
286 global->LocalLookupRealNamedProperty(*name, &lookup); | 286 global->LocalLookupRealNamedProperty(name, &lookup); |
287 if (!lookup.IsFound()) return false; | 287 if (!lookup.IsFound()) return false; |
288 PropertyCell* cell = global->GetPropertyCell(&lookup); | 288 PropertyCell* cell = global->GetPropertyCell(&lookup); |
289 return cell->type()->IsConstant(); | 289 return cell->type()->IsConstant(); |
290 } | 290 } |
291 | 291 |
292 return false; | 292 return false; |
293 } | 293 } |
294 | 294 |
295 | 295 |
296 void IC::TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name) { | 296 void IC::TryRemoveInvalidHandlers(Handle<Map> map, Handle<String> name) { |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 return result; | 1159 return result; |
1160 } | 1160 } |
1161 | 1161 |
1162 | 1162 |
1163 static bool LookupForWrite(Handle<JSObject> receiver, | 1163 static bool LookupForWrite(Handle<JSObject> receiver, |
1164 Handle<String> name, | 1164 Handle<String> name, |
1165 Handle<Object> value, | 1165 Handle<Object> value, |
1166 LookupResult* lookup, | 1166 LookupResult* lookup, |
1167 IC* ic) { | 1167 IC* ic) { |
1168 Handle<JSObject> holder = receiver; | 1168 Handle<JSObject> holder = receiver; |
1169 receiver->Lookup(*name, lookup); | 1169 receiver->Lookup(name, lookup); |
1170 if (lookup->IsFound()) { | 1170 if (lookup->IsFound()) { |
1171 if (lookup->IsInterceptor() && !HasInterceptorSetter(lookup->holder())) { | 1171 if (lookup->IsInterceptor() && !HasInterceptorSetter(lookup->holder())) { |
1172 receiver->LocalLookupRealNamedProperty(*name, lookup); | 1172 receiver->LocalLookupRealNamedProperty(name, lookup); |
1173 if (!lookup->IsFound()) return false; | 1173 if (!lookup->IsFound()) return false; |
1174 } | 1174 } |
1175 | 1175 |
1176 if (lookup->IsReadOnly() || !lookup->IsCacheable()) return false; | 1176 if (lookup->IsReadOnly() || !lookup->IsCacheable()) return false; |
1177 if (lookup->holder() == *receiver) return lookup->CanHoldValue(value); | 1177 if (lookup->holder() == *receiver) return lookup->CanHoldValue(value); |
1178 if (lookup->IsPropertyCallbacks()) return true; | 1178 if (lookup->IsPropertyCallbacks()) return true; |
1179 // JSGlobalProxy either stores on the global object in the prototype, or | 1179 // JSGlobalProxy either stores on the global object in the prototype, or |
1180 // goes into the runtime if access checks are needed, so this is always | 1180 // goes into the runtime if access checks are needed, so this is always |
1181 // safe. | 1181 // safe. |
1182 if (receiver->IsJSGlobalProxy()) { | 1182 if (receiver->IsJSGlobalProxy()) { |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1869 ASSERT(args.length() == 2); | 1869 ASSERT(args.length() == 2); |
1870 Handle<JSArray> receiver = args.at<JSArray>(0); | 1870 Handle<JSArray> receiver = args.at<JSArray>(0); |
1871 Handle<Object> len = args.at<Object>(1); | 1871 Handle<Object> len = args.at<Object>(1); |
1872 | 1872 |
1873 // The generated code should filter out non-Smis before we get here. | 1873 // The generated code should filter out non-Smis before we get here. |
1874 ASSERT(len->IsSmi()); | 1874 ASSERT(len->IsSmi()); |
1875 | 1875 |
1876 #ifdef DEBUG | 1876 #ifdef DEBUG |
1877 // The length property has to be a writable callback property. | 1877 // The length property has to be a writable callback property. |
1878 LookupResult debug_lookup(isolate); | 1878 LookupResult debug_lookup(isolate); |
1879 receiver->LocalLookup(isolate->heap()->length_string(), &debug_lookup); | 1879 receiver->LocalLookup(isolate->factory()->length_string(), &debug_lookup); |
1880 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); | 1880 ASSERT(debug_lookup.IsPropertyCallbacks() && !debug_lookup.IsReadOnly()); |
1881 #endif | 1881 #endif |
1882 | 1882 |
1883 RETURN_FAILURE_ON_EXCEPTION( | 1883 RETURN_FAILURE_ON_EXCEPTION( |
1884 isolate, JSArray::SetElementsLength(receiver, len)); | 1884 isolate, JSArray::SetElementsLength(receiver, len)); |
1885 return *len; | 1885 return *len; |
1886 } | 1886 } |
1887 | 1887 |
1888 | 1888 |
1889 // Extend storage is called in a store inline cache when | 1889 // Extend storage is called in a store inline cache when |
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2908 #undef ADDR | 2908 #undef ADDR |
2909 }; | 2909 }; |
2910 | 2910 |
2911 | 2911 |
2912 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2912 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2913 return IC_utilities[id]; | 2913 return IC_utilities[id]; |
2914 } | 2914 } |
2915 | 2915 |
2916 | 2916 |
2917 } } // namespace v8::internal | 2917 } } // namespace v8::internal |
OLD | NEW |