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

Side by Side Diff: src/runtime/runtime-object.cc

Issue 1975763002: [runtime] Make sure that LookupIterator::OWN always performs a HIDDEN lookup as well. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comment Created 4 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
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/runtime/runtime-scopes.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 "src/runtime/runtime-utils.h" 5 #include "src/runtime/runtime-utils.h"
6 6
7 #include "src/arguments.h" 7 #include "src/arguments.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/debug/debug.h" 9 #include "src/debug/debug.h"
10 #include "src/isolate-inl.h" 10 #include "src/isolate-inl.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 return Runtime::GetObjectProperty(isolate, receiver_obj, key_obj); 113 return Runtime::GetObjectProperty(isolate, receiver_obj, key_obj);
114 } 114 }
115 115
116 116
117 Maybe<bool> Runtime::DeleteObjectProperty(Isolate* isolate, 117 Maybe<bool> Runtime::DeleteObjectProperty(Isolate* isolate,
118 Handle<JSReceiver> receiver, 118 Handle<JSReceiver> receiver,
119 Handle<Object> key, 119 Handle<Object> key,
120 LanguageMode language_mode) { 120 LanguageMode language_mode) {
121 bool success = false; 121 bool success = false;
122 LookupIterator it = LookupIterator::PropertyOrElement( 122 LookupIterator it = LookupIterator::PropertyOrElement(
123 isolate, receiver, key, &success, LookupIterator::HIDDEN); 123 isolate, receiver, key, &success, LookupIterator::OWN);
124 if (!success) return Nothing<bool>(); 124 if (!success) return Nothing<bool>();
125 125
126 return JSReceiver::DeleteProperty(&it, language_mode); 126 return JSReceiver::DeleteProperty(&it, language_mode);
127 } 127 }
128 128
129 // ES6 19.1.3.2 129 // ES6 19.1.3.2
130 RUNTIME_FUNCTION(Runtime_ObjectHasOwnProperty) { 130 RUNTIME_FUNCTION(Runtime_ObjectHasOwnProperty) {
131 HandleScope scope(isolate); 131 HandleScope scope(isolate);
132 Handle<Object> property = args.at<Object>(1); 132 Handle<Object> property = args.at<Object>(1);
133 133
(...skipping 28 matching lines...) Expand all
162 } 162 }
163 163
164 Map* map = js_obj->map(); 164 Map* map = js_obj->map();
165 if (!map->has_hidden_prototype() && 165 if (!map->has_hidden_prototype() &&
166 (key_is_array_index ? !map->has_indexed_interceptor() 166 (key_is_array_index ? !map->has_indexed_interceptor()
167 : !map->has_named_interceptor())) { 167 : !map->has_named_interceptor())) {
168 return isolate->heap()->false_value(); 168 return isolate->heap()->false_value();
169 } 169 }
170 170
171 // Slow case. 171 // Slow case.
172 LookupIterator::Configuration c = LookupIterator::HIDDEN; 172 LookupIterator::Configuration c = LookupIterator::OWN;
173 LookupIterator it = key_is_array_index 173 LookupIterator it = key_is_array_index
174 ? LookupIterator(isolate, js_obj, index, js_obj, c) 174 ? LookupIterator(isolate, js_obj, index, js_obj, c)
175 : LookupIterator(js_obj, key, js_obj, c); 175 : LookupIterator(js_obj, key, js_obj, c);
176 176
177 Maybe<bool> maybe = JSReceiver::HasProperty(&it); 177 Maybe<bool> maybe = JSReceiver::HasProperty(&it);
178 if (maybe.IsNothing()) return isolate->heap()->exception(); 178 if (maybe.IsNothing()) return isolate->heap()->exception();
179 DCHECK(!isolate->has_pending_exception()); 179 DCHECK(!isolate->has_pending_exception());
180 return isolate->heap()->ToBoolean(maybe.FromJust()); 180 return isolate->heap()->ToBoolean(maybe.FromJust());
181 181
182 } else if (object->IsJSProxy()) { 182 } else if (object->IsJSProxy()) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 // Go up context chain to the script context. 293 // Go up context chain to the script context.
294 Handle<Context> script_context(isolate->context()->script_context(), isolate); 294 Handle<Context> script_context(isolate->context()->script_context(), isolate);
295 DCHECK(script_context->IsScriptContext()); 295 DCHECK(script_context->IsScriptContext());
296 DCHECK(script_context->get(slot)->IsPropertyCell()); 296 DCHECK(script_context->get(slot)->IsPropertyCell());
297 297
298 // Lookup the named property on the global object. 298 // Lookup the named property on the global object.
299 Handle<ScopeInfo> scope_info(script_context->scope_info(), isolate); 299 Handle<ScopeInfo> scope_info(script_context->scope_info(), isolate);
300 Handle<Name> name(scope_info->ContextSlotName(slot), isolate); 300 Handle<Name> name(scope_info->ContextSlotName(slot), isolate);
301 Handle<JSGlobalObject> global_object(script_context->global_object(), 301 Handle<JSGlobalObject> global_object(script_context->global_object(),
302 isolate); 302 isolate);
303 LookupIterator it(global_object, name, global_object, LookupIterator::HIDDEN); 303 LookupIterator it(global_object, name, global_object, LookupIterator::OWN);
304 304
305 // Switch to fast mode only if there is a data property and it's not on 305 // Switch to fast mode only if there is a data property and it's not on
306 // a hidden prototype. 306 // a hidden prototype.
307 if (it.state() == LookupIterator::DATA && 307 if (it.state() == LookupIterator::DATA &&
308 it.GetHolder<Object>().is_identical_to(global_object)) { 308 it.GetHolder<Object>().is_identical_to(global_object)) {
309 // Now update the cell in the script context. 309 // Now update the cell in the script context.
310 Handle<PropertyCell> cell = it.GetPropertyCell(); 310 Handle<PropertyCell> cell = it.GetPropertyCell();
311 script_context->set(slot, *cell); 311 script_context->set(slot, *cell);
312 } else { 312 } else {
313 // This is not a fast case, so keep this access in a slow mode. 313 // This is not a fast case, so keep this access in a slow mode.
(...skipping 14 matching lines...) Expand all
328 // Go up context chain to the script context. 328 // Go up context chain to the script context.
329 Handle<Context> script_context(isolate->context()->script_context(), isolate); 329 Handle<Context> script_context(isolate->context()->script_context(), isolate);
330 DCHECK(script_context->IsScriptContext()); 330 DCHECK(script_context->IsScriptContext());
331 DCHECK(script_context->get(slot)->IsPropertyCell()); 331 DCHECK(script_context->get(slot)->IsPropertyCell());
332 332
333 // Lookup the named property on the global object. 333 // Lookup the named property on the global object.
334 Handle<ScopeInfo> scope_info(script_context->scope_info(), isolate); 334 Handle<ScopeInfo> scope_info(script_context->scope_info(), isolate);
335 Handle<Name> name(scope_info->ContextSlotName(slot), isolate); 335 Handle<Name> name(scope_info->ContextSlotName(slot), isolate);
336 Handle<JSGlobalObject> global_object(script_context->global_object(), 336 Handle<JSGlobalObject> global_object(script_context->global_object(),
337 isolate); 337 isolate);
338 LookupIterator it(global_object, name, global_object, LookupIterator::HIDDEN); 338 LookupIterator it(global_object, name, global_object, LookupIterator::OWN);
339 339
340 // Switch to fast mode only if there is a data property and it's not on 340 // Switch to fast mode only if there is a data property and it's not on
341 // a hidden prototype. 341 // a hidden prototype.
342 if (it.state() == LookupIterator::DATA && 342 if (it.state() == LookupIterator::DATA &&
343 it.GetHolder<Object>().is_identical_to(global_object)) { 343 it.GetHolder<Object>().is_identical_to(global_object)) {
344 // Now update cell in the script context. 344 // Now update cell in the script context.
345 Handle<PropertyCell> cell = it.GetPropertyCell(); 345 Handle<PropertyCell> cell = it.GetPropertyCell();
346 script_context->set(slot, *cell); 346 script_context->set(slot, *cell);
347 } else { 347 } else {
348 // This is not a fast case, so keep this access in a slow mode. 348 // This is not a fast case, so keep this access in a slow mode.
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after
1109 1109
1110 1110
1111 RUNTIME_FUNCTION(Runtime_CreateDataProperty) { 1111 RUNTIME_FUNCTION(Runtime_CreateDataProperty) {
1112 HandleScope scope(isolate); 1112 HandleScope scope(isolate);
1113 DCHECK(args.length() == 3); 1113 DCHECK(args.length() == 3);
1114 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, o, 0); 1114 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, o, 0);
1115 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1115 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1116 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 1116 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
1117 bool success; 1117 bool success;
1118 LookupIterator it = LookupIterator::PropertyOrElement( 1118 LookupIterator it = LookupIterator::PropertyOrElement(
1119 isolate, o, key, &success, LookupIterator::HIDDEN); 1119 isolate, o, key, &success, LookupIterator::OWN);
1120 if (!success) return isolate->heap()->exception(); 1120 if (!success) return isolate->heap()->exception();
1121 MAYBE_RETURN( 1121 MAYBE_RETURN(
1122 JSReceiver::CreateDataProperty(&it, value, Object::THROW_ON_ERROR), 1122 JSReceiver::CreateDataProperty(&it, value, Object::THROW_ON_ERROR),
1123 isolate->heap()->exception()); 1123 isolate->heap()->exception());
1124 return *value; 1124 return *value;
1125 } 1125 }
1126 1126
1127 } // namespace internal 1127 } // namespace internal
1128 } // namespace v8 1128 } // namespace v8
OLDNEW
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/runtime/runtime-scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698