| 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 1223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1234 if (!lookup->IsProperty()) { | 1234 if (!lookup->IsProperty()) { |
| 1235 // Nonexistent property. The result is undefined. | 1235 // Nonexistent property. The result is undefined. |
| 1236 return isolate()->stub_cache()->ComputeLoadNonexistent(name, receiver); | 1236 return isolate()->stub_cache()->ComputeLoadNonexistent(name, receiver); |
| 1237 } | 1237 } |
| 1238 | 1238 |
| 1239 // Compute monomorphic stub. | 1239 // Compute monomorphic stub. |
| 1240 Handle<JSObject> holder(lookup->holder()); | 1240 Handle<JSObject> holder(lookup->holder()); |
| 1241 switch (lookup->type()) { | 1241 switch (lookup->type()) { |
| 1242 case FIELD: | 1242 case FIELD: |
| 1243 return isolate()->stub_cache()->ComputeLoadField( | 1243 return isolate()->stub_cache()->ComputeLoadField( |
| 1244 name, receiver, holder, lookup->GetFieldIndex()); | 1244 name, receiver, holder, |
| 1245 lookup->GetFieldIndex(), lookup->representation()); |
| 1245 case CONSTANT_FUNCTION: { | 1246 case CONSTANT_FUNCTION: { |
| 1246 Handle<JSFunction> constant(lookup->GetConstantFunction()); | 1247 Handle<JSFunction> constant(lookup->GetConstantFunction()); |
| 1247 return isolate()->stub_cache()->ComputeLoadConstant( | 1248 return isolate()->stub_cache()->ComputeLoadConstant( |
| 1248 name, receiver, holder, constant); | 1249 name, receiver, holder, constant); |
| 1249 } | 1250 } |
| 1250 case NORMAL: | 1251 case NORMAL: |
| 1251 if (holder->IsGlobalObject()) { | 1252 if (holder->IsGlobalObject()) { |
| 1252 Handle<GlobalObject> global = Handle<GlobalObject>::cast(holder); | 1253 Handle<GlobalObject> global = Handle<GlobalObject>::cast(holder); |
| 1253 Handle<JSGlobalPropertyCell> cell( | 1254 Handle<JSGlobalPropertyCell> cell( |
| 1254 global->GetPropertyCell(lookup), isolate()); | 1255 global->GetPropertyCell(lookup), isolate()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1276 if (!getter->IsJSFunction()) break; | 1277 if (!getter->IsJSFunction()) break; |
| 1277 if (holder->IsGlobalObject()) break; | 1278 if (holder->IsGlobalObject()) break; |
| 1278 if (!holder->HasFastProperties()) break; | 1279 if (!holder->HasFastProperties()) break; |
| 1279 return isolate()->stub_cache()->ComputeLoadViaGetter( | 1280 return isolate()->stub_cache()->ComputeLoadViaGetter( |
| 1280 name, receiver, holder, Handle<JSFunction>::cast(getter)); | 1281 name, receiver, holder, Handle<JSFunction>::cast(getter)); |
| 1281 } else if (receiver->IsJSArray() && | 1282 } else if (receiver->IsJSArray() && |
| 1282 name->Equals(isolate()->heap()->length_string())) { | 1283 name->Equals(isolate()->heap()->length_string())) { |
| 1283 PropertyIndex lengthIndex = | 1284 PropertyIndex lengthIndex = |
| 1284 PropertyIndex::NewHeaderIndex(JSArray::kLengthOffset / kPointerSize); | 1285 PropertyIndex::NewHeaderIndex(JSArray::kLengthOffset / kPointerSize); |
| 1285 return isolate()->stub_cache()->ComputeLoadField( | 1286 return isolate()->stub_cache()->ComputeLoadField( |
| 1286 name, receiver, holder, lengthIndex); | 1287 name, receiver, holder, lengthIndex, Representation::Tagged()); |
| 1287 } | 1288 } |
| 1288 // TODO(dcarney): Handle correctly. | 1289 // TODO(dcarney): Handle correctly. |
| 1289 if (callback->IsDeclaredAccessorInfo()) break; | 1290 if (callback->IsDeclaredAccessorInfo()) break; |
| 1290 ASSERT(callback->IsForeign()); | 1291 ASSERT(callback->IsForeign()); |
| 1291 // No IC support for old-style native accessors. | 1292 // No IC support for old-style native accessors. |
| 1292 break; | 1293 break; |
| 1293 } | 1294 } |
| 1294 case INTERCEPTOR: | 1295 case INTERCEPTOR: |
| 1295 ASSERT(HasInterceptorGetter(*holder)); | 1296 ASSERT(HasInterceptorGetter(*holder)); |
| 1296 return isolate()->stub_cache()->ComputeLoadInterceptor( | 1297 return isolate()->stub_cache()->ComputeLoadInterceptor( |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 Handle<JSObject> receiver, | 1444 Handle<JSObject> receiver, |
| 1444 Handle<String> name) { | 1445 Handle<String> name) { |
| 1445 // Bail out if we didn't find a result. | 1446 // Bail out if we didn't find a result. |
| 1446 if (!lookup->IsProperty()) return Handle<Code>::null(); | 1447 if (!lookup->IsProperty()) return Handle<Code>::null(); |
| 1447 | 1448 |
| 1448 // Compute a monomorphic stub. | 1449 // Compute a monomorphic stub. |
| 1449 Handle<JSObject> holder(lookup->holder(), isolate()); | 1450 Handle<JSObject> holder(lookup->holder(), isolate()); |
| 1450 switch (lookup->type()) { | 1451 switch (lookup->type()) { |
| 1451 case FIELD: | 1452 case FIELD: |
| 1452 return isolate()->stub_cache()->ComputeKeyedLoadField( | 1453 return isolate()->stub_cache()->ComputeKeyedLoadField( |
| 1453 name, receiver, holder, lookup->GetFieldIndex()); | 1454 name, receiver, holder, |
| 1455 lookup->GetFieldIndex(), lookup->representation()); |
| 1454 case CONSTANT_FUNCTION: { | 1456 case CONSTANT_FUNCTION: { |
| 1455 Handle<JSFunction> constant(lookup->GetConstantFunction(), isolate()); | 1457 Handle<JSFunction> constant(lookup->GetConstantFunction(), isolate()); |
| 1456 return isolate()->stub_cache()->ComputeKeyedLoadConstant( | 1458 return isolate()->stub_cache()->ComputeKeyedLoadConstant( |
| 1457 name, receiver, holder, constant); | 1459 name, receiver, holder, constant); |
| 1458 } | 1460 } |
| 1459 case CALLBACKS: { | 1461 case CALLBACKS: { |
| 1460 Handle<Object> callback_object(lookup->GetCallbackObject(), isolate()); | 1462 Handle<Object> callback_object(lookup->GetCallbackObject(), isolate()); |
| 1461 // TODO(dcarney): Handle DeclaredAccessorInfo correctly. | 1463 // TODO(dcarney): Handle DeclaredAccessorInfo correctly. |
| 1462 if (!callback_object->IsExecutableAccessorInfo()) break; | 1464 if (!callback_object->IsExecutableAccessorInfo()) break; |
| 1463 Handle<ExecutableAccessorInfo> callback = | 1465 Handle<ExecutableAccessorInfo> callback = |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2253 | 2255 |
| 2254 // Check the object has run out out property space. | 2256 // Check the object has run out out property space. |
| 2255 ASSERT(object->HasFastProperties()); | 2257 ASSERT(object->HasFastProperties()); |
| 2256 ASSERT(object->map()->unused_property_fields() == 0); | 2258 ASSERT(object->map()->unused_property_fields() == 0); |
| 2257 | 2259 |
| 2258 // Expand the properties array. | 2260 // Expand the properties array. |
| 2259 FixedArray* old_storage = object->properties(); | 2261 FixedArray* old_storage = object->properties(); |
| 2260 int new_unused = transition->unused_property_fields(); | 2262 int new_unused = transition->unused_property_fields(); |
| 2261 int new_size = old_storage->length() + new_unused + 1; | 2263 int new_size = old_storage->length() + new_unused + 1; |
| 2262 Object* result; | 2264 Object* result; |
| 2263 { MaybeObject* maybe_result = old_storage->CopySize(new_size); | 2265 MaybeObject* maybe_result = old_storage->CopySize(new_size); |
| 2264 if (!maybe_result->ToObject(&result)) return maybe_result; | 2266 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 2267 |
| 2268 FixedArray* new_storage = FixedArray::cast(result); |
| 2269 |
| 2270 Object* to_store = value; |
| 2271 |
| 2272 if (FLAG_track_double_fields) { |
| 2273 DescriptorArray* descriptors = transition->instance_descriptors(); |
| 2274 PropertyDetails details = descriptors->GetDetails(transition->LastAdded()); |
| 2275 if (details.representation().IsDouble()) { |
| 2276 MaybeObject* maybe_storage = |
| 2277 isolate->heap()->AllocateHeapNumber(value->Number()); |
| 2278 if (!maybe_storage->To(&to_store)) return maybe_storage; |
| 2279 } |
| 2265 } | 2280 } |
| 2266 FixedArray* new_storage = FixedArray::cast(result); | 2281 |
| 2267 new_storage->set(old_storage->length(), value); | 2282 new_storage->set(old_storage->length(), to_store); |
| 2268 | 2283 |
| 2269 // Set the new property value and do the map transition. | 2284 // Set the new property value and do the map transition. |
| 2270 object->set_properties(new_storage); | 2285 object->set_properties(new_storage); |
| 2271 object->set_map(transition); | 2286 object->set_map(transition); |
| 2272 | 2287 |
| 2273 // Return the stored value. | 2288 // Return the stored value. |
| 2274 return value; | 2289 return value; |
| 2275 } | 2290 } |
| 2276 | 2291 |
| 2277 | 2292 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2299 Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); | 2314 Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); |
| 2300 return ic.Store(state, | 2315 return ic.Store(state, |
| 2301 Code::GetStrictMode(extra_ic_state), | 2316 Code::GetStrictMode(extra_ic_state), |
| 2302 args.at<Object>(0), | 2317 args.at<Object>(0), |
| 2303 args.at<Object>(1), | 2318 args.at<Object>(1), |
| 2304 args.at<Object>(2), | 2319 args.at<Object>(2), |
| 2305 MISS); | 2320 MISS); |
| 2306 } | 2321 } |
| 2307 | 2322 |
| 2308 | 2323 |
| 2324 RUNTIME_FUNCTION(MaybeObject*, StoreIC_Slow) { |
| 2325 NoHandleAllocation na(isolate); |
| 2326 ASSERT(args.length() == 3); |
| 2327 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2328 Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); |
| 2329 Handle<Object> object = args.at<Object>(0); |
| 2330 Handle<Object> key = args.at<Object>(1); |
| 2331 Handle<Object> value = args.at<Object>(2); |
| 2332 StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state); |
| 2333 return Runtime::SetObjectProperty(isolate, |
| 2334 object, |
| 2335 key, |
| 2336 value, |
| 2337 NONE, |
| 2338 strict_mode); |
| 2339 } |
| 2340 |
| 2341 |
| 2309 RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Slow) { | 2342 RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Slow) { |
| 2310 NoHandleAllocation na(isolate); | 2343 NoHandleAllocation na(isolate); |
| 2311 ASSERT(args.length() == 3); | 2344 ASSERT(args.length() == 3); |
| 2312 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2345 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2313 Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); | 2346 Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); |
| 2314 Handle<Object> object = args.at<Object>(0); | 2347 Handle<Object> object = args.at<Object>(0); |
| 2315 Handle<Object> key = args.at<Object>(1); | 2348 Handle<Object> key = args.at<Object>(1); |
| 2316 Handle<Object> value = args.at<Object>(2); | 2349 Handle<Object> value = args.at<Object>(2); |
| 2317 StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state); | 2350 StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state); |
| 2318 return Runtime::SetObjectProperty(isolate, | 2351 return Runtime::SetObjectProperty(isolate, |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2974 #undef ADDR | 3007 #undef ADDR |
| 2975 }; | 3008 }; |
| 2976 | 3009 |
| 2977 | 3010 |
| 2978 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3011 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2979 return IC_utilities[id]; | 3012 return IC_utilities[id]; |
| 2980 } | 3013 } |
| 2981 | 3014 |
| 2982 | 3015 |
| 2983 } } // namespace v8::internal | 3016 } } // namespace v8::internal |
| OLD | NEW |