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

Side by Side Diff: src/objects.cc

Issue 11361275: Remove atomic increment/decrement on each DOM call (Closed) Base URL: git://github.com/v8/v8.git@bleeding_edge
Patch Set: Simpiler approach Created 8 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 } 193 }
194 Object* fun_obj = data->getter(); 194 Object* fun_obj = data->getter();
195 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); 195 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
196 if (call_fun == NULL) return isolate->heap()->undefined_value(); 196 if (call_fun == NULL) return isolate->heap()->undefined_value();
197 HandleScope scope(isolate); 197 HandleScope scope(isolate);
198 JSObject* self = JSObject::cast(receiver); 198 JSObject* self = JSObject::cast(receiver);
199 Handle<String> key(name); 199 Handle<String> key(name);
200 LOG(isolate, ApiNamedPropertyAccess("load", self, name)); 200 LOG(isolate, ApiNamedPropertyAccess("load", self, name));
201 CustomArguments args(isolate, data->data(), self, this); 201 CustomArguments args(isolate, data->data(), self, this);
202 v8::AccessorInfo info(args.end()); 202 v8::AccessorInfo info(args.end());
203 v8::Handle<v8::Value> result; 203 v8::Handle<v8::Value> result = call_fun(v8::Utils::ToLocal(key), info);
204 {
205 // Leaving JavaScript.
206 VMState state(isolate, EXTERNAL);
207 result = call_fun(v8::Utils::ToLocal(key), info);
208 }
209 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 204 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
210 if (result.IsEmpty()) { 205 if (result.IsEmpty()) {
211 return isolate->heap()->undefined_value(); 206 return isolate->heap()->undefined_value();
212 } 207 }
213 Object* return_value = *v8::Utils::OpenHandle(*result); 208 Object* return_value = *v8::Utils::OpenHandle(*result);
214 return_value->VerifyApiCallResultType(); 209 return_value->VerifyApiCallResultType();
215 return return_value; 210 return return_value;
216 } 211 }
217 212
218 // __defineGetter__ callback 213 // __defineGetter__ callback
(...skipping 1702 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 Handle<JSObject> this_handle(this); 1916 Handle<JSObject> this_handle(this);
1922 Handle<String> name_handle(name); 1917 Handle<String> name_handle(name);
1923 Handle<Object> value_handle(value, isolate); 1918 Handle<Object> value_handle(value, isolate);
1924 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 1919 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
1925 if (!interceptor->setter()->IsUndefined()) { 1920 if (!interceptor->setter()->IsUndefined()) {
1926 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name)); 1921 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-set", this, name));
1927 CustomArguments args(isolate, interceptor->data(), this, this); 1922 CustomArguments args(isolate, interceptor->data(), this, this);
1928 v8::AccessorInfo info(args.end()); 1923 v8::AccessorInfo info(args.end());
1929 v8::NamedPropertySetter setter = 1924 v8::NamedPropertySetter setter =
1930 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); 1925 v8::ToCData<v8::NamedPropertySetter>(interceptor->setter());
1931 v8::Handle<v8::Value> result; 1926 Handle<Object> value_unhole(value->IsTheHole() ?
1932 { 1927 isolate->heap()->undefined_value() :
1933 // Leaving JavaScript. 1928 value,
1934 VMState state(isolate, EXTERNAL); 1929 isolate);
1935 Handle<Object> value_unhole(value->IsTheHole() ? 1930 v8::Handle<v8::Value> result = setter(v8::Utils::ToLocal(name_handle),
1936 isolate->heap()->undefined_value() : 1931 v8::Utils::ToLocal(value_unhole),
1937 value, 1932 info);
1938 isolate);
1939 result = setter(v8::Utils::ToLocal(name_handle),
1940 v8::Utils::ToLocal(value_unhole),
1941 info);
1942 }
1943 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 1933 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
1944 if (!result.IsEmpty()) return *value_handle; 1934 if (!result.IsEmpty()) return *value_handle;
1945 } 1935 }
1946 MaybeObject* raw_result = 1936 MaybeObject* raw_result =
1947 this_handle->SetPropertyPostInterceptor(*name_handle, 1937 this_handle->SetPropertyPostInterceptor(*name_handle,
1948 *value_handle, 1938 *value_handle,
1949 attributes, 1939 attributes,
1950 strict_mode, 1940 strict_mode,
1951 PERFORM_EXTENSIBILITY_CHECK); 1941 PERFORM_EXTENSIBILITY_CHECK);
1952 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 1942 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 ARRAY_SIZE(args))); 2008 ARRAY_SIZE(args)));
2019 return isolate->Throw(*error); 2009 return isolate->Throw(*error);
2020 } 2010 }
2021 Object* call_obj = data->setter(); 2011 Object* call_obj = data->setter();
2022 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); 2012 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj);
2023 if (call_fun == NULL) return value; 2013 if (call_fun == NULL) return value;
2024 Handle<String> key(name); 2014 Handle<String> key(name);
2025 LOG(isolate, ApiNamedPropertyAccess("store", this, name)); 2015 LOG(isolate, ApiNamedPropertyAccess("store", this, name));
2026 CustomArguments args(isolate, data->data(), this, JSObject::cast(holder)); 2016 CustomArguments args(isolate, data->data(), this, JSObject::cast(holder));
2027 v8::AccessorInfo info(args.end()); 2017 v8::AccessorInfo info(args.end());
2028 { 2018 call_fun(v8::Utils::ToLocal(key),
2029 // Leaving JavaScript. 2019 v8::Utils::ToLocal(value_handle),
2030 VMState state(isolate, EXTERNAL); 2020 info);
2031 call_fun(v8::Utils::ToLocal(key),
2032 v8::Utils::ToLocal(value_handle),
2033 info);
2034 }
2035 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 2021 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
2036 return *value_handle; 2022 return *value_handle;
2037 } 2023 }
2038 2024
2039 if (structure->IsAccessorPair()) { 2025 if (structure->IsAccessorPair()) {
2040 Object* setter = AccessorPair::cast(structure)->setter(); 2026 Object* setter = AccessorPair::cast(structure)->setter();
2041 if (setter->IsSpecFunction()) { 2027 if (setter->IsSpecFunction()) {
2042 // TODO(rossberg): nicer would be to cast to some JSCallable here... 2028 // TODO(rossberg): nicer would be to cast to some JSCallable here...
2043 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value); 2029 return SetPropertyWithDefinedSetter(JSReceiver::cast(setter), value);
2044 } else { 2030 } else {
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 Handle<JSObject> receiver_handle(receiver); 3211 Handle<JSObject> receiver_handle(receiver);
3226 Handle<JSObject> holder_handle(this); 3212 Handle<JSObject> holder_handle(this);
3227 Handle<String> name_handle(name); 3213 Handle<String> name_handle(name);
3228 CustomArguments args(isolate, interceptor->data(), receiver, this); 3214 CustomArguments args(isolate, interceptor->data(), receiver, this);
3229 v8::AccessorInfo info(args.end()); 3215 v8::AccessorInfo info(args.end());
3230 if (!interceptor->query()->IsUndefined()) { 3216 if (!interceptor->query()->IsUndefined()) {
3231 v8::NamedPropertyQuery query = 3217 v8::NamedPropertyQuery query =
3232 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); 3218 v8::ToCData<v8::NamedPropertyQuery>(interceptor->query());
3233 LOG(isolate, 3219 LOG(isolate,
3234 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name)); 3220 ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name));
3235 v8::Handle<v8::Integer> result; 3221 v8::Handle<v8::Integer> result = query(v8::Utils::ToLocal(name_handle), info );
3236 {
3237 // Leaving JavaScript.
3238 VMState state(isolate, EXTERNAL);
3239 result = query(v8::Utils::ToLocal(name_handle), info);
3240 }
3241 if (!result.IsEmpty()) { 3222 if (!result.IsEmpty()) {
3242 ASSERT(result->IsInt32()); 3223 ASSERT(result->IsInt32());
3243 return static_cast<PropertyAttributes>(result->Int32Value()); 3224 return static_cast<PropertyAttributes>(result->Int32Value());
3244 } 3225 }
3245 } else if (!interceptor->getter()->IsUndefined()) { 3226 } else if (!interceptor->getter()->IsUndefined()) {
3246 v8::NamedPropertyGetter getter = 3227 v8::NamedPropertyGetter getter =
3247 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); 3228 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter());
3248 LOG(isolate, 3229 LOG(isolate,
3249 ApiNamedPropertyAccess("interceptor-named-get-has", this, name)); 3230 ApiNamedPropertyAccess("interceptor-named-get-has", this, name));
3250 v8::Handle<v8::Value> result; 3231 v8::Handle<v8::Value> result = getter(v8::Utils::ToLocal(name_handle), info) ;
3251 {
3252 // Leaving JavaScript.
3253 VMState state(isolate, EXTERNAL);
3254 result = getter(v8::Utils::ToLocal(name_handle), info);
3255 }
3256 if (!result.IsEmpty()) return DONT_ENUM; 3232 if (!result.IsEmpty()) return DONT_ENUM;
3257 } 3233 }
3258 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle, 3234 return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle,
3259 *name_handle, 3235 *name_handle,
3260 continue_search); 3236 continue_search);
3261 } 3237 }
3262 3238
3263 3239
3264 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver( 3240 PropertyAttributes JSReceiver::GetPropertyAttributeWithReceiver(
3265 JSReceiver* receiver, 3241 JSReceiver* receiver,
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3371 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 3347 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
3372 Handle<JSReceiver> hreceiver(receiver); 3348 Handle<JSReceiver> hreceiver(receiver);
3373 Handle<JSObject> holder(this); 3349 Handle<JSObject> holder(this);
3374 CustomArguments args(isolate, interceptor->data(), receiver, this); 3350 CustomArguments args(isolate, interceptor->data(), receiver, this);
3375 v8::AccessorInfo info(args.end()); 3351 v8::AccessorInfo info(args.end());
3376 if (!interceptor->query()->IsUndefined()) { 3352 if (!interceptor->query()->IsUndefined()) {
3377 v8::IndexedPropertyQuery query = 3353 v8::IndexedPropertyQuery query =
3378 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); 3354 v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query());
3379 LOG(isolate, 3355 LOG(isolate,
3380 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index)); 3356 ApiIndexedPropertyAccess("interceptor-indexed-has", this, index));
3381 v8::Handle<v8::Integer> result; 3357 v8::Handle<v8::Integer> result = query(index, info);
3382 {
3383 // Leaving JavaScript.
3384 VMState state(isolate, EXTERNAL);
3385 result = query(index, info);
3386 }
3387 if (!result.IsEmpty()) 3358 if (!result.IsEmpty())
3388 return static_cast<PropertyAttributes>(result->Int32Value()); 3359 return static_cast<PropertyAttributes>(result->Int32Value());
3389 } else if (!interceptor->getter()->IsUndefined()) { 3360 } else if (!interceptor->getter()->IsUndefined()) {
3390 v8::IndexedPropertyGetter getter = 3361 v8::IndexedPropertyGetter getter =
3391 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); 3362 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter());
3392 LOG(isolate, 3363 LOG(isolate,
3393 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index)); 3364 ApiIndexedPropertyAccess("interceptor-indexed-get-has", this, index));
3394 v8::Handle<v8::Value> result; 3365 v8::Handle<v8::Value> result = getter(index, info);
3395 {
3396 // Leaving JavaScript.
3397 VMState state(isolate, EXTERNAL);
3398 result = getter(index, info);
3399 }
3400 if (!result.IsEmpty()) return NONE; 3366 if (!result.IsEmpty()) return NONE;
3401 } 3367 }
3402 3368
3403 return holder->GetElementAttributeWithoutInterceptor( 3369 return holder->GetElementAttributeWithoutInterceptor(
3404 *hreceiver, index, continue_search); 3370 *hreceiver, index, continue_search);
3405 } 3371 }
3406 3372
3407 3373
3408 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( 3374 PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor(
3409 JSReceiver* receiver, uint32_t index, bool continue_search) { 3375 JSReceiver* receiver, uint32_t index, bool continue_search) {
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
4048 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 4014 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
4049 Handle<String> name_handle(name); 4015 Handle<String> name_handle(name);
4050 Handle<JSObject> this_handle(this); 4016 Handle<JSObject> this_handle(this);
4051 if (!interceptor->deleter()->IsUndefined()) { 4017 if (!interceptor->deleter()->IsUndefined()) {
4052 v8::NamedPropertyDeleter deleter = 4018 v8::NamedPropertyDeleter deleter =
4053 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); 4019 v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter());
4054 LOG(isolate, 4020 LOG(isolate,
4055 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); 4021 ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name));
4056 CustomArguments args(isolate, interceptor->data(), this, this); 4022 CustomArguments args(isolate, interceptor->data(), this, this);
4057 v8::AccessorInfo info(args.end()); 4023 v8::AccessorInfo info(args.end());
4058 v8::Handle<v8::Boolean> result; 4024 v8::Handle<v8::Boolean> result = deleter(v8::Utils::ToLocal(name_handle), in fo);
4059 {
4060 // Leaving JavaScript.
4061 VMState state(isolate, EXTERNAL);
4062 result = deleter(v8::Utils::ToLocal(name_handle), info);
4063 }
4064 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 4025 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
4065 if (!result.IsEmpty()) { 4026 if (!result.IsEmpty()) {
4066 ASSERT(result->IsBoolean()); 4027 ASSERT(result->IsBoolean());
4067 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 4028 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
4068 result_internal->VerifyApiCallResultType(); 4029 result_internal->VerifyApiCallResultType();
4069 return *result_internal; 4030 return *result_internal;
4070 } 4031 }
4071 } 4032 }
4072 MaybeObject* raw_result = 4033 MaybeObject* raw_result =
4073 this_handle->DeletePropertyPostInterceptor(*name_handle, NORMAL_DELETION); 4034 this_handle->DeletePropertyPostInterceptor(*name_handle, NORMAL_DELETION);
(...skipping 11 matching lines...) Expand all
4085 HandleScope scope(isolate); 4046 HandleScope scope(isolate);
4086 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 4047 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
4087 if (interceptor->deleter()->IsUndefined()) return heap->false_value(); 4048 if (interceptor->deleter()->IsUndefined()) return heap->false_value();
4088 v8::IndexedPropertyDeleter deleter = 4049 v8::IndexedPropertyDeleter deleter =
4089 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); 4050 v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter());
4090 Handle<JSObject> this_handle(this); 4051 Handle<JSObject> this_handle(this);
4091 LOG(isolate, 4052 LOG(isolate,
4092 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); 4053 ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index));
4093 CustomArguments args(isolate, interceptor->data(), this, this); 4054 CustomArguments args(isolate, interceptor->data(), this, this);
4094 v8::AccessorInfo info(args.end()); 4055 v8::AccessorInfo info(args.end());
4095 v8::Handle<v8::Boolean> result; 4056 v8::Handle<v8::Boolean> result = deleter(index, info);
4096 {
4097 // Leaving JavaScript.
4098 VMState state(isolate, EXTERNAL);
4099 result = deleter(index, info);
4100 }
4101 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 4057 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
4102 if (!result.IsEmpty()) { 4058 if (!result.IsEmpty()) {
4103 ASSERT(result->IsBoolean()); 4059 ASSERT(result->IsBoolean());
4104 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 4060 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
4105 result_internal->VerifyApiCallResultType(); 4061 result_internal->VerifyApiCallResultType();
4106 return *result_internal; 4062 return *result_internal;
4107 } 4063 }
4108 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete( 4064 MaybeObject* raw_result = this_handle->GetElementsAccessor()->Delete(
4109 *this_handle, 4065 *this_handle,
4110 index, 4066 index,
(...skipping 5590 matching lines...) Expand 10 before | Expand all | Expand 10 after
9701 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); 9657 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor());
9702 Handle<JSObject> this_handle(this); 9658 Handle<JSObject> this_handle(this);
9703 Handle<Object> value_handle(value, isolate); 9659 Handle<Object> value_handle(value, isolate);
9704 if (!interceptor->setter()->IsUndefined()) { 9660 if (!interceptor->setter()->IsUndefined()) {
9705 v8::IndexedPropertySetter setter = 9661 v8::IndexedPropertySetter setter =
9706 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); 9662 v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter());
9707 LOG(isolate, 9663 LOG(isolate,
9708 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); 9664 ApiIndexedPropertyAccess("interceptor-indexed-set", this, index));
9709 CustomArguments args(isolate, interceptor->data(), this, this); 9665 CustomArguments args(isolate, interceptor->data(), this, this);
9710 v8::AccessorInfo info(args.end()); 9666 v8::AccessorInfo info(args.end());
9711 v8::Handle<v8::Value> result; 9667 v8::Handle<v8::Value> result = setter(index, v8::Utils::ToLocal(value_handle ), info);
9712 {
9713 // Leaving JavaScript.
9714 VMState state(isolate, EXTERNAL);
9715 result = setter(index, v8::Utils::ToLocal(value_handle), info);
9716 }
9717 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 9668 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
9718 if (!result.IsEmpty()) return *value_handle; 9669 if (!result.IsEmpty()) return *value_handle;
9719 } 9670 }
9720 MaybeObject* raw_result = 9671 MaybeObject* raw_result =
9721 this_handle->SetElementWithoutInterceptor(index, 9672 this_handle->SetElementWithoutInterceptor(index,
9722 *value_handle, 9673 *value_handle,
9723 attributes, 9674 attributes,
9724 strict_mode, 9675 strict_mode,
9725 check_prototype, 9676 check_prototype,
9726 set_mode); 9677 set_mode);
(...skipping 16 matching lines...) Expand all
9743 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); 9694 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
9744 if (call_fun == NULL) return isolate->heap()->undefined_value(); 9695 if (call_fun == NULL) return isolate->heap()->undefined_value();
9745 HandleScope scope(isolate); 9696 HandleScope scope(isolate);
9746 Handle<JSObject> self(JSObject::cast(receiver)); 9697 Handle<JSObject> self(JSObject::cast(receiver));
9747 Handle<JSObject> holder_handle(JSObject::cast(holder)); 9698 Handle<JSObject> holder_handle(JSObject::cast(holder));
9748 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); 9699 Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
9749 Handle<String> key = isolate->factory()->NumberToString(number); 9700 Handle<String> key = isolate->factory()->NumberToString(number);
9750 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); 9701 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key));
9751 CustomArguments args(isolate, data->data(), *self, *holder_handle); 9702 CustomArguments args(isolate, data->data(), *self, *holder_handle);
9752 v8::AccessorInfo info(args.end()); 9703 v8::AccessorInfo info(args.end());
9753 v8::Handle<v8::Value> result; 9704 v8::Handle<v8::Value> result = call_fun(v8::Utils::ToLocal(key), info);
9754 {
9755 // Leaving JavaScript.
9756 VMState state(isolate, EXTERNAL);
9757 result = call_fun(v8::Utils::ToLocal(key), info);
9758 }
9759 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 9705 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
9760 if (result.IsEmpty()) return isolate->heap()->undefined_value(); 9706 if (result.IsEmpty()) return isolate->heap()->undefined_value();
9761 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 9707 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
9762 result_internal->VerifyApiCallResultType(); 9708 result_internal->VerifyApiCallResultType();
9763 return *result_internal; 9709 return *result_internal;
9764 } 9710 }
9765 9711
9766 // __defineGetter__ callback 9712 // __defineGetter__ callback
9767 if (structure->IsAccessorPair()) { 9713 if (structure->IsAccessorPair()) {
9768 Object* getter = AccessorPair::cast(structure)->getter(); 9714 Object* getter = AccessorPair::cast(structure)->getter();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
9803 Handle<JSObject> holder_handle(JSObject::cast(holder)); 9749 Handle<JSObject> holder_handle(JSObject::cast(holder));
9804 Handle<AccessorInfo> data(AccessorInfo::cast(structure)); 9750 Handle<AccessorInfo> data(AccessorInfo::cast(structure));
9805 Object* call_obj = data->setter(); 9751 Object* call_obj = data->setter();
9806 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); 9752 v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj);
9807 if (call_fun == NULL) return value; 9753 if (call_fun == NULL) return value;
9808 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); 9754 Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
9809 Handle<String> key(isolate->factory()->NumberToString(number)); 9755 Handle<String> key(isolate->factory()->NumberToString(number));
9810 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key)); 9756 LOG(isolate, ApiNamedPropertyAccess("store", *self, *key));
9811 CustomArguments args(isolate, data->data(), *self, *holder_handle); 9757 CustomArguments args(isolate, data->data(), *self, *holder_handle);
9812 v8::AccessorInfo info(args.end()); 9758 v8::AccessorInfo info(args.end());
9813 { 9759 call_fun(v8::Utils::ToLocal(key),
9814 // Leaving JavaScript. 9760 v8::Utils::ToLocal(value_handle),
9815 VMState state(isolate, EXTERNAL); 9761 info);
9816 call_fun(v8::Utils::ToLocal(key),
9817 v8::Utils::ToLocal(value_handle),
9818 info);
9819 }
9820 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 9762 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
9821 return *value_handle; 9763 return *value_handle;
9822 } 9764 }
9823 9765
9824 if (structure->IsAccessorPair()) { 9766 if (structure->IsAccessorPair()) {
9825 Handle<Object> setter(AccessorPair::cast(structure)->setter()); 9767 Handle<Object> setter(AccessorPair::cast(structure)->setter());
9826 if (setter->IsSpecFunction()) { 9768 if (setter->IsSpecFunction()) {
9827 // TODO(rossberg): nicer would be to cast to some JSCallable here... 9769 // TODO(rossberg): nicer would be to cast to some JSCallable here...
9828 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value); 9770 return SetPropertyWithDefinedSetter(JSReceiver::cast(*setter), value);
9829 } else { 9771 } else {
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
10597 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate); 10539 Handle<InterceptorInfo> interceptor(GetIndexedInterceptor(), isolate);
10598 Handle<Object> this_handle(receiver, isolate); 10540 Handle<Object> this_handle(receiver, isolate);
10599 Handle<JSObject> holder_handle(this, isolate); 10541 Handle<JSObject> holder_handle(this, isolate);
10600 if (!interceptor->getter()->IsUndefined()) { 10542 if (!interceptor->getter()->IsUndefined()) {
10601 v8::IndexedPropertyGetter getter = 10543 v8::IndexedPropertyGetter getter =
10602 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); 10544 v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter());
10603 LOG(isolate, 10545 LOG(isolate,
10604 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); 10546 ApiIndexedPropertyAccess("interceptor-indexed-get", this, index));
10605 CustomArguments args(isolate, interceptor->data(), receiver, this); 10547 CustomArguments args(isolate, interceptor->data(), receiver, this);
10606 v8::AccessorInfo info(args.end()); 10548 v8::AccessorInfo info(args.end());
10607 v8::Handle<v8::Value> result; 10549 v8::Handle<v8::Value> result = getter(index, info);
10608 {
10609 // Leaving JavaScript.
10610 VMState state(isolate, EXTERNAL);
10611 result = getter(index, info);
10612 }
10613 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 10550 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
10614 if (!result.IsEmpty()) { 10551 if (!result.IsEmpty()) {
10615 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 10552 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
10616 result_internal->VerifyApiCallResultType(); 10553 result_internal->VerifyApiCallResultType();
10617 return *result_internal; 10554 return *result_internal;
10618 } 10555 }
10619 } 10556 }
10620 10557
10621 Heap* heap = holder_handle->GetHeap(); 10558 Heap* heap = holder_handle->GetHeap();
10622 ElementsAccessor* handler = holder_handle->GetElementsAccessor(); 10559 ElementsAccessor* handler = holder_handle->GetElementsAccessor();
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
10901 Handle<JSObject> holder_handle(this); 10838 Handle<JSObject> holder_handle(this);
10902 Handle<String> name_handle(name); 10839 Handle<String> name_handle(name);
10903 10840
10904 if (!interceptor->getter()->IsUndefined()) { 10841 if (!interceptor->getter()->IsUndefined()) {
10905 v8::NamedPropertyGetter getter = 10842 v8::NamedPropertyGetter getter =
10906 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); 10843 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter());
10907 LOG(isolate, 10844 LOG(isolate,
10908 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); 10845 ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name));
10909 CustomArguments args(isolate, interceptor->data(), receiver, this); 10846 CustomArguments args(isolate, interceptor->data(), receiver, this);
10910 v8::AccessorInfo info(args.end()); 10847 v8::AccessorInfo info(args.end());
10911 v8::Handle<v8::Value> result; 10848 v8::Handle<v8::Value> result = getter(v8::Utils::ToLocal(name_handle), info) ;
10912 {
10913 // Leaving JavaScript.
10914 VMState state(isolate, EXTERNAL);
10915 result = getter(v8::Utils::ToLocal(name_handle), info);
10916 }
10917 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 10849 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
10918 if (!result.IsEmpty()) { 10850 if (!result.IsEmpty()) {
10919 *attributes = NONE; 10851 *attributes = NONE;
10920 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 10852 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
10921 result_internal->VerifyApiCallResultType(); 10853 result_internal->VerifyApiCallResultType();
10922 return *result_internal; 10854 return *result_internal;
10923 } 10855 }
10924 } 10856 }
10925 10857
10926 MaybeObject* result = holder_handle->GetPropertyPostInterceptor( 10858 MaybeObject* result = holder_handle->GetPropertyPostInterceptor(
(...skipping 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after
13885 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13817 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13886 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13818 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13887 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13819 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13888 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13820 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13889 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13821 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13890 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13822 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13891 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13823 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13892 } 13824 }
13893 13825
13894 } } // namespace v8::internal 13826 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698