Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: src/runtime.cc

Issue 291153005: Consistently say 'own' property (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add new files Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.h ('k') | src/scopeinfo.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "v8.h" 8 #include "v8.h"
9 9
10 #include "accessors.h" 10 #include "accessors.h"
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 uint32_t element_index = 0; 270 uint32_t element_index = 0;
271 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; 271 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT;
272 if (key->IsInternalizedString()) { 272 if (key->IsInternalizedString()) {
273 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { 273 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) {
274 // Array index as string (uint32). 274 // Array index as string (uint32).
275 maybe_result = JSObject::SetOwnElement( 275 maybe_result = JSObject::SetOwnElement(
276 boilerplate, element_index, value, SLOPPY); 276 boilerplate, element_index, value, SLOPPY);
277 } else { 277 } else {
278 Handle<String> name(String::cast(*key)); 278 Handle<String> name(String::cast(*key));
279 ASSERT(!name->AsArrayIndex(&element_index)); 279 ASSERT(!name->AsArrayIndex(&element_index));
280 maybe_result = JSObject::SetLocalPropertyIgnoreAttributes( 280 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(
281 boilerplate, name, value, NONE, 281 boilerplate, name, value, NONE,
282 Object::OPTIMAL_REPRESENTATION, mode); 282 Object::OPTIMAL_REPRESENTATION, mode);
283 } 283 }
284 } else if (key->ToArrayIndex(&element_index)) { 284 } else if (key->ToArrayIndex(&element_index)) {
285 // Array index (uint32). 285 // Array index (uint32).
286 maybe_result = JSObject::SetOwnElement( 286 maybe_result = JSObject::SetOwnElement(
287 boilerplate, element_index, value, SLOPPY); 287 boilerplate, element_index, value, SLOPPY);
288 } else { 288 } else {
289 // Non-uint32 number. 289 // Non-uint32 number.
290 ASSERT(key->IsNumber()); 290 ASSERT(key->IsNumber());
291 double num = key->Number(); 291 double num = key->Number();
292 char arr[100]; 292 char arr[100];
293 Vector<char> buffer(arr, ARRAY_SIZE(arr)); 293 Vector<char> buffer(arr, ARRAY_SIZE(arr));
294 const char* str = DoubleToCString(num, buffer); 294 const char* str = DoubleToCString(num, buffer);
295 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); 295 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str);
296 maybe_result = JSObject::SetLocalPropertyIgnoreAttributes( 296 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(
297 boilerplate, name, value, NONE, 297 boilerplate, name, value, NONE,
298 Object::OPTIMAL_REPRESENTATION, mode); 298 Object::OPTIMAL_REPRESENTATION, mode);
299 } 299 }
300 // If setting the property on the boilerplate throws an 300 // If setting the property on the boilerplate throws an
301 // exception, the exception is converted to an empty handle in 301 // exception, the exception is converted to an empty handle in
302 // the handle based operations. In that case, we need to 302 // the handle based operations. In that case, we need to
303 // convert back to an exception. 303 // convert back to an exception.
304 RETURN_ON_EXCEPTION(isolate, maybe_result, Object); 304 RETURN_ON_EXCEPTION(isolate, maybe_result, Object);
305 } 305 }
306 306
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 obj, obj, index, access_type, &Isolate::MayIndexedAccess)) { 1953 obj, obj, index, access_type, &Isolate::MayIndexedAccess)) {
1954 return ACCESS_ALLOWED; 1954 return ACCESS_ALLOWED;
1955 } 1955 }
1956 1956
1957 obj->GetIsolate()->ReportFailedAccessCheck(obj, access_type); 1957 obj->GetIsolate()->ReportFailedAccessCheck(obj, access_type);
1958 return ACCESS_FORBIDDEN; 1958 return ACCESS_FORBIDDEN;
1959 } 1959 }
1960 1960
1961 Isolate* isolate = obj->GetIsolate(); 1961 Isolate* isolate = obj->GetIsolate();
1962 LookupResult lookup(isolate); 1962 LookupResult lookup(isolate);
1963 obj->LocalLookup(name, &lookup, true); 1963 obj->LookupOwn(name, &lookup, true);
1964 1964
1965 if (!lookup.IsProperty()) return ACCESS_ABSENT; 1965 if (!lookup.IsProperty()) return ACCESS_ABSENT;
1966 Handle<JSObject> holder(lookup.holder(), isolate); 1966 Handle<JSObject> holder(lookup.holder(), isolate);
1967 if (CheckGenericAccess<Handle<Object> >( 1967 if (CheckGenericAccess<Handle<Object> >(
1968 obj, holder, name, access_type, &Isolate::MayNamedAccess)) { 1968 obj, holder, name, access_type, &Isolate::MayNamedAccess)) {
1969 return ACCESS_ALLOWED; 1969 return ACCESS_ALLOWED;
1970 } 1970 }
1971 1971
1972 // Access check callback denied the access, but some properties 1972 // Access check callback denied the access, but some properties
1973 // can have a special permissions which override callbacks descision 1973 // can have a special permissions which override callbacks descision
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 // more than one access failure here. 2020 // more than one access failure here.
2021 AccessCheckResult access_check_result = 2021 AccessCheckResult access_check_result =
2022 CheckPropertyAccess(obj, name, v8::ACCESS_HAS); 2022 CheckPropertyAccess(obj, name, v8::ACCESS_HAS);
2023 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 2023 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
2024 switch (access_check_result) { 2024 switch (access_check_result) {
2025 case ACCESS_FORBIDDEN: return factory->false_value(); 2025 case ACCESS_FORBIDDEN: return factory->false_value();
2026 case ACCESS_ALLOWED: break; 2026 case ACCESS_ALLOWED: break;
2027 case ACCESS_ABSENT: return factory->undefined_value(); 2027 case ACCESS_ABSENT: return factory->undefined_value();
2028 } 2028 }
2029 2029
2030 PropertyAttributes attrs = JSReceiver::GetLocalPropertyAttribute(obj, name); 2030 PropertyAttributes attrs = JSReceiver::GetOwnPropertyAttribute(obj, name);
2031 if (attrs == ABSENT) { 2031 if (attrs == ABSENT) {
2032 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 2032 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
2033 return factory->undefined_value(); 2033 return factory->undefined_value();
2034 } 2034 }
2035 ASSERT(!isolate->has_scheduled_exception()); 2035 ASSERT(!isolate->has_scheduled_exception());
2036 Handle<AccessorPair> accessors; 2036 Handle<AccessorPair> accessors;
2037 bool has_accessors = 2037 bool has_accessors =
2038 JSObject::GetLocalPropertyAccessorPair(obj, name).ToHandle(&accessors); 2038 JSObject::GetOwnPropertyAccessorPair(obj, name).ToHandle(&accessors);
2039 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); 2039 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE);
2040 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); 2040 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0));
2041 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); 2041 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0));
2042 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(has_accessors)); 2042 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(has_accessors));
2043 2043
2044 if (!has_accessors) { 2044 if (!has_accessors) {
2045 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); 2045 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0));
2046 // Runtime::GetObjectProperty does access check. 2046 // Runtime::GetObjectProperty does access check.
2047 Handle<Object> value; 2047 Handle<Object> value;
2048 ASSIGN_RETURN_ON_EXCEPTION( 2048 ASSIGN_RETURN_ON_EXCEPTION(
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
2270 // assign to it when evaluating the assignment for "const x = 2270 // assign to it when evaluating the assignment for "const x =
2271 // <expr>" the initial value is the hole. 2271 // <expr>" the initial value is the hole.
2272 bool is_var = value->IsUndefined(); 2272 bool is_var = value->IsUndefined();
2273 bool is_const = value->IsTheHole(); 2273 bool is_const = value->IsTheHole();
2274 bool is_function = value->IsSharedFunctionInfo(); 2274 bool is_function = value->IsSharedFunctionInfo();
2275 ASSERT(is_var + is_const + is_function == 1); 2275 ASSERT(is_var + is_const + is_function == 1);
2276 2276
2277 if (is_var || is_const) { 2277 if (is_var || is_const) {
2278 // Lookup the property in the global object, and don't set the 2278 // Lookup the property in the global object, and don't set the
2279 // value of the variable if the property is already there. 2279 // value of the variable if the property is already there.
2280 // Do the lookup locally only, see ES5 erratum. 2280 // Do the lookup own properties only, see ES5 erratum.
2281 LookupResult lookup(isolate); 2281 LookupResult lookup(isolate);
2282 global->LocalLookup(name, &lookup, true); 2282 global->LookupOwn(name, &lookup, true);
2283 if (lookup.IsFound()) { 2283 if (lookup.IsFound()) {
2284 // We found an existing property. Unless it was an interceptor 2284 // We found an existing property. Unless it was an interceptor
2285 // that claims the property is absent, skip this declaration. 2285 // that claims the property is absent, skip this declaration.
2286 if (!lookup.IsInterceptor()) continue; 2286 if (!lookup.IsInterceptor()) continue;
2287 if (JSReceiver::GetPropertyAttribute(global, name) != ABSENT) continue; 2287 if (JSReceiver::GetPropertyAttribute(global, name) != ABSENT) continue;
2288 // Fall-through and introduce the absent property by using 2288 // Fall-through and introduce the absent property by using
2289 // SetProperty. 2289 // SetProperty.
2290 } 2290 }
2291 } else if (is_function) { 2291 } else if (is_function) {
2292 // Copy the function and update its context. Use it as value. 2292 // Copy the function and update its context. Use it as value.
2293 Handle<SharedFunctionInfo> shared = 2293 Handle<SharedFunctionInfo> shared =
2294 Handle<SharedFunctionInfo>::cast(value); 2294 Handle<SharedFunctionInfo>::cast(value);
2295 Handle<JSFunction> function = 2295 Handle<JSFunction> function =
2296 isolate->factory()->NewFunctionFromSharedFunctionInfo( 2296 isolate->factory()->NewFunctionFromSharedFunctionInfo(
2297 shared, context, TENURED); 2297 shared, context, TENURED);
2298 value = function; 2298 value = function;
2299 } 2299 }
2300 2300
2301 LookupResult lookup(isolate); 2301 LookupResult lookup(isolate);
2302 global->LocalLookup(name, &lookup, true); 2302 global->LookupOwn(name, &lookup, true);
2303 2303
2304 // Compute the property attributes. According to ECMA-262, 2304 // Compute the property attributes. According to ECMA-262,
2305 // the property must be non-configurable except in eval. 2305 // the property must be non-configurable except in eval.
2306 int attr = NONE; 2306 int attr = NONE;
2307 bool is_eval = DeclareGlobalsEvalFlag::decode(flags); 2307 bool is_eval = DeclareGlobalsEvalFlag::decode(flags);
2308 if (!is_eval) { 2308 if (!is_eval) {
2309 attr |= DONT_DELETE; 2309 attr |= DONT_DELETE;
2310 } 2310 }
2311 bool is_native = DeclareGlobalsNativeFlag::decode(flags); 2311 bool is_native = DeclareGlobalsNativeFlag::decode(flags);
2312 if (is_const || (is_native && is_function)) { 2312 if (is_const || (is_native && is_function)) {
2313 attr |= READ_ONLY; 2313 attr |= READ_ONLY;
2314 } 2314 }
2315 2315
2316 StrictMode strict_mode = DeclareGlobalsStrictMode::decode(flags); 2316 StrictMode strict_mode = DeclareGlobalsStrictMode::decode(flags);
2317 2317
2318 if (!lookup.IsFound() || is_function) { 2318 if (!lookup.IsFound() || is_function) {
2319 // If the local property exists, check that we can reconfigure it 2319 // If the own property exists, check that we can reconfigure it
2320 // as required for function declarations. 2320 // as required for function declarations.
2321 if (lookup.IsFound() && lookup.IsDontDelete()) { 2321 if (lookup.IsFound() && lookup.IsDontDelete()) {
2322 if (lookup.IsReadOnly() || lookup.IsDontEnum() || 2322 if (lookup.IsReadOnly() || lookup.IsDontEnum() ||
2323 lookup.IsPropertyCallbacks()) { 2323 lookup.IsPropertyCallbacks()) {
2324 return ThrowRedeclarationError(isolate, name); 2324 return ThrowRedeclarationError(isolate, name);
2325 } 2325 }
2326 // If the existing property is not configurable, keep its attributes. 2326 // If the existing property is not configurable, keep its attributes.
2327 attr = lookup.GetAttributes(); 2327 attr = lookup.GetAttributes();
2328 } 2328 }
2329 // Define or redefine own property. 2329 // Define or redefine own property.
2330 RETURN_FAILURE_ON_EXCEPTION(isolate, 2330 RETURN_FAILURE_ON_EXCEPTION(isolate,
2331 JSObject::SetLocalPropertyIgnoreAttributes( 2331 JSObject::SetOwnPropertyIgnoreAttributes(
2332 global, name, value, static_cast<PropertyAttributes>(attr))); 2332 global, name, value, static_cast<PropertyAttributes>(attr)));
2333 } else { 2333 } else {
2334 // Do a [[Put]] on the existing (own) property. 2334 // Do a [[Put]] on the existing (own) property.
2335 RETURN_FAILURE_ON_EXCEPTION( 2335 RETURN_FAILURE_ON_EXCEPTION(
2336 isolate, 2336 isolate,
2337 JSObject::SetProperty( 2337 JSObject::SetProperty(
2338 global, name, value, static_cast<PropertyAttributes>(attr), 2338 global, name, value, static_cast<PropertyAttributes>(attr),
2339 strict_mode)); 2339 strict_mode));
2340 } 2340 }
2341 } 2341 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2407 ASSERT(context->IsFunctionContext()); 2407 ASSERT(context->IsFunctionContext());
2408 object = isolate->factory()->NewJSObject( 2408 object = isolate->factory()->NewJSObject(
2409 isolate->context_extension_function()); 2409 isolate->context_extension_function());
2410 context->set_extension(*object); 2410 context->set_extension(*object);
2411 } 2411 }
2412 ASSERT(*object != NULL); 2412 ASSERT(*object != NULL);
2413 2413
2414 // Declare the property by setting it to the initial value if provided, 2414 // Declare the property by setting it to the initial value if provided,
2415 // or undefined, and use the correct mode (e.g. READ_ONLY attribute for 2415 // or undefined, and use the correct mode (e.g. READ_ONLY attribute for
2416 // constant declarations). 2416 // constant declarations).
2417 ASSERT(!JSReceiver::HasLocalProperty(object, name)); 2417 ASSERT(!JSReceiver::HasOwnProperty(object, name));
2418 Handle<Object> value(isolate->heap()->undefined_value(), isolate); 2418 Handle<Object> value(isolate->heap()->undefined_value(), isolate);
2419 if (*initial_value != NULL) value = initial_value; 2419 if (*initial_value != NULL) value = initial_value;
2420 // Declaring a const context slot is a conflicting declaration if 2420 // Declaring a const context slot is a conflicting declaration if
2421 // there is a callback with that name in a prototype. It is 2421 // there is a callback with that name in a prototype. It is
2422 // allowed to introduce const variables in 2422 // allowed to introduce const variables in
2423 // JSContextExtensionObjects. They are treated specially in 2423 // JSContextExtensionObjects. They are treated specially in
2424 // SetProperty and no setters are invoked for those since they are 2424 // SetProperty and no setters are invoked for those since they are
2425 // not real JSObjects. 2425 // not real JSObjects.
2426 if (initial_value->IsTheHole() && 2426 if (initial_value->IsTheHole() &&
2427 !object->IsJSContextExtensionObject()) { 2427 !object->IsJSContextExtensionObject()) {
2428 LookupResult lookup(isolate); 2428 LookupResult lookup(isolate);
2429 object->Lookup(name, &lookup); 2429 object->Lookup(name, &lookup);
2430 if (lookup.IsPropertyCallbacks()) { 2430 if (lookup.IsPropertyCallbacks()) {
2431 return ThrowRedeclarationError(isolate, name); 2431 return ThrowRedeclarationError(isolate, name);
2432 } 2432 }
2433 } 2433 }
2434 if (object->IsJSGlobalObject()) { 2434 if (object->IsJSGlobalObject()) {
2435 // Define own property on the global object. 2435 // Define own property on the global object.
2436 RETURN_FAILURE_ON_EXCEPTION(isolate, 2436 RETURN_FAILURE_ON_EXCEPTION(isolate,
2437 JSObject::SetLocalPropertyIgnoreAttributes(object, name, value, mode)); 2437 JSObject::SetOwnPropertyIgnoreAttributes(object, name, value, mode));
2438 } else { 2438 } else {
2439 RETURN_FAILURE_ON_EXCEPTION(isolate, 2439 RETURN_FAILURE_ON_EXCEPTION(isolate,
2440 JSReceiver::SetProperty(object, name, value, mode, SLOPPY)); 2440 JSReceiver::SetProperty(object, name, value, mode, SLOPPY));
2441 } 2441 }
2442 } 2442 }
2443 2443
2444 return isolate->heap()->undefined_value(); 2444 return isolate->heap()->undefined_value();
2445 } 2445 }
2446 2446
2447 2447
2448 RUNTIME_FUNCTION(Runtime_InitializeVarGlobal) { 2448 RUNTIME_FUNCTION(Runtime_InitializeVarGlobal) {
2449 HandleScope scope(isolate); 2449 HandleScope scope(isolate);
2450 // args[0] == name 2450 // args[0] == name
2451 // args[1] == language_mode 2451 // args[1] == language_mode
2452 // args[2] == value (optional) 2452 // args[2] == value (optional)
2453 2453
2454 // Determine if we need to assign to the variable if it already 2454 // Determine if we need to assign to the variable if it already
2455 // exists (based on the number of arguments). 2455 // exists (based on the number of arguments).
2456 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); 2456 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3);
2457 bool assign = args.length() == 3; 2457 bool assign = args.length() == 3;
2458 2458
2459 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 2459 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
2460 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 1); 2460 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 1);
2461 2461
2462 // According to ECMA-262, section 12.2, page 62, the property must 2462 // According to ECMA-262, section 12.2, page 62, the property must
2463 // not be deletable. 2463 // not be deletable.
2464 PropertyAttributes attributes = DONT_DELETE; 2464 PropertyAttributes attributes = DONT_DELETE;
2465 2465
2466 // Lookup the property locally in the global object. If it isn't 2466 // Lookup the property as own on the global object. If it isn't
2467 // there, there is a property with this name in the prototype chain. 2467 // there, there is a property with this name in the prototype chain.
2468 // We follow Safari and Firefox behavior and only set the property 2468 // We follow Safari and Firefox behavior and only set the property
2469 // locally if there is an explicit initialization value that we have 2469 // if there is an explicit initialization value that we have
2470 // to assign to the property. 2470 // to assign to the property.
2471 // Note that objects can have hidden prototypes, so we need to traverse 2471 // Note that objects can have hidden prototypes, so we need to traverse
2472 // the whole chain of hidden prototypes to do a 'local' lookup. 2472 // the whole chain of hidden prototypes to do an 'own' lookup.
2473 LookupResult lookup(isolate); 2473 LookupResult lookup(isolate);
2474 isolate->context()->global_object()->LocalLookup(name, &lookup, true); 2474 isolate->context()->global_object()->LookupOwn(name, &lookup, true);
2475 if (lookup.IsInterceptor()) { 2475 if (lookup.IsInterceptor()) {
2476 Handle<JSObject> holder(lookup.holder()); 2476 Handle<JSObject> holder(lookup.holder());
2477 PropertyAttributes intercepted = 2477 PropertyAttributes intercepted =
2478 JSReceiver::GetPropertyAttribute(holder, name); 2478 JSReceiver::GetPropertyAttribute(holder, name);
2479 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { 2479 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) {
2480 // Found an interceptor that's not read only. 2480 // Found an interceptor that's not read only.
2481 if (assign) { 2481 if (assign) {
2482 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 2482 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
2483 Handle<Object> result; 2483 Handle<Object> result;
2484 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2484 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
(...skipping 30 matching lines...) Expand all
2515 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); 2515 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
2516 2516
2517 // Get the current global object from top. 2517 // Get the current global object from top.
2518 GlobalObject* global = isolate->context()->global_object(); 2518 GlobalObject* global = isolate->context()->global_object();
2519 2519
2520 // According to ECMA-262, section 12.2, page 62, the property must 2520 // According to ECMA-262, section 12.2, page 62, the property must
2521 // not be deletable. Since it's a const, it must be READ_ONLY too. 2521 // not be deletable. Since it's a const, it must be READ_ONLY too.
2522 PropertyAttributes attributes = 2522 PropertyAttributes attributes =
2523 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); 2523 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY);
2524 2524
2525 // Lookup the property locally in the global object. If it isn't 2525 // Lookup the property as own on the global object. If it isn't
2526 // there, we add the property and take special precautions to always 2526 // there, we add the property and take special precautions to always
2527 // add it as a local property even in case of callbacks in the 2527 // add it even in case of callbacks in the prototype chain (this rules
2528 // prototype chain (this rules out using SetProperty). 2528 // out using SetProperty). We use SetOwnPropertyIgnoreAttributes instead
2529 // We use SetLocalPropertyIgnoreAttributes instead
2530 LookupResult lookup(isolate); 2529 LookupResult lookup(isolate);
2531 global->LocalLookup(name, &lookup); 2530 global->LookupOwn(name, &lookup);
2532 if (!lookup.IsFound()) { 2531 if (!lookup.IsFound()) {
2533 HandleScope handle_scope(isolate); 2532 HandleScope handle_scope(isolate);
2534 Handle<GlobalObject> global(isolate->context()->global_object()); 2533 Handle<GlobalObject> global(isolate->context()->global_object());
2535 RETURN_FAILURE_ON_EXCEPTION( 2534 RETURN_FAILURE_ON_EXCEPTION(
2536 isolate, 2535 isolate,
2537 JSObject::SetLocalPropertyIgnoreAttributes(global, name, value, 2536 JSObject::SetOwnPropertyIgnoreAttributes(global, name, value,
2538 attributes)); 2537 attributes));
2539 return *value; 2538 return *value;
2540 } 2539 }
2541 2540
2542 if (!lookup.IsReadOnly()) { 2541 if (!lookup.IsReadOnly()) {
2543 // Restore global object from context (in case of GC) and continue 2542 // Restore global object from context (in case of GC) and continue
2544 // with setting the value. 2543 // with setting the value.
2545 HandleScope handle_scope(isolate); 2544 HandleScope handle_scope(isolate);
2546 Handle<GlobalObject> global(isolate->context()->global_object()); 2545 Handle<GlobalObject> global(isolate->context()->global_object());
2547 2546
2548 // BUG 1213575: Handle the case where we have to set a read-only 2547 // BUG 1213575: Handle the case where we have to set a read-only
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2637 // function f() { eval("delete x; const x;"); } 2636 // function f() { eval("delete x; const x;"); }
2638 // 2637 //
2639 // In that case, the initialization behaves like a normal assignment. 2638 // In that case, the initialization behaves like a normal assignment.
2640 Handle<JSObject> object = Handle<JSObject>::cast(holder); 2639 Handle<JSObject> object = Handle<JSObject>::cast(holder);
2641 2640
2642 if (*object == context->extension()) { 2641 if (*object == context->extension()) {
2643 // This is the property that was introduced by the const declaration. 2642 // This is the property that was introduced by the const declaration.
2644 // Set it if it hasn't been set before. NOTE: We cannot use 2643 // Set it if it hasn't been set before. NOTE: We cannot use
2645 // GetProperty() to get the current value as it 'unholes' the value. 2644 // GetProperty() to get the current value as it 'unholes' the value.
2646 LookupResult lookup(isolate); 2645 LookupResult lookup(isolate);
2647 object->LocalLookupRealNamedProperty(name, &lookup); 2646 object->LookupOwnRealNamedProperty(name, &lookup);
2648 ASSERT(lookup.IsFound()); // the property was declared 2647 ASSERT(lookup.IsFound()); // the property was declared
2649 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only 2648 ASSERT(lookup.IsReadOnly()); // and it was declared as read-only
2650 2649
2651 if (lookup.IsField()) { 2650 if (lookup.IsField()) {
2652 FixedArray* properties = object->properties(); 2651 FixedArray* properties = object->properties();
2653 int index = lookup.GetFieldIndex().field_index(); 2652 int index = lookup.GetFieldIndex().field_index();
2654 if (properties->get(index)->IsTheHole()) { 2653 if (properties->get(index)->IsTheHole()) {
2655 properties->set(index, *value); 2654 properties->set(index, *value);
2656 } 2655 }
2657 } else if (lookup.IsNormal()) { 2656 } else if (lookup.IsNormal()) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2770 return *regexp; 2769 return *regexp;
2771 } 2770 }
2772 2771
2773 // Map has changed, so use generic, but slower, method. 2772 // Map has changed, so use generic, but slower, method.
2774 PropertyAttributes final = 2773 PropertyAttributes final =
2775 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE); 2774 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE);
2776 PropertyAttributes writable = 2775 PropertyAttributes writable =
2777 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 2776 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
2778 Handle<Object> zero(Smi::FromInt(0), isolate); 2777 Handle<Object> zero(Smi::FromInt(0), isolate);
2779 Factory* factory = isolate->factory(); 2778 Factory* factory = isolate->factory();
2780 JSObject::SetLocalPropertyIgnoreAttributes( 2779 JSObject::SetOwnPropertyIgnoreAttributes(
2781 regexp, factory->source_string(), source, final).Check(); 2780 regexp, factory->source_string(), source, final).Check();
2782 JSObject::SetLocalPropertyIgnoreAttributes( 2781 JSObject::SetOwnPropertyIgnoreAttributes(
2783 regexp, factory->global_string(), global, final).Check(); 2782 regexp, factory->global_string(), global, final).Check();
2784 JSObject::SetLocalPropertyIgnoreAttributes( 2783 JSObject::SetOwnPropertyIgnoreAttributes(
2785 regexp, factory->ignore_case_string(), ignoreCase, final).Check(); 2784 regexp, factory->ignore_case_string(), ignoreCase, final).Check();
2786 JSObject::SetLocalPropertyIgnoreAttributes( 2785 JSObject::SetOwnPropertyIgnoreAttributes(
2787 regexp, factory->multiline_string(), multiline, final).Check(); 2786 regexp, factory->multiline_string(), multiline, final).Check();
2788 JSObject::SetLocalPropertyIgnoreAttributes( 2787 JSObject::SetOwnPropertyIgnoreAttributes(
2789 regexp, factory->last_index_string(), zero, writable).Check(); 2788 regexp, factory->last_index_string(), zero, writable).Check();
2790 return *regexp; 2789 return *regexp;
2791 } 2790 }
2792 2791
2793 2792
2794 RUNTIME_FUNCTION(Runtime_FinishArrayPrototypeSetup) { 2793 RUNTIME_FUNCTION(Runtime_FinishArrayPrototypeSetup) {
2795 HandleScope scope(isolate); 2794 HandleScope scope(isolate);
2796 ASSERT(args.length() == 1); 2795 ASSERT(args.length() == 1);
2797 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0); 2796 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0);
2798 Object* length = prototype->length(); 2797 Object* length = prototype->length();
(...skipping 2251 matching lines...) Expand 10 before | Expand all | Expand 10 after
5050 RUNTIME_FUNCTION(Runtime_KeyedGetProperty) { 5049 RUNTIME_FUNCTION(Runtime_KeyedGetProperty) {
5051 HandleScope scope(isolate); 5050 HandleScope scope(isolate);
5052 ASSERT(args.length() == 2); 5051 ASSERT(args.length() == 2);
5053 5052
5054 CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0); 5053 CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0);
5055 CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1); 5054 CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1);
5056 5055
5057 // Fast cases for getting named properties of the receiver JSObject 5056 // Fast cases for getting named properties of the receiver JSObject
5058 // itself. 5057 // itself.
5059 // 5058 //
5060 // The global proxy objects has to be excluded since LocalLookup on 5059 // The global proxy objects has to be excluded since LookupOwn on
5061 // the global proxy object can return a valid result even though the 5060 // the global proxy object can return a valid result even though the
5062 // global proxy object never has properties. This is the case 5061 // global proxy object never has properties. This is the case
5063 // because the global proxy object forwards everything to its hidden 5062 // because the global proxy object forwards everything to its hidden
5064 // prototype including local lookups. 5063 // prototype including own lookups.
5065 // 5064 //
5066 // Additionally, we need to make sure that we do not cache results 5065 // Additionally, we need to make sure that we do not cache results
5067 // for objects that require access checks. 5066 // for objects that require access checks.
5068 if (receiver_obj->IsJSObject()) { 5067 if (receiver_obj->IsJSObject()) {
5069 if (!receiver_obj->IsJSGlobalProxy() && 5068 if (!receiver_obj->IsJSGlobalProxy() &&
5070 !receiver_obj->IsAccessCheckNeeded() && 5069 !receiver_obj->IsAccessCheckNeeded() &&
5071 key_obj->IsName()) { 5070 key_obj->IsName()) {
5072 DisallowHeapAllocation no_allocation; 5071 DisallowHeapAllocation no_allocation;
5073 Handle<JSObject> receiver = Handle<JSObject>::cast(receiver_obj); 5072 Handle<JSObject> receiver = Handle<JSObject>::cast(receiver_obj);
5074 Handle<Name> key = Handle<Name>::cast(key_obj); 5073 Handle<Name> key = Handle<Name>::cast(key_obj);
5075 if (receiver->HasFastProperties()) { 5074 if (receiver->HasFastProperties()) {
5076 // Attempt to use lookup cache. 5075 // Attempt to use lookup cache.
5077 Handle<Map> receiver_map(receiver->map(), isolate); 5076 Handle<Map> receiver_map(receiver->map(), isolate);
5078 KeyedLookupCache* keyed_lookup_cache = isolate->keyed_lookup_cache(); 5077 KeyedLookupCache* keyed_lookup_cache = isolate->keyed_lookup_cache();
5079 int offset = keyed_lookup_cache->Lookup(receiver_map, key); 5078 int offset = keyed_lookup_cache->Lookup(receiver_map, key);
5080 if (offset != -1) { 5079 if (offset != -1) {
5081 // Doubles are not cached, so raw read the value. 5080 // Doubles are not cached, so raw read the value.
5082 Object* value = receiver->RawFastPropertyAt(offset); 5081 Object* value = receiver->RawFastPropertyAt(offset);
5083 return value->IsTheHole() 5082 return value->IsTheHole()
5084 ? isolate->heap()->undefined_value() 5083 ? isolate->heap()->undefined_value()
5085 : value; 5084 : value;
5086 } 5085 }
5087 // Lookup cache miss. Perform lookup and update the cache if 5086 // Lookup cache miss. Perform lookup and update the cache if
5088 // appropriate. 5087 // appropriate.
5089 LookupResult result(isolate); 5088 LookupResult result(isolate);
5090 receiver->LocalLookup(key, &result); 5089 receiver->LookupOwn(key, &result);
5091 if (result.IsField()) { 5090 if (result.IsField()) {
5092 int offset = result.GetFieldIndex().field_index(); 5091 int offset = result.GetFieldIndex().field_index();
5093 // Do not track double fields in the keyed lookup cache. Reading 5092 // Do not track double fields in the keyed lookup cache. Reading
5094 // double values requires boxing. 5093 // double values requires boxing.
5095 if (!result.representation().IsDouble()) { 5094 if (!result.representation().IsDouble()) {
5096 keyed_lookup_cache->Update(receiver_map, key, offset); 5095 keyed_lookup_cache->Update(receiver_map, key, offset);
5097 } 5096 }
5098 AllowHeapAllocation allow_allocation; 5097 AllowHeapAllocation allow_allocation;
5099 return *JSObject::FastPropertyAt( 5098 return *JSObject::FastPropertyAt(
5100 receiver, result.representation(), offset); 5099 receiver, result.representation(), offset);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
5205 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5204 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5206 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 5205 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
5207 5206
5208 // Check access rights if needed. 5207 // Check access rights if needed.
5209 if (js_object->IsAccessCheckNeeded() && 5208 if (js_object->IsAccessCheckNeeded() &&
5210 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) { 5209 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) {
5211 return isolate->heap()->undefined_value(); 5210 return isolate->heap()->undefined_value();
5212 } 5211 }
5213 5212
5214 LookupResult lookup(isolate); 5213 LookupResult lookup(isolate);
5215 js_object->LocalLookupRealNamedProperty(name, &lookup); 5214 js_object->LookupOwnRealNamedProperty(name, &lookup);
5216 5215
5217 // Special case for callback properties. 5216 // Special case for callback properties.
5218 if (lookup.IsPropertyCallbacks()) { 5217 if (lookup.IsPropertyCallbacks()) {
5219 Handle<Object> callback(lookup.GetCallbackObject(), isolate); 5218 Handle<Object> callback(lookup.GetCallbackObject(), isolate);
5220 // Avoid redefining callback as data property, just use the stored 5219 // Avoid redefining callback as data property, just use the stored
5221 // setter to update the value instead. 5220 // setter to update the value instead.
5222 // TODO(mstarzinger): So far this only works if property attributes don't 5221 // TODO(mstarzinger): So far this only works if property attributes don't
5223 // change, this should be fixed once we cleanup the underlying code. 5222 // change, this should be fixed once we cleanup the underlying code.
5224 ASSERT(!callback->IsForeign()); 5223 ASSERT(!callback->IsForeign());
5225 if (callback->IsAccessorInfo() && 5224 if (callback->IsAccessorInfo() &&
(...skipping 24 matching lines...) Expand all
5250 // Since the result is a property, the prototype will exist so 5249 // Since the result is a property, the prototype will exist so
5251 // we don't have to check for null. 5250 // we don't have to check for null.
5252 js_object = Handle<JSObject>(JSObject::cast(js_object->GetPrototype())); 5251 js_object = Handle<JSObject>(JSObject::cast(js_object->GetPrototype()));
5253 } 5252 }
5254 JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); 5253 JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
5255 // Use IgnoreAttributes version since a readonly property may be 5254 // Use IgnoreAttributes version since a readonly property may be
5256 // overridden and SetProperty does not allow this. 5255 // overridden and SetProperty does not allow this.
5257 Handle<Object> result; 5256 Handle<Object> result;
5258 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5257 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5259 isolate, result, 5258 isolate, result,
5260 JSObject::SetLocalPropertyIgnoreAttributes( 5259 JSObject::SetOwnPropertyIgnoreAttributes(
5261 js_object, name, obj_value, attr)); 5260 js_object, name, obj_value, attr));
5262 return *result; 5261 return *result;
5263 } 5262 }
5264 5263
5265 Handle<Object> result; 5264 Handle<Object> result;
5266 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5265 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5267 isolate, result, 5266 isolate, result,
5268 Runtime::ForceSetObjectProperty( 5267 Runtime::ForceSetObjectProperty(
5269 js_object, name, obj_value, attr, 5268 js_object, name, obj_value, attr,
5270 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED)); 5269 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED));
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
5404 SLOPPY, false, DEFINE_PROPERTY); 5403 SLOPPY, false, DEFINE_PROPERTY);
5405 } 5404 }
5406 5405
5407 if (key->IsName()) { 5406 if (key->IsName()) {
5408 Handle<Name> name = Handle<Name>::cast(key); 5407 Handle<Name> name = Handle<Name>::cast(key);
5409 if (name->AsArrayIndex(&index)) { 5408 if (name->AsArrayIndex(&index)) {
5410 return JSObject::SetElement(js_object, index, value, attr, 5409 return JSObject::SetElement(js_object, index, value, attr,
5411 SLOPPY, false, DEFINE_PROPERTY); 5410 SLOPPY, false, DEFINE_PROPERTY);
5412 } else { 5411 } else {
5413 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); 5412 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));
5414 return JSObject::SetLocalPropertyIgnoreAttributes( 5413 return JSObject::SetOwnPropertyIgnoreAttributes(
5415 js_object, name, value, attr, Object::OPTIMAL_REPRESENTATION, 5414 js_object, name, value, attr, Object::OPTIMAL_REPRESENTATION,
5416 ALLOW_AS_CONSTANT, JSReceiver::PERFORM_EXTENSIBILITY_CHECK, 5415 ALLOW_AS_CONSTANT, JSReceiver::PERFORM_EXTENSIBILITY_CHECK,
5417 store_from_keyed); 5416 store_from_keyed);
5418 } 5417 }
5419 } 5418 }
5420 5419
5421 // Call-back into JavaScript to convert the key to a string. 5420 // Call-back into JavaScript to convert the key to a string.
5422 Handle<Object> converted; 5421 Handle<Object> converted;
5423 ASSIGN_RETURN_ON_EXCEPTION( 5422 ASSIGN_RETURN_ON_EXCEPTION(
5424 isolate, converted, Execution::ToString(isolate, key), Object); 5423 isolate, converted, Execution::ToString(isolate, key), Object);
5425 Handle<String> name = Handle<String>::cast(converted); 5424 Handle<String> name = Handle<String>::cast(converted);
5426 5425
5427 if (name->AsArrayIndex(&index)) { 5426 if (name->AsArrayIndex(&index)) {
5428 return JSObject::SetElement(js_object, index, value, attr, 5427 return JSObject::SetElement(js_object, index, value, attr,
5429 SLOPPY, false, DEFINE_PROPERTY); 5428 SLOPPY, false, DEFINE_PROPERTY);
5430 } else { 5429 } else {
5431 return JSObject::SetLocalPropertyIgnoreAttributes( 5430 return JSObject::SetOwnPropertyIgnoreAttributes(
5432 js_object, name, value, attr, Object::OPTIMAL_REPRESENTATION, 5431 js_object, name, value, attr, Object::OPTIMAL_REPRESENTATION,
5433 ALLOW_AS_CONSTANT, JSReceiver::PERFORM_EXTENSIBILITY_CHECK, 5432 ALLOW_AS_CONSTANT, JSReceiver::PERFORM_EXTENSIBILITY_CHECK,
5434 store_from_keyed); 5433 store_from_keyed);
5435 } 5434 }
5436 } 5435 }
5437 5436
5438 5437
5439 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate, 5438 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate,
5440 Handle<JSReceiver> receiver, 5439 Handle<JSReceiver> receiver,
5441 Handle<Object> key, 5440 Handle<Object> key,
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
5654 5653
5655 5654
5656 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) { 5655 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) {
5657 ASSERT(args.length() == 0); 5656 ASSERT(args.length() == 0);
5658 SealHandleScope shs(isolate); 5657 SealHandleScope shs(isolate);
5659 isolate->debug()->PromiseHandleEpilogue(); 5658 isolate->debug()->PromiseHandleEpilogue();
5660 return isolate->heap()->undefined_value(); 5659 return isolate->heap()->undefined_value();
5661 } 5660 }
5662 5661
5663 5662
5664 // Set a local property, even if it is READ_ONLY. If the property does not 5663 // Set an own property, even if it is READ_ONLY. If the property does not
5665 // exist, it will be added with attributes NONE. 5664 // exist, it will be added with attributes NONE.
5666 RUNTIME_FUNCTION(Runtime_IgnoreAttributesAndSetProperty) { 5665 RUNTIME_FUNCTION(Runtime_IgnoreAttributesAndSetProperty) {
5667 HandleScope scope(isolate); 5666 HandleScope scope(isolate);
5668 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); 5667 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
5669 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5668 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5670 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 5669 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
5671 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 5670 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5672 // Compute attributes. 5671 // Compute attributes.
5673 PropertyAttributes attributes = NONE; 5672 PropertyAttributes attributes = NONE;
5674 if (args.length() == 4) { 5673 if (args.length() == 4) {
5675 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3); 5674 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3);
5676 // Only attribute bits should be set. 5675 // Only attribute bits should be set.
5677 RUNTIME_ASSERT( 5676 RUNTIME_ASSERT(
5678 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5677 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5679 attributes = static_cast<PropertyAttributes>(unchecked_value); 5678 attributes = static_cast<PropertyAttributes>(unchecked_value);
5680 } 5679 }
5681 Handle<Object> result; 5680 Handle<Object> result;
5682 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5681 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5683 isolate, result, 5682 isolate, result,
5684 JSObject::SetLocalPropertyIgnoreAttributes( 5683 JSObject::SetOwnPropertyIgnoreAttributes(
5685 object, name, value, attributes)); 5684 object, name, value, attributes));
5686 return *result; 5685 return *result;
5687 } 5686 }
5688 5687
5689 5688
5690 RUNTIME_FUNCTION(Runtime_DeleteProperty) { 5689 RUNTIME_FUNCTION(Runtime_DeleteProperty) {
5691 HandleScope scope(isolate); 5690 HandleScope scope(isolate);
5692 ASSERT(args.length() == 3); 5691 ASSERT(args.length() == 3);
5693 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5692 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5694 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5693 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5695 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); 5694 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2);
5696 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT 5695 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT
5697 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; 5696 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION;
5698 Handle<Object> result; 5697 Handle<Object> result;
5699 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5698 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5700 isolate, result, 5699 isolate, result,
5701 JSReceiver::DeleteProperty(object, key, delete_mode)); 5700 JSReceiver::DeleteProperty(object, key, delete_mode));
5702 return *result; 5701 return *result;
5703 } 5702 }
5704 5703
5705 5704
5706 static Object* HasLocalPropertyImplementation(Isolate* isolate, 5705 static Object* HasOwnPropertyImplementation(Isolate* isolate,
5707 Handle<JSObject> object, 5706 Handle<JSObject> object,
5708 Handle<Name> key) { 5707 Handle<Name> key) {
5709 if (JSReceiver::HasLocalProperty(object, key)) { 5708 if (JSReceiver::HasOwnProperty(object, key)) {
5710 return isolate->heap()->true_value(); 5709 return isolate->heap()->true_value();
5711 } 5710 }
5712 // Handle hidden prototypes. If there's a hidden prototype above this thing 5711 // Handle hidden prototypes. If there's a hidden prototype above this thing
5713 // then we have to check it for properties, because they are supposed to 5712 // then we have to check it for properties, because they are supposed to
5714 // look like they are on this object. 5713 // look like they are on this object.
5715 Handle<Object> proto(object->GetPrototype(), isolate); 5714 Handle<Object> proto(object->GetPrototype(), isolate);
5716 if (proto->IsJSObject() && 5715 if (proto->IsJSObject() &&
5717 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { 5716 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) {
5718 return HasLocalPropertyImplementation(isolate, 5717 return HasOwnPropertyImplementation(isolate,
5719 Handle<JSObject>::cast(proto), 5718 Handle<JSObject>::cast(proto),
5720 key); 5719 key);
5721 } 5720 }
5722 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5721 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5723 return isolate->heap()->false_value(); 5722 return isolate->heap()->false_value();
5724 } 5723 }
5725 5724
5726 5725
5727 RUNTIME_FUNCTION(Runtime_HasLocalProperty) { 5726 RUNTIME_FUNCTION(Runtime_HasOwnProperty) {
5728 HandleScope scope(isolate); 5727 HandleScope scope(isolate);
5729 ASSERT(args.length() == 2); 5728 ASSERT(args.length() == 2);
5730 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0) 5729 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0)
5731 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5730 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5732 5731
5733 uint32_t index; 5732 uint32_t index;
5734 const bool key_is_array_index = key->AsArrayIndex(&index); 5733 const bool key_is_array_index = key->AsArrayIndex(&index);
5735 5734
5736 // Only JS objects can have properties. 5735 // Only JS objects can have properties.
5737 if (object->IsJSObject()) { 5736 if (object->IsJSObject()) {
5738 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); 5737 Handle<JSObject> js_obj = Handle<JSObject>::cast(object);
5739 // Fast case: either the key is a real named property or it is not 5738 // Fast case: either the key is a real named property or it is not
5740 // an array index and there are no interceptors or hidden 5739 // an array index and there are no interceptors or hidden
5741 // prototypes. 5740 // prototypes.
5742 if (JSObject::HasRealNamedProperty(js_obj, key)) { 5741 if (JSObject::HasRealNamedProperty(js_obj, key)) {
5743 ASSERT(!isolate->has_scheduled_exception()); 5742 ASSERT(!isolate->has_scheduled_exception());
5744 return isolate->heap()->true_value(); 5743 return isolate->heap()->true_value();
5745 } else { 5744 } else {
5746 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5745 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5747 } 5746 }
5748 Map* map = js_obj->map(); 5747 Map* map = js_obj->map();
5749 if (!key_is_array_index && 5748 if (!key_is_array_index &&
5750 !map->has_named_interceptor() && 5749 !map->has_named_interceptor() &&
5751 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { 5750 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) {
5752 return isolate->heap()->false_value(); 5751 return isolate->heap()->false_value();
5753 } 5752 }
5754 // Slow case. 5753 // Slow case.
5755 return HasLocalPropertyImplementation(isolate, 5754 return HasOwnPropertyImplementation(isolate,
5756 Handle<JSObject>(js_obj), 5755 Handle<JSObject>(js_obj),
5757 Handle<Name>(key)); 5756 Handle<Name>(key));
5758 } else if (object->IsString() && key_is_array_index) { 5757 } else if (object->IsString() && key_is_array_index) {
5759 // Well, there is one exception: Handle [] on strings. 5758 // Well, there is one exception: Handle [] on strings.
5760 Handle<String> string = Handle<String>::cast(object); 5759 Handle<String> string = Handle<String>::cast(object);
5761 if (index < static_cast<uint32_t>(string->length())) { 5760 if (index < static_cast<uint32_t>(string->length())) {
5762 return isolate->heap()->true_value(); 5761 return isolate->heap()->true_value();
5763 } 5762 }
5764 } 5763 }
5765 return isolate->heap()->false_value(); 5764 return isolate->heap()->false_value();
5766 } 5765 }
5767 5766
(...skipping 23 matching lines...) Expand all
5791 } 5790 }
5792 5791
5793 5792
5794 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { 5793 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) {
5795 HandleScope scope(isolate); 5794 HandleScope scope(isolate);
5796 ASSERT(args.length() == 2); 5795 ASSERT(args.length() == 2);
5797 5796
5798 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5797 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5799 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5798 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5800 5799
5801 PropertyAttributes att = JSReceiver::GetLocalPropertyAttribute(object, key); 5800 PropertyAttributes att = JSReceiver::GetOwnPropertyAttribute(object, key);
5802 if (att == ABSENT || (att & DONT_ENUM) != 0) { 5801 if (att == ABSENT || (att & DONT_ENUM) != 0) {
5803 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5802 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5804 return isolate->heap()->false_value(); 5803 return isolate->heap()->false_value();
5805 } 5804 }
5806 ASSERT(!isolate->has_scheduled_exception()); 5805 ASSERT(!isolate->has_scheduled_exception());
5807 return isolate->heap()->true_value(); 5806 return isolate->heap()->true_value();
5808 } 5807 }
5809 5808
5810 5809
5811 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { 5810 RUNTIME_FUNCTION(Runtime_GetPropertyNames) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5843 isolate, content, 5842 isolate, content,
5844 JSReceiver::GetKeys(object, JSReceiver::INCLUDE_PROTOS)); 5843 JSReceiver::GetKeys(object, JSReceiver::INCLUDE_PROTOS));
5845 5844
5846 // Test again, since cache may have been built by preceding call. 5845 // Test again, since cache may have been built by preceding call.
5847 if (object->IsSimpleEnum()) return object->map(); 5846 if (object->IsSimpleEnum()) return object->map();
5848 5847
5849 return *content; 5848 return *content;
5850 } 5849 }
5851 5850
5852 5851
5853 // Find the length of the prototype chain that is to to handled as one. If a 5852 // Find the length of the prototype chain that is to be handled as one. If a
5854 // prototype object is hidden it is to be viewed as part of the the object it 5853 // prototype object is hidden it is to be viewed as part of the the object it
5855 // is prototype for. 5854 // is prototype for.
5856 static int LocalPrototypeChainLength(JSObject* obj) { 5855 static int OwnPrototypeChainLength(JSObject* obj) {
5857 int count = 1; 5856 int count = 1;
5858 Object* proto = obj->GetPrototype(); 5857 Object* proto = obj->GetPrototype();
5859 while (proto->IsJSObject() && 5858 while (proto->IsJSObject() &&
5860 JSObject::cast(proto)->map()->is_hidden_prototype()) { 5859 JSObject::cast(proto)->map()->is_hidden_prototype()) {
5861 count++; 5860 count++;
5862 proto = JSObject::cast(proto)->GetPrototype(); 5861 proto = JSObject::cast(proto)->GetPrototype();
5863 } 5862 }
5864 return count; 5863 return count;
5865 } 5864 }
5866 5865
5867 5866
5868 // Return the names of the local named properties. 5867 // Return the names of the own named properties.
5869 // args[0]: object 5868 // args[0]: object
5870 // args[1]: PropertyAttributes as int 5869 // args[1]: PropertyAttributes as int
5871 RUNTIME_FUNCTION(Runtime_GetLocalPropertyNames) { 5870 RUNTIME_FUNCTION(Runtime_GetOwnPropertyNames) {
5872 HandleScope scope(isolate); 5871 HandleScope scope(isolate);
5873 ASSERT(args.length() == 2); 5872 ASSERT(args.length() == 2);
5874 if (!args[0]->IsJSObject()) { 5873 if (!args[0]->IsJSObject()) {
5875 return isolate->heap()->undefined_value(); 5874 return isolate->heap()->undefined_value();
5876 } 5875 }
5877 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5876 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5878 CONVERT_SMI_ARG_CHECKED(filter_value, 1); 5877 CONVERT_SMI_ARG_CHECKED(filter_value, 1);
5879 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value); 5878 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value);
5880 5879
5881 // Skip the global proxy as it has no properties and always delegates to the 5880 // Skip the global proxy as it has no properties and always delegates to the
5882 // real global object. 5881 // real global object.
5883 if (obj->IsJSGlobalProxy()) { 5882 if (obj->IsJSGlobalProxy()) {
5884 // Only collect names if access is permitted. 5883 // Only collect names if access is permitted.
5885 if (obj->IsAccessCheckNeeded() && 5884 if (obj->IsAccessCheckNeeded() &&
5886 !isolate->MayNamedAccess( 5885 !isolate->MayNamedAccess(
5887 obj, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { 5886 obj, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
5888 isolate->ReportFailedAccessCheck(obj, v8::ACCESS_KEYS); 5887 isolate->ReportFailedAccessCheck(obj, v8::ACCESS_KEYS);
5889 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5888 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5890 return *isolate->factory()->NewJSArray(0); 5889 return *isolate->factory()->NewJSArray(0);
5891 } 5890 }
5892 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype())); 5891 obj = Handle<JSObject>(JSObject::cast(obj->GetPrototype()));
5893 } 5892 }
5894 5893
5895 // Find the number of objects making up this. 5894 // Find the number of objects making up this.
5896 int length = LocalPrototypeChainLength(*obj); 5895 int length = OwnPrototypeChainLength(*obj);
5897 5896
5898 // Find the number of local properties for each of the objects. 5897 // Find the number of own properties for each of the objects.
5899 ScopedVector<int> local_property_count(length); 5898 ScopedVector<int> own_property_count(length);
5900 int total_property_count = 0; 5899 int total_property_count = 0;
5901 Handle<JSObject> jsproto = obj; 5900 Handle<JSObject> jsproto = obj;
5902 for (int i = 0; i < length; i++) { 5901 for (int i = 0; i < length; i++) {
5903 // Only collect names if access is permitted. 5902 // Only collect names if access is permitted.
5904 if (jsproto->IsAccessCheckNeeded() && 5903 if (jsproto->IsAccessCheckNeeded() &&
5905 !isolate->MayNamedAccess( 5904 !isolate->MayNamedAccess(
5906 jsproto, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { 5905 jsproto, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
5907 isolate->ReportFailedAccessCheck(jsproto, v8::ACCESS_KEYS); 5906 isolate->ReportFailedAccessCheck(jsproto, v8::ACCESS_KEYS);
5908 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5907 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5909 return *isolate->factory()->NewJSArray(0); 5908 return *isolate->factory()->NewJSArray(0);
5910 } 5909 }
5911 int n; 5910 int n;
5912 n = jsproto->NumberOfLocalProperties(filter); 5911 n = jsproto->NumberOfOwnProperties(filter);
5913 local_property_count[i] = n; 5912 own_property_count[i] = n;
5914 total_property_count += n; 5913 total_property_count += n;
5915 if (i < length - 1) { 5914 if (i < length - 1) {
5916 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); 5915 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype()));
5917 } 5916 }
5918 } 5917 }
5919 5918
5920 // Allocate an array with storage for all the property names. 5919 // Allocate an array with storage for all the property names.
5921 Handle<FixedArray> names = 5920 Handle<FixedArray> names =
5922 isolate->factory()->NewFixedArray(total_property_count); 5921 isolate->factory()->NewFixedArray(total_property_count);
5923 5922
5924 // Get the property names. 5923 // Get the property names.
5925 jsproto = obj; 5924 jsproto = obj;
5926 int next_copy_index = 0; 5925 int next_copy_index = 0;
5927 int hidden_strings = 0; 5926 int hidden_strings = 0;
5928 for (int i = 0; i < length; i++) { 5927 for (int i = 0; i < length; i++) {
5929 jsproto->GetLocalPropertyNames(*names, next_copy_index, filter); 5928 jsproto->GetOwnPropertyNames(*names, next_copy_index, filter);
5930 if (i > 0) { 5929 if (i > 0) {
5931 // Names from hidden prototypes may already have been added 5930 // Names from hidden prototypes may already have been added
5932 // for inherited function template instances. Count the duplicates 5931 // for inherited function template instances. Count the duplicates
5933 // and stub them out; the final copy pass at the end ignores holes. 5932 // and stub them out; the final copy pass at the end ignores holes.
5934 for (int j = next_copy_index; 5933 for (int j = next_copy_index;
5935 j < next_copy_index + local_property_count[i]; 5934 j < next_copy_index + own_property_count[i];
5936 j++) { 5935 j++) {
5937 Object* name_from_hidden_proto = names->get(j); 5936 Object* name_from_hidden_proto = names->get(j);
5938 for (int k = 0; k < next_copy_index; k++) { 5937 for (int k = 0; k < next_copy_index; k++) {
5939 if (names->get(k) != isolate->heap()->hidden_string()) { 5938 if (names->get(k) != isolate->heap()->hidden_string()) {
5940 Object* name = names->get(k); 5939 Object* name = names->get(k);
5941 if (name_from_hidden_proto == name) { 5940 if (name_from_hidden_proto == name) {
5942 names->set(j, isolate->heap()->hidden_string()); 5941 names->set(j, isolate->heap()->hidden_string());
5943 hidden_strings++; 5942 hidden_strings++;
5944 break; 5943 break;
5945 } 5944 }
5946 } 5945 }
5947 } 5946 }
5948 } 5947 }
5949 } 5948 }
5950 next_copy_index += local_property_count[i]; 5949 next_copy_index += own_property_count[i];
5951 5950
5952 // Hidden properties only show up if the filter does not skip strings. 5951 // Hidden properties only show up if the filter does not skip strings.
5953 if ((filter & STRING) == 0 && JSObject::HasHiddenProperties(jsproto)) { 5952 if ((filter & STRING) == 0 && JSObject::HasHiddenProperties(jsproto)) {
5954 hidden_strings++; 5953 hidden_strings++;
5955 } 5954 }
5956 if (i < length - 1) { 5955 if (i < length - 1) {
5957 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); 5956 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype()));
5958 } 5957 }
5959 } 5958 }
5960 5959
(...skipping 12 matching lines...) Expand all
5973 } 5972 }
5974 names->set(dest_pos++, name); 5973 names->set(dest_pos++, name);
5975 } 5974 }
5976 ASSERT_EQ(0, hidden_strings); 5975 ASSERT_EQ(0, hidden_strings);
5977 } 5976 }
5978 5977
5979 return *isolate->factory()->NewJSArrayWithElements(names); 5978 return *isolate->factory()->NewJSArrayWithElements(names);
5980 } 5979 }
5981 5980
5982 5981
5983 // Return the names of the local indexed properties. 5982 // Return the names of the own indexed properties.
5984 // args[0]: object 5983 // args[0]: object
5985 RUNTIME_FUNCTION(Runtime_GetLocalElementNames) { 5984 RUNTIME_FUNCTION(Runtime_GetOwnElementNames) {
5986 HandleScope scope(isolate); 5985 HandleScope scope(isolate);
5987 ASSERT(args.length() == 1); 5986 ASSERT(args.length() == 1);
5988 if (!args[0]->IsJSObject()) { 5987 if (!args[0]->IsJSObject()) {
5989 return isolate->heap()->undefined_value(); 5988 return isolate->heap()->undefined_value();
5990 } 5989 }
5991 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5990 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5992 5991
5993 int n = obj->NumberOfLocalElements(static_cast<PropertyAttributes>(NONE)); 5992 int n = obj->NumberOfOwnElements(static_cast<PropertyAttributes>(NONE));
5994 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); 5993 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n);
5995 obj->GetLocalElementKeys(*names, static_cast<PropertyAttributes>(NONE)); 5994 obj->GetOwnElementKeys(*names, static_cast<PropertyAttributes>(NONE));
5996 return *isolate->factory()->NewJSArrayWithElements(names); 5995 return *isolate->factory()->NewJSArrayWithElements(names);
5997 } 5996 }
5998 5997
5999 5998
6000 // Return information on whether an object has a named or indexed interceptor. 5999 // Return information on whether an object has a named or indexed interceptor.
6001 // args[0]: object 6000 // args[0]: object
6002 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) { 6001 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) {
6003 HandleScope scope(isolate); 6002 HandleScope scope(isolate);
6004 ASSERT(args.length() == 1); 6003 ASSERT(args.length() == 1);
6005 if (!args[0]->IsJSObject()) { 6004 if (!args[0]->IsJSObject()) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
6042 if (obj->HasIndexedInterceptor()) { 6041 if (obj->HasIndexedInterceptor()) {
6043 Handle<JSObject> result; 6042 Handle<JSObject> result;
6044 if (JSObject::GetKeysForIndexedInterceptor(obj, obj).ToHandle(&result)) { 6043 if (JSObject::GetKeysForIndexedInterceptor(obj, obj).ToHandle(&result)) {
6045 return *result; 6044 return *result;
6046 } 6045 }
6047 } 6046 }
6048 return isolate->heap()->undefined_value(); 6047 return isolate->heap()->undefined_value();
6049 } 6048 }
6050 6049
6051 6050
6052 RUNTIME_FUNCTION(Runtime_LocalKeys) { 6051 RUNTIME_FUNCTION(Runtime_OwnKeys) {
6053 HandleScope scope(isolate); 6052 HandleScope scope(isolate);
6054 ASSERT(args.length() == 1); 6053 ASSERT(args.length() == 1);
6055 CONVERT_ARG_CHECKED(JSObject, raw_object, 0); 6054 CONVERT_ARG_CHECKED(JSObject, raw_object, 0);
6056 Handle<JSObject> object(raw_object); 6055 Handle<JSObject> object(raw_object);
6057 6056
6058 if (object->IsJSGlobalProxy()) { 6057 if (object->IsJSGlobalProxy()) {
6059 // Do access checks before going to the global object. 6058 // Do access checks before going to the global object.
6060 if (object->IsAccessCheckNeeded() && 6059 if (object->IsAccessCheckNeeded() &&
6061 !isolate->MayNamedAccess( 6060 !isolate->MayNamedAccess(
6062 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { 6061 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
6063 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); 6062 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS);
6064 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 6063 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
6065 return *isolate->factory()->NewJSArray(0); 6064 return *isolate->factory()->NewJSArray(0);
6066 } 6065 }
6067 6066
6068 Handle<Object> proto(object->GetPrototype(), isolate); 6067 Handle<Object> proto(object->GetPrototype(), isolate);
6069 // If proxy is detached we simply return an empty array. 6068 // If proxy is detached we simply return an empty array.
6070 if (proto->IsNull()) return *isolate->factory()->NewJSArray(0); 6069 if (proto->IsNull()) return *isolate->factory()->NewJSArray(0);
6071 object = Handle<JSObject>::cast(proto); 6070 object = Handle<JSObject>::cast(proto);
6072 } 6071 }
6073 6072
6074 Handle<FixedArray> contents; 6073 Handle<FixedArray> contents;
6075 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6074 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6076 isolate, contents, 6075 isolate, contents,
6077 JSReceiver::GetKeys(object, JSReceiver::LOCAL_ONLY)); 6076 JSReceiver::GetKeys(object, JSReceiver::OWN_ONLY));
6078 6077
6079 // Some fast paths through GetKeysInFixedArrayFor reuse a cached 6078 // Some fast paths through GetKeysInFixedArrayFor reuse a cached
6080 // property array and since the result is mutable we have to create 6079 // property array and since the result is mutable we have to create
6081 // a fresh clone on each invocation. 6080 // a fresh clone on each invocation.
6082 int length = contents->length(); 6081 int length = contents->length();
6083 Handle<FixedArray> copy = isolate->factory()->NewFixedArray(length); 6082 Handle<FixedArray> copy = isolate->factory()->NewFixedArray(length);
6084 for (int i = 0; i < length; i++) { 6083 for (int i = 0; i < length; i++) {
6085 Object* entry = contents->get(i); 6084 Object* entry = contents->get(i);
6086 if (entry->IsString()) { 6085 if (entry->IsString()) {
6087 copy->set(i, entry); 6086 copy->set(i, entry);
(...skipping 3395 matching lines...) Expand 10 before | Expand all | Expand 10 after
9483 "not_defined", HandleVector(&name, 1)); 9482 "not_defined", HandleVector(&name, 1));
9484 return isolate->Throw(*error); 9483 return isolate->Throw(*error);
9485 } 9484 }
9486 // In sloppy mode, the property is added to the global object. 9485 // In sloppy mode, the property is added to the global object.
9487 attributes = NONE; 9486 attributes = NONE;
9488 object = Handle<JSReceiver>(isolate->context()->global_object()); 9487 object = Handle<JSReceiver>(isolate->context()->global_object());
9489 } 9488 }
9490 9489
9491 // Set the property if it's not read only or doesn't yet exist. 9490 // Set the property if it's not read only or doesn't yet exist.
9492 if ((attributes & READ_ONLY) == 0 || 9491 if ((attributes & READ_ONLY) == 0 ||
9493 (JSReceiver::GetLocalPropertyAttribute(object, name) == ABSENT)) { 9492 (JSReceiver::GetOwnPropertyAttribute(object, name) == ABSENT)) {
9494 RETURN_FAILURE_ON_EXCEPTION( 9493 RETURN_FAILURE_ON_EXCEPTION(
9495 isolate, 9494 isolate,
9496 JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); 9495 JSReceiver::SetProperty(object, name, value, NONE, strict_mode));
9497 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) { 9496 } else if (strict_mode == STRICT && (attributes & READ_ONLY) != 0) {
9498 // Setting read only property in strict mode. 9497 // Setting read only property in strict mode.
9499 Handle<Object> error = 9498 Handle<Object> error =
9500 isolate->factory()->NewTypeError( 9499 isolate->factory()->NewTypeError(
9501 "strict_cannot_assign", HandleVector(&name, 1)); 9500 "strict_cannot_assign", HandleVector(&name, 1));
9502 return isolate->Throw(*error); 9501 return isolate->Throw(*error);
9503 } 9502 }
(...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after
10723 for (Handle<Object> p = array; 10722 for (Handle<Object> p = array;
10724 !p->IsNull(); 10723 !p->IsNull();
10725 p = Handle<Object>(p->GetPrototype(isolate), isolate)) { 10724 p = Handle<Object>(p->GetPrototype(isolate), isolate)) {
10726 if (p->IsJSProxy() || JSObject::cast(*p)->HasIndexedInterceptor()) { 10725 if (p->IsJSProxy() || JSObject::cast(*p)->HasIndexedInterceptor()) {
10727 // Bail out if we find a proxy or interceptor, likely not worth 10726 // Bail out if we find a proxy or interceptor, likely not worth
10728 // collecting keys in that case. 10727 // collecting keys in that case.
10729 return *isolate->factory()->NewNumberFromUint(length); 10728 return *isolate->factory()->NewNumberFromUint(length);
10730 } 10729 }
10731 Handle<JSObject> current = Handle<JSObject>::cast(p); 10730 Handle<JSObject> current = Handle<JSObject>::cast(p);
10732 Handle<FixedArray> current_keys = 10731 Handle<FixedArray> current_keys =
10733 isolate->factory()->NewFixedArray( 10732 isolate->factory()->NewFixedArray(current->NumberOfOwnElements(NONE));
10734 current->NumberOfLocalElements(NONE)); 10733 current->GetOwnElementKeys(*current_keys, NONE);
10735 current->GetLocalElementKeys(*current_keys, NONE);
10736 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 10734 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
10737 isolate, keys, FixedArray::UnionOfKeys(keys, current_keys)); 10735 isolate, keys, FixedArray::UnionOfKeys(keys, current_keys));
10738 } 10736 }
10739 // Erase any keys >= length. 10737 // Erase any keys >= length.
10740 // TODO(adamk): Remove this step when the contract of %GetArrayKeys 10738 // TODO(adamk): Remove this step when the contract of %GetArrayKeys
10741 // is changed to let this happen on the JS side. 10739 // is changed to let this happen on the JS side.
10742 for (int i = 0; i < keys->length(); i++) { 10740 for (int i = 0; i < keys->length(); i++) {
10743 if (NumberToUint32(keys->get(i)) >= length) keys->set_undefined(i); 10741 if (NumberToUint32(keys->get(i)) >= length) keys->set_undefined(i);
10744 } 10742 }
10745 return *isolate->factory()->NewJSArrayWithElements(keys); 10743 return *isolate->factory()->NewJSArrayWithElements(keys);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
10908 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 10906 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
10909 isolate, element_or_char, 10907 isolate, element_or_char,
10910 Runtime::GetElementOrCharAt(isolate, obj, index)); 10908 Runtime::GetElementOrCharAt(isolate, obj, index));
10911 details->set(0, *element_or_char); 10909 details->set(0, *element_or_char);
10912 details->set( 10910 details->set(
10913 1, PropertyDetails(NONE, NORMAL, Representation::None()).AsSmi()); 10911 1, PropertyDetails(NONE, NORMAL, Representation::None()).AsSmi());
10914 return *isolate->factory()->NewJSArrayWithElements(details); 10912 return *isolate->factory()->NewJSArrayWithElements(details);
10915 } 10913 }
10916 10914
10917 // Find the number of objects making up this. 10915 // Find the number of objects making up this.
10918 int length = LocalPrototypeChainLength(*obj); 10916 int length = OwnPrototypeChainLength(*obj);
10919 10917
10920 // Try local lookup on each of the objects. 10918 // Try own lookup on each of the objects.
10921 Handle<JSObject> jsproto = obj; 10919 Handle<JSObject> jsproto = obj;
10922 for (int i = 0; i < length; i++) { 10920 for (int i = 0; i < length; i++) {
10923 LookupResult result(isolate); 10921 LookupResult result(isolate);
10924 jsproto->LocalLookup(name, &result); 10922 jsproto->LookupOwn(name, &result);
10925 if (result.IsFound()) { 10923 if (result.IsFound()) {
10926 // LookupResult is not GC safe as it holds raw object pointers. 10924 // LookupResult is not GC safe as it holds raw object pointers.
10927 // GC can happen later in this code so put the required fields into 10925 // GC can happen later in this code so put the required fields into
10928 // local variables using handles when required for later use. 10926 // local variables using handles when required for later use.
10929 Handle<Object> result_callback_obj; 10927 Handle<Object> result_callback_obj;
10930 if (result.IsPropertyCallbacks()) { 10928 if (result.IsPropertyCallbacks()) {
10931 result_callback_obj = Handle<Object>(result.GetCallbackObject(), 10929 result_callback_obj = Handle<Object>(result.GetCallbackObject(),
10932 isolate); 10930 isolate);
10933 } 10931 }
10934 10932
(...skipping 1914 matching lines...) Expand 10 before | Expand all | Expand 10 after
12849 12847
12850 // Helper function to find or create the arguments object for 12848 // Helper function to find or create the arguments object for
12851 // Runtime_DebugEvaluate. 12849 // Runtime_DebugEvaluate.
12852 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeArgumentsObject( 12850 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeArgumentsObject(
12853 Isolate* isolate, 12851 Isolate* isolate,
12854 Handle<JSObject> target, 12852 Handle<JSObject> target,
12855 Handle<JSFunction> function) { 12853 Handle<JSFunction> function) {
12856 // Do not materialize the arguments object for eval or top-level code. 12854 // Do not materialize the arguments object for eval or top-level code.
12857 // Skip if "arguments" is already taken. 12855 // Skip if "arguments" is already taken.
12858 if (!function->shared()->is_function() || 12856 if (!function->shared()->is_function() ||
12859 JSReceiver::HasLocalProperty(target, 12857 JSReceiver::HasOwnProperty(
12860 isolate->factory()->arguments_string())) { 12858 target, isolate->factory()->arguments_string())) {
12861 return target; 12859 return target;
12862 } 12860 }
12863 12861
12864 // FunctionGetArguments can't throw an exception. 12862 // FunctionGetArguments can't throw an exception.
12865 Handle<JSObject> arguments = Handle<JSObject>::cast( 12863 Handle<JSObject> arguments = Handle<JSObject>::cast(
12866 Accessors::FunctionGetArguments(function)); 12864 Accessors::FunctionGetArguments(function));
12867 Handle<String> arguments_str = isolate->factory()->arguments_string(); 12865 Handle<String> arguments_str = isolate->factory()->arguments_string();
12868 RETURN_ON_EXCEPTION( 12866 RETURN_ON_EXCEPTION(
12869 isolate, 12867 isolate,
12870 Runtime::SetObjectProperty( 12868 Runtime::SetObjectProperty(
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after
13785 13783
13786 error = U_ZERO_ERROR; 13784 error = U_ZERO_ERROR;
13787 // No need to force strict BCP47 rules. 13785 // No need to force strict BCP47 rules.
13788 uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error); 13786 uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
13789 if (U_FAILURE(error)) { 13787 if (U_FAILURE(error)) {
13790 // This shouldn't happen, but lets not break the user. 13788 // This shouldn't happen, but lets not break the user.
13791 continue; 13789 continue;
13792 } 13790 }
13793 13791
13794 RETURN_FAILURE_ON_EXCEPTION(isolate, 13792 RETURN_FAILURE_ON_EXCEPTION(isolate,
13795 JSObject::SetLocalPropertyIgnoreAttributes( 13793 JSObject::SetOwnPropertyIgnoreAttributes(
13796 locales, 13794 locales,
13797 factory->NewStringFromAsciiChecked(result), 13795 factory->NewStringFromAsciiChecked(result),
13798 factory->NewNumber(i), 13796 factory->NewNumber(i),
13799 NONE)); 13797 NONE));
13800 } 13798 }
13801 13799
13802 return *locales; 13800 return *locales;
13803 } 13801 }
13804 13802
13805 13803
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
13890 char base_locale[ULOC_FULLNAME_CAPACITY]; 13888 char base_locale[ULOC_FULLNAME_CAPACITY];
13891 uloc_toLanguageTag( 13889 uloc_toLanguageTag(
13892 icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error); 13890 icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error);
13893 13891
13894 if (U_FAILURE(error)) { 13892 if (U_FAILURE(error)) {
13895 return isolate->Throw(*factory->illegal_argument_string()); 13893 return isolate->Throw(*factory->illegal_argument_string());
13896 } 13894 }
13897 13895
13898 Handle<JSObject> result = factory->NewJSObject(isolate->object_function()); 13896 Handle<JSObject> result = factory->NewJSObject(isolate->object_function());
13899 RETURN_FAILURE_ON_EXCEPTION(isolate, 13897 RETURN_FAILURE_ON_EXCEPTION(isolate,
13900 JSObject::SetLocalPropertyIgnoreAttributes( 13898 JSObject::SetOwnPropertyIgnoreAttributes(
13901 result, 13899 result,
13902 maximized, 13900 maximized,
13903 factory->NewStringFromAsciiChecked(base_max_locale), 13901 factory->NewStringFromAsciiChecked(base_max_locale),
13904 NONE)); 13902 NONE));
13905 RETURN_FAILURE_ON_EXCEPTION(isolate, 13903 RETURN_FAILURE_ON_EXCEPTION(isolate,
13906 JSObject::SetLocalPropertyIgnoreAttributes( 13904 JSObject::SetOwnPropertyIgnoreAttributes(
13907 result, 13905 result,
13908 base, 13906 base,
13909 factory->NewStringFromAsciiChecked(base_locale), 13907 factory->NewStringFromAsciiChecked(base_locale),
13910 NONE)); 13908 NONE));
13911 output->set(i, *result); 13909 output->set(i, *result);
13912 } 13910 }
13913 13911
13914 Handle<JSArray> result = factory->NewJSArrayWithElements(output); 13912 Handle<JSArray> result = factory->NewJSArrayWithElements(output);
13915 result->set_length(Smi::FromInt(length)); 13913 result->set_length(Smi::FromInt(length));
13916 return *result; 13914 return *result;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
14018 14016
14019 // Set date time formatter as internal field of the resulting JS object. 14017 // Set date time formatter as internal field of the resulting JS object.
14020 icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat( 14018 icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat(
14021 isolate, locale, options, resolved); 14019 isolate, locale, options, resolved);
14022 14020
14023 if (!date_format) return isolate->ThrowIllegalOperation(); 14021 if (!date_format) return isolate->ThrowIllegalOperation();
14024 14022
14025 local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format)); 14023 local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format));
14026 14024
14027 RETURN_FAILURE_ON_EXCEPTION(isolate, 14025 RETURN_FAILURE_ON_EXCEPTION(isolate,
14028 JSObject::SetLocalPropertyIgnoreAttributes( 14026 JSObject::SetOwnPropertyIgnoreAttributes(
14029 local_object, 14027 local_object,
14030 isolate->factory()->NewStringFromStaticAscii("dateFormat"), 14028 isolate->factory()->NewStringFromStaticAscii("dateFormat"),
14031 isolate->factory()->NewStringFromStaticAscii("valid"), 14029 isolate->factory()->NewStringFromStaticAscii("valid"),
14032 NONE)); 14030 NONE));
14033 14031
14034 // Make object handle weak so we can delete the data format once GC kicks in. 14032 // Make object handle weak so we can delete the data format once GC kicks in.
14035 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); 14033 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object);
14036 GlobalHandles::MakeWeak(wrapper.location(), 14034 GlobalHandles::MakeWeak(wrapper.location(),
14037 reinterpret_cast<void*>(wrapper.location()), 14035 reinterpret_cast<void*>(wrapper.location()),
14038 DateFormat::DeleteDateFormat); 14036 DateFormat::DeleteDateFormat);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
14117 14115
14118 // Set number formatter as internal field of the resulting JS object. 14116 // Set number formatter as internal field of the resulting JS object.
14119 icu::DecimalFormat* number_format = NumberFormat::InitializeNumberFormat( 14117 icu::DecimalFormat* number_format = NumberFormat::InitializeNumberFormat(
14120 isolate, locale, options, resolved); 14118 isolate, locale, options, resolved);
14121 14119
14122 if (!number_format) return isolate->ThrowIllegalOperation(); 14120 if (!number_format) return isolate->ThrowIllegalOperation();
14123 14121
14124 local_object->SetInternalField(0, reinterpret_cast<Smi*>(number_format)); 14122 local_object->SetInternalField(0, reinterpret_cast<Smi*>(number_format));
14125 14123
14126 RETURN_FAILURE_ON_EXCEPTION(isolate, 14124 RETURN_FAILURE_ON_EXCEPTION(isolate,
14127 JSObject::SetLocalPropertyIgnoreAttributes( 14125 JSObject::SetOwnPropertyIgnoreAttributes(
14128 local_object, 14126 local_object,
14129 isolate->factory()->NewStringFromStaticAscii("numberFormat"), 14127 isolate->factory()->NewStringFromStaticAscii("numberFormat"),
14130 isolate->factory()->NewStringFromStaticAscii("valid"), 14128 isolate->factory()->NewStringFromStaticAscii("valid"),
14131 NONE)); 14129 NONE));
14132 14130
14133 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); 14131 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object);
14134 GlobalHandles::MakeWeak(wrapper.location(), 14132 GlobalHandles::MakeWeak(wrapper.location(),
14135 reinterpret_cast<void*>(wrapper.location()), 14133 reinterpret_cast<void*>(wrapper.location()),
14136 NumberFormat::DeleteNumberFormat); 14134 NumberFormat::DeleteNumberFormat);
14137 return *local_object; 14135 return *local_object;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
14225 14223
14226 // Set collator as internal field of the resulting JS object. 14224 // Set collator as internal field of the resulting JS object.
14227 icu::Collator* collator = Collator::InitializeCollator( 14225 icu::Collator* collator = Collator::InitializeCollator(
14228 isolate, locale, options, resolved); 14226 isolate, locale, options, resolved);
14229 14227
14230 if (!collator) return isolate->ThrowIllegalOperation(); 14228 if (!collator) return isolate->ThrowIllegalOperation();
14231 14229
14232 local_object->SetInternalField(0, reinterpret_cast<Smi*>(collator)); 14230 local_object->SetInternalField(0, reinterpret_cast<Smi*>(collator));
14233 14231
14234 RETURN_FAILURE_ON_EXCEPTION(isolate, 14232 RETURN_FAILURE_ON_EXCEPTION(isolate,
14235 JSObject::SetLocalPropertyIgnoreAttributes( 14233 JSObject::SetOwnPropertyIgnoreAttributes(
14236 local_object, 14234 local_object,
14237 isolate->factory()->NewStringFromStaticAscii("collator"), 14235 isolate->factory()->NewStringFromStaticAscii("collator"),
14238 isolate->factory()->NewStringFromStaticAscii("valid"), 14236 isolate->factory()->NewStringFromStaticAscii("valid"),
14239 NONE)); 14237 NONE));
14240 14238
14241 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); 14239 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object);
14242 GlobalHandles::MakeWeak(wrapper.location(), 14240 GlobalHandles::MakeWeak(wrapper.location(),
14243 reinterpret_cast<void*>(wrapper.location()), 14241 reinterpret_cast<void*>(wrapper.location()),
14244 Collator::DeleteCollator); 14242 Collator::DeleteCollator);
14245 return *local_object; 14243 return *local_object;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
14331 icu::BreakIterator* break_iterator = BreakIterator::InitializeBreakIterator( 14329 icu::BreakIterator* break_iterator = BreakIterator::InitializeBreakIterator(
14332 isolate, locale, options, resolved); 14330 isolate, locale, options, resolved);
14333 14331
14334 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14332 if (!break_iterator) return isolate->ThrowIllegalOperation();
14335 14333
14336 local_object->SetInternalField(0, reinterpret_cast<Smi*>(break_iterator)); 14334 local_object->SetInternalField(0, reinterpret_cast<Smi*>(break_iterator));
14337 // Make sure that the pointer to adopted text is NULL. 14335 // Make sure that the pointer to adopted text is NULL.
14338 local_object->SetInternalField(1, reinterpret_cast<Smi*>(NULL)); 14336 local_object->SetInternalField(1, reinterpret_cast<Smi*>(NULL));
14339 14337
14340 RETURN_FAILURE_ON_EXCEPTION(isolate, 14338 RETURN_FAILURE_ON_EXCEPTION(isolate,
14341 JSObject::SetLocalPropertyIgnoreAttributes( 14339 JSObject::SetOwnPropertyIgnoreAttributes(
14342 local_object, 14340 local_object,
14343 isolate->factory()->NewStringFromStaticAscii("breakIterator"), 14341 isolate->factory()->NewStringFromStaticAscii("breakIterator"),
14344 isolate->factory()->NewStringFromStaticAscii("valid"), 14342 isolate->factory()->NewStringFromStaticAscii("valid"),
14345 NONE)); 14343 NONE));
14346 14344
14347 // Make object handle weak so we can delete the break iterator once GC kicks 14345 // Make object handle weak so we can delete the break iterator once GC kicks
14348 // in. 14346 // in.
14349 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); 14347 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object);
14350 GlobalHandles::MakeWeak(wrapper.location(), 14348 GlobalHandles::MakeWeak(wrapper.location(),
14351 reinterpret_cast<void*>(wrapper.location()), 14349 reinterpret_cast<void*>(wrapper.location()),
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
15223 } 15221 }
15224 return NULL; 15222 return NULL;
15225 } 15223 }
15226 15224
15227 15225
15228 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 15226 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
15229 return &(kIntrinsicFunctions[static_cast<int>(id)]); 15227 return &(kIntrinsicFunctions[static_cast<int>(id)]);
15230 } 15228 }
15231 15229
15232 } } // namespace v8::internal 15230 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/scopeinfo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698