OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 2004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2015 // more than one access failure here. | 2015 // more than one access failure here. |
2016 AccessCheckResult access_check_result = | 2016 AccessCheckResult access_check_result = |
2017 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); | 2017 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); |
2018 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 2018 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
2019 switch (access_check_result) { | 2019 switch (access_check_result) { |
2020 case ACCESS_FORBIDDEN: return factory->false_value(); | 2020 case ACCESS_FORBIDDEN: return factory->false_value(); |
2021 case ACCESS_ALLOWED: break; | 2021 case ACCESS_ALLOWED: break; |
2022 case ACCESS_ABSENT: return factory->undefined_value(); | 2022 case ACCESS_ABSENT: return factory->undefined_value(); |
2023 } | 2023 } |
2024 | 2024 |
2025 PropertyAttributes attrs = JSReceiver::GetOwnPropertyAttribute(obj, name); | 2025 PropertyAttributes attrs = JSReceiver::GetOwnPropertyAttributes(obj, name); |
2026 if (attrs == ABSENT) { | 2026 if (attrs == ABSENT) { |
2027 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 2027 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
2028 return factory->undefined_value(); | 2028 return factory->undefined_value(); |
2029 } | 2029 } |
2030 ASSERT(!isolate->has_scheduled_exception()); | 2030 ASSERT(!isolate->has_scheduled_exception()); |
2031 Handle<AccessorPair> accessors; | 2031 Handle<AccessorPair> accessors; |
2032 bool has_accessors = | 2032 bool has_accessors = |
2033 JSObject::GetOwnPropertyAccessorPair(obj, name).ToHandle(&accessors); | 2033 JSObject::GetOwnPropertyAccessorPair(obj, name).ToHandle(&accessors); |
2034 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); | 2034 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); |
2035 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); | 2035 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 if (is_var || is_const) { | 2272 if (is_var || is_const) { |
2273 // Lookup the property in the global object, and don't set the | 2273 // Lookup the property in the global object, and don't set the |
2274 // value of the variable if the property is already there. | 2274 // value of the variable if the property is already there. |
2275 // Do the lookup own properties only, see ES5 erratum. | 2275 // Do the lookup own properties only, see ES5 erratum. |
2276 LookupResult lookup(isolate); | 2276 LookupResult lookup(isolate); |
2277 global->LookupOwn(name, &lookup, true); | 2277 global->LookupOwn(name, &lookup, true); |
2278 if (lookup.IsFound()) { | 2278 if (lookup.IsFound()) { |
2279 // We found an existing property. Unless it was an interceptor | 2279 // We found an existing property. Unless it was an interceptor |
2280 // that claims the property is absent, skip this declaration. | 2280 // that claims the property is absent, skip this declaration. |
2281 if (!lookup.IsInterceptor()) continue; | 2281 if (!lookup.IsInterceptor()) continue; |
2282 if (JSReceiver::GetPropertyAttribute(global, name) != ABSENT) continue; | 2282 if (JSReceiver::GetPropertyAttributes(global, name) != ABSENT) continue; |
2283 // Fall-through and introduce the absent property by using | 2283 // Fall-through and introduce the absent property by using |
2284 // SetProperty. | 2284 // SetProperty. |
2285 } | 2285 } |
2286 } else if (is_function) { | 2286 } else if (is_function) { |
2287 // Copy the function and update its context. Use it as value. | 2287 // Copy the function and update its context. Use it as value. |
2288 Handle<SharedFunctionInfo> shared = | 2288 Handle<SharedFunctionInfo> shared = |
2289 Handle<SharedFunctionInfo>::cast(value); | 2289 Handle<SharedFunctionInfo>::cast(value); |
2290 Handle<JSFunction> function = | 2290 Handle<JSFunction> function = |
2291 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 2291 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
2292 shared, context, TENURED); | 2292 shared, context, TENURED); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 // We follow Safari and Firefox behavior and only set the property | 2463 // We follow Safari and Firefox behavior and only set the property |
2464 // if there is an explicit initialization value that we have | 2464 // if there is an explicit initialization value that we have |
2465 // to assign to the property. | 2465 // to assign to the property. |
2466 // Note that objects can have hidden prototypes, so we need to traverse | 2466 // Note that objects can have hidden prototypes, so we need to traverse |
2467 // the whole chain of hidden prototypes to do an 'own' lookup. | 2467 // the whole chain of hidden prototypes to do an 'own' lookup. |
2468 LookupResult lookup(isolate); | 2468 LookupResult lookup(isolate); |
2469 isolate->context()->global_object()->LookupOwn(name, &lookup, true); | 2469 isolate->context()->global_object()->LookupOwn(name, &lookup, true); |
2470 if (lookup.IsInterceptor()) { | 2470 if (lookup.IsInterceptor()) { |
2471 Handle<JSObject> holder(lookup.holder()); | 2471 Handle<JSObject> holder(lookup.holder()); |
2472 PropertyAttributes intercepted = | 2472 PropertyAttributes intercepted = |
2473 JSReceiver::GetPropertyAttribute(holder, name); | 2473 JSReceiver::GetPropertyAttributes(holder, name); |
2474 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { | 2474 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { |
2475 // Found an interceptor that's not read only. | 2475 // Found an interceptor that's not read only. |
2476 if (assign) { | 2476 if (assign) { |
2477 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 2477 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
2478 Handle<Object> result; | 2478 Handle<Object> result; |
2479 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2479 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2480 isolate, result, | 2480 isolate, result, |
2481 JSObject::SetPropertyForResult( | 2481 JSObject::SetPropertyForResult( |
2482 holder, &lookup, name, value, attributes, strict_mode)); | 2482 holder, &lookup, name, value, attributes, strict_mode)); |
2483 return *result; | 2483 return *result; |
(...skipping 3275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5759 } | 5759 } |
5760 | 5760 |
5761 | 5761 |
5762 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { | 5762 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { |
5763 HandleScope scope(isolate); | 5763 HandleScope scope(isolate); |
5764 ASSERT(args.length() == 2); | 5764 ASSERT(args.length() == 2); |
5765 | 5765 |
5766 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 5766 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
5767 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); | 5767 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
5768 | 5768 |
5769 PropertyAttributes att = JSReceiver::GetOwnPropertyAttribute(object, key); | 5769 PropertyAttributes att = JSReceiver::GetOwnPropertyAttributes(object, key); |
5770 if (att == ABSENT || (att & DONT_ENUM) != 0) { | 5770 if (att == ABSENT || (att & DONT_ENUM) != 0) { |
5771 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 5771 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
5772 return isolate->heap()->false_value(); | 5772 return isolate->heap()->false_value(); |
5773 } | 5773 } |
5774 ASSERT(!isolate->has_scheduled_exception()); | 5774 ASSERT(!isolate->has_scheduled_exception()); |
5775 return isolate->heap()->true_value(); | 5775 return isolate->heap()->true_value(); |
5776 } | 5776 } |
5777 | 5777 |
5778 | 5778 |
5779 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { | 5779 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { |
(...skipping 3666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9446 "not_defined", HandleVector(&name, 1)); | 9446 "not_defined", HandleVector(&name, 1)); |
9447 return isolate->Throw(*error); | 9447 return isolate->Throw(*error); |
9448 } | 9448 } |
9449 // In sloppy mode, the property is added to the global object. | 9449 // In sloppy mode, the property is added to the global object. |
9450 attributes = NONE; | 9450 attributes = NONE; |
9451 object = Handle<JSReceiver>(isolate->context()->global_object()); | 9451 object = Handle<JSReceiver>(isolate->context()->global_object()); |
9452 } | 9452 } |
9453 | 9453 |
9454 // Set the property if it's not read only or doesn't yet exist. | 9454 // Set the property if it's not read only or doesn't yet exist. |
9455 if ((attributes & READ_ONLY) == 0 || | 9455 if ((attributes & READ_ONLY) == 0 || |
9456 (JSReceiver::GetOwnPropertyAttribute(object, name) == ABSENT)) { | 9456 (JSReceiver::GetOwnPropertyAttributes(object, name) == ABSENT)) { |
9457 RETURN_FAILURE_ON_EXCEPTION( | 9457 RETURN_FAILURE_ON_EXCEPTION( |
9458 isolate, | 9458 isolate, |
9459 JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); | 9459 JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); |
9460 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { | 9460 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { |
9461 // Setting read only property in strict mode. | 9461 // Setting read only property in strict mode. |
9462 Handle<Object> error = | 9462 Handle<Object> error = |
9463 isolate->factory()->NewTypeError( | 9463 isolate->factory()->NewTypeError( |
9464 "strict_cannot_assign", HandleVector(&name, 1)); | 9464 "strict_cannot_assign", HandleVector(&name, 1)); |
9465 return isolate->Throw(*error); | 9465 return isolate->Throw(*error); |
9466 } | 9466 } |
(...skipping 5676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15143 } | 15143 } |
15144 return NULL; | 15144 return NULL; |
15145 } | 15145 } |
15146 | 15146 |
15147 | 15147 |
15148 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15148 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
15149 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15149 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
15150 } | 15150 } |
15151 | 15151 |
15152 } } // namespace v8::internal | 15152 } } // namespace v8::internal |
OLD | NEW |