| 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 1795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1806 // more than one access failure here. | 1806 // more than one access failure here. |
| 1807 AccessCheckResult access_check_result = | 1807 AccessCheckResult access_check_result = |
| 1808 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); | 1808 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); |
| 1809 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 1809 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 1810 switch (access_check_result) { | 1810 switch (access_check_result) { |
| 1811 case ACCESS_FORBIDDEN: return factory->false_value(); | 1811 case ACCESS_FORBIDDEN: return factory->false_value(); |
| 1812 case ACCESS_ALLOWED: break; | 1812 case ACCESS_ALLOWED: break; |
| 1813 case ACCESS_ABSENT: return factory->undefined_value(); | 1813 case ACCESS_ABSENT: return factory->undefined_value(); |
| 1814 } | 1814 } |
| 1815 | 1815 |
| 1816 PropertyAttributes attrs = obj->GetLocalPropertyAttribute(*name); | 1816 PropertyAttributes attrs = JSReceiver::GetLocalPropertyAttribute(obj, name); |
| 1817 if (attrs == ABSENT) { | 1817 if (attrs == ABSENT) { |
| 1818 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 1818 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 1819 return factory->undefined_value(); | 1819 return factory->undefined_value(); |
| 1820 } | 1820 } |
| 1821 ASSERT(!isolate->has_scheduled_exception()); | 1821 ASSERT(!isolate->has_scheduled_exception()); |
| 1822 AccessorPair* raw_accessors = obj->GetLocalPropertyAccessorPair(*name); | 1822 AccessorPair* raw_accessors = obj->GetLocalPropertyAccessorPair(*name); |
| 1823 Handle<AccessorPair> accessors(raw_accessors, isolate); | 1823 Handle<AccessorPair> accessors(raw_accessors, isolate); |
| 1824 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); | 1824 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); |
| 1825 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); | 1825 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
| 1826 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); | 1826 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2054 if (is_var || is_const) { | 2054 if (is_var || is_const) { |
| 2055 // Lookup the property in the global object, and don't set the | 2055 // Lookup the property in the global object, and don't set the |
| 2056 // value of the variable if the property is already there. | 2056 // value of the variable if the property is already there. |
| 2057 // Do the lookup locally only, see ES5 erratum. | 2057 // Do the lookup locally only, see ES5 erratum. |
| 2058 LookupResult lookup(isolate); | 2058 LookupResult lookup(isolate); |
| 2059 global->LocalLookup(*name, &lookup, true); | 2059 global->LocalLookup(*name, &lookup, true); |
| 2060 if (lookup.IsFound()) { | 2060 if (lookup.IsFound()) { |
| 2061 // We found an existing property. Unless it was an interceptor | 2061 // We found an existing property. Unless it was an interceptor |
| 2062 // that claims the property is absent, skip this declaration. | 2062 // that claims the property is absent, skip this declaration. |
| 2063 if (!lookup.IsInterceptor()) continue; | 2063 if (!lookup.IsInterceptor()) continue; |
| 2064 PropertyAttributes attributes = global->GetPropertyAttribute(*name); | 2064 if (JSReceiver::GetPropertyAttribute(global, name) != ABSENT) continue; |
| 2065 if (attributes != ABSENT) continue; | |
| 2066 // Fall-through and introduce the absent property by using | 2065 // Fall-through and introduce the absent property by using |
| 2067 // SetProperty. | 2066 // SetProperty. |
| 2068 } | 2067 } |
| 2069 } else if (is_function) { | 2068 } else if (is_function) { |
| 2070 // Copy the function and update its context. Use it as value. | 2069 // Copy the function and update its context. Use it as value. |
| 2071 Handle<SharedFunctionInfo> shared = | 2070 Handle<SharedFunctionInfo> shared = |
| 2072 Handle<SharedFunctionInfo>::cast(value); | 2071 Handle<SharedFunctionInfo>::cast(value); |
| 2073 Handle<JSFunction> function = | 2072 Handle<JSFunction> function = |
| 2074 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 2073 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| 2075 shared, context, TENURED); | 2074 shared, context, TENURED); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2245 // Lookup the property locally in the global object. If it isn't | 2244 // Lookup the property locally in the global object. If it isn't |
| 2246 // there, there is a property with this name in the prototype chain. | 2245 // there, there is a property with this name in the prototype chain. |
| 2247 // We follow Safari and Firefox behavior and only set the property | 2246 // We follow Safari and Firefox behavior and only set the property |
| 2248 // locally if there is an explicit initialization value that we have | 2247 // locally if there is an explicit initialization value that we have |
| 2249 // to assign to the property. | 2248 // to assign to the property. |
| 2250 // Note that objects can have hidden prototypes, so we need to traverse | 2249 // Note that objects can have hidden prototypes, so we need to traverse |
| 2251 // the whole chain of hidden prototypes to do a 'local' lookup. | 2250 // the whole chain of hidden prototypes to do a 'local' lookup. |
| 2252 LookupResult lookup(isolate); | 2251 LookupResult lookup(isolate); |
| 2253 isolate->context()->global_object()->LocalLookup(*name, &lookup, true); | 2252 isolate->context()->global_object()->LocalLookup(*name, &lookup, true); |
| 2254 if (lookup.IsInterceptor()) { | 2253 if (lookup.IsInterceptor()) { |
| 2254 Handle<JSObject> holder(lookup.holder()); |
| 2255 PropertyAttributes intercepted = | 2255 PropertyAttributes intercepted = |
| 2256 lookup.holder()->GetPropertyAttribute(*name); | 2256 JSReceiver::GetPropertyAttribute(holder, name); |
| 2257 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { | 2257 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { |
| 2258 // Found an interceptor that's not read only. | 2258 // Found an interceptor that's not read only. |
| 2259 if (assign) { | 2259 if (assign) { |
| 2260 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 2260 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| 2261 Handle<Object> result = JSObject::SetPropertyForResult( | 2261 Handle<Object> result = JSObject::SetPropertyForResult( |
| 2262 handle(lookup.holder()), &lookup, name, value, attributes, | 2262 holder, &lookup, name, value, attributes, strict_mode); |
| 2263 strict_mode); | |
| 2264 RETURN_IF_EMPTY_HANDLE(isolate, result); | 2263 RETURN_IF_EMPTY_HANDLE(isolate, result); |
| 2265 return *result; | 2264 return *result; |
| 2266 } else { | 2265 } else { |
| 2267 return isolate->heap()->undefined_value(); | 2266 return isolate->heap()->undefined_value(); |
| 2268 } | 2267 } |
| 2269 } | 2268 } |
| 2270 } | 2269 } |
| 2271 | 2270 |
| 2272 if (assign) { | 2271 if (assign) { |
| 2273 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 2272 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
| (...skipping 3363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5637 CONVERT_SMI_ARG_CHECKED(index, 1); | 5636 CONVERT_SMI_ARG_CHECKED(index, 1); |
| 5638 | 5637 |
| 5639 bool result = JSReceiver::HasElement(receiver, index); | 5638 bool result = JSReceiver::HasElement(receiver, index); |
| 5640 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 5639 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5641 if (isolate->has_pending_exception()) return Failure::Exception(); | 5640 if (isolate->has_pending_exception()) return Failure::Exception(); |
| 5642 return isolate->heap()->ToBoolean(result); | 5641 return isolate->heap()->ToBoolean(result); |
| 5643 } | 5642 } |
| 5644 | 5643 |
| 5645 | 5644 |
| 5646 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { | 5645 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { |
| 5647 SealHandleScope shs(isolate); | 5646 HandleScope scope(isolate); |
| 5648 ASSERT(args.length() == 2); | 5647 ASSERT(args.length() == 2); |
| 5649 | 5648 |
| 5650 CONVERT_ARG_CHECKED(JSObject, object, 0); | 5649 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
| 5651 CONVERT_ARG_CHECKED(Name, key, 1); | 5650 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
| 5652 | 5651 |
| 5653 PropertyAttributes att = object->GetLocalPropertyAttribute(key); | 5652 PropertyAttributes att = JSReceiver::GetLocalPropertyAttribute(object, key); |
| 5654 if (att == ABSENT || (att & DONT_ENUM) != 0) { | 5653 if (att == ABSENT || (att & DONT_ENUM) != 0) { |
| 5655 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 5654 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 5656 return isolate->heap()->false_value(); | 5655 return isolate->heap()->false_value(); |
| 5657 } | 5656 } |
| 5658 ASSERT(!isolate->has_scheduled_exception()); | 5657 ASSERT(!isolate->has_scheduled_exception()); |
| 5659 return isolate->heap()->true_value(); | 5658 return isolate->heap()->true_value(); |
| 5660 } | 5659 } |
| 5661 | 5660 |
| 5662 | 5661 |
| 5663 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { | 5662 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5793 hidden_strings++; | 5792 hidden_strings++; |
| 5794 break; | 5793 break; |
| 5795 } | 5794 } |
| 5796 } | 5795 } |
| 5797 } | 5796 } |
| 5798 } | 5797 } |
| 5799 } | 5798 } |
| 5800 next_copy_index += local_property_count[i]; | 5799 next_copy_index += local_property_count[i]; |
| 5801 | 5800 |
| 5802 // Hidden properties only show up if the filter does not skip strings. | 5801 // Hidden properties only show up if the filter does not skip strings. |
| 5803 if ((filter & STRING) == 0 && jsproto->HasHiddenProperties()) { | 5802 if ((filter & STRING) == 0 && JSObject::HasHiddenProperties(jsproto)) { |
| 5804 hidden_strings++; | 5803 hidden_strings++; |
| 5805 } | 5804 } |
| 5806 if (i < length - 1) { | 5805 if (i < length - 1) { |
| 5807 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); | 5806 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); |
| 5808 } | 5807 } |
| 5809 } | 5808 } |
| 5810 | 5809 |
| 5811 // Filter out name of hidden properties object and | 5810 // Filter out name of hidden properties object and |
| 5812 // hidden prototype duplicates. | 5811 // hidden prototype duplicates. |
| 5813 if (hidden_strings > 0) { | 5812 if (hidden_strings > 0) { |
| (...skipping 3518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9332 "not_defined", HandleVector(&name, 1)); | 9331 "not_defined", HandleVector(&name, 1)); |
| 9333 return isolate->Throw(*error); | 9332 return isolate->Throw(*error); |
| 9334 } | 9333 } |
| 9335 // In sloppy mode, the property is added to the global object. | 9334 // In sloppy mode, the property is added to the global object. |
| 9336 attributes = NONE; | 9335 attributes = NONE; |
| 9337 object = Handle<JSReceiver>(isolate->context()->global_object()); | 9336 object = Handle<JSReceiver>(isolate->context()->global_object()); |
| 9338 } | 9337 } |
| 9339 | 9338 |
| 9340 // Set the property if it's not read only or doesn't yet exist. | 9339 // Set the property if it's not read only or doesn't yet exist. |
| 9341 if ((attributes & READ_ONLY) == 0 || | 9340 if ((attributes & READ_ONLY) == 0 || |
| 9342 (object->GetLocalPropertyAttribute(*name) == ABSENT)) { | 9341 (JSReceiver::GetLocalPropertyAttribute(object, name) == ABSENT)) { |
| 9343 RETURN_IF_EMPTY_HANDLE( | 9342 RETURN_IF_EMPTY_HANDLE( |
| 9344 isolate, | 9343 isolate, |
| 9345 JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); | 9344 JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); |
| 9346 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { | 9345 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { |
| 9347 // Setting read only property in strict mode. | 9346 // Setting read only property in strict mode. |
| 9348 Handle<Object> error = | 9347 Handle<Object> error = |
| 9349 isolate->factory()->NewTypeError( | 9348 isolate->factory()->NewTypeError( |
| 9350 "strict_cannot_assign", HandleVector(&name, 1)); | 9349 "strict_cannot_assign", HandleVector(&name, 1)); |
| 9351 return isolate->Throw(*error); | 9350 return isolate->Throw(*error); |
| 9352 } | 9351 } |
| (...skipping 5622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14975 // Handle last resort GC and make sure to allow future allocations | 14974 // Handle last resort GC and make sure to allow future allocations |
| 14976 // to grow the heap without causing GCs (if possible). | 14975 // to grow the heap without causing GCs (if possible). |
| 14977 isolate->counters()->gc_last_resort_from_js()->Increment(); | 14976 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 14978 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 14977 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 14979 "Runtime::PerformGC"); | 14978 "Runtime::PerformGC"); |
| 14980 } | 14979 } |
| 14981 } | 14980 } |
| 14982 | 14981 |
| 14983 | 14982 |
| 14984 } } // namespace v8::internal | 14983 } } // namespace v8::internal |
| OLD | NEW |