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

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: fix arm64 port 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, Strength strength) {
131 for (; it->IsFound(); it->Next()) { 131 for (; it->IsFound(); it->Next()) {
132 switch (it->state()) { 132 switch (it->state()) {
133 case LookupIterator::NOT_FOUND: 133 case LookupIterator::NOT_FOUND:
134 case LookupIterator::TRANSITION: 134 case LookupIterator::TRANSITION:
135 UNREACHABLE(); 135 UNREACHABLE();
136 case LookupIterator::JSPROXY: 136 case LookupIterator::JSPROXY:
137 return JSProxy::GetPropertyWithHandler( 137 return JSProxy::GetPropertyWithHandler(
138 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName()); 138 it->GetHolder<JSProxy>(), it->GetReceiver(), it->GetName());
139 case LookupIterator::INTERCEPTOR: { 139 case LookupIterator::INTERCEPTOR: {
140 MaybeHandle<Object> maybe_result = 140 MaybeHandle<Object> maybe_result =
141 JSObject::GetPropertyWithInterceptor(it); 141 JSObject::GetPropertyWithInterceptor(it);
142 if (!maybe_result.is_null()) return maybe_result; 142 if (!maybe_result.is_null()) return maybe_result;
143 if (it->isolate()->has_pending_exception()) return maybe_result; 143 if (it->isolate()->has_pending_exception()) return maybe_result;
144 break; 144 break;
145 } 145 }
146 case LookupIterator::ACCESS_CHECK: 146 case LookupIterator::ACCESS_CHECK:
147 if (it->HasAccess()) break; 147 if (it->HasAccess()) break;
148 return JSObject::GetPropertyWithFailedAccessCheck(it); 148 return JSObject::GetPropertyWithFailedAccessCheck(it, strength);
149 case LookupIterator::ACCESSOR: 149 case LookupIterator::ACCESSOR:
150 return GetPropertyWithAccessor(it); 150 return GetPropertyWithAccessor(it, strength);
151 case LookupIterator::INTEGER_INDEXED_EXOTIC: 151 case LookupIterator::INTEGER_INDEXED_EXOTIC:
152 return it->factory()->undefined_value(); 152 return ReadAbsentProperty(it, strength);
153 case LookupIterator::DATA: 153 case LookupIterator::DATA:
154 return it->GetDataValue(); 154 return it->GetDataValue();
155 } 155 }
156 } 156 }
157 return it->factory()->undefined_value(); 157 return ReadAbsentProperty(it, strength);
158 } 158 }
159 159
160 160
161 Handle<Object> JSReceiver::GetDataProperty(Handle<JSReceiver> object, 161 Handle<Object> JSReceiver::GetDataProperty(Handle<JSReceiver> object,
162 Handle<Name> name) { 162 Handle<Name> name) {
163 LookupIterator it(object, name, 163 LookupIterator it(object, name,
164 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 164 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
165 return GetDataProperty(&it); 165 return GetDataProperty(&it);
166 } 166 }
167 167
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 295
296 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 296 // TODO(rossberg): adjust once there is a story for symbols vs proxies.
297 if (name->IsSymbol()) return isolate->factory()->undefined_value(); 297 if (name->IsSymbol()) return isolate->factory()->undefined_value();
298 298
299 Handle<Object> args[] = { receiver, name }; 299 Handle<Object> args[] = { receiver, name };
300 return CallTrap( 300 return CallTrap(
301 proxy, "get", isolate->derived_get_trap(), arraysize(args), args); 301 proxy, "get", isolate->derived_get_trap(), arraysize(args), args);
302 } 302 }
303 303
304 304
305 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) { 305 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it,
306 Strength strength) {
306 Isolate* isolate = it->isolate(); 307 Isolate* isolate = it->isolate();
307 Handle<Object> structure = it->GetAccessors(); 308 Handle<Object> structure = it->GetAccessors();
308 Handle<Object> receiver = it->GetReceiver(); 309 Handle<Object> receiver = it->GetReceiver();
309 310
310 DCHECK(!structure->IsForeign()); 311 DCHECK(!structure->IsForeign());
311 // api style callbacks. 312 // api style callbacks.
312 if (structure->IsAccessorInfo()) { 313 if (structure->IsAccessorInfo()) {
313 Handle<JSObject> holder = it->GetHolder<JSObject>(); 314 Handle<JSObject> holder = it->GetHolder<JSObject>();
314 Handle<Name> name = it->GetName(); 315 Handle<Name> name = it->GetName();
315 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); 316 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
316 if (!info->IsCompatibleReceiver(*receiver)) { 317 if (!info->IsCompatibleReceiver(*receiver)) {
317 THROW_NEW_ERROR(isolate, 318 THROW_NEW_ERROR(isolate,
318 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, 319 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver,
319 name, receiver), 320 name, receiver),
320 Object); 321 Object);
321 } 322 }
322 323
323 Handle<ExecutableAccessorInfo> data = 324 Handle<ExecutableAccessorInfo> data =
324 Handle<ExecutableAccessorInfo>::cast(structure); 325 Handle<ExecutableAccessorInfo>::cast(structure);
325 v8::AccessorNameGetterCallback call_fun = 326 v8::AccessorNameGetterCallback call_fun =
326 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); 327 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter());
327 if (call_fun == NULL) return isolate->factory()->undefined_value(); 328 if (call_fun == NULL) return isolate->factory()->undefined_value();
328 329
329 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); 330 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name));
330 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); 331 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
331 v8::Handle<v8::Value> result = 332 v8::Handle<v8::Value> result =
332 args.Call(call_fun, v8::Utils::ToLocal(name)); 333 args.Call(call_fun, v8::Utils::ToLocal(name));
333 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 334 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
334 if (result.IsEmpty()) { 335 if (result.IsEmpty()) {
335 return isolate->factory()->undefined_value(); 336 return ReadAbsentProperty(isolate, receiver, name, strength);
336 } 337 }
337 Handle<Object> return_value = v8::Utils::OpenHandle(*result); 338 Handle<Object> return_value = v8::Utils::OpenHandle(*result);
338 return_value->VerifyApiCallResultType(); 339 return_value->VerifyApiCallResultType();
339 // Rebox handle before return. 340 // Rebox handle before return.
340 return handle(*return_value, isolate); 341 return handle(*return_value, isolate);
341 } 342 }
342 343
343 // __defineGetter__ callback 344 // __defineGetter__ callback
344 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(), 345 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(),
345 isolate); 346 isolate);
346 if (getter->IsSpecFunction()) { 347 if (getter->IsSpecFunction()) {
347 // TODO(rossberg): nicer would be to cast to some JSCallable here... 348 // TODO(rossberg): nicer would be to cast to some JSCallable here...
348 return Object::GetPropertyWithDefinedGetter( 349 return Object::GetPropertyWithDefinedGetter(
349 receiver, Handle<JSReceiver>::cast(getter)); 350 receiver, Handle<JSReceiver>::cast(getter));
350 } 351 }
351 // Getter is not a function. 352 // Getter is not a function.
352 return isolate->factory()->undefined_value(); 353 return ReadAbsentProperty(isolate, receiver, it->GetName(), strength);
353 } 354 }
354 355
355 356
356 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, 357 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate,
357 Handle<AccessorInfo> info, 358 Handle<AccessorInfo> info,
358 Handle<Map> map) { 359 Handle<Map> map) {
359 if (!info->HasExpectedReceiverType()) return true; 360 if (!info->HasExpectedReceiverType()) return true;
360 if (!map->IsJSObjectMap()) return false; 361 if (!map->IsJSObjectMap()) return false;
361 return FunctionTemplateInfo::cast(info->expected_receiver_type()) 362 return FunctionTemplateInfo::cast(info->expected_receiver_type())
362 ->IsTemplateFor(*map); 363 ->IsTemplateFor(*map);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 } 481 }
481 } else if (it->state() == LookupIterator::INTERCEPTOR) { 482 } else if (it->state() == LookupIterator::INTERCEPTOR) {
482 if (it->GetInterceptor()->all_can_read()) return true; 483 if (it->GetInterceptor()->all_can_read()) return true;
483 } 484 }
484 } 485 }
485 return false; 486 return false;
486 } 487 }
487 488
488 489
489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( 490 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
490 LookupIterator* it) { 491 LookupIterator* it, Strength strength) {
491 Handle<JSObject> checked = it->GetHolder<JSObject>(); 492 Handle<JSObject> checked = it->GetHolder<JSObject>();
492 while (FindAllCanReadHolder(it)) { 493 while (FindAllCanReadHolder(it)) {
493 if (it->state() == LookupIterator::ACCESSOR) { 494 if (it->state() == LookupIterator::ACCESSOR) {
494 return GetPropertyWithAccessor(it); 495 return GetPropertyWithAccessor(it, strength);
495 } 496 }
496 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 497 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
497 auto result = GetPropertyWithInterceptor(it); 498 auto result = GetPropertyWithInterceptor(it);
498 if (it->isolate()->has_scheduled_exception()) break; 499 if (it->isolate()->has_scheduled_exception()) break;
499 if (!result.is_null()) return result; 500 if (!result.is_null()) return result;
500 } 501 }
501 it->isolate()->ReportFailedAccessCheck(checked); 502 it->isolate()->ReportFailedAccessCheck(checked);
502 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 503 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
503 return it->factory()->undefined_value(); 504 return it->factory()->undefined_value();
504 } 505 }
(...skipping 2746 matching lines...) Expand 10 before | Expand all | Expand 10 after
3251 if (found) return result; 3252 if (found) return result;
3252 return SetDataProperty(&own_lookup, value); 3253 return SetDataProperty(&own_lookup, value);
3253 } 3254 }
3254 } 3255 }
3255 3256
3256 UNREACHABLE(); 3257 UNREACHABLE();
3257 return MaybeHandle<Object>(); 3258 return MaybeHandle<Object>();
3258 } 3259 }
3259 3260
3260 3261
3262 MaybeHandle<Object> Object::ReadAbsentProperty(LookupIterator* it,
3263 Strength strength) {
3264 return ReadAbsentProperty(it->isolate(), it->GetReceiver(), it->GetName(),
3265 strength);
3266 }
3267
3268 MaybeHandle<Object> Object::ReadAbsentProperty(Isolate* isolate,
3269 Handle<Object> receiver,
3270 Handle<Object> name,
3271 Strength strength) {
3272 if (is_strong(strength)) {
3273 THROW_NEW_ERROR(
3274 isolate,
3275 NewTypeError(MessageTemplate::kStrongPropertyAccess, receiver, name),
3276 Object);
3277 }
3278 return isolate->factory()->undefined_value();
3279 }
3280
3281
3261 MaybeHandle<Object> Object::WriteToReadOnlyProperty( 3282 MaybeHandle<Object> Object::WriteToReadOnlyProperty(
3262 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) { 3283 LookupIterator* it, Handle<Object> value, LanguageMode language_mode) {
3263 return WriteToReadOnlyProperty(it->isolate(), it->GetReceiver(), it->name(), 3284 return WriteToReadOnlyProperty(it->isolate(), it->GetReceiver(), it->name(),
3264 value, language_mode); 3285 value, language_mode);
3265 } 3286 }
3266 3287
3267 3288
3268 MaybeHandle<Object> Object::WriteToReadOnlyProperty( 3289 MaybeHandle<Object> Object::WriteToReadOnlyProperty(
3269 Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 3290 Isolate* isolate, Handle<Object> receiver, Handle<Object> name,
3270 Handle<Object> value, LanguageMode language_mode) { 3291 Handle<Object> value, LanguageMode language_mode) {
(...skipping 13837 matching lines...) Expand 10 before | Expand all | Expand 10 after
17108 Handle<Object> new_value) { 17129 Handle<Object> new_value) {
17109 if (cell->value() != *new_value) { 17130 if (cell->value() != *new_value) {
17110 cell->set_value(*new_value); 17131 cell->set_value(*new_value);
17111 Isolate* isolate = cell->GetIsolate(); 17132 Isolate* isolate = cell->GetIsolate();
17112 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17133 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17113 isolate, DependentCode::kPropertyCellChangedGroup); 17134 isolate, DependentCode::kPropertyCellChangedGroup);
17114 } 17135 }
17115 } 17136 }
17116 } // namespace internal 17137 } // namespace internal
17117 } // namespace v8 17138 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | test/mjsunit/strong/load-element.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698