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

Side by Side Diff: src/objects.cc

Issue 10779012: Removing LookupTransition from LookupRealNamedProperty and related utility functions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 5 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/objects.h ('k') | src/profile-generator.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 399
400 case INTERCEPTOR: { 400 case INTERCEPTOR: {
401 // If the object has an interceptor, try real named properties. 401 // If the object has an interceptor, try real named properties.
402 // No access check in GetPropertyAttributeWithInterceptor. 402 // No access check in GetPropertyAttributeWithInterceptor.
403 LookupResult r(GetIsolate()); 403 LookupResult r(GetIsolate());
404 if (continue_search) { 404 if (continue_search) {
405 result->holder()->LookupRealNamedProperty(name, &r); 405 result->holder()->LookupRealNamedProperty(name, &r);
406 } else { 406 } else {
407 result->holder()->LocalLookupRealNamedProperty(name, &r); 407 result->holder()->LocalLookupRealNamedProperty(name, &r);
408 } 408 }
409 if (r.IsProperty()) { 409 if (!r.IsFound()) break;
410 return GetPropertyAttributeWithFailedAccessCheck(receiver, 410 return GetPropertyAttributeWithFailedAccessCheck(receiver,
411 &r, 411 &r,
412 name, 412 name,
413 continue_search); 413 continue_search);
414 }
415 break;
416 } 414 }
417 415
418 case HANDLER: 416 case HANDLER:
419 case TRANSITION: 417 case TRANSITION:
420 case NONEXISTENT: 418 case NONEXISTENT:
421 UNREACHABLE(); 419 UNREACHABLE();
422 } 420 }
423 } 421 }
424 422
425 GetIsolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); 423 GetIsolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
(...skipping 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1740 1738
1741 MaybeObject* JSObject::SetPropertyPostInterceptor( 1739 MaybeObject* JSObject::SetPropertyPostInterceptor(
1742 String* name, 1740 String* name,
1743 Object* value, 1741 Object* value,
1744 PropertyAttributes attributes, 1742 PropertyAttributes attributes,
1745 StrictModeFlag strict_mode, 1743 StrictModeFlag strict_mode,
1746 ExtensibilityCheck extensibility_check) { 1744 ExtensibilityCheck extensibility_check) {
1747 // Check local property, ignore interceptor. 1745 // Check local property, ignore interceptor.
1748 LookupResult result(GetIsolate()); 1746 LookupResult result(GetIsolate());
1749 LocalLookupRealNamedProperty(name, &result); 1747 LocalLookupRealNamedProperty(name, &result);
1748 if (!result.IsFound()) map()->LookupTransition(this, name, &result);
1750 if (result.IsFound()) { 1749 if (result.IsFound()) {
1751 // An existing property, a map transition or a null descriptor was 1750 // An existing property or a map transition was found. Use set property to
1752 // found. Use set property to handle all these cases. 1751 // handle all these cases.
1753 return SetProperty(&result, name, value, attributes, strict_mode); 1752 return SetProperty(&result, name, value, attributes, strict_mode);
1754 } 1753 }
1755 bool done = false; 1754 bool done = false;
1756 MaybeObject* result_object; 1755 MaybeObject* result_object;
1757 result_object = 1756 result_object =
1758 SetPropertyViaPrototypes(name, value, attributes, strict_mode, &done); 1757 SetPropertyViaPrototypes(name, value, attributes, strict_mode, &done);
1759 if (done) return result_object; 1758 if (done) return result_object;
1760 // Add a new real property. 1759 // Add a new real property.
1761 return AddProperty(name, value, attributes, strict_mode, 1760 return AddProperty(name, value, attributes, strict_mode,
1762 MAY_BE_STORE_FROM_KEYED, extensibility_check); 1761 MAY_BE_STORE_FROM_KEYED, extensibility_check);
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1907 } 1906 }
1908 1907
1909 1908
1910 MaybeObject* JSReceiver::SetProperty(String* name, 1909 MaybeObject* JSReceiver::SetProperty(String* name,
1911 Object* value, 1910 Object* value,
1912 PropertyAttributes attributes, 1911 PropertyAttributes attributes,
1913 StrictModeFlag strict_mode, 1912 StrictModeFlag strict_mode,
1914 JSReceiver::StoreFromKeyed store_mode) { 1913 JSReceiver::StoreFromKeyed store_mode) {
1915 LookupResult result(GetIsolate()); 1914 LookupResult result(GetIsolate());
1916 LocalLookup(name, &result); 1915 LocalLookup(name, &result);
1916 if (!result.IsFound()) {
1917 map()->LookupTransition(JSObject::cast(this), name, &result);
1918 }
1917 return SetProperty(&result, name, value, attributes, strict_mode, store_mode); 1919 return SetProperty(&result, name, value, attributes, strict_mode, store_mode);
1918 } 1920 }
1919 1921
1920 1922
1921 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure, 1923 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure,
1922 String* name, 1924 String* name,
1923 Object* value, 1925 Object* value,
1924 JSObject* holder, 1926 JSObject* holder,
1925 StrictModeFlag strict_mode) { 1927 StrictModeFlag strict_mode) {
1926 Isolate* isolate = GetIsolate(); 1928 Isolate* isolate = GetIsolate();
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
2347 LookupResult* result) { 2349 LookupResult* result) {
2348 if (IsJSGlobalProxy()) { 2350 if (IsJSGlobalProxy()) {
2349 Object* proto = GetPrototype(); 2351 Object* proto = GetPrototype();
2350 if (proto->IsNull()) return result->NotFound(); 2352 if (proto->IsNull()) return result->NotFound();
2351 ASSERT(proto->IsJSGlobalObject()); 2353 ASSERT(proto->IsJSGlobalObject());
2352 // A GlobalProxy's prototype should always be a proper JSObject. 2354 // A GlobalProxy's prototype should always be a proper JSObject.
2353 return JSObject::cast(proto)->LocalLookupRealNamedProperty(name, result); 2355 return JSObject::cast(proto)->LocalLookupRealNamedProperty(name, result);
2354 } 2356 }
2355 2357
2356 if (HasFastProperties()) { 2358 if (HasFastProperties()) {
2357 map()->LookupTransitionOrDescriptor(this, name, result); 2359 map()->LookupDescriptor(this, name, result);
2358 // A property or a map transition was found. We return all of these result 2360 // A property or a map transition was found. We return all of these result
2359 // types because LocalLookupRealNamedProperty is used when setting 2361 // types because LocalLookupRealNamedProperty is used when setting
2360 // properties where map transitions are handled. 2362 // properties where map transitions are handled.
2361 ASSERT(!result->IsFound() || 2363 ASSERT(!result->IsFound() ||
2362 (result->holder() == this && result->IsFastPropertyType())); 2364 (result->holder() == this && result->IsFastPropertyType()));
2363 // Disallow caching for uninitialized constants. These can only 2365 // Disallow caching for uninitialized constants. These can only
2364 // occur as fields. 2366 // occur as fields.
2365 if (result->IsField() && 2367 if (result->IsField() &&
2366 result->IsReadOnly() && 2368 result->IsReadOnly() &&
2367 FastPropertyAt(result->GetFieldIndex())->IsTheHole()) { 2369 FastPropertyAt(result->GetFieldIndex())->IsTheHole()) {
(...skipping 19 matching lines...) Expand all
2387 result->DictionaryResult(this, entry); 2389 result->DictionaryResult(this, entry);
2388 return; 2390 return;
2389 } 2391 }
2390 2392
2391 result->NotFound(); 2393 result->NotFound();
2392 } 2394 }
2393 2395
2394 2396
2395 void JSObject::LookupRealNamedProperty(String* name, LookupResult* result) { 2397 void JSObject::LookupRealNamedProperty(String* name, LookupResult* result) {
2396 LocalLookupRealNamedProperty(name, result); 2398 LocalLookupRealNamedProperty(name, result);
2397 if (result->IsProperty()) return; 2399 if (result->IsFound()) return;
2398 2400
2399 LookupRealNamedPropertyInPrototypes(name, result); 2401 LookupRealNamedPropertyInPrototypes(name, result);
2400 } 2402 }
2401 2403
2402 2404
2403 void JSObject::LookupRealNamedPropertyInPrototypes(String* name, 2405 void JSObject::LookupRealNamedPropertyInPrototypes(String* name,
2404 LookupResult* result) { 2406 LookupResult* result) {
2405 Heap* heap = GetHeap(); 2407 Heap* heap = GetHeap();
2406 for (Object* pt = GetPrototype(); 2408 for (Object* pt = GetPrototype();
2407 pt != heap->null_value(); 2409 pt != heap->null_value();
2408 pt = pt->GetPrototype()) { 2410 pt = pt->GetPrototype()) {
2409 if (pt->IsJSProxy()) { 2411 if (pt->IsJSProxy()) {
2410 return result->HandlerResult(JSProxy::cast(pt)); 2412 return result->HandlerResult(JSProxy::cast(pt));
2411 } 2413 }
2412 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); 2414 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result);
2413 ASSERT(!(result->IsProperty() && result->type() == INTERCEPTOR)); 2415 ASSERT(!(result->IsFound() && result->type() == INTERCEPTOR));
2414 if (result->IsProperty()) return; 2416 if (result->IsFound()) return;
2415 } 2417 }
2416 result->NotFound(); 2418 result->NotFound();
2417 } 2419 }
2418 2420
2419 2421
2420 // We only need to deal with CALLBACKS and INTERCEPTORS 2422 // We only need to deal with CALLBACKS and INTERCEPTORS
2421 MaybeObject* JSObject::SetPropertyWithFailedAccessCheck( 2423 MaybeObject* JSObject::SetPropertyWithFailedAccessCheck(
2422 LookupResult* result, 2424 LookupResult* result,
2423 String* name, 2425 String* name,
2424 Object* value, 2426 Object* value,
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
2926 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( 2928 MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
2927 String* name, 2929 String* name,
2928 Object* value, 2930 Object* value,
2929 PropertyAttributes attributes) { 2931 PropertyAttributes attributes) {
2930 // Make sure that the top context does not change when doing callbacks or 2932 // Make sure that the top context does not change when doing callbacks or
2931 // interceptor calls. 2933 // interceptor calls.
2932 AssertNoContextChange ncc; 2934 AssertNoContextChange ncc;
2933 Isolate* isolate = GetIsolate(); 2935 Isolate* isolate = GetIsolate();
2934 LookupResult result(isolate); 2936 LookupResult result(isolate);
2935 LocalLookup(name, &result); 2937 LocalLookup(name, &result);
2938 if (!result.IsFound()) map()->LookupTransition(this, name, &result);
2936 // Check access rights if needed. 2939 // Check access rights if needed.
2937 if (IsAccessCheckNeeded()) { 2940 if (IsAccessCheckNeeded()) {
2938 if (!isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) { 2941 if (!isolate->MayNamedAccess(this, name, v8::ACCESS_SET)) {
2939 return SetPropertyWithFailedAccessCheck(&result, 2942 return SetPropertyWithFailedAccessCheck(&result,
2940 name, 2943 name,
2941 value, 2944 value,
2942 false, 2945 false,
2943 kNonStrictMode); 2946 kNonStrictMode);
2944 } 2947 }
2945 } 2948 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3014 } 3017 }
3015 3018
3016 3019
3017 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( 3020 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor(
3018 JSObject* receiver, 3021 JSObject* receiver,
3019 String* name, 3022 String* name,
3020 bool continue_search) { 3023 bool continue_search) {
3021 // Check local property, ignore interceptor. 3024 // Check local property, ignore interceptor.
3022 LookupResult result(GetIsolate()); 3025 LookupResult result(GetIsolate());
3023 LocalLookupRealNamedProperty(name, &result); 3026 LocalLookupRealNamedProperty(name, &result);
3024 if (result.IsProperty()) return result.GetAttributes(); 3027 if (result.IsFound()) return result.GetAttributes();
3025 3028
3026 if (continue_search) { 3029 if (continue_search) {
3027 // Continue searching via the prototype chain. 3030 // Continue searching via the prototype chain.
3028 Object* pt = GetPrototype(); 3031 Object* pt = GetPrototype();
3029 if (!pt->IsNull()) { 3032 if (!pt->IsNull()) {
3030 return JSObject::cast(pt)-> 3033 return JSObject::cast(pt)->
3031 GetPropertyAttributeWithReceiver(receiver, name); 3034 GetPropertyAttributeWithReceiver(receiver, name);
3032 } 3035 }
3033 } 3036 }
3034 return ABSENT; 3037 return ABSENT;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3107 bool continue_search) { 3110 bool continue_search) {
3108 // Check access rights if needed. 3111 // Check access rights if needed.
3109 if (IsAccessCheckNeeded()) { 3112 if (IsAccessCheckNeeded()) {
3110 JSObject* this_obj = JSObject::cast(this); 3113 JSObject* this_obj = JSObject::cast(this);
3111 Heap* heap = GetHeap(); 3114 Heap* heap = GetHeap();
3112 if (!heap->isolate()->MayNamedAccess(this_obj, name, v8::ACCESS_HAS)) { 3115 if (!heap->isolate()->MayNamedAccess(this_obj, name, v8::ACCESS_HAS)) {
3113 return this_obj->GetPropertyAttributeWithFailedAccessCheck( 3116 return this_obj->GetPropertyAttributeWithFailedAccessCheck(
3114 receiver, result, name, continue_search); 3117 receiver, result, name, continue_search);
3115 } 3118 }
3116 } 3119 }
3117 if (result->IsProperty()) { 3120 if (result->IsFound()) {
3118 switch (result->type()) { 3121 switch (result->type()) {
3119 case NORMAL: // fall through 3122 case NORMAL: // fall through
3120 case FIELD: 3123 case FIELD:
3121 case CONSTANT_FUNCTION: 3124 case CONSTANT_FUNCTION:
3122 case CALLBACKS: 3125 case CALLBACKS:
3123 return result->GetAttributes(); 3126 return result->GetAttributes();
3124 case HANDLER: { 3127 case HANDLER: {
3125 return JSProxy::cast(result->proxy())->GetPropertyAttributeWithHandler( 3128 return JSProxy::cast(result->proxy())->GetPropertyAttributeWithHandler(
3126 receiver, name); 3129 receiver, name);
3127 } 3130 }
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
3693 if (store_result->IsFailure()) return store_result; 3696 if (store_result->IsFailure()) return store_result;
3694 return this; 3697 return this;
3695 } 3698 }
3696 3699
3697 3700
3698 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name, 3701 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name,
3699 DeleteMode mode) { 3702 DeleteMode mode) {
3700 // Check local property, ignore interceptor. 3703 // Check local property, ignore interceptor.
3701 LookupResult result(GetIsolate()); 3704 LookupResult result(GetIsolate());
3702 LocalLookupRealNamedProperty(name, &result); 3705 LocalLookupRealNamedProperty(name, &result);
3703 if (!result.IsProperty()) return GetHeap()->true_value(); 3706 if (!result.IsFound()) return GetHeap()->true_value();
3704 3707
3705 // Normalize object if needed. 3708 // Normalize object if needed.
3706 Object* obj; 3709 Object* obj;
3707 { MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); 3710 { MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
3708 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 3711 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
3709 } 3712 }
3710 3713
3711 return DeleteNormalizedProperty(name, mode); 3714 return DeleteNormalizedProperty(name, mode);
3712 } 3715 }
3713 3716
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
3842 ASSERT(proto->IsJSGlobalObject()); 3845 ASSERT(proto->IsJSGlobalObject());
3843 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode); 3846 return JSGlobalObject::cast(proto)->DeleteProperty(name, mode);
3844 } 3847 }
3845 3848
3846 uint32_t index = 0; 3849 uint32_t index = 0;
3847 if (name->AsArrayIndex(&index)) { 3850 if (name->AsArrayIndex(&index)) {
3848 return DeleteElement(index, mode); 3851 return DeleteElement(index, mode);
3849 } else { 3852 } else {
3850 LookupResult result(isolate); 3853 LookupResult result(isolate);
3851 LocalLookup(name, &result); 3854 LocalLookup(name, &result);
3852 if (!result.IsProperty()) return isolate->heap()->true_value(); 3855 if (!result.IsFound()) return isolate->heap()->true_value();
3853 // Ignore attributes if forcing a deletion. 3856 // Ignore attributes if forcing a deletion.
3854 if (result.IsDontDelete() && mode != FORCE_DELETION) { 3857 if (result.IsDontDelete() && mode != FORCE_DELETION) {
3855 if (mode == STRICT_DELETION) { 3858 if (mode == STRICT_DELETION) {
3856 // Deleting a non-configurable property in strict mode. 3859 // Deleting a non-configurable property in strict mode.
3857 HandleScope scope(isolate); 3860 HandleScope scope(isolate);
3858 Handle<Object> args[2] = { Handle<Object>(name), Handle<Object>(this) }; 3861 Handle<Object> args[2] = { Handle<Object>(name), Handle<Object>(this) };
3859 return isolate->Throw(*isolate->factory()->NewTypeError( 3862 return isolate->Throw(*isolate->factory()->NewTypeError(
3860 "strict_delete_property", HandleVector(args, 2))); 3863 "strict_delete_property", HandleVector(args, 2)));
3861 } 3864 }
3862 return isolate->heap()->false_value(); 3865 return isolate->heap()->false_value();
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
4192 if (js_object->HasNamedInterceptor() && 4195 if (js_object->HasNamedInterceptor() &&
4193 !heap->isolate()->bootstrapper()->IsActive()) { 4196 !heap->isolate()->bootstrapper()->IsActive()) {
4194 result->InterceptorResult(js_object); 4197 result->InterceptorResult(js_object);
4195 return; 4198 return;
4196 } 4199 }
4197 4200
4198 js_object->LocalLookupRealNamedProperty(name, result); 4201 js_object->LocalLookupRealNamedProperty(name, result);
4199 } 4202 }
4200 4203
4201 4204
4202 void JSReceiver::Lookup(String* name, LookupResult* result) { 4205 void JSReceiver::Lookup(String* name,
4206 LookupResult* result) {
4203 // Ecma-262 3rd 8.6.2.4 4207 // Ecma-262 3rd 8.6.2.4
4204 Heap* heap = GetHeap(); 4208 Heap* heap = GetHeap();
4205 for (Object* current = this; 4209 for (Object* current = this;
4206 current != heap->null_value(); 4210 current != heap->null_value();
4207 current = JSObject::cast(current)->GetPrototype()) { 4211 current = JSObject::cast(current)->GetPrototype()) {
4208 JSReceiver::cast(current)->LocalLookup(name, result); 4212 JSReceiver::cast(current)->LocalLookup(name, result);
4209 if (result->IsProperty()) return; 4213 if (result->IsFound()) return;
4210 } 4214 }
4211 result->NotFound(); 4215 result->NotFound();
4212 } 4216 }
4213 4217
4214 4218
4215 // Search object and its prototype chain for callback properties. 4219 // Search object and its prototype chain for callback properties.
4216 void JSObject::LookupCallback(String* name, LookupResult* result) { 4220 void JSObject::LookupCallbackProperty(String* name, LookupResult* result) {
4217 Heap* heap = GetHeap(); 4221 Heap* heap = GetHeap();
4218 for (Object* current = this; 4222 for (Object* current = this;
4219 current != heap->null_value() && current->IsJSObject(); 4223 current != heap->null_value() && current->IsJSObject();
4220 current = JSObject::cast(current)->GetPrototype()) { 4224 current = JSObject::cast(current)->GetPrototype()) {
4221 JSObject::cast(current)->LocalLookupRealNamedProperty(name, result); 4225 JSObject::cast(current)->LocalLookupRealNamedProperty(name, result);
4222 if (result->IsPropertyCallbacks()) return; 4226 if (result->IsPropertyCallbacks()) return;
4223 } 4227 }
4224 result->NotFound(); 4228 result->NotFound();
4225 } 4229 }
4226 4230
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
4377 ASSERT(!IsAccessCheckNeeded() || 4381 ASSERT(!IsAccessCheckNeeded() ||
4378 GetIsolate()->MayNamedAccess(this, name, v8::ACCESS_SET)); 4382 GetIsolate()->MayNamedAccess(this, name, v8::ACCESS_SET));
4379 4383
4380 // Check if there is an API defined callback object which prohibits 4384 // Check if there is an API defined callback object which prohibits
4381 // callback overwriting in this object or its prototype chain. 4385 // callback overwriting in this object or its prototype chain.
4382 // This mechanism is needed for instance in a browser setting, where 4386 // This mechanism is needed for instance in a browser setting, where
4383 // certain accessors such as window.location should not be allowed 4387 // certain accessors such as window.location should not be allowed
4384 // to be overwritten because allowing overwriting could potentially 4388 // to be overwritten because allowing overwriting could potentially
4385 // cause security problems. 4389 // cause security problems.
4386 LookupResult callback_result(GetIsolate()); 4390 LookupResult callback_result(GetIsolate());
4387 LookupCallback(name, &callback_result); 4391 LookupCallbackProperty(name, &callback_result);
4388 if (callback_result.IsProperty()) { 4392 if (callback_result.IsFound()) {
4389 Object* obj = callback_result.GetCallbackObject(); 4393 Object* obj = callback_result.GetCallbackObject();
4390 if (obj->IsAccessorInfo() && 4394 if (obj->IsAccessorInfo() &&
4391 AccessorInfo::cast(obj)->prohibits_overwriting()) { 4395 AccessorInfo::cast(obj)->prohibits_overwriting()) {
4392 return false; 4396 return false;
4393 } 4397 }
4394 } 4398 }
4395 4399
4396 return true; 4400 return true;
4397 } 4401 }
4398 4402
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
4686 // Ignore getters and setters on pixel and external array 4690 // Ignore getters and setters on pixel and external array
4687 // elements. 4691 // elements.
4688 return isolate->heap()->undefined_value(); 4692 return isolate->heap()->undefined_value();
4689 case DICTIONARY_ELEMENTS: 4693 case DICTIONARY_ELEMENTS:
4690 break; 4694 break;
4691 case NON_STRICT_ARGUMENTS_ELEMENTS: 4695 case NON_STRICT_ARGUMENTS_ELEMENTS:
4692 UNIMPLEMENTED(); 4696 UNIMPLEMENTED();
4693 break; 4697 break;
4694 } 4698 }
4695 4699
4696 { MaybeObject* maybe_ok = 4700 MaybeObject* maybe_ok =
4697 SetElementCallback(index, info, info->property_attributes()); 4701 SetElementCallback(index, info, info->property_attributes());
4698 if (maybe_ok->IsFailure()) return maybe_ok; 4702 if (maybe_ok->IsFailure()) return maybe_ok;
4699 }
4700 } else { 4703 } else {
4701 // Lookup the name. 4704 // Lookup the name.
4702 LookupResult result(isolate); 4705 LookupResult result(isolate);
4703 LocalLookup(name, &result); 4706 LocalLookup(name, &result);
4704 // ES5 forbids turning a property into an accessor if it's not 4707 // ES5 forbids turning a property into an accessor if it's not
4705 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5). 4708 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5).
4706 if (result.IsProperty() && (result.IsReadOnly() || result.IsDontDelete())) { 4709 if (result.IsFound() && (result.IsReadOnly() || result.IsDontDelete())) {
4707 return isolate->heap()->undefined_value(); 4710 return isolate->heap()->undefined_value();
4708 } 4711 }
4709 { MaybeObject* maybe_ok = 4712
4710 SetPropertyCallback(name, info, info->property_attributes()); 4713 MaybeObject* maybe_ok =
4711 if (maybe_ok->IsFailure()) return maybe_ok; 4714 SetPropertyCallback(name, info, info->property_attributes());
4712 } 4715 if (maybe_ok->IsFailure()) return maybe_ok;
4713 } 4716 }
4714 4717
4715 return this; 4718 return this;
4716 } 4719 }
4717 4720
4718 4721
4719 Object* JSObject::LookupAccessor(String* name, AccessorComponent component) { 4722 Object* JSObject::LookupAccessor(String* name, AccessorComponent component) {
4720 Heap* heap = GetHeap(); 4723 Heap* heap = GetHeap();
4721 4724
4722 // Make sure that the top context does not change when doing callbacks or 4725 // Make sure that the top context does not change when doing callbacks or
(...skipping 25 matching lines...) Expand all
4748 } 4751 }
4749 } 4752 }
4750 } 4753 }
4751 } 4754 }
4752 } else { 4755 } else {
4753 for (Object* obj = this; 4756 for (Object* obj = this;
4754 obj != heap->null_value(); 4757 obj != heap->null_value();
4755 obj = JSReceiver::cast(obj)->GetPrototype()) { 4758 obj = JSReceiver::cast(obj)->GetPrototype()) {
4756 LookupResult result(heap->isolate()); 4759 LookupResult result(heap->isolate());
4757 JSReceiver::cast(obj)->LocalLookup(name, &result); 4760 JSReceiver::cast(obj)->LocalLookup(name, &result);
4758 if (result.IsProperty()) { 4761 if (result.IsFound()) {
4759 if (result.IsReadOnly()) return heap->undefined_value(); 4762 if (result.IsReadOnly()) return heap->undefined_value();
4760 if (result.IsPropertyCallbacks()) { 4763 if (result.IsPropertyCallbacks()) {
4761 Object* obj = result.GetCallbackObject(); 4764 Object* obj = result.GetCallbackObject();
4762 if (obj->IsAccessorPair()) { 4765 if (obj->IsAccessorPair()) {
4763 return AccessorPair::cast(obj)->GetComponent(component); 4766 return AccessorPair::cast(obj)->GetComponent(component);
4764 } 4767 }
4765 } 4768 }
4766 } 4769 }
4767 } 4770 }
4768 } 4771 }
(...skipping 2865 matching lines...) Expand 10 before | Expand all | Expand 10 after
7634 // Traverse the proposed prototype chain looking for properties of the 7637 // Traverse the proposed prototype chain looking for properties of the
7635 // same names as are set by the inline constructor. 7638 // same names as are set by the inline constructor.
7636 for (Object* obj = prototype; 7639 for (Object* obj = prototype;
7637 obj != heap->null_value(); 7640 obj != heap->null_value();
7638 obj = obj->GetPrototype()) { 7641 obj = obj->GetPrototype()) {
7639 JSReceiver* receiver = JSReceiver::cast(obj); 7642 JSReceiver* receiver = JSReceiver::cast(obj);
7640 for (int i = 0; i < this_property_assignments_count(); i++) { 7643 for (int i = 0; i < this_property_assignments_count(); i++) {
7641 LookupResult result(heap->isolate()); 7644 LookupResult result(heap->isolate());
7642 String* name = GetThisPropertyAssignmentName(i); 7645 String* name = GetThisPropertyAssignmentName(i);
7643 receiver->LocalLookup(name, &result); 7646 receiver->LocalLookup(name, &result);
7644 if (result.IsProperty()) { 7647 if (result.IsFound()) {
7645 switch (result.type()) { 7648 switch (result.type()) {
7646 case NORMAL: 7649 case NORMAL:
7647 case FIELD: 7650 case FIELD:
7648 case CONSTANT_FUNCTION: 7651 case CONSTANT_FUNCTION:
7649 break; 7652 break;
7650 case INTERCEPTOR: 7653 case INTERCEPTOR:
7651 case CALLBACKS: 7654 case CALLBACKS:
7652 case HANDLER: 7655 case HANDLER:
7653 return false; 7656 return false;
7654 case TRANSITION: 7657 case TRANSITION:
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after
10167 } 10170 }
10168 10171
10169 10172
10170 MaybeObject* JSObject::GetPropertyPostInterceptor( 10173 MaybeObject* JSObject::GetPropertyPostInterceptor(
10171 JSReceiver* receiver, 10174 JSReceiver* receiver,
10172 String* name, 10175 String* name,
10173 PropertyAttributes* attributes) { 10176 PropertyAttributes* attributes) {
10174 // Check local property in holder, ignore interceptor. 10177 // Check local property in holder, ignore interceptor.
10175 LookupResult result(GetIsolate()); 10178 LookupResult result(GetIsolate());
10176 LocalLookupRealNamedProperty(name, &result); 10179 LocalLookupRealNamedProperty(name, &result);
10177 if (result.IsProperty()) { 10180 if (result.IsFound()) {
10178 return GetProperty(receiver, &result, name, attributes); 10181 return GetProperty(receiver, &result, name, attributes);
10179 } 10182 }
10180 // Continue searching via the prototype chain. 10183 // Continue searching via the prototype chain.
10181 Object* pt = GetPrototype(); 10184 Object* pt = GetPrototype();
10182 *attributes = ABSENT; 10185 *attributes = ABSENT;
10183 if (pt->IsNull()) return GetHeap()->undefined_value(); 10186 if (pt->IsNull()) return GetHeap()->undefined_value();
10184 return pt->GetPropertyWithReceiver(receiver, name, attributes); 10187 return pt->GetPropertyWithReceiver(receiver, name, attributes);
10185 } 10188 }
10186 10189
10187 10190
10188 MaybeObject* JSObject::GetLocalPropertyPostInterceptor( 10191 MaybeObject* JSObject::GetLocalPropertyPostInterceptor(
10189 JSReceiver* receiver, 10192 JSReceiver* receiver,
10190 String* name, 10193 String* name,
10191 PropertyAttributes* attributes) { 10194 PropertyAttributes* attributes) {
10192 // Check local property in holder, ignore interceptor. 10195 // Check local property in holder, ignore interceptor.
10193 LookupResult result(GetIsolate()); 10196 LookupResult result(GetIsolate());
10194 LocalLookupRealNamedProperty(name, &result); 10197 LocalLookupRealNamedProperty(name, &result);
10195 if (result.IsProperty()) { 10198 if (result.IsFound()) {
10196 return GetProperty(receiver, &result, name, attributes); 10199 return GetProperty(receiver, &result, name, attributes);
10197 } 10200 }
10198 return GetHeap()->undefined_value(); 10201 return GetHeap()->undefined_value();
10199 } 10202 }
10200 10203
10201 10204
10202 MaybeObject* JSObject::GetPropertyWithInterceptor( 10205 MaybeObject* JSObject::GetPropertyWithInterceptor(
10203 JSReceiver* receiver, 10206 JSReceiver* receiver,
10204 String* name, 10207 String* name,
10205 PropertyAttributes* attributes) { 10208 PropertyAttributes* attributes) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
10244 Isolate* isolate = GetIsolate(); 10247 Isolate* isolate = GetIsolate();
10245 if (IsAccessCheckNeeded()) { 10248 if (IsAccessCheckNeeded()) {
10246 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) { 10249 if (!isolate->MayNamedAccess(this, key, v8::ACCESS_HAS)) {
10247 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS); 10250 isolate->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
10248 return false; 10251 return false;
10249 } 10252 }
10250 } 10253 }
10251 10254
10252 LookupResult result(isolate); 10255 LookupResult result(isolate);
10253 LocalLookupRealNamedProperty(key, &result); 10256 LocalLookupRealNamedProperty(key, &result);
10254 return result.IsProperty() && !result.IsInterceptor(); 10257 return result.IsFound() && !result.IsInterceptor();
10255 } 10258 }
10256 10259
10257 10260
10258 bool JSObject::HasRealElementProperty(uint32_t index) { 10261 bool JSObject::HasRealElementProperty(uint32_t index) {
10259 // Check access rights if needed. 10262 // Check access rights if needed.
10260 if (IsAccessCheckNeeded()) { 10263 if (IsAccessCheckNeeded()) {
10261 Heap* heap = GetHeap(); 10264 Heap* heap = GetHeap();
10262 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { 10265 if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) {
10263 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); 10266 heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS);
10264 return false; 10267 return false;
(...skipping 2849 matching lines...) Expand 10 before | Expand all | Expand 10 after
13114 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13117 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13115 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13118 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13116 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13119 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13117 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13120 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13118 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13121 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13119 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13122 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13120 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13123 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13121 } 13124 }
13122 13125
13123 } } // namespace v8::internal 13126 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/profile-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698