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

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: make arm look like other architectures 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 2274 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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