| 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 |