| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |