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

Side by Side Diff: src/objects.cc

Issue 1148583002: Simplify GetProperty helpers to ease element support (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { 129 MaybeHandle<Object> Object::GetProperty(LookupIterator* it) {
130 for (; it->IsFound(); it->Next()) { 130 for (; it->IsFound(); it->Next()) {
131 switch (it->state()) { 131 switch (it->state()) {
132 case LookupIterator::NOT_FOUND: 132 case LookupIterator::NOT_FOUND:
133 case LookupIterator::TRANSITION: 133 case LookupIterator::TRANSITION:
134 UNREACHABLE(); 134 UNREACHABLE();
135 case LookupIterator::JSPROXY: 135 case LookupIterator::JSPROXY:
136 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(), 136 return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(),
137 it->GetReceiver(), it->name()); 137 it->GetReceiver(), it->name());
138 case LookupIterator::INTERCEPTOR: { 138 case LookupIterator::INTERCEPTOR: {
139 MaybeHandle<Object> maybe_result = JSObject::GetPropertyWithInterceptor( 139 MaybeHandle<Object> maybe_result =
140 it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); 140 JSObject::GetPropertyWithInterceptor(it);
141 if (!maybe_result.is_null()) return maybe_result; 141 if (!maybe_result.is_null()) return maybe_result;
142 if (it->isolate()->has_pending_exception()) return maybe_result; 142 if (it->isolate()->has_pending_exception()) return maybe_result;
143 break; 143 break;
144 } 144 }
145 case LookupIterator::ACCESS_CHECK: 145 case LookupIterator::ACCESS_CHECK:
146 if (it->HasAccess()) break; 146 if (it->HasAccess()) break;
147 return JSObject::GetPropertyWithFailedAccessCheck(it); 147 return JSObject::GetPropertyWithFailedAccessCheck(it);
148 case LookupIterator::ACCESSOR: 148 case LookupIterator::ACCESSOR:
149 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), 149 return GetPropertyWithAccessor(it);
150 it->GetHolder<JSObject>(),
151 it->GetAccessors());
152 case LookupIterator::INTEGER_INDEXED_EXOTIC: 150 case LookupIterator::INTEGER_INDEXED_EXOTIC:
153 return it->factory()->undefined_value(); 151 return it->factory()->undefined_value();
154 case LookupIterator::DATA: 152 case LookupIterator::DATA:
155 return it->GetDataValue(); 153 return it->GetDataValue();
156 } 154 }
157 } 155 }
158 return it->factory()->undefined_value(); 156 return it->factory()->undefined_value();
159 } 157 }
160 158
161 159
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 294
297 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 295 // TODO(rossberg): adjust once there is a story for symbols vs proxies.
298 if (name->IsSymbol()) return isolate->factory()->undefined_value(); 296 if (name->IsSymbol()) return isolate->factory()->undefined_value();
299 297
300 Handle<Object> args[] = { receiver, name }; 298 Handle<Object> args[] = { receiver, name };
301 return CallTrap( 299 return CallTrap(
302 proxy, "get", isolate->derived_get_trap(), arraysize(args), args); 300 proxy, "get", isolate->derived_get_trap(), arraysize(args), args);
303 } 301 }
304 302
305 303
306 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, 304 MaybeHandle<Object> Object::GetPropertyWithAccessor(LookupIterator* it) {
307 Handle<Name> name, 305 Handle<Object> structure = it->GetAccessors();
308 Handle<JSObject> holder, 306 Handle<Object> receiver = it->GetReceiver();
309 Handle<Object> structure) { 307
310 Isolate* isolate = name->GetIsolate();
311 DCHECK(!structure->IsForeign()); 308 DCHECK(!structure->IsForeign());
312 // api style callbacks. 309 // api style callbacks.
313 if (structure->IsAccessorInfo()) { 310 if (structure->IsAccessorInfo()) {
311 Handle<JSObject> holder = it->GetHolder<JSObject>();
312 Handle<Name> name = it->name();
314 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); 313 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure);
315 if (!info->IsCompatibleReceiver(*receiver)) { 314 if (!info->IsCompatibleReceiver(*receiver)) {
316 THROW_NEW_ERROR(isolate, 315 THROW_NEW_ERROR(it->isolate(),
Jakob Kummerow 2015/05/20 09:06:50 nit: consider "Isolate* isolate = it->isolate();"
317 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, 316 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver,
318 name, receiver), 317 name, receiver),
319 Object); 318 Object);
320 } 319 }
321 320
322 Handle<ExecutableAccessorInfo> data = 321 Handle<ExecutableAccessorInfo> data =
323 Handle<ExecutableAccessorInfo>::cast(structure); 322 Handle<ExecutableAccessorInfo>::cast(structure);
324 v8::AccessorNameGetterCallback call_fun = 323 v8::AccessorNameGetterCallback call_fun =
325 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); 324 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter());
326 if (call_fun == NULL) return isolate->factory()->undefined_value(); 325 if (call_fun == NULL) return it->isolate()->factory()->undefined_value();
327 326
328 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); 327 LOG(it->isolate(), ApiNamedPropertyAccess("load", *holder, *name));
329 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); 328 PropertyCallbackArguments args(it->isolate(), data->data(), *receiver,
329 *holder);
330 v8::Handle<v8::Value> result = 330 v8::Handle<v8::Value> result =
331 args.Call(call_fun, v8::Utils::ToLocal(name)); 331 args.Call(call_fun, v8::Utils::ToLocal(name));
332 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 332 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
333 if (result.IsEmpty()) { 333 if (result.IsEmpty()) {
334 return isolate->factory()->undefined_value(); 334 return it->isolate()->factory()->undefined_value();
335 } 335 }
336 Handle<Object> return_value = v8::Utils::OpenHandle(*result); 336 Handle<Object> return_value = v8::Utils::OpenHandle(*result);
337 return_value->VerifyApiCallResultType(); 337 return_value->VerifyApiCallResultType();
338 // Rebox handle before return. 338 // Rebox handle before return.
339 return handle(*return_value, isolate); 339 return handle(*return_value, it->isolate());
340 } 340 }
341 341
342 // __defineGetter__ callback 342 // __defineGetter__ callback
343 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(), 343 Handle<Object> getter(Handle<AccessorPair>::cast(structure)->getter(),
344 isolate); 344 it->isolate());
345 if (getter->IsSpecFunction()) { 345 if (getter->IsSpecFunction()) {
346 // TODO(rossberg): nicer would be to cast to some JSCallable here... 346 // TODO(rossberg): nicer would be to cast to some JSCallable here...
347 return Object::GetPropertyWithDefinedGetter( 347 return Object::GetPropertyWithDefinedGetter(
348 receiver, Handle<JSReceiver>::cast(getter)); 348 receiver, Handle<JSReceiver>::cast(getter));
349 } 349 }
350 // Getter is not a function. 350 // Getter is not a function.
351 return isolate->factory()->undefined_value(); 351 return it->isolate()->factory()->undefined_value();
352 } 352 }
353 353
354 354
355 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate, 355 bool AccessorInfo::IsCompatibleReceiverMap(Isolate* isolate,
356 Handle<AccessorInfo> info, 356 Handle<AccessorInfo> info,
357 Handle<Map> map) { 357 Handle<Map> map) {
358 if (!info->HasExpectedReceiverType()) return true; 358 if (!info->HasExpectedReceiverType()) return true;
359 if (!map->IsJSObjectMap()) return false; 359 if (!map->IsJSObjectMap()) return false;
360 return FunctionTemplateInfo::cast(info->expected_receiver_type()) 360 return FunctionTemplateInfo::cast(info->expected_receiver_type())
361 ->IsTemplateFor(*map); 361 ->IsTemplateFor(*map);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 } 484 }
485 return false; 485 return false;
486 } 486 }
487 487
488 488
489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( 489 MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
490 LookupIterator* it) { 490 LookupIterator* it) {
491 Handle<JSObject> checked = it->GetHolder<JSObject>(); 491 Handle<JSObject> checked = it->GetHolder<JSObject>();
492 while (FindAllCanReadHolder(it)) { 492 while (FindAllCanReadHolder(it)) {
493 if (it->state() == LookupIterator::ACCESSOR) { 493 if (it->state() == LookupIterator::ACCESSOR) {
494 return GetPropertyWithAccessor(it->GetReceiver(), it->name(), 494 return GetPropertyWithAccessor(it);
495 it->GetHolder<JSObject>(),
496 it->GetAccessors());
497 } 495 }
498 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 496 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
499 auto receiver = Handle<JSObject>::cast(it->GetReceiver()); 497 auto result = GetPropertyWithInterceptor(it);
500 auto result = GetPropertyWithInterceptor(it->GetHolder<JSObject>(),
501 receiver, it->name());
502 if (it->isolate()->has_scheduled_exception()) break; 498 if (it->isolate()->has_scheduled_exception()) break;
503 if (!result.is_null()) return result; 499 if (!result.is_null()) return result;
504 } 500 }
505 it->isolate()->ReportFailedAccessCheck(checked); 501 it->isolate()->ReportFailedAccessCheck(checked);
506 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 502 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
507 return it->factory()->undefined_value(); 503 return it->factory()->undefined_value();
508 } 504 }
509 505
510 506
511 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( 507 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
(...skipping 12241 matching lines...) Expand 10 before | Expand all | Expand 10 after
12753 DCHECK(!structure->IsForeign()); 12749 DCHECK(!structure->IsForeign());
12754 // api style callbacks. 12750 // api style callbacks.
12755 if (structure->IsExecutableAccessorInfo()) { 12751 if (structure->IsExecutableAccessorInfo()) {
12756 Handle<ExecutableAccessorInfo> data = 12752 Handle<ExecutableAccessorInfo> data =
12757 Handle<ExecutableAccessorInfo>::cast(structure); 12753 Handle<ExecutableAccessorInfo>::cast(structure);
12758 Object* fun_obj = data->getter(); 12754 Object* fun_obj = data->getter();
12759 v8::AccessorNameGetterCallback call_fun = 12755 v8::AccessorNameGetterCallback call_fun =
12760 v8::ToCData<v8::AccessorNameGetterCallback>(fun_obj); 12756 v8::ToCData<v8::AccessorNameGetterCallback>(fun_obj);
12761 if (call_fun == NULL) return isolate->factory()->undefined_value(); 12757 if (call_fun == NULL) return isolate->factory()->undefined_value();
12762 Handle<JSObject> holder_handle = Handle<JSObject>::cast(holder); 12758 Handle<JSObject> holder_handle = Handle<JSObject>::cast(holder);
12763 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); 12759 Handle<String> key = isolate->factory()->Uint32ToString(index);
12764 Handle<String> key = isolate->factory()->NumberToString(number);
12765 LOG(isolate, ApiNamedPropertyAccess("load", *holder_handle, *key)); 12760 LOG(isolate, ApiNamedPropertyAccess("load", *holder_handle, *key));
12766 PropertyCallbackArguments 12761 PropertyCallbackArguments
12767 args(isolate, data->data(), *receiver, *holder_handle); 12762 args(isolate, data->data(), *receiver, *holder_handle);
12768 v8::Handle<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(key)); 12763 v8::Handle<v8::Value> result = args.Call(call_fun, v8::Utils::ToLocal(key));
12769 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 12764 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
12770 if (result.IsEmpty()) return isolate->factory()->undefined_value(); 12765 if (result.IsEmpty()) return isolate->factory()->undefined_value();
12771 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 12766 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
12772 result_internal->VerifyApiCallResultType(); 12767 result_internal->VerifyApiCallResultType();
12773 // Rebox handle before return. 12768 // Rebox handle before return.
12774 return handle(*result_internal, isolate); 12769 return handle(*result_internal, isolate);
(...skipping 27 matching lines...) Expand all
12802 DCHECK(!value->IsTheHole()); 12797 DCHECK(!value->IsTheHole());
12803 DCHECK(!structure->IsForeign()); 12798 DCHECK(!structure->IsForeign());
12804 if (structure->IsExecutableAccessorInfo()) { 12799 if (structure->IsExecutableAccessorInfo()) {
12805 // api style callbacks 12800 // api style callbacks
12806 Handle<ExecutableAccessorInfo> data = 12801 Handle<ExecutableAccessorInfo> data =
12807 Handle<ExecutableAccessorInfo>::cast(structure); 12802 Handle<ExecutableAccessorInfo>::cast(structure);
12808 Object* call_obj = data->setter(); 12803 Object* call_obj = data->setter();
12809 v8::AccessorNameSetterCallback call_fun = 12804 v8::AccessorNameSetterCallback call_fun =
12810 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj); 12805 v8::ToCData<v8::AccessorNameSetterCallback>(call_obj);
12811 if (call_fun == NULL) return value; 12806 if (call_fun == NULL) return value;
12812 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); 12807 Handle<String> key(isolate->factory()->Uint32ToString(index));
12813 Handle<String> key(isolate->factory()->NumberToString(number));
12814 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *key)); 12808 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *key));
12815 PropertyCallbackArguments 12809 PropertyCallbackArguments
12816 args(isolate, data->data(), *object, *holder); 12810 args(isolate, data->data(), *object, *holder);
12817 args.Call(call_fun, 12811 args.Call(call_fun,
12818 v8::Utils::ToLocal(key), 12812 v8::Utils::ToLocal(key),
12819 v8::Utils::ToLocal(value)); 12813 v8::Utils::ToLocal(value));
12820 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 12814 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
12821 return value; 12815 return value;
12822 } 12816 }
12823 12817
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
14019 InterceptorInfo* JSObject::GetIndexedInterceptor() { 14013 InterceptorInfo* JSObject::GetIndexedInterceptor() {
14020 DCHECK(map()->has_indexed_interceptor()); 14014 DCHECK(map()->has_indexed_interceptor());
14021 JSFunction* constructor = JSFunction::cast(map()->GetConstructor()); 14015 JSFunction* constructor = JSFunction::cast(map()->GetConstructor());
14022 DCHECK(constructor->shared()->IsApiFunction()); 14016 DCHECK(constructor->shared()->IsApiFunction());
14023 Object* result = 14017 Object* result =
14024 constructor->shared()->get_api_func_data()->indexed_property_handler(); 14018 constructor->shared()->get_api_func_data()->indexed_property_handler();
14025 return InterceptorInfo::cast(result); 14019 return InterceptorInfo::cast(result);
14026 } 14020 }
14027 14021
14028 14022
14029 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( 14023 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it) {
14030 Handle<JSObject> holder, 14024 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
14031 Handle<Object> receiver, 14025 Handle<InterceptorInfo> interceptor = it->GetInterceptor();
14032 Handle<Name> name) { 14026 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>();
14033 Isolate* isolate = holder->GetIsolate();
14034 14027
14035 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); 14028 Handle<Name> name = it->name();
14036 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); 14029 Handle<JSObject> holder = it->GetHolder<JSObject>();
14037 14030
14038 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { 14031 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
14039 return MaybeHandle<Object>(); 14032 return MaybeHandle<Object>();
14040 } 14033 }
14041 14034
14042 v8::GenericNamedPropertyGetterCallback getter = 14035 v8::GenericNamedPropertyGetterCallback getter =
14043 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 14036 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
14044 interceptor->getter()); 14037 interceptor->getter());
14045 LOG(isolate, 14038 LOG(it->isolate(),
14046 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); 14039 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name));
14047 PropertyCallbackArguments 14040 PropertyCallbackArguments args(it->isolate(), interceptor->data(),
14048 args(isolate, interceptor->data(), *receiver, *holder); 14041 *it->GetReceiver(), *holder);
14049 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); 14042 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name));
14050 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 14043 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
14051 if (result.IsEmpty()) return MaybeHandle<Object>(); 14044 if (result.IsEmpty()) return MaybeHandle<Object>();
14052 14045
14053 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 14046 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
14054 result_internal->VerifyApiCallResultType(); 14047 result_internal->VerifyApiCallResultType();
14055 // Rebox handle before return 14048 // Rebox handle before return
14056 return handle(*result_internal, isolate); 14049 return handle(*result_internal, it->isolate());
14057 } 14050 }
14058 14051
14059 14052
14060 // Compute the property keys from the interceptor. 14053 // Compute the property keys from the interceptor.
14061 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( 14054 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor(
14062 Handle<JSObject> object, Handle<JSReceiver> receiver) { 14055 Handle<JSObject> object, Handle<JSReceiver> receiver) {
14063 Isolate* isolate = receiver->GetIsolate(); 14056 Isolate* isolate = receiver->GetIsolate();
14064 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 14057 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
14065 PropertyCallbackArguments 14058 PropertyCallbackArguments
14066 args(isolate, interceptor->data(), *receiver, *object); 14059 args(isolate, interceptor->data(), *receiver, *object);
(...skipping 3183 matching lines...) Expand 10 before | Expand all | Expand 10 after
17250 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, 17243 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell,
17251 Handle<Object> new_value) { 17244 Handle<Object> new_value) {
17252 if (cell->value() != *new_value) { 17245 if (cell->value() != *new_value) {
17253 cell->set_value(*new_value); 17246 cell->set_value(*new_value);
17254 Isolate* isolate = cell->GetIsolate(); 17247 Isolate* isolate = cell->GetIsolate();
17255 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17248 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17256 isolate, DependentCode::kPropertyCellChangedGroup); 17249 isolate, DependentCode::kPropertyCellChangedGroup);
17257 } 17250 }
17258 } 17251 }
17259 } } // namespace v8::internal 17252 } } // namespace v8::internal
OLDNEW
« src/lookup.cc ('K') | « src/objects.h ('k') | src/runtime/runtime-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698