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 2274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2633 // TODO(rossberg): Support symbols in the API. | 2632 // TODO(rossberg): Support symbols in the API. |
2634 if (name->IsSymbol()) return value; | 2633 if (name->IsSymbol()) return value; |
2635 Isolate* isolate = GetIsolate(); | 2634 Isolate* isolate = GetIsolate(); |
2636 HandleScope scope(isolate); | 2635 HandleScope scope(isolate); |
2637 Handle<JSObject> this_handle(this); | 2636 Handle<JSObject> this_handle(this); |
2638 Handle<String> name_handle(String::cast(name)); | 2637 Handle<String> name_handle(String::cast(name)); |
2639 Handle<Object> value_handle(value, isolate); | 2638 Handle<Object> value_handle(value, isolate); |
2640 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 2639 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
2641 if (!interceptor->setter()->IsUndefined()) { | 2640 if (!interceptor->setter()->IsUndefined()) { |
2642 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name)); | 2641 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name)); |
2643 CustomArguments args(isolate, interceptor->data(), this, this); | 2642 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
2644 v8::AccessorInfo info(args.end()); | |
2645 v8::NamedPropertySetter setter = | 2643 v8::NamedPropertySetter setter = |
2646 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); | 2644 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); |
2647 v8::Handle<v8::Value> result; | 2645 v8::Handle<v8::Value> result; |
2648 { | 2646 { |
2649 // Leaving JavaScript. | 2647 // Leaving JavaScript. |
2650 VMState<EXTERNAL> state(isolate); | 2648 VMState<EXTERNAL> state(isolate); |
2651 Handle<Object> value_unhole(value->IsTheHole() ? | 2649 Handle<Object> value_unhole(value->IsTheHole() ? |
2652 isolate->heap()->undefined_value() : | 2650 isolate->heap()->undefined_value() : |
2653 value, | 2651 value, |
2654 isolate); | 2652 isolate); |
2655 result = setter(v8::Utils::ToLocal(name_handle), | 2653 result = args.Call(setter, |
2656 v8::Utils::ToLocal(value_unhole), | 2654 v8::Utils::ToLocal(name_handle), |
2657 info); | 2655 v8::Utils::ToLocal(value_unhole)); |
2658 } | 2656 } |
2659 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 2657 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
2660 if (!result.IsEmpty()) return *value_handle; | 2658 if (!result.IsEmpty()) return *value_handle; |
2661 } | 2659 } |
2662 MaybeObject* raw_result = | 2660 MaybeObject* raw_result = |
2663 this_handle->SetPropertyPostInterceptor(*name_handle, | 2661 this_handle->SetPropertyPostInterceptor(*name_handle, |
2664 *value_handle, | 2662 *value_handle, |
2665 attributes, | 2663 attributes, |
2666 strict_mode, | 2664 strict_mode, |
2667 PERFORM_EXTENSIBILITY_CHECK); | 2665 PERFORM_EXTENSIBILITY_CHECK); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2747 ARRAY_SIZE(args))); | 2745 ARRAY_SIZE(args))); |
2748 return isolate->Throw(*error); | 2746 return isolate->Throw(*error); |
2749 } | 2747 } |
2750 // TODO(rossberg): Support symbols in the API. | 2748 // TODO(rossberg): Support symbols in the API. |
2751 if (name->IsSymbol()) return value; | 2749 if (name->IsSymbol()) return value; |
2752 Object* call_obj = data->setter(); | 2750 Object* call_obj = data->setter(); |
2753 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); | 2751 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
2754 if (call_fun == NULL) return value; | 2752 if (call_fun == NULL) return value; |
2755 Handle<String> key(String::cast(name)); | 2753 Handle<String> key(String::cast(name)); |
2756 LOG(isolate, ApiNamedPropertyAccess("store", this, name)); | 2754 LOG(isolate, ApiNamedPropertyAccess("store", this, name)); |
2757 CustomArguments args(isolate, data->data(), this, JSObject::cast(holder)); | 2755 PropertyCallbackArguments |
2758 v8::AccessorInfo info(args.end()); | 2756 args(isolate, data->data(), this, JSObject::cast(holder)); |
2759 { | 2757 { |
2760 // Leaving JavaScript. | 2758 // Leaving JavaScript. |
2761 VMState<EXTERNAL> state(isolate); | 2759 VMState<EXTERNAL> state(isolate); |
2762 call_fun(v8::Utils::ToLocal(key), | 2760 args.Call(call_fun, |
2763 v8::Utils::ToLocal(value_handle), | 2761 v8::Utils::ToLocal(key), |
2764 info); | 2762 v8::Utils::ToLocal(value_handle)); |
2765 } | 2763 } |
2766 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 2764 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
2767 return *value_handle; | 2765 return *value_handle; |
2768 } | 2766 } |
2769 | 2767 |
2770 if (structure->IsAccessorPair()) { | 2768 if (structure->IsAccessorPair()) { |
2771 Object* setter = AccessorPair::cast(structure)->setter(); | 2769 Object* setter = AccessorPair::cast(structure)->setter(); |
2772 if (setter->IsSpecFunction()) { | 2770 if (setter->IsSpecFunction()) { |
2773 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 2771 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
2774 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value); | 2772 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value); |
(...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4056 | 4054 |
4057 // Make sure that the top context does not change when doing | 4055 // Make sure that the top context does not change when doing |
4058 // callbacks or interceptor calls. | 4056 // callbacks or interceptor calls. |
4059 AssertNoContextChange ncc; | 4057 AssertNoContextChange ncc; |
4060 | 4058 |
4061 HandleScope scope(isolate); | 4059 HandleScope scope(isolate); |
4062 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 4060 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
4063 Handle<JSObject> receiver_handle(receiver); | 4061 Handle<JSObject> receiver_handle(receiver); |
4064 Handle<JSObject> holder_handle(this); | 4062 Handle<JSObject> holder_handle(this); |
4065 Handle<String> name_handle(String::cast(name)); | 4063 Handle<String> name_handle(String::cast(name)); |
4066 CustomArguments args(isolate, interceptor->data(), receiver, this); | 4064 PropertyCallbackArguments args(isolate, interceptor->data(), receiver, this); |
4067 v8::AccessorInfo info(args.end()); | |
4068 if (!interceptor->query()->IsUndefined()) { | 4065 if (!interceptor->query()->IsUndefined()) { |
4069 v8::NamedPropertyQuery query = | 4066 v8::NamedPropertyQuery query = |
4070 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); | 4067 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); |
4071 LOG(isolate, | 4068 LOG(isolate, |
4072 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); | 4069 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); |
4073 v8::Handle<v8::Integer> result; | 4070 v8::Handle<v8::Integer> result; |
4074 { | 4071 { |
4075 // Leaving JavaScript. | 4072 // Leaving JavaScript. |
4076 VMState<EXTERNAL> state(isolate); | 4073 VMState<EXTERNAL> state(isolate); |
4077 result = query(v8::Utils::ToLocal(name_handle), info); | 4074 result = args.Call(query, v8::Utils::ToLocal(name_handle)); |
4078 } | 4075 } |
4079 if (!result.IsEmpty()) { | 4076 if (!result.IsEmpty()) { |
4080 ASSERT(result->IsInt32()); | 4077 ASSERT(result->IsInt32()); |
4081 return static_cast<PropertyAttributes>(result->Int32Value()); | 4078 return static_cast<PropertyAttributes>(result->Int32Value()); |
4082 } | 4079 } |
4083 } else if (!interceptor->getter()->IsUndefined()) { | 4080 } else if (!interceptor->getter()->IsUndefined()) { |
4084 v8::NamedPropertyGetter getter = | 4081 v8::NamedPropertyGetter getter = |
4085 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); | 4082 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); |
4086 LOG(isolate, | 4083 LOG(isolate, |
4087 ApiNamedPropertyAccess("interceptor-named-get-has", this, name)); | 4084 ApiNamedPropertyAccess("interceptor-named-get-has", this, name)); |
4088 v8::Handle<v8::Value> result; | 4085 v8::Handle<v8::Value> result; |
4089 { | 4086 { |
4090 // Leaving JavaScript. | 4087 // Leaving JavaScript. |
4091 VMState<EXTERNAL> state(isolate); | 4088 VMState<EXTERNAL> state(isolate); |
4092 result = getter(v8::Utils::ToLocal(name_handle), info); | 4089 result = args.Call(getter, v8::Utils::ToLocal(name_handle)); |
4093 } | 4090 } |
4094 if (!result.IsEmpty()) return DONT_ENUM; | 4091 if (!result.IsEmpty()) return DONT_ENUM; |
4095 } | 4092 } |
4096 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, | 4093 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, |
4097 *name_handle, | 4094 *name_handle, |
4098 continue_search); | 4095 continue_search); |
4099 } | 4096 } |
4100 | 4097 |
4101 | 4098 |
4102 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( | 4099 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4197 PropertyAttributes JSObject::GetElementAttributeWithInterceptor( | 4194 PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
4198 JSReceiver* receiver, uint32_t index, bool continue_search) { | 4195 JSReceiver* receiver, uint32_t index, bool continue_search) { |
4199 Isolate* isolate = GetIsolate(); | 4196 Isolate* isolate = GetIsolate(); |
4200 // Make sure that the top context does not change when doing | 4197 // Make sure that the top context does not change when doing |
4201 // callbacks or interceptor calls. | 4198 // callbacks or interceptor calls. |
4202 AssertNoContextChange ncc; | 4199 AssertNoContextChange ncc; |
4203 HandleScope scope(isolate); | 4200 HandleScope scope(isolate); |
4204 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 4201 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
4205 Handle<JSReceiver> hreceiver(receiver); | 4202 Handle<JSReceiver> hreceiver(receiver); |
4206 Handle<JSObject> holder(this); | 4203 Handle<JSObject> holder(this); |
4207 CustomArguments args(isolate, interceptor->data(), receiver, this); | 4204 PropertyCallbackArguments args(isolate, interceptor->data(), receiver, this); |
4208 v8::AccessorInfo info(args.end()); | |
4209 if (!interceptor->query()->IsUndefined()) { | 4205 if (!interceptor->query()->IsUndefined()) { |
4210 v8::IndexedPropertyQuery query = | 4206 v8::IndexedPropertyQuery query = |
4211 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); | 4207 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); |
4212 LOG(isolate, | 4208 LOG(isolate, |
4213 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); | 4209 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); |
4214 v8::Handle<v8::Integer> result; | 4210 v8::Handle<v8::Integer> result; |
4215 { | 4211 { |
4216 // Leaving JavaScript. | 4212 // Leaving JavaScript. |
4217 VMState<EXTERNAL> state(isolate); | 4213 VMState<EXTERNAL> state(isolate); |
4218 result = query(index, info); | 4214 result = args.Call(query, index); |
4219 } | 4215 } |
4220 if (!result.IsEmpty()) | 4216 if (!result.IsEmpty()) |
4221 return static_cast<PropertyAttributes>(result->Int32Value()); | 4217 return static_cast<PropertyAttributes>(result->Int32Value()); |
4222 } else if (!interceptor->getter()->IsUndefined()) { | 4218 } else if (!interceptor->getter()->IsUndefined()) { |
4223 v8::IndexedPropertyGetter getter = | 4219 v8::IndexedPropertyGetter getter = |
4224 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); | 4220 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); |
4225 LOG(isolate, | 4221 LOG(isolate, |
4226 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index)); | 4222 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index)); |
4227 v8::Handle<v8::Value> result; | 4223 v8::Handle<v8::Value> result; |
4228 { | 4224 { |
4229 // Leaving JavaScript. | 4225 // Leaving JavaScript. |
4230 VMState<EXTERNAL> state(isolate); | 4226 VMState<EXTERNAL> state(isolate); |
4231 result = getter(index, info); | 4227 result = args.Call(getter, index); |
4232 } | 4228 } |
4233 if (!result.IsEmpty()) return NONE; | 4229 if (!result.IsEmpty()) return NONE; |
4234 } | 4230 } |
4235 | 4231 |
4236 return holder->GetElementAttributeWithoutInterceptor( | 4232 return holder->GetElementAttributeWithoutInterceptor( |
4237 *hreceiver, index, continue_search); | 4233 *hreceiver, index, continue_search); |
4238 } | 4234 } |
4239 | 4235 |
4240 | 4236 |
4241 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( | 4237 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4885 Isolate* isolate = GetIsolate(); | 4881 Isolate* isolate = GetIsolate(); |
4886 HandleScope scope(isolate); | 4882 HandleScope scope(isolate); |
4887 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); | 4883 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
4888 Handle<String> name_handle(String::cast(name)); | 4884 Handle<String> name_handle(String::cast(name)); |
4889 Handle<JSObject> this_handle(this); | 4885 Handle<JSObject> this_handle(this); |
4890 if (!interceptor->deleter()->IsUndefined()) { | 4886 if (!interceptor->deleter()->IsUndefined()) { |
4891 v8::NamedPropertyDeleter deleter = | 4887 v8::NamedPropertyDeleter deleter = |
4892 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); | 4888 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); |
4893 LOG(isolate, | 4889 LOG(isolate, |
4894 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); | 4890 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); |
4895 CustomArguments args(isolate, interceptor->data(), this, this); | 4891 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
4896 v8::AccessorInfo info(args.end()); | |
4897 v8::Handle<v8::Boolean> result; | 4892 v8::Handle<v8::Boolean> result; |
4898 { | 4893 { |
4899 // Leaving JavaScript. | 4894 // Leaving JavaScript. |
4900 VMState<EXTERNAL> state(isolate); | 4895 VMState<EXTERNAL> state(isolate); |
4901 result = deleter(v8::Utils::ToLocal(name_handle), info); | 4896 result = args.Call(deleter, v8::Utils::ToLocal(name_handle)); |
4902 } | 4897 } |
4903 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 4898 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
4904 if (!result.IsEmpty()) { | 4899 if (!result.IsEmpty()) { |
4905 ASSERT(result->IsBoolean()); | 4900 ASSERT(result->IsBoolean()); |
4906 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4901 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
4907 result_internal->VerifyApiCallResultType(); | 4902 result_internal->VerifyApiCallResultType(); |
4908 return *result_internal; | 4903 return *result_internal; |
4909 } | 4904 } |
4910 } | 4905 } |
4911 MaybeObject* raw_result = | 4906 MaybeObject* raw_result = |
(...skipping 10 matching lines...) Expand all Loading... |
4922 // callbacks or interceptor calls. | 4917 // callbacks or interceptor calls. |
4923 AssertNoContextChange ncc; | 4918 AssertNoContextChange ncc; |
4924 HandleScope scope(isolate); | 4919 HandleScope scope(isolate); |
4925 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 4920 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
4926 if (interceptor->deleter()->IsUndefined()) return heap->false_value(); | 4921 if (interceptor->deleter()->IsUndefined()) return heap->false_value(); |
4927 v8::IndexedPropertyDeleter deleter = | 4922 v8::IndexedPropertyDeleter deleter = |
4928 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); | 4923 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); |
4929 Handle<JSObject> this_handle(this); | 4924 Handle<JSObject> this_handle(this); |
4930 LOG(isolate, | 4925 LOG(isolate, |
4931 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); | 4926 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); |
4932 CustomArguments args(isolate, interceptor->data(), this, this); | 4927 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
4933 v8::AccessorInfo info(args.end()); | |
4934 v8::Handle<v8::Boolean> result; | 4928 v8::Handle<v8::Boolean> result; |
4935 { | 4929 { |
4936 // Leaving JavaScript. | 4930 // Leaving JavaScript. |
4937 VMState<EXTERNAL> state(isolate); | 4931 VMState<EXTERNAL> state(isolate); |
4938 result = deleter(index, info); | 4932 result = args.Call(deleter, index); |
4939 } | 4933 } |
4940 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 4934 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
4941 if (!result.IsEmpty()) { | 4935 if (!result.IsEmpty()) { |
4942 ASSERT(result->IsBoolean()); | 4936 ASSERT(result->IsBoolean()); |
4943 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 4937 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
4944 result_internal->VerifyApiCallResultType(); | 4938 result_internal->VerifyApiCallResultType(); |
4945 return *result_internal; | 4939 return *result_internal; |
4946 } | 4940 } |
4947 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( | 4941 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( |
4948 *this_handle, | 4942 *this_handle, |
(...skipping 6176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11125 AssertNoContextChange ncc; | 11119 AssertNoContextChange ncc; |
11126 HandleScope scope(isolate); | 11120 HandleScope scope(isolate); |
11127 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); | 11121 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
11128 Handle<JSObject> this_handle(this); | 11122 Handle<JSObject> this_handle(this); |
11129 Handle<Object> value_handle(value, isolate); | 11123 Handle<Object> value_handle(value, isolate); |
11130 if (!interceptor->setter()->IsUndefined()) { | 11124 if (!interceptor->setter()->IsUndefined()) { |
11131 v8::IndexedPropertySetter setter = | 11125 v8::IndexedPropertySetter setter = |
11132 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); | 11126 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); |
11133 LOG(isolate, | 11127 LOG(isolate, |
11134 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); | 11128 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); |
11135 CustomArguments args(isolate, interceptor->data(), this, this); | 11129 PropertyCallbackArguments args(isolate, interceptor->data(), this, this); |
11136 v8::AccessorInfo info(args.end()); | |
11137 v8::Handle<v8::Value> result; | 11130 v8::Handle<v8::Value> result; |
11138 { | 11131 { |
11139 // Leaving JavaScript. | 11132 // Leaving JavaScript. |
11140 VMState<EXTERNAL> state(isolate); | 11133 VMState<EXTERNAL> state(isolate); |
11141 result = setter(index, v8::Utils::ToLocal(value_handle), info); | 11134 result = args.Call(setter, index, v8::Utils::ToLocal(value_handle)); |
11142 } | 11135 } |
11143 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11136 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
11144 if (!result.IsEmpty()) return *value_handle; | 11137 if (!result.IsEmpty()) return *value_handle; |
11145 } | 11138 } |
11146 MaybeObject* raw_result = | 11139 MaybeObject* raw_result = |
11147 this_handle->SetElementWithoutInterceptor(index, | 11140 this_handle->SetElementWithoutInterceptor(index, |
11148 *value_handle, | 11141 *value_handle, |
11149 attributes, | 11142 attributes, |
11150 strict_mode, | 11143 strict_mode, |
11151 check_prototype, | 11144 check_prototype, |
(...skipping 16 matching lines...) Expand all Loading... |
11168 ExecutableAccessorInfo::cast(structure)); | 11161 ExecutableAccessorInfo::cast(structure)); |
11169 Object* fun_obj = data->getter(); | 11162 Object* fun_obj = data->getter(); |
11170 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); | 11163 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); |
11171 if (call_fun == NULL) return isolate->heap()->undefined_value(); | 11164 if (call_fun == NULL) return isolate->heap()->undefined_value(); |
11172 HandleScope scope(isolate); | 11165 HandleScope scope(isolate); |
11173 Handle<JSObject> self(JSObject::cast(receiver)); | 11166 Handle<JSObject> self(JSObject::cast(receiver)); |
11174 Handle<JSObject> holder_handle(JSObject::cast(holder)); | 11167 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
11175 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11168 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
11176 Handle<String> key = isolate->factory()->NumberToString(number); | 11169 Handle<String> key = isolate->factory()->NumberToString(number); |
11177 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); | 11170 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); |
11178 CustomArguments args(isolate, data->data(), *self, *holder_handle); | 11171 PropertyCallbackArguments |
11179 v8::AccessorInfo info(args.end()); | 11172 args(isolate, data->data(), *self, *holder_handle); |
11180 v8::Handle<v8::Value> result; | 11173 v8::Handle<v8::Value> result; |
11181 { | 11174 { |
11182 // Leaving JavaScript. | 11175 // Leaving JavaScript. |
11183 VMState<EXTERNAL> state(isolate); | 11176 VMState<EXTERNAL> state(isolate); |
11184 result = call_fun(v8::Utils::ToLocal(key), info); | 11177 result = args.Call(call_fun, v8::Utils::ToLocal(key)); |
11185 } | 11178 } |
11186 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11179 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
11187 if (result.IsEmpty()) return isolate->heap()->undefined_value(); | 11180 if (result.IsEmpty()) return isolate->heap()->undefined_value(); |
11188 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 11181 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
11189 result_internal->VerifyApiCallResultType(); | 11182 result_internal->VerifyApiCallResultType(); |
11190 return *result_internal; | 11183 return *result_internal; |
11191 } | 11184 } |
11192 | 11185 |
11193 // __defineGetter__ callback | 11186 // __defineGetter__ callback |
11194 if (structure->IsAccessorPair()) { | 11187 if (structure->IsAccessorPair()) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11235 Handle<JSObject> self(this); | 11228 Handle<JSObject> self(this); |
11236 Handle<JSObject> holder_handle(JSObject::cast(holder)); | 11229 Handle<JSObject> holder_handle(JSObject::cast(holder)); |
11237 Handle<ExecutableAccessorInfo> data( | 11230 Handle<ExecutableAccessorInfo> data( |
11238 ExecutableAccessorInfo::cast(structure)); | 11231 ExecutableAccessorInfo::cast(structure)); |
11239 Object* call_obj = data->setter(); | 11232 Object* call_obj = data->setter(); |
11240 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); | 11233 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
11241 if (call_fun == NULL) return value; | 11234 if (call_fun == NULL) return value; |
11242 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11235 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
11243 Handle<String> key(isolate->factory()->NumberToString(number)); | 11236 Handle<String> key(isolate->factory()->NumberToString(number)); |
11244 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); | 11237 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); |
11245 CustomArguments args(isolate, data->data(), *self, *holder_handle); | 11238 PropertyCallbackArguments |
11246 v8::AccessorInfo info(args.end()); | 11239 args(isolate, data->data(), *self, *holder_handle); |
11247 { | 11240 { |
11248 // Leaving JavaScript. | 11241 // Leaving JavaScript. |
11249 VMState<EXTERNAL> state(isolate); | 11242 VMState<EXTERNAL> state(isolate); |
11250 call_fun(v8::Utils::ToLocal(key), | 11243 args.Call(call_fun, |
11251 v8::Utils::ToLocal(value_handle), | 11244 v8::Utils::ToLocal(key), |
11252 info); | 11245 v8::Utils::ToLocal(value_handle)); |
11253 } | 11246 } |
11254 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 11247 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
11255 return *value_handle; | 11248 return *value_handle; |
11256 } | 11249 } |
11257 | 11250 |
11258 if (structure->IsAccessorPair()) { | 11251 if (structure->IsAccessorPair()) { |
11259 Handle<Object> setter(AccessorPair::cast(structure)->setter(), isolate); | 11252 Handle<Object> setter(AccessorPair::cast(structure)->setter(), isolate); |
11260 if (setter->IsSpecFunction()) { | 11253 if (setter->IsSpecFunction()) { |
11261 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 11254 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
11262 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value); | 11255 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value); |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12126 AssertNoContextChange ncc; | 12119 AssertNoContextChange ncc; |
12127 HandleScope scope(isolate); | 12120 HandleScope scope(isolate); |
12128 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate); | 12121 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate); |
12129 Handle<Object> this_handle(receiver, isolate); | 12122 Handle<Object> this_handle(receiver, isolate); |
12130 Handle<JSObject> holder_handle(this, isolate); | 12123 Handle<JSObject> holder_handle(this, isolate); |
12131 if (!interceptor->getter()->IsUndefined()) { | 12124 if (!interceptor->getter()->IsUndefined()) { |
12132 v8::IndexedPropertyGetter getter = | 12125 v8::IndexedPropertyGetter getter = |
12133 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); | 12126 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); |
12134 LOG(isolate, | 12127 LOG(isolate, |
12135 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); | 12128 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); |
12136 CustomArguments args(isolate, interceptor->data(), receiver, this); | 12129 PropertyCallbackArguments |
12137 v8::AccessorInfo info(args.end()); | 12130 args(isolate, interceptor->data(), receiver, this); |
12138 v8::Handle<v8::Value> result; | 12131 v8::Handle<v8::Value> result; |
12139 { | 12132 { |
12140 // Leaving JavaScript. | 12133 // Leaving JavaScript. |
12141 VMState<EXTERNAL> state(isolate); | 12134 VMState<EXTERNAL> state(isolate); |
12142 result = getter(index, info); | 12135 result = args.Call(getter, index); |
12143 } | 12136 } |
12144 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 12137 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
12145 if (!result.IsEmpty()) { | 12138 if (!result.IsEmpty()) { |
12146 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 12139 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
12147 result_internal->VerifyApiCallResultType(); | 12140 result_internal->VerifyApiCallResultType(); |
12148 return *result_internal; | 12141 return *result_internal; |
12149 } | 12142 } |
12150 } | 12143 } |
12151 | 12144 |
12152 Heap* heap = holder_handle->GetHeap(); | 12145 Heap* heap = holder_handle->GetHeap(); |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12436 HandleScope scope(isolate); | 12429 HandleScope scope(isolate); |
12437 Handle<Object> receiver_handle(receiver, isolate); | 12430 Handle<Object> receiver_handle(receiver, isolate); |
12438 Handle<JSObject> holder_handle(this); | 12431 Handle<JSObject> holder_handle(this); |
12439 Handle<String> name_handle(String::cast(name)); | 12432 Handle<String> name_handle(String::cast(name)); |
12440 | 12433 |
12441 if (!interceptor->getter()->IsUndefined()) { | 12434 if (!interceptor->getter()->IsUndefined()) { |
12442 v8::NamedPropertyGetter getter = | 12435 v8::NamedPropertyGetter getter = |
12443 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); | 12436 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); |
12444 LOG(isolate, | 12437 LOG(isolate, |
12445 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); | 12438 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); |
12446 CustomArguments args(isolate, interceptor->data(), receiver, this); | 12439 PropertyCallbackArguments |
12447 v8::AccessorInfo info(args.end()); | 12440 args(isolate, interceptor->data(), receiver, this); |
12448 v8::Handle<v8::Value> result; | 12441 v8::Handle<v8::Value> result; |
12449 { | 12442 { |
12450 // Leaving JavaScript. | 12443 // Leaving JavaScript. |
12451 VMState<EXTERNAL> state(isolate); | 12444 VMState<EXTERNAL> state(isolate); |
12452 result = getter(v8::Utils::ToLocal(name_handle), info); | 12445 result = args.Call(getter, v8::Utils::ToLocal(name_handle)); |
12453 } | 12446 } |
12454 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 12447 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
12455 if (!result.IsEmpty()) { | 12448 if (!result.IsEmpty()) { |
12456 *attributes = NONE; | 12449 *attributes = NONE; |
12457 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 12450 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
12458 result_internal->VerifyApiCallResultType(); | 12451 result_internal->VerifyApiCallResultType(); |
12459 return *result_internal; | 12452 return *result_internal; |
12460 } | 12453 } |
12461 } | 12454 } |
12462 | 12455 |
(...skipping 2974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15437 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 15430 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
15438 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 15431 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
15439 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 15432 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
15440 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 15433 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
15441 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 15434 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
15442 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 15435 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
15443 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 15436 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
15444 } | 15437 } |
15445 | 15438 |
15446 } } // namespace v8::internal | 15439 } } // namespace v8::internal |
OLD | NEW |