Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/objects.cc

Issue 12494012: new style of property/function callbacks (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: account for apiparameteroperand changes Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/isolate.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/isolate.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698