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