| 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 529 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 540                           Handle<String> name) { | 540                           Handle<String> name) { | 
| 541   // If the object is undefined or null it's illegal to try to get any | 541   // If the object is undefined or null it's illegal to try to get any | 
| 542   // of its properties; throw a TypeError in that case. | 542   // of its properties; throw a TypeError in that case. | 
| 543   if (object->IsUndefined() || object->IsNull()) { | 543   if (object->IsUndefined() || object->IsNull()) { | 
| 544     return TypeError("non_object_property_load", object, name); | 544     return TypeError("non_object_property_load", object, name); | 
| 545   } | 545   } | 
| 546 | 546 | 
| 547   if (FLAG_use_ic) { | 547   if (FLAG_use_ic) { | 
| 548     // Use specialized code for getting prototype of functions. | 548     // Use specialized code for getting prototype of functions. | 
| 549     if (object->IsJSFunction() && | 549     if (object->IsJSFunction() && | 
| 550         name->Equals(isolate()->heap()->prototype_string()) && | 550         String::Equals(isolate()->factory()->prototype_string(), name) && | 
| 551         Handle<JSFunction>::cast(object)->should_have_prototype()) { | 551         Handle<JSFunction>::cast(object)->should_have_prototype()) { | 
| 552       Handle<Code> stub; | 552       Handle<Code> stub; | 
| 553       if (state() == UNINITIALIZED) { | 553       if (state() == UNINITIALIZED) { | 
| 554         stub = pre_monomorphic_stub(); | 554         stub = pre_monomorphic_stub(); | 
| 555       } else if (state() == PREMONOMORPHIC) { | 555       } else if (state() == PREMONOMORPHIC) { | 
| 556         FunctionPrototypeStub function_prototype_stub(kind()); | 556         FunctionPrototypeStub function_prototype_stub(kind()); | 
| 557         stub = function_prototype_stub.GetCode(isolate()); | 557         stub = function_prototype_stub.GetCode(isolate()); | 
| 558       } else if (state() != MEGAMORPHIC) { | 558       } else if (state() != MEGAMORPHIC) { | 
| 559         ASSERT(state() != GENERIC); | 559         ASSERT(state() != GENERIC); | 
| 560         stub = megamorphic_stub(); | 560         stub = megamorphic_stub(); | 
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 882 | 882 | 
| 883   return code; | 883   return code; | 
| 884 } | 884 } | 
| 885 | 885 | 
| 886 | 886 | 
| 887 Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, | 887 Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, | 
| 888                                     Handle<Object> object, | 888                                     Handle<Object> object, | 
| 889                                     Handle<String> name, | 889                                     Handle<String> name, | 
| 890                                     Handle<Object> unused, | 890                                     Handle<Object> unused, | 
| 891                                     InlineCacheHolderFlag cache_holder) { | 891                                     InlineCacheHolderFlag cache_holder) { | 
| 892   if (object->IsString() && name->Equals(isolate()->heap()->length_string())) { | 892   if (object->IsString() && | 
|  | 893       String::Equals(isolate()->factory()->length_string(), name)) { | 
| 893     int length_index = String::kLengthOffset / kPointerSize; | 894     int length_index = String::kLengthOffset / kPointerSize; | 
| 894     return SimpleFieldLoad(length_index); | 895     return SimpleFieldLoad(length_index); | 
| 895   } | 896   } | 
| 896 | 897 | 
| 897   if (object->IsStringWrapper() && | 898   if (object->IsStringWrapper() && | 
| 898       name->Equals(isolate()->heap()->length_string())) { | 899       String::Equals(isolate()->factory()->length_string(), name)) { | 
| 899     if (kind() == Code::LOAD_IC) { | 900     if (kind() == Code::LOAD_IC) { | 
| 900       StringLengthStub string_length_stub; | 901       StringLengthStub string_length_stub; | 
| 901       return string_length_stub.GetCode(isolate()); | 902       return string_length_stub.GetCode(isolate()); | 
| 902     } else { | 903     } else { | 
| 903       KeyedStringLengthStub string_length_stub; | 904       KeyedStringLengthStub string_length_stub; | 
| 904       return string_length_stub.GetCode(isolate()); | 905       return string_length_stub.GetCode(isolate()); | 
| 905     } | 906     } | 
| 906   } | 907   } | 
| 907 | 908 | 
| 908   Handle<HeapType> type = CurrentTypeOf(object, isolate()); | 909   Handle<HeapType> type = CurrentTypeOf(object, isolate()); | 
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1206   } | 1207   } | 
| 1207 | 1208 | 
| 1208   // If the object is undefined or null it's illegal to try to set any | 1209   // If the object is undefined or null it's illegal to try to set any | 
| 1209   // properties on it; throw a TypeError in that case. | 1210   // properties on it; throw a TypeError in that case. | 
| 1210   if (object->IsUndefined() || object->IsNull()) { | 1211   if (object->IsUndefined() || object->IsNull()) { | 
| 1211     return TypeError("non_object_property_store", object, name); | 1212     return TypeError("non_object_property_store", object, name); | 
| 1212   } | 1213   } | 
| 1213 | 1214 | 
| 1214   // The length property of string values is read-only. Throw in strict mode. | 1215   // The length property of string values is read-only. Throw in strict mode. | 
| 1215   if (strict_mode() == STRICT && object->IsString() && | 1216   if (strict_mode() == STRICT && object->IsString() && | 
| 1216       name->Equals(isolate()->heap()->length_string())) { | 1217       String::Equals(isolate()->factory()->length_string(), name)) { | 
| 1217     return TypeError("strict_read_only_property", object, name); | 1218     return TypeError("strict_read_only_property", object, name); | 
| 1218   } | 1219   } | 
| 1219 | 1220 | 
| 1220   // Ignore other stores where the receiver is not a JSObject. | 1221   // Ignore other stores where the receiver is not a JSObject. | 
| 1221   // TODO(1475): Must check prototype chains of object wrappers. | 1222   // TODO(1475): Must check prototype chains of object wrappers. | 
| 1222   if (!object->IsJSObject()) return *value; | 1223   if (!object->IsJSObject()) return *value; | 
| 1223 | 1224 | 
| 1224   Handle<JSObject> receiver = Handle<JSObject>::cast(object); | 1225   Handle<JSObject> receiver = Handle<JSObject>::cast(object); | 
| 1225 | 1226 | 
| 1226   // Check if the given name is an array index. | 1227   // Check if the given name is an array index. | 
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1393               receiver, holder, name, Handle<JSFunction>::cast(setter)); | 1394               receiver, holder, name, Handle<JSFunction>::cast(setter)); | 
| 1394         } | 1395         } | 
| 1395         // TODO(dcarney): Handle correctly. | 1396         // TODO(dcarney): Handle correctly. | 
| 1396         if (callback->IsDeclaredAccessorInfo()) break; | 1397         if (callback->IsDeclaredAccessorInfo()) break; | 
| 1397         ASSERT(callback->IsForeign()); | 1398         ASSERT(callback->IsForeign()); | 
| 1398 | 1399 | 
| 1399         // Use specialized code for setting the length of arrays with fast | 1400         // Use specialized code for setting the length of arrays with fast | 
| 1400         // properties. Slow properties might indicate redefinition of the length | 1401         // properties. Slow properties might indicate redefinition of the length | 
| 1401         // property. | 1402         // property. | 
| 1402         if (receiver->IsJSArray() && | 1403         if (receiver->IsJSArray() && | 
| 1403             name->Equals(isolate()->heap()->length_string()) && | 1404             String::Equals(isolate()->factory()->length_string(), name) && | 
| 1404             Handle<JSArray>::cast(receiver)->AllowsSetElementsLength() && | 1405             Handle<JSArray>::cast(receiver)->AllowsSetElementsLength() && | 
| 1405             receiver->HasFastProperties()) { | 1406             receiver->HasFastProperties()) { | 
| 1406           return compiler.CompileStoreArrayLength(receiver, lookup, name); | 1407           return compiler.CompileStoreArrayLength(receiver, lookup, name); | 
| 1407         } | 1408         } | 
| 1408 | 1409 | 
| 1409         // No IC support for old-style native accessors. | 1410         // No IC support for old-style native accessors. | 
| 1410         break; | 1411         break; | 
| 1411       } | 1412       } | 
| 1412       case INTERCEPTOR: | 1413       case INTERCEPTOR: | 
| 1413         if (kind() == Code::KEYED_STORE_IC) break; | 1414         if (kind() == Code::KEYED_STORE_IC) break; | 
| (...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2839 #undef ADDR | 2840 #undef ADDR | 
| 2840 }; | 2841 }; | 
| 2841 | 2842 | 
| 2842 | 2843 | 
| 2843 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2844 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 
| 2844   return IC_utilities[id]; | 2845   return IC_utilities[id]; | 
| 2845 } | 2846 } | 
| 2846 | 2847 | 
| 2847 | 2848 | 
| 2848 } }  // namespace v8::internal | 2849 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|