Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
| 9 #include "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 2889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2900 UNREACHABLE(); | 2900 UNREACHABLE(); |
| 2901 } | 2901 } |
| 2902 } | 2902 } |
| 2903 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); | 2903 if (new_map->NumberOfOwnDescriptors() != old_nof) return MaybeHandle<Map>(); |
| 2904 return handle(new_map); | 2904 return handle(new_map); |
| 2905 } | 2905 } |
| 2906 | 2906 |
| 2907 | 2907 |
| 2908 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, | 2908 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(LookupIterator* it, |
| 2909 Handle<Object> value) { | 2909 Handle<Object> value) { |
| 2910 // TODO(rossberg): Support symbols in the API. | 2910 Handle<Name> name = it->name(); |
| 2911 if (it->name()->IsSymbol()) return value; | |
| 2912 | |
| 2913 Handle<String> name_string = Handle<String>::cast(it->name()); | |
| 2914 Handle<JSObject> holder = it->GetHolder<JSObject>(); | 2911 Handle<JSObject> holder = it->GetHolder<JSObject>(); |
| 2915 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 2912 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 2916 if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>(); | 2913 if (interceptor->setter()->IsUndefined() || |
| 2914 (name->IsSymbol() && !interceptor->can_intercept_symbols())) { | |
| 2915 return MaybeHandle<Object>(); | |
| 2916 } | |
| 2917 | 2917 |
| 2918 LOG(it->isolate(), | 2918 LOG(it->isolate(), |
| 2919 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name_string)); | 2919 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); |
| 2920 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, | 2920 PropertyCallbackArguments args(it->isolate(), interceptor->data(), *holder, |
| 2921 *holder); | 2921 *holder); |
| 2922 v8::NamedPropertySetterCallback setter = | 2922 v8::GenericNamedPropertySetterCallback setter = |
| 2923 v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); | 2923 v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
| 2924 interceptor->setter()); | |
| 2924 v8::Handle<v8::Value> result = args.Call( | 2925 v8::Handle<v8::Value> result = args.Call( |
| 2925 setter, v8::Utils::ToLocal(name_string), v8::Utils::ToLocal(value)); | 2926 setter, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); |
| 2926 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); | 2927 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
| 2927 if (!result.IsEmpty()) return value; | 2928 if (!result.IsEmpty()) return value; |
| 2928 | 2929 |
| 2929 return MaybeHandle<Object>(); | 2930 return MaybeHandle<Object>(); |
| 2930 } | 2931 } |
| 2931 | 2932 |
| 2932 | 2933 |
| 2933 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, | 2934 MaybeHandle<Object> Object::SetProperty(Handle<Object> object, |
| 2934 Handle<Name> name, Handle<Object> value, | 2935 Handle<Name> name, Handle<Object> value, |
| 2935 StrictMode strict_mode, | 2936 StrictMode strict_mode, |
| (...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4238 } | 4239 } |
| 4239 | 4240 |
| 4240 return value; | 4241 return value; |
| 4241 } | 4242 } |
| 4242 | 4243 |
| 4243 | 4244 |
| 4244 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( | 4245 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
| 4245 Handle<JSObject> holder, | 4246 Handle<JSObject> holder, |
| 4246 Handle<Object> receiver, | 4247 Handle<Object> receiver, |
| 4247 Handle<Name> name) { | 4248 Handle<Name> name) { |
| 4248 // TODO(rossberg): Support symbols in the API. | |
| 4249 if (name->IsSymbol()) return maybe(ABSENT); | |
| 4250 | |
| 4251 Isolate* isolate = holder->GetIsolate(); | 4249 Isolate* isolate = holder->GetIsolate(); |
| 4252 HandleScope scope(isolate); | 4250 HandleScope scope(isolate); |
| 4253 | 4251 |
| 4254 // Make sure that the top context does not change when doing | 4252 // Make sure that the top context does not change when doing |
| 4255 // callbacks or interceptor calls. | 4253 // callbacks or interceptor calls. |
| 4256 AssertNoContextChange ncc(isolate); | 4254 AssertNoContextChange ncc(isolate); |
| 4257 | 4255 |
| 4258 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); | 4256 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); |
| 4257 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | |
| 4258 return Maybe<PropertyAttributes>(ABSENT); | |
|
rossberg
2014/08/19 11:36:37
Nit: maybe(ABSENT)
| |
| 4259 } | |
| 4259 PropertyCallbackArguments args( | 4260 PropertyCallbackArguments args( |
| 4260 isolate, interceptor->data(), *receiver, *holder); | 4261 isolate, interceptor->data(), *receiver, *holder); |
| 4261 if (!interceptor->query()->IsUndefined()) { | 4262 if (!interceptor->query()->IsUndefined()) { |
| 4262 v8::NamedPropertyQueryCallback query = | 4263 v8::GenericNamedPropertyQueryCallback query = |
| 4263 v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); | 4264 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| 4265 interceptor->query()); | |
| 4264 LOG(isolate, | 4266 LOG(isolate, |
| 4265 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); | 4267 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| 4266 v8::Handle<v8::Integer> result = | 4268 v8::Handle<v8::Integer> result = |
| 4267 args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); | 4269 args.Call(query, v8::Utils::ToLocal(name)); |
| 4268 if (!result.IsEmpty()) { | 4270 if (!result.IsEmpty()) { |
| 4269 DCHECK(result->IsInt32()); | 4271 DCHECK(result->IsInt32()); |
| 4270 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); | 4272 return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
| 4271 } | 4273 } |
| 4272 } else if (!interceptor->getter()->IsUndefined()) { | 4274 } else if (!interceptor->getter()->IsUndefined()) { |
| 4273 v8::NamedPropertyGetterCallback getter = | 4275 v8::GenericNamedPropertyGetterCallback getter = |
| 4274 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 4276 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 4277 interceptor->getter()); | |
| 4275 LOG(isolate, | 4278 LOG(isolate, |
| 4276 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); | 4279 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
| 4277 v8::Handle<v8::Value> result = | 4280 v8::Handle<v8::Value> result = args.Call(getter, v8::Utils::ToLocal(name)); |
| 4278 args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); | |
| 4279 if (!result.IsEmpty()) return maybe(DONT_ENUM); | 4281 if (!result.IsEmpty()) return maybe(DONT_ENUM); |
| 4280 } | 4282 } |
| 4281 | 4283 |
| 4282 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); | 4284 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); |
| 4283 return maybe(ABSENT); | 4285 return maybe(ABSENT); |
| 4284 } | 4286 } |
| 4285 | 4287 |
| 4286 | 4288 |
| 4287 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( | 4289 Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( |
| 4288 Handle<JSReceiver> object, Handle<Name> name) { | 4290 Handle<JSReceiver> object, Handle<Name> name) { |
| (...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5123 Handle<Object> result = DeleteNormalizedProperty(object, name, delete_mode); | 5125 Handle<Object> result = DeleteNormalizedProperty(object, name, delete_mode); |
| 5124 ReoptimizeIfPrototype(object); | 5126 ReoptimizeIfPrototype(object); |
| 5125 return result; | 5127 return result; |
| 5126 } | 5128 } |
| 5127 | 5129 |
| 5128 | 5130 |
| 5129 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( | 5131 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
| 5130 Handle<JSObject> object, Handle<Name> name) { | 5132 Handle<JSObject> object, Handle<Name> name) { |
| 5131 Isolate* isolate = object->GetIsolate(); | 5133 Isolate* isolate = object->GetIsolate(); |
| 5132 | 5134 |
| 5133 // TODO(rossberg): Support symbols in the API. | |
| 5134 if (name->IsSymbol()) return isolate->factory()->false_value(); | |
| 5135 | |
| 5136 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 5135 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 5137 if (!interceptor->deleter()->IsUndefined()) { | 5136 if (!interceptor->deleter()->IsUndefined() |
| 5138 v8::NamedPropertyDeleterCallback deleter = | 5137 && (name->IsString() || interceptor->can_intercept_symbols())) { |
| 5139 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); | 5138 v8::GenericNamedPropertyDeleterCallback deleter = |
| 5139 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( | |
| 5140 interceptor->deleter()); | |
| 5140 LOG(isolate, | 5141 LOG(isolate, |
| 5141 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); | 5142 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); |
| 5142 PropertyCallbackArguments args( | 5143 PropertyCallbackArguments args( |
| 5143 isolate, interceptor->data(), *object, *object); | 5144 isolate, interceptor->data(), *object, *object); |
| 5144 v8::Handle<v8::Boolean> result = | 5145 v8::Handle<v8::Boolean> result = |
| 5145 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); | 5146 args.Call(deleter, v8::Utils::ToLocal(name)); |
| 5146 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5147 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 5147 if (!result.IsEmpty()) { | 5148 if (!result.IsEmpty()) { |
| 5148 DCHECK(result->IsBoolean()); | 5149 DCHECK(result->IsBoolean()); |
| 5149 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 5150 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 5150 result_internal->VerifyApiCallResultType(); | 5151 result_internal->VerifyApiCallResultType(); |
| 5151 // Rebox CustomArguments::kReturnValueOffset before returning. | 5152 // Rebox CustomArguments::kReturnValueOffset before returning. |
| 5152 return handle(*result_internal, isolate); | 5153 return handle(*result_internal, isolate); |
| 5153 } | 5154 } |
| 5154 } | 5155 } |
| 5155 Handle<Object> result = | 5156 Handle<Object> result = |
| (...skipping 8419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13575 return InterceptorInfo::cast(result); | 13576 return InterceptorInfo::cast(result); |
| 13576 } | 13577 } |
| 13577 | 13578 |
| 13578 | 13579 |
| 13579 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( | 13580 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( |
| 13580 Handle<JSObject> holder, | 13581 Handle<JSObject> holder, |
| 13581 Handle<Object> receiver, | 13582 Handle<Object> receiver, |
| 13582 Handle<Name> name) { | 13583 Handle<Name> name) { |
| 13583 Isolate* isolate = holder->GetIsolate(); | 13584 Isolate* isolate = holder->GetIsolate(); |
| 13584 | 13585 |
| 13585 // TODO(rossberg): Support symbols in the API. | |
| 13586 if (name->IsSymbol()) return isolate->factory()->undefined_value(); | |
| 13587 | |
| 13588 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); | 13586 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); |
| 13589 Handle<String> name_string = Handle<String>::cast(name); | |
| 13590 | |
| 13591 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); | 13587 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); |
| 13592 | 13588 |
| 13593 v8::NamedPropertyGetterCallback getter = | 13589 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 13594 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); | 13590 return MaybeHandle<Object>(); |
| 13591 } | |
| 13592 | |
| 13593 v8::GenericNamedPropertyGetterCallback getter = | |
| 13594 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | |
| 13595 interceptor->getter()); | |
| 13595 LOG(isolate, | 13596 LOG(isolate, |
| 13596 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 13597 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
| 13597 PropertyCallbackArguments | 13598 PropertyCallbackArguments |
| 13598 args(isolate, interceptor->data(), *receiver, *holder); | 13599 args(isolate, interceptor->data(), *receiver, *holder); |
| 13599 v8::Handle<v8::Value> result = | 13600 v8::Handle<v8::Value> result = |
| 13600 args.Call(getter, v8::Utils::ToLocal(name_string)); | 13601 args.Call(getter, v8::Utils::ToLocal(name)); |
| 13601 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 13602 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 13602 if (result.IsEmpty()) return MaybeHandle<Object>(); | 13603 if (result.IsEmpty()) return MaybeHandle<Object>(); |
| 13603 | 13604 |
| 13604 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 13605 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 13605 result_internal->VerifyApiCallResultType(); | 13606 result_internal->VerifyApiCallResultType(); |
| 13606 // Rebox handle before return | 13607 // Rebox handle before return |
| 13607 return handle(*result_internal, isolate); | 13608 return handle(*result_internal, isolate); |
| 13608 } | 13609 } |
| 13609 | 13610 |
| 13610 | 13611 |
| 13611 // Compute the property keys from the interceptor. | 13612 // Compute the property keys from the interceptor. |
| 13612 // TODO(rossberg): support symbols in API, and filter here if needed. | |
|
rossberg
2014/08/19 11:36:37
Note that simply relaxing this function to also re
wingo
2014/08/21 09:55:32
Good catch. I've taken a look at other callers an
| |
| 13613 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( | 13613 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
| 13614 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 13614 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
| 13615 Isolate* isolate = receiver->GetIsolate(); | 13615 Isolate* isolate = receiver->GetIsolate(); |
| 13616 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 13616 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 13617 PropertyCallbackArguments | 13617 PropertyCallbackArguments |
| 13618 args(isolate, interceptor->data(), *receiver, *object); | 13618 args(isolate, interceptor->data(), *receiver, *object); |
| 13619 v8::Handle<v8::Object> result; | 13619 v8::Handle<v8::Object> result; |
| 13620 if (!interceptor->enumerator()->IsUndefined()) { | 13620 if (!interceptor->enumerator()->IsUndefined()) { |
| 13621 v8::NamedPropertyEnumeratorCallback enum_fun = | 13621 v8::GenericNamedPropertyEnumeratorCallback enum_fun = |
| 13622 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( | 13622 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( |
| 13623 interceptor->enumerator()); | 13623 interceptor->enumerator()); |
| 13624 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 13624 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
| 13625 result = args.Call(enum_fun); | 13625 result = args.Call(enum_fun); |
| 13626 } | 13626 } |
| 13627 if (result.IsEmpty()) return MaybeHandle<JSObject>(); | 13627 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
| 13628 #if ENABLE_EXTRA_CHECKS | 13628 #if ENABLE_EXTRA_CHECKS |
| 13629 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || | 13629 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 13630 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); | 13630 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
| 13631 #endif | 13631 #endif |
| 13632 // Rebox before returning. | 13632 // Rebox before returning. |
| (...skipping 3280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16913 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16913 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16914 static const char* error_messages_[] = { | 16914 static const char* error_messages_[] = { |
| 16915 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16915 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16916 }; | 16916 }; |
| 16917 #undef ERROR_MESSAGES_TEXTS | 16917 #undef ERROR_MESSAGES_TEXTS |
| 16918 return error_messages_[reason]; | 16918 return error_messages_[reason]; |
| 16919 } | 16919 } |
| 16920 | 16920 |
| 16921 | 16921 |
| 16922 } } // namespace v8::internal | 16922 } } // namespace v8::internal |
| OLD | NEW |