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 |