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

Side by Side Diff: src/objects.cc

Issue 1168093002: [strong] Implement strong mode restrictions on property access (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: slim down, improve tests Created 5 years, 6 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 if (js_object->map()->is_access_check_needed()) return false; 120 if (js_object->map()->is_access_check_needed()) return false;
121 auto isolate = js_object->GetIsolate(); 121 auto isolate = js_object->GetIsolate();
122 // TODO(dcarney): this should just be read from the symbol registry so as not 122 // TODO(dcarney): this should just be read from the symbol registry so as not
123 // to be context dependent. 123 // to be context dependent.
124 auto key = isolate->promise_status(); 124 auto key = isolate->promise_status();
125 // Shouldn't be possible to throw here. 125 // Shouldn't be possible to throw here.
126 return JSObject::HasRealNamedProperty(js_object, key).FromJust(); 126 return JSObject::HasRealNamedProperty(js_object, key).FromJust();
127 } 127 }
128 128
129 129
130 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { 130 MaybeHandle<Object> Object::GetProperty(LookupIterator* it,
131 LanguageMode language_mode) {
131 for (; it->IsFound(); it->Next()) { 132 for (; it->IsFound(); it->Next()) {
132 switch (it->state()) { 133 switch (it->state()) {
133 case LookupIterator::NOT_FOUND: 134 case LookupIterator::NOT_FOUND:
134 case LookupIterator::TRANSITION: 135 case LookupIterator::TRANSITION:
135 UNREACHABLE(); 136 UNREACHABLE();
136 case LookupIterator::JSPROXY: 137 case LookupIterator::JSPROXY:
137 return JSProxy::GetPropertyWithHandler( 138 return JSProxy::GetPropertyWithHandler(
138 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName()); 139 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName());
139 case LookupIterator::INTERCEPTOR: { 140 case LookupIterator::INTERCEPTOR: {
140 MaybeHandle<Object> maybe_result = 141 MaybeHandle<Object> maybe_result =
141 JSObject::GetPropertyWithInterceptor(it); 142 JSObject::GetPropertyWithInterceptor(it);
142 if (!maybe_result.is_null()) return maybe_result; 143 if (!maybe_result.is_null()) return maybe_result;
143 if (it->isolate()->has_pending_exception()) return maybe_result; 144 if (it->isolate()->has_pending_exception()) return maybe_result;
144 break; 145 break;
145 } 146 }
146 case LookupIterator::ACCESS_CHECK: 147 case LookupIterator::ACCESS_CHECK:
147 if (it->HasAccess()) break; 148 if (it->HasAccess()) break;
148 return JSObject::GetPropertyWithFailedAccessCheck(it); 149 return JSObject::GetPropertyWithFailedAccessCheck(it, language_mode);
149 case LookupIterator::ACCESSOR: 150 case LookupIterator::ACCESSOR:
150 return GetPropertyWithAccessor(it); 151 return GetPropertyWithAccessor(it, language_mode);
151 case LookupIterator::INTEGER_INDEXED_EXOTIC: 152 case LookupIterator::INTEGER_INDEXED_EXOTIC:
152 return it->factory()->undefined_value(); 153 return ReadAbsentProperty(it, language_mode);
153 case LookupIterator::DATA: 154 case LookupIterator::DATA:
154 return it->GetDataValue(); 155 return it->GetDataValue();
155 } 156 }
156 } 157 }
157 return it->factory()->undefined_value(); 158 return ReadAbsentProperty(it, language_mode);
158 } 159 }
159 160
160 161
161 Handle<Object> JSReceiver::GetDataProperty(Handle<JSReceiver> object, 162 Handle<Object> JSReceiver::GetDataProperty(Handle<JSReceiver> object,
162 Handle<Name> name) { 163 Handle<Name> name) {
163 LookupIterator it(object, name, 164 LookupIterator it(object, name,
164 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 165 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
165 return GetDataProperty(&it); 166 return GetDataProperty(&it);
166 } 167 }
167 168
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 296
296 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 297 // TODO(rossberg): adjust once there is a story for symbols vs proxies.
297 if (name->IsSymbol()) return isolate->factory()->undefined_value(); 298 if (name->IsSymbol()) return isolate->factory()->undefined_value();
298 299
299 Handle<Object> args[] = { receiver, name }; 300 Handle<Object> args[] = { receiver, name };
300 return CallTrap( 301 return CallTrap(
301 proxy, "get", isolate->derived_get_trap(), arraysize(args), args); 302 proxy, "get", isolate->derived_get_trap(), arraysize(args), args);
302 } 303 }
303 304
304 305
305 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) { 306 MaybeHandle<Object> Object::GetPropertyWithAccessor(
307 LookupIterator* it, LanguageMode language_mode) {
306 Isolate* isolate = it->isolate(); 308 Isolate* isolate = it->isolate();
307 Handle<Object> structure = it->GetAccessors(); 309 Handle<Object> structure = it->GetAccessors();
308 Handle<Object> receiver = it->GetReceiver(); 310 Handle<Object> receiver = it->GetReceiver();
309 311
310 DCHECK(!structure->IsForeign()); 312 DCHECK(!structure->IsForeign());
311 // api style callbacks. 313 // api style callbacks.
312 if (structure->IsAccessorInfo()) { 314 if (structure->IsAccessorInfo()) {
313 Handle<JSObject> holder = it->GetHolder<JSObject>(); 315 Handle<JSObject> holder = it->GetHolder<JSObject>();
314 Handle<Name> name = it->GetName(); 316 Handle<Name> name = it->GetName();
315 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); 317 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
316 if (!info->IsCompatibleReceiver(*receiver)) { 318 if (!info->IsCompatibleReceiver(*receiver)) {
317 THROW_NEW_ERROR(isolate, 319 THROW_NEW_ERROR(isolate,
318 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, 320 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver,
319 name, receiver), 321 name, receiver),
320 Object); 322 Object);
321 } 323 }
322 324
323 Handle<ExecutableAccessorInfo> data = 325 Handle<ExecutableAccessorInfo> data =
324 Handle<ExecutableAccessorInfo>::cast(structure); 326 Handle<ExecutableAccessorInfo>::cast(structure);
325 v8::AccessorNameGetterCallback call_fun = 327 v8::AccessorNameGetterCallback call_fun =
326 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); 328 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter());
327 if (call_fun == NULL) return isolate->factory()->undefined_value(); 329 if (call_fun == NULL) return isolate->factory()->undefined_value();
328 330
329 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); 331 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name));
330 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); 332 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
331 v8::Handle<v8::Value> result = 333 v8::Handle<v8::Value> result =
332 args.Call(call_fun, v8::Utils::ToLocal(name)); 334 args.Call(call_fun, v8::Utils::ToLocal(name));
333 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 335 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
334 if (result.IsEmpty()) { 336 if (result.IsEmpty()) {
335 return isolate->factory()->undefined_value(); 337 return ReadAbsentProperty(isolate, receiver, name, language_mode);
336 } 338 }
337 Handle<Object> return_value = v8::Utils::OpenHandle(*result); 339 Handle<Object> return_value = v8::Utils::OpenHandle(*result);
338 return_value->VerifyApiCallResultType(); 340 return_value->VerifyApiCallResultType();
339 // Rebox handle before return. 341 // Rebox handle before return.
340 return handle(*return_value, isolate); 342 return handle(*return_value, isolate);
341 } 343 }
342 344
343 // __defineGetter__ callback 345 // __defineGetter__ callback
344 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(), 346 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(),
345 isolate); 347 isolate);
346 if (getter->IsSpecFunction()) { 348 if (getter->IsSpecFunction()) {
347 // TODO(rossberg): nicer would be to cast to some JSCallable here... 349 // TODO(rossberg): nicer would be to cast to some JSCallable here...
348 return Object::GetPropertyWithDefinedGetter( 350 return Object::GetPropertyWithDefinedGetter(
349 receiver, Handle<JSReceiver>::cast(getter)); 351 receiver, Handle<JSReceiver>::cast(getter));
350 } 352 }
351 // Getter is not a function. 353 // Getter is not a function.
352 return isolate->factory()->undefined_value(); 354 return ReadAbsentProperty(isolate, receiver, it->GetName(), language_mode);
353 } 355 }
354 356
355 357
356 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, 358 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate,
357 Handle<AccessorInfo> info, 359 Handle<AccessorInfo> info,
358 Handle<Map> map) { 360 Handle<Map> map) {
359 if (!info->HasExpectedReceiverType()) return true; 361 if (!info->HasExpectedReceiverType()) return true;
360 if (!map->IsJSObjectMap()) return false; 362 if (!map->IsJSObjectMap()) return false;
361 return FunctionTemplateInfo::cast(info->expected_receiver_type()) 363 return FunctionTemplateInfo::cast(info->expected_receiver_type())
362 ->IsTemplateFor(*map); 364 ->IsTemplateFor(*map);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 } 482 }
481 } else if (it->state() == LookupIterator::INTERCEPTOR) { 483 } else if (it->state() == LookupIterator::INTERCEPTOR) {
482 if (it->GetInterceptor()->all_can_read()) return true; 484 if (it->GetInterceptor()->all_can_read()) return true;
483 } 485 }
484 } 486 }
485 return false; 487 return false;
486 } 488 }
487 489
488 490
489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( 491 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
490 LookupIterator* it) { 492 LookupIterator* it, LanguageMode language_mode) {
491 Handle<JSObject> checked = it->GetHolder<JSObject>(); 493 Handle<JSObject> checked = it->GetHolder<JSObject>();
492 while (FindAllCanReadHolder(it)) { 494 while (FindAllCanReadHolder(it)) {
493 if (it->state() == LookupIterator::ACCESSOR) { 495 if (it->state() == LookupIterator::ACCESSOR) {
494 return GetPropertyWithAccessor(it); 496 return GetPropertyWithAccessor(it, language_mode);
495 } 497 }
496 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 498 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
497 auto result = GetPropertyWithInterceptor(it); 499 auto result = GetPropertyWithInterceptor(it);
498 if (it->isolate()->has_scheduled_exception()) break; 500 if (it->isolate()->has_scheduled_exception()) break;
499 if (!result.is_null()) return result; 501 if (!result.is_null()) return result;
500 } 502 }
501 it->isolate()->ReportFailedAccessCheck(checked); 503 it->isolate()->ReportFailedAccessCheck(checked);
502 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 504 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
503 return it->factory()->undefined_value(); 505 return it->factory()->undefined_value();
504 } 506 }
(...skipping 2746 matching lines...) Expand 10 before | Expand all | Expand 10 after
3251 if (found) return result; 3253 if (found) return result;
3252 return SetDataProperty(&own_lookup, value); 3254 return SetDataProperty(&own_lookup, value);
3253 } 3255 }
3254 } 3256 }
3255 3257
3256 UNREACHABLE(); 3258 UNREACHABLE();
3257 return MaybeHandle<Object>(); 3259 return MaybeHandle<Object>();
3258 } 3260 }
3259 3261
3260 3262
3263 MaybeHandle<Object> Object::ReadAbsentProperty(LookupIterator* it,
3264 LanguageMode language_mode) {
3265 return ReadAbsentProperty(it->isolate(), it->GetReceiver(), it->GetName(),
3266 language_mode);
3267 }
3268
3269 MaybeHandle<Object> Object::ReadAbsentProperty(Isolate* isolate,
3270 Handle<Object> receiver,
3271 Handle<Object> name,
3272 LanguageMode language_mode) {
3273 if (is_strong(language_mode)) {
3274 THROW_NEW_ERROR(
3275 isolate,
3276 NewTypeError(MessageTemplate::kStrongPropertyAccess, name, receiver),
3277 Object);
3278 }
3279 return isolate->factory()->undefined_value();
3280 }
3281
3282
3261 MaybeHandle<Object> Object::WriteToReadOnlyProperty( 3283 MaybeHandle<Object> Object::WriteToReadOnlyProperty(
3262 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) { 3284 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) {
3263 return WriteToReadOnlyProperty(it->isolate(), it->GetReceiver(), it->name(), 3285 return WriteToReadOnlyProperty(it->isolate(), it->GetReceiver(), it->name(),
3264 value, language_mode); 3286 value, language_mode);
3265 } 3287 }
3266 3288
3267 3289
3268 MaybeHandle<Object> Object::WriteToReadOnlyProperty( 3290 MaybeHandle<Object> Object::WriteToReadOnlyProperty(
3269 Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 3291 Isolate* isolate, Handle<Object> receiver, Handle<Object> name,
3270 Handle<Object> value, LanguageMode language_mode) { 3292 Handle<Object> value, LanguageMode language_mode) {
(...skipping 13704 matching lines...) Expand 10 before | Expand all | Expand 10 after
16975 Handle<Object> new_value) { 16997 Handle<Object> new_value) {
16976 if (cell->value() != *new_value) { 16998 if (cell->value() != *new_value) {
16977 cell->set_value(*new_value); 16999 cell->set_value(*new_value);
16978 Isolate* isolate = cell->GetIsolate(); 17000 Isolate* isolate = cell->GetIsolate();
16979 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17001 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16980 isolate, DependentCode::kPropertyCellChangedGroup); 17002 isolate, DependentCode::kPropertyCellChangedGroup);
16981 } 17003 }
16982 } 17004 }
16983 } // namespace internal 17005 } // namespace internal
16984 } // namespace v8 17006 } // namespace v8
OLDNEW
« src/lookup.h ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698