OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 4148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4159 } | 4159 } |
4160 return isolate->heap()->false_value(); | 4160 return isolate->heap()->false_value(); |
4161 } | 4161 } |
4162 | 4162 |
4163 | 4163 |
4164 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { | 4164 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { |
4165 NoHandleAllocation ha; | 4165 NoHandleAllocation ha; |
4166 ASSERT(args.length() == 2); | 4166 ASSERT(args.length() == 2); |
4167 CONVERT_CHECKED(String, key, args[1]); | 4167 CONVERT_CHECKED(String, key, args[1]); |
4168 | 4168 |
| 4169 uint32_t index; |
| 4170 const bool key_is_array_index = key->AsArrayIndex(&index); |
| 4171 |
4169 Object* obj = args[0]; | 4172 Object* obj = args[0]; |
4170 // Only JS objects can have properties. | 4173 // Only JS objects can have properties. |
4171 if (obj->IsJSObject()) { | 4174 if (obj->IsJSObject()) { |
4172 JSObject* object = JSObject::cast(obj); | 4175 JSObject* object = JSObject::cast(obj); |
4173 // Fast case - no interceptors. | 4176 // Fast case: either the key is a real named property or it is not |
| 4177 // an array index and there are no interceptors or hidden |
| 4178 // prototypes. |
4174 if (object->HasRealNamedProperty(key)) return isolate->heap()->true_value(); | 4179 if (object->HasRealNamedProperty(key)) return isolate->heap()->true_value(); |
4175 // Slow case. Either it's not there or we have an interceptor. We should | 4180 Map* map = object->map(); |
4176 // have handles for this kind of deal. | 4181 if (!key_is_array_index && |
| 4182 !map->has_named_interceptor() && |
| 4183 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { |
| 4184 return isolate->heap()->false_value(); |
| 4185 } |
| 4186 // Slow case. |
4177 HandleScope scope(isolate); | 4187 HandleScope scope(isolate); |
4178 return HasLocalPropertyImplementation(isolate, | 4188 return HasLocalPropertyImplementation(isolate, |
4179 Handle<JSObject>(object), | 4189 Handle<JSObject>(object), |
4180 Handle<String>(key)); | 4190 Handle<String>(key)); |
4181 } else if (obj->IsString()) { | 4191 } else if (obj->IsString() && key_is_array_index) { |
4182 // Well, there is one exception: Handle [] on strings. | 4192 // Well, there is one exception: Handle [] on strings. |
4183 uint32_t index; | 4193 String* string = String::cast(obj); |
4184 if (key->AsArrayIndex(&index)) { | 4194 if (index < static_cast<uint32_t>(string->length())) { |
4185 String* string = String::cast(obj); | 4195 return isolate->heap()->true_value(); |
4186 if (index < static_cast<uint32_t>(string->length())) | |
4187 return isolate->heap()->true_value(); | |
4188 } | 4196 } |
4189 } | 4197 } |
4190 return isolate->heap()->false_value(); | 4198 return isolate->heap()->false_value(); |
4191 } | 4199 } |
4192 | 4200 |
4193 | 4201 |
4194 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { | 4202 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { |
4195 NoHandleAllocation na; | 4203 NoHandleAllocation na; |
4196 ASSERT(args.length() == 2); | 4204 ASSERT(args.length() == 2); |
4197 | 4205 |
(...skipping 7976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12174 } else { | 12182 } else { |
12175 // Handle last resort GC and make sure to allow future allocations | 12183 // Handle last resort GC and make sure to allow future allocations |
12176 // to grow the heap without causing GCs (if possible). | 12184 // to grow the heap without causing GCs (if possible). |
12177 isolate->counters()->gc_last_resort_from_js()->Increment(); | 12185 isolate->counters()->gc_last_resort_from_js()->Increment(); |
12178 isolate->heap()->CollectAllGarbage(false); | 12186 isolate->heap()->CollectAllGarbage(false); |
12179 } | 12187 } |
12180 } | 12188 } |
12181 | 12189 |
12182 | 12190 |
12183 } } // namespace v8::internal | 12191 } } // namespace v8::internal |
OLD | NEW |