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 |