| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 isolate); | 332 isolate); |
| 333 } | 333 } |
| 334 ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(structure); | 334 ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(structure); |
| 335 Object* fun_obj = data->getter(); | 335 Object* fun_obj = data->getter(); |
| 336 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); | 336 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); |
| 337 if (call_fun == NULL) return isolate->heap()->undefined_value(); | 337 if (call_fun == NULL) return isolate->heap()->undefined_value(); |
| 338 HandleScope scope(isolate); | 338 HandleScope scope(isolate); |
| 339 JSObject* self = JSObject::cast(receiver); | 339 JSObject* self = JSObject::cast(receiver); |
| 340 Handle<String> key(String::cast(name)); | 340 Handle<String> key(String::cast(name)); |
| 341 LOG(isolate, ApiNamedPropertyAccess("load", self, name)); | 341 LOG(isolate, ApiNamedPropertyAccess("load", self, name)); |
| 342 CustomArguments args(isolate, data->data(), self, this); | 342 PropertyCallbackArguments args(isolate, data->data(), self, this); |
| 343 v8::AccessorInfo info(args.end()); | |
| 344 v8::Handle<v8::Value> result; | 343 v8::Handle<v8::Value> result; |
| 345 { | 344 { |
| 346 // Leaving JavaScript. | 345 // Leaving JavaScript. |
| 347 VMState<EXTERNAL> state(isolate); | 346 VMState<EXTERNAL> state(isolate); |
| 348 result = call_fun(v8::Utils::ToLocal(key), info); | 347 result = args.Call(call_fun, v8::Utils::ToLocal(key)); |
| 349 } | 348 } |
| 350 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 349 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 351 if (result.IsEmpty()) { | 350 if (result.IsEmpty()) { |
| 352 return isolate->heap()->undefined_value(); | 351 return isolate->heap()->undefined_value(); |
| 353 } | 352 } |
| 354 Object* return_value = *v8::Utils::OpenHandle(*result); | 353 Object* return_value = *v8::Utils::OpenHandle(*result); |
| 355 return_value->VerifyApiCallResultType(); | 354 return_value->VerifyApiCallResultType(); |
| 356 return return_value; | 355 return return_value; |
| 357 } | 356 } |
| 358 | 357 |
| (...skipping 2260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2619 // TODO(rossberg): Support symbols in the API. | 2618 // TODO(rossberg): Support symbols in the API. |
| 2620 if (name->IsSymbol()) return value; | 2619 if (name->IsSymbol()) return value; |
| 2621 Isolate* isolate = GetIsolate(); | 2620 Isolate* isolate = GetIsolate(); |
| 2622 HandleScope scope(isolate); | 2621 HandleScope scope(isolate); |
| 2623 Handle<JSObject> this_handle(this); | 2622 Handle<JSObject> this_handle(this); |
| 2624 Handle<String> name_handle(String::cast(name)); | 2623 Handle<String> name_handle(String::cast(name)); |
| 2625 Handle<Object> value_handle(value, isolate); | 2624 Handle<Object> value_handle(value, isolate); |
| 2626 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 2625 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
| 2627 if (!interceptor->setter()->IsUndefined()) { | 2626 if (!interceptor->setter()->IsUndefined()) { |
| 2628 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name)); | 2627 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name)); |
| 2629 CustomArguments args(isolate, interceptor->data(), this, this); | 2628 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
| 2630 v8::AccessorInfo info(args.end()); | |
| 2631 v8::NamedPropertySetter setter = | 2629 v8::NamedPropertySetter setter = |
| 2632 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); | 2630 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); |
| 2633 v8::Handle<v8::Value> result; | 2631 v8::Handle<v8::Value> result; |
| 2634 { | 2632 { |
| 2635 // Leaving JavaScript. | 2633 // Leaving JavaScript. |
| 2636 VMState<EXTERNAL> state(isolate); | 2634 VMState<EXTERNAL> state(isolate); |
| 2637 Handle<Object> value_unhole(value->IsTheHole() ? | 2635 Handle<Object> value_unhole(value->IsTheHole() ? |
| 2638 isolate->heap()->undefined_value() : | 2636 isolate->heap()->undefined_value() : |
| 2639 value, | 2637 value, |
| 2640 isolate); | 2638 isolate); |
| 2641 result = setter(v8::Utils::ToLocal(name_handle), | 2639 result = args.Call(setter, |
| 2642 v8::Utils::ToLocal(value_unhole), | 2640 v8::Utils::ToLocal(name_handle), |
| 2643 info); | 2641 v8::Utils::ToLocal(value_unhole)); |
| 2644 } | 2642 } |
| 2645 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 2643 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 2646 if (!result.IsEmpty()) return *value_handle; | 2644 if (!result.IsEmpty()) return *value_handle; |
| 2647 } | 2645 } |
| 2648 MaybeObject* raw_result = | 2646 MaybeObject* raw_result = |
| 2649 this_handle->SetPropertyPostInterceptor(*name_handle, | 2647 this_handle->SetPropertyPostInterceptor(*name_handle, |
| 2650 *value_handle, | 2648 *value_handle, |
| 2651 attributes, | 2649 attributes, |
| 2652 strict_mode, | 2650 strict_mode, |
| 2653 PERFORM_EXTENSIBILITY_CHECK); | 2651 PERFORM_EXTENSIBILITY_CHECK); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2733 ARRAY_SIZE(args))); | 2731 ARRAY_SIZE(args))); |
| 2734 return isolate->Throw(*error); | 2732 return isolate->Throw(*error); |
| 2735 } | 2733 } |
| 2736 // TODO(rossberg): Support symbols in the API. | 2734 // TODO(rossberg): Support symbols in the API. |
| 2737 if (name->IsSymbol()) return value; | 2735 if (name->IsSymbol()) return value; |
| 2738 Object* call_obj = data->setter(); | 2736 Object* call_obj = data->setter(); |
| 2739 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); | 2737 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
| 2740 if (call_fun == NULL) return value; | 2738 if (call_fun == NULL) return value; |
| 2741 Handle<String> key(String::cast(name)); | 2739 Handle<String> key(String::cast(name)); |
| 2742 LOG(isolate, ApiNamedPropertyAccess("store", this, name)); | 2740 LOG(isolate, ApiNamedPropertyAccess("store", this, name)); |
| 2743 CustomArguments args(isolate, data->data(), this, JSObject::cast(holder)); | 2741 PropertyCallbackArguments |
| 2744 v8::AccessorInfo info(args.end()); | 2742 args(isolate, data->data(), this, JSObject::cast(holder)); |
| 2745 { | 2743 { |
| 2746 // Leaving JavaScript. | 2744 // Leaving JavaScript. |
| 2747 VMState<EXTERNAL> state(isolate); | 2745 VMState<EXTERNAL> state(isolate); |
| 2748 call_fun(v8::Utils::ToLocal(key), | 2746 args.Call(call_fun, |
| 2749 v8::Utils::ToLocal(value_handle), | 2747 v8::Utils::ToLocal(key), |
| 2750 info); | 2748 v8::Utils::ToLocal(value_handle)); |
| 2751 } | 2749 } |
| 2752 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 2750 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 2753 return *value_handle; | 2751 return *value_handle; |
| 2754 } | 2752 } |
| 2755 | 2753 |
| 2756 if (structure->IsAccessorPair()) { | 2754 if (structure->IsAccessorPair()) { |
| 2757 Object* setter = AccessorPair::cast(structure)->setter(); | 2755 Object* setter = AccessorPair::cast(structure)->setter(); |
| 2758 if (setter->IsSpecFunction()) { | 2756 if (setter->IsSpecFunction()) { |
| 2759 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 2757 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
| 2760 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value); | 2758 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value); |
| (...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4042 | 4040 |
| 4043 // Make sure that the top context does not change when doing | 4041 // Make sure that the top context does not change when doing |
| 4044 // callbacks or interceptor calls. | 4042 // callbacks or interceptor calls. |
| 4045 AssertNoContextChange ncc; | 4043 AssertNoContextChange ncc; |
| 4046 | 4044 |
| 4047 HandleScope scope(isolate); | 4045 HandleScope scope(isolate); |
| 4048 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 4046 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
| 4049 Handle<JSObject> receiver_handle(receiver); | 4047 Handle<JSObject> receiver_handle(receiver); |
| 4050 Handle<JSObject> holder_handle(this); | 4048 Handle<JSObject> holder_handle(this); |
| 4051 Handle<String> name_handle(String::cast(name)); | 4049 Handle<String> name_handle(String::cast(name)); |
| 4052 CustomArguments args(isolate, interceptor->data(), receiver, this); | 4050 PropertyCallbackArguments args(isolate, interceptor->data(), receiver, this); |
| 4053 v8::AccessorInfo info(args.end()); | |
| 4054 if (!interceptor->query()->IsUndefined()) { | 4051 if (!interceptor->query()->IsUndefined()) { |
| 4055 v8::NamedPropertyQuery query = | 4052 v8::NamedPropertyQuery query = |
| 4056 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); | 4053 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); |
| 4057 LOG(isolate, | 4054 LOG(isolate, |
| 4058 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); | 4055 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); |
| 4059 v8::Handle<v8::Integer> result; | 4056 v8::Handle<v8::Integer> result; |
| 4060 { | 4057 { |
| 4061 // Leaving JavaScript. | 4058 // Leaving JavaScript. |
| 4062 VMState<EXTERNAL> state(isolate); | 4059 VMState<EXTERNAL> state(isolate); |
| 4063 result = query(v8::Utils::ToLocal(name_handle), info); | 4060 result = args.Call(query, v8::Utils::ToLocal(name_handle)); |
| 4064 } | 4061 } |
| 4065 if (!result.IsEmpty()) { | 4062 if (!result.IsEmpty()) { |
| 4066 ASSERT(result->IsInt32()); | 4063 ASSERT(result->IsInt32()); |
| 4067 return static_cast<PropertyAttributes>(result->Int32Value()); | 4064 return static_cast<PropertyAttributes>(result->Int32Value()); |
| 4068 } | 4065 } |
| 4069 } else if (!interceptor->getter()->IsUndefined()) { | 4066 } else if (!interceptor->getter()->IsUndefined()) { |
| 4070 v8::NamedPropertyGetter getter = | 4067 v8::NamedPropertyGetter getter = |
| 4071 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); | 4068 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); |
| 4072 LOG(isolate, | 4069 LOG(isolate, |
| 4073 ApiNamedPropertyAccess("interceptor-named-get-has", this, name)); | 4070 ApiNamedPropertyAccess("interceptor-named-get-has", this, name)); |
| 4074 v8::Handle<v8::Value> result; | 4071 v8::Handle<v8::Value> result; |
| 4075 { | 4072 { |
| 4076 // Leaving JavaScript. | 4073 // Leaving JavaScript. |
| 4077 VMState<EXTERNAL> state(isolate); | 4074 VMState<EXTERNAL> state(isolate); |
| 4078 result = getter(v8::Utils::ToLocal(name_handle), info); | 4075 result = args.Call(getter, v8::Utils::ToLocal(name_handle)); |
| 4079 } | 4076 } |
| 4080 if (!result.IsEmpty()) return DONT_ENUM; | 4077 if (!result.IsEmpty()) return DONT_ENUM; |
| 4081 } | 4078 } |
| 4082 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, | 4079 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, |
| 4083 *name_handle, | 4080 *name_handle, |
| 4084 continue_search); | 4081 continue_search); |
| 4085 } | 4082 } |
| 4086 | 4083 |
| 4087 | 4084 |
| 4088 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( | 4085 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4183 PropertyAttributes JSObject::GetElementAttributeWithInterceptor( | 4180 PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
| 4184 JSReceiver* receiver, uint32_t index, bool continue_search) { | 4181 JSReceiver* receiver, uint32_t index, bool continue_search) { |
| 4185 Isolate* isolate = GetIsolate(); | 4182 Isolate* isolate = GetIsolate(); |
| 4186 // Make sure that the top context does not change when doing | 4183 // Make sure that the top context does not change when doing |
| 4187 // callbacks or interceptor calls. | 4184 // callbacks or interceptor calls. |
| 4188 AssertNoContextChange ncc; | 4185 AssertNoContextChange ncc; |
| 4189 HandleScope scope(isolate); | 4186 HandleScope scope(isolate); |
| 4190 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 4187 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
| 4191 Handle<JSReceiver> hreceiver(receiver); | 4188 Handle<JSReceiver> hreceiver(receiver); |
| 4192 Handle<JSObject> holder(this); | 4189 Handle<JSObject> holder(this); |
| 4193 CustomArguments args(isolate, interceptor->data(), receiver, this); | 4190 PropertyCallbackArguments args(isolate, interceptor->data(), receiver, this); |
| 4194 v8::AccessorInfo info(args.end()); | |
| 4195 if (!interceptor->query()->IsUndefined()) { | 4191 if (!interceptor->query()->IsUndefined()) { |
| 4196 v8::IndexedPropertyQuery query = | 4192 v8::IndexedPropertyQuery query = |
| 4197 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); | 4193 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); |
| 4198 LOG(isolate, | 4194 LOG(isolate, |
| 4199 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); | 4195 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); |
| 4200 v8::Handle<v8::Integer> result; | 4196 v8::Handle<v8::Integer> result; |
| 4201 { | 4197 { |
| 4202 // Leaving JavaScript. | 4198 // Leaving JavaScript. |
| 4203 VMState<EXTERNAL> state(isolate); | 4199 VMState<EXTERNAL> state(isolate); |
| 4204 result = query(index, info); | 4200 result = args.Call(query, index); |
| 4205 } | 4201 } |
| 4206 if (!result.IsEmpty()) | 4202 if (!result.IsEmpty()) |
| 4207 return static_cast<PropertyAttributes>(result->Int32Value()); | 4203 return static_cast<PropertyAttributes>(result->Int32Value()); |
| 4208 } else if (!interceptor->getter()->IsUndefined()) { | 4204 } else if (!interceptor->getter()->IsUndefined()) { |
| 4209 v8::IndexedPropertyGetter getter = | 4205 v8::IndexedPropertyGetter getter = |
| 4210 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); | 4206 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); |
| 4211 LOG(isolate, | 4207 LOG(isolate, |
| 4212 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index)); | 4208 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index)); |
| 4213 v8::Handle<v8::Value> result; | 4209 v8::Handle<v8::Value> result; |
| 4214 { | 4210 { |
| 4215 // Leaving JavaScript. | 4211 // Leaving JavaScript. |
| 4216 VMState<EXTERNAL> state(isolate); | 4212 VMState<EXTERNAL> state(isolate); |
| 4217 result = getter(index, info); | 4213 result = args.Call(getter, index); |
| 4218 } | 4214 } |
| 4219 if (!result.IsEmpty()) return NONE; | 4215 if (!result.IsEmpty()) return NONE; |
| 4220 } | 4216 } |
| 4221 | 4217 |
| 4222 return holder->GetElementAttributeWithoutInterceptor( | 4218 return holder->GetElementAttributeWithoutInterceptor( |
| 4223 *hreceiver, index, continue_search); | 4219 *hreceiver, index, continue_search); |
| 4224 } | 4220 } |
| 4225 | 4221 |
| 4226 | 4222 |
| 4227 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( | 4223 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4871 Isolate* isolate = GetIsolate(); | 4867 Isolate* isolate = GetIsolate(); |
| 4872 HandleScope scope(isolate); | 4868 HandleScope scope(isolate); |
| 4873 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 4869 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
| 4874 Handle<String> name_handle(String::cast(name)); | 4870 Handle<String> name_handle(String::cast(name)); |
| 4875 Handle<JSObject> this_handle(this); | 4871 Handle<JSObject> this_handle(this); |
| 4876 if (!interceptor->deleter()->IsUndefined()) { | 4872 if (!interceptor->deleter()->IsUndefined()) { |
| 4877 v8::NamedPropertyDeleter deleter = | 4873 v8::NamedPropertyDeleter deleter = |
| 4878 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); | 4874 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); |
| 4879 LOG(isolate, | 4875 LOG(isolate, |
| 4880 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); | 4876 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); |
| 4881 CustomArguments args(isolate, interceptor->data(), this, this); | 4877 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
| 4882 v8::AccessorInfo info(args.end()); | |
| 4883 v8::Handle<v8::Boolean> result; | 4878 v8::Handle<v8::Boolean> result; |
| 4884 { | 4879 { |
| 4885 // Leaving JavaScript. | 4880 // Leaving JavaScript. |
| 4886 VMState<EXTERNAL> state(isolate); | 4881 VMState<EXTERNAL> state(isolate); |
| 4887 result = deleter(v8::Utils::ToLocal(name_handle), info); | 4882 result = args.Call(deleter, v8::Utils::ToLocal(name_handle)); |
| 4888 } | 4883 } |
| 4889 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 4884 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 4890 if (!result.IsEmpty()) { | 4885 if (!result.IsEmpty()) { |
| 4891 ASSERT(result->IsBoolean()); | 4886 ASSERT(result->IsBoolean()); |
| 4892 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4887 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 4893 result_internal->VerifyApiCallResultType(); | 4888 result_internal->VerifyApiCallResultType(); |
| 4894 return *result_internal; | 4889 return *result_internal; |
| 4895 } | 4890 } |
| 4896 } | 4891 } |
| 4897 MaybeObject* raw_result = | 4892 MaybeObject* raw_result = |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4908 // callbacks or interceptor calls. | 4903 // callbacks or interceptor calls. |
| 4909 AssertNoContextChange ncc; | 4904 AssertNoContextChange ncc; |
| 4910 HandleScope scope(isolate); | 4905 HandleScope scope(isolate); |
| 4911 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 4906 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
| 4912 if (interceptor->deleter()->IsUndefined()) return heap->false_value(); | 4907 if (interceptor->deleter()->IsUndefined()) return heap->false_value(); |
| 4913 v8::IndexedPropertyDeleter deleter = | 4908 v8::IndexedPropertyDeleter deleter = |
| 4914 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); | 4909 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); |
| 4915 Handle<JSObject> this_handle(this); | 4910 Handle<JSObject> this_handle(this); |
| 4916 LOG(isolate, | 4911 LOG(isolate, |
| 4917 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); | 4912 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); |
| 4918 CustomArguments args(isolate, interceptor->data(), this, this); | 4913 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
| 4919 v8::AccessorInfo info(args.end()); | |
| 4920 v8::Handle<v8::Boolean> result; | 4914 v8::Handle<v8::Boolean> result; |
| 4921 { | 4915 { |
| 4922 // Leaving JavaScript. | 4916 // Leaving JavaScript. |
| 4923 VMState<EXTERNAL> state(isolate); | 4917 VMState<EXTERNAL> state(isolate); |
| 4924 result = deleter(index, info); | 4918 result = args.Call(deleter, index); |
| 4925 } | 4919 } |
| 4926 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 4920 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 4927 if (!result.IsEmpty()) { | 4921 if (!result.IsEmpty()) { |
| 4928 ASSERT(result->IsBoolean()); | 4922 ASSERT(result->IsBoolean()); |
| 4929 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4923 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 4930 result_internal->VerifyApiCallResultType(); | 4924 result_internal->VerifyApiCallResultType(); |
| 4931 return *result_internal; | 4925 return *result_internal; |
| 4932 } | 4926 } |
| 4933 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( | 4927 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( |
| 4934 *this_handle, | 4928 *this_handle, |
| (...skipping 6145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11080 AssertNoContextChange ncc; | 11074 AssertNoContextChange ncc; |
| 11081 HandleScope scope(isolate); | 11075 HandleScope scope(isolate); |
| 11082 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 11076 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
| 11083 Handle<JSObject> this_handle(this); | 11077 Handle<JSObject> this_handle(this); |
| 11084 Handle<Object> value_handle(value, isolate); | 11078 Handle<Object> value_handle(value, isolate); |
| 11085 if (!interceptor->setter()->IsUndefined()) { | 11079 if (!interceptor->setter()->IsUndefined()) { |
| 11086 v8::IndexedPropertySetter setter = | 11080 v8::IndexedPropertySetter setter = |
| 11087 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); | 11081 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); |
| 11088 LOG(isolate, | 11082 LOG(isolate, |
| 11089 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); | 11083 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); |
| 11090 CustomArguments args(isolate, interceptor->data(), this, this); | 11084 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
| 11091 v8::AccessorInfo info(args.end()); | |
| 11092 v8::Handle<v8::Value> result; | 11085 v8::Handle<v8::Value> result; |
| 11093 { | 11086 { |
| 11094 // Leaving JavaScript. | 11087 // Leaving JavaScript. |
| 11095 VMState<EXTERNAL> state(isolate); | 11088 VMState<EXTERNAL> state(isolate); |
| 11096 result = setter(index, v8::Utils::ToLocal(value_handle), info); | 11089 result = args.Call(setter, index, v8::Utils::ToLocal(value_handle)); |
| 11097 } | 11090 } |
| 11098 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11091 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 11099 if (!result.IsEmpty()) return *value_handle; | 11092 if (!result.IsEmpty()) return *value_handle; |
| 11100 } | 11093 } |
| 11101 MaybeObject* raw_result = | 11094 MaybeObject* raw_result = |
| 11102 this_handle->SetElementWithoutInterceptor(index, | 11095 this_handle->SetElementWithoutInterceptor(index, |
| 11103 *value_handle, | 11096 *value_handle, |
| 11104 attributes, | 11097 attributes, |
| 11105 strict_mode, | 11098 strict_mode, |
| 11106 check_prototype, | 11099 check_prototype, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 11123 ExecutableAccessorInfo::cast(structure)); | 11116 ExecutableAccessorInfo::cast(structure)); |
| 11124 Object* fun_obj = data->getter(); | 11117 Object* fun_obj = data->getter(); |
| 11125 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); | 11118 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); |
| 11126 if (call_fun == NULL) return isolate->heap()->undefined_value(); | 11119 if (call_fun == NULL) return isolate->heap()->undefined_value(); |
| 11127 HandleScope scope(isolate); | 11120 HandleScope scope(isolate); |
| 11128 Handle<JSObject> self(JSObject::cast(receiver)); | 11121 Handle<JSObject> self(JSObject::cast(receiver)); |
| 11129 Handle<JSObject> holder_handle(JSObject::cast(holder)); | 11122 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
| 11130 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11123 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
| 11131 Handle<String> key = isolate->factory()->NumberToString(number); | 11124 Handle<String> key = isolate->factory()->NumberToString(number); |
| 11132 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); | 11125 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); |
| 11133 CustomArguments args(isolate, data->data(), *self, *holder_handle); | 11126 PropertyCallbackArguments |
| 11134 v8::AccessorInfo info(args.end()); | 11127 args(isolate, data->data(), *self, *holder_handle); |
| 11135 v8::Handle<v8::Value> result; | 11128 v8::Handle<v8::Value> result; |
| 11136 { | 11129 { |
| 11137 // Leaving JavaScript. | 11130 // Leaving JavaScript. |
| 11138 VMState<EXTERNAL> state(isolate); | 11131 VMState<EXTERNAL> state(isolate); |
| 11139 result = call_fun(v8::Utils::ToLocal(key), info); | 11132 result = args.Call(call_fun, v8::Utils::ToLocal(key)); |
| 11140 } | 11133 } |
| 11141 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11134 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 11142 if (result.IsEmpty()) return isolate->heap()->undefined_value(); | 11135 if (result.IsEmpty()) return isolate->heap()->undefined_value(); |
| 11143 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 11136 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 11144 result_internal->VerifyApiCallResultType(); | 11137 result_internal->VerifyApiCallResultType(); |
| 11145 return *result_internal; | 11138 return *result_internal; |
| 11146 } | 11139 } |
| 11147 | 11140 |
| 11148 // __defineGetter__ callback | 11141 // __defineGetter__ callback |
| 11149 if (structure->IsAccessorPair()) { | 11142 if (structure->IsAccessorPair()) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11190 Handle<JSObject> self(this); | 11183 Handle<JSObject> self(this); |
| 11191 Handle<JSObject> holder_handle(JSObject::cast(holder)); | 11184 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
| 11192 Handle<ExecutableAccessorInfo> data( | 11185 Handle<ExecutableAccessorInfo> data( |
| 11193 ExecutableAccessorInfo::cast(structure)); | 11186 ExecutableAccessorInfo::cast(structure)); |
| 11194 Object* call_obj = data->setter(); | 11187 Object* call_obj = data->setter(); |
| 11195 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); | 11188 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
| 11196 if (call_fun == NULL) return value; | 11189 if (call_fun == NULL) return value; |
| 11197 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11190 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
| 11198 Handle<String> key(isolate->factory()->NumberToString(number)); | 11191 Handle<String> key(isolate->factory()->NumberToString(number)); |
| 11199 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); | 11192 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); |
| 11200 CustomArguments args(isolate, data->data(), *self, *holder_handle); | 11193 PropertyCallbackArguments |
| 11201 v8::AccessorInfo info(args.end()); | 11194 args(isolate, data->data(), *self, *holder_handle); |
| 11202 { | 11195 { |
| 11203 // Leaving JavaScript. | 11196 // Leaving JavaScript. |
| 11204 VMState<EXTERNAL> state(isolate); | 11197 VMState<EXTERNAL> state(isolate); |
| 11205 call_fun(v8::Utils::ToLocal(key), | 11198 args.Call(call_fun, |
| 11206 v8::Utils::ToLocal(value_handle), | 11199 v8::Utils::ToLocal(key), |
| 11207 info); | 11200 v8::Utils::ToLocal(value_handle)); |
| 11208 } | 11201 } |
| 11209 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11202 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 11210 return *value_handle; | 11203 return *value_handle; |
| 11211 } | 11204 } |
| 11212 | 11205 |
| 11213 if (structure->IsAccessorPair()) { | 11206 if (structure->IsAccessorPair()) { |
| 11214 Handle<Object> setter(AccessorPair::cast(structure)->setter(), isolate); | 11207 Handle<Object> setter(AccessorPair::cast(structure)->setter(), isolate); |
| 11215 if (setter->IsSpecFunction()) { | 11208 if (setter->IsSpecFunction()) { |
| 11216 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 11209 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
| 11217 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value); | 11210 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value); |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12081 AssertNoContextChange ncc; | 12074 AssertNoContextChange ncc; |
| 12082 HandleScope scope(isolate); | 12075 HandleScope scope(isolate); |
| 12083 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate); | 12076 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate); |
| 12084 Handle<Object> this_handle(receiver, isolate); | 12077 Handle<Object> this_handle(receiver, isolate); |
| 12085 Handle<JSObject> holder_handle(this, isolate); | 12078 Handle<JSObject> holder_handle(this, isolate); |
| 12086 if (!interceptor->getter()->IsUndefined()) { | 12079 if (!interceptor->getter()->IsUndefined()) { |
| 12087 v8::IndexedPropertyGetter getter = | 12080 v8::IndexedPropertyGetter getter = |
| 12088 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); | 12081 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); |
| 12089 LOG(isolate, | 12082 LOG(isolate, |
| 12090 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); | 12083 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); |
| 12091 CustomArguments args(isolate, interceptor->data(), receiver, this); | 12084 PropertyCallbackArguments |
| 12092 v8::AccessorInfo info(args.end()); | 12085 args(isolate, interceptor->data(), receiver, this); |
| 12093 v8::Handle<v8::Value> result; | 12086 v8::Handle<v8::Value> result; |
| 12094 { | 12087 { |
| 12095 // Leaving JavaScript. | 12088 // Leaving JavaScript. |
| 12096 VMState<EXTERNAL> state(isolate); | 12089 VMState<EXTERNAL> state(isolate); |
| 12097 result = getter(index, info); | 12090 result = args.Call(getter, index); |
| 12098 } | 12091 } |
| 12099 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 12092 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 12100 if (!result.IsEmpty()) { | 12093 if (!result.IsEmpty()) { |
| 12101 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 12094 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 12102 result_internal->VerifyApiCallResultType(); | 12095 result_internal->VerifyApiCallResultType(); |
| 12103 return *result_internal; | 12096 return *result_internal; |
| 12104 } | 12097 } |
| 12105 } | 12098 } |
| 12106 | 12099 |
| 12107 Heap* heap = holder_handle->GetHeap(); | 12100 Heap* heap = holder_handle->GetHeap(); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12391 HandleScope scope(isolate); | 12384 HandleScope scope(isolate); |
| 12392 Handle<Object> receiver_handle(receiver, isolate); | 12385 Handle<Object> receiver_handle(receiver, isolate); |
| 12393 Handle<JSObject> holder_handle(this); | 12386 Handle<JSObject> holder_handle(this); |
| 12394 Handle<String> name_handle(String::cast(name)); | 12387 Handle<String> name_handle(String::cast(name)); |
| 12395 | 12388 |
| 12396 if (!interceptor->getter()->IsUndefined()) { | 12389 if (!interceptor->getter()->IsUndefined()) { |
| 12397 v8::NamedPropertyGetter getter = | 12390 v8::NamedPropertyGetter getter = |
| 12398 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); | 12391 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); |
| 12399 LOG(isolate, | 12392 LOG(isolate, |
| 12400 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); | 12393 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); |
| 12401 CustomArguments args(isolate, interceptor->data(), receiver, this); | 12394 PropertyCallbackArguments |
| 12402 v8::AccessorInfo info(args.end()); | 12395 args(isolate, interceptor->data(), receiver, this); |
| 12403 v8::Handle<v8::Value> result; | 12396 v8::Handle<v8::Value> result; |
| 12404 { | 12397 { |
| 12405 // Leaving JavaScript. | 12398 // Leaving JavaScript. |
| 12406 VMState<EXTERNAL> state(isolate); | 12399 VMState<EXTERNAL> state(isolate); |
| 12407 result = getter(v8::Utils::ToLocal(name_handle), info); | 12400 result = args.Call(getter, v8::Utils::ToLocal(name_handle)); |
| 12408 } | 12401 } |
| 12409 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 12402 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 12410 if (!result.IsEmpty()) { | 12403 if (!result.IsEmpty()) { |
| 12411 *attributes = NONE; | 12404 *attributes = NONE; |
| 12412 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 12405 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
| 12413 result_internal->VerifyApiCallResultType(); | 12406 result_internal->VerifyApiCallResultType(); |
| 12414 return *result_internal; | 12407 return *result_internal; |
| 12415 } | 12408 } |
| 12416 } | 12409 } |
| 12417 | 12410 |
| (...skipping 2974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15392 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 15385 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 15393 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 15386 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 15394 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 15387 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 15395 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 15388 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 15396 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 15389 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 15397 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 15390 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 15398 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 15391 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 15399 } | 15392 } |
| 15400 | 15393 |
| 15401 } } // namespace v8::internal | 15394 } } // namespace v8::internal |
| OLD | NEW |