| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 165 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 166 HandleScope scope(isolate); | 166 HandleScope scope(isolate); |
| 167 Handle<JSObject> object = Utils::OpenHandle(*info.This()); | 167 Handle<JSObject> object = Utils::OpenHandle(*info.This()); |
| 168 Handle<Object> value = Utils::OpenHandle(*val); | 168 Handle<Object> value = Utils::OpenHandle(*val); |
| 169 | 169 |
| 170 if (SetPropertyOnInstanceIfInherited(isolate, info, name, value)) return; | 170 if (SetPropertyOnInstanceIfInherited(isolate, info, name, value)) return; |
| 171 | 171 |
| 172 LookupIterator it(object, Utils::OpenHandle(*name)); | 172 LookupIterator it(object, Utils::OpenHandle(*name)); |
| 173 CHECK_EQ(LookupIterator::ACCESSOR, it.state()); | 173 CHECK_EQ(LookupIterator::ACCESSOR, it.state()); |
| 174 DCHECK(it.HolderIsReceiverOrHiddenPrototype()); | 174 DCHECK(it.HolderIsReceiverOrHiddenPrototype()); |
| 175 Object::SetDataProperty(&it, value); | 175 |
| 176 if (Object::SetDataProperty(&it, value).is_null()) { |
| 177 isolate->OptionalRescheduleException(false); |
| 178 } |
| 176 } | 179 } |
| 177 | 180 |
| 178 | 181 |
| 179 Handle<AccessorInfo> Accessors::ArgumentsIteratorInfo( | 182 Handle<AccessorInfo> Accessors::ArgumentsIteratorInfo( |
| 180 Isolate* isolate, PropertyAttributes attributes) { | 183 Isolate* isolate, PropertyAttributes attributes) { |
| 181 Handle<Name> name(isolate->native_context()->iterator_symbol(), isolate); | 184 Handle<Name> name(isolate->native_context()->iterator_symbol(), isolate); |
| 182 return MakeAccessor(isolate, name, &ArgumentsIteratorGetter, | 185 return MakeAccessor(isolate, name, &ArgumentsIteratorGetter, |
| 183 &ArgumentsIteratorSetter, attributes); | 186 &ArgumentsIteratorSetter, attributes); |
| 184 } | 187 } |
| 185 | 188 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 } | 243 } |
| 241 Handle<Object> number_v; | 244 Handle<Object> number_v; |
| 242 maybe = Execution::ToNumber(isolate, value); | 245 maybe = Execution::ToNumber(isolate, value); |
| 243 if (!maybe.ToHandle(&number_v)) { | 246 if (!maybe.ToHandle(&number_v)) { |
| 244 isolate->OptionalRescheduleException(false); | 247 isolate->OptionalRescheduleException(false); |
| 245 return; | 248 return; |
| 246 } | 249 } |
| 247 | 250 |
| 248 if (uint32_v->Number() == number_v->Number()) { | 251 if (uint32_v->Number() == number_v->Number()) { |
| 249 maybe = JSArray::SetElementsLength(array_handle, uint32_v); | 252 maybe = JSArray::SetElementsLength(array_handle, uint32_v); |
| 250 maybe.Check(); | 253 if (maybe.is_null()) isolate->OptionalRescheduleException(false); |
| 251 return; | 254 return; |
| 252 } | 255 } |
| 253 | 256 |
| 254 Handle<Object> exception; | 257 Handle<Object> exception; |
| 255 maybe = isolate->factory()->NewRangeError("invalid_array_length", | 258 maybe = isolate->factory()->NewRangeError("invalid_array_length", |
| 256 HandleVector<Object>(NULL, 0)); | 259 HandleVector<Object>(NULL, 0)); |
| 257 if (!maybe.ToHandle(&exception)) { | 260 if (!maybe.ToHandle(&exception)) { |
| 258 isolate->OptionalRescheduleException(false); | 261 isolate->OptionalRescheduleException(false); |
| 259 return; | 262 return; |
| 260 } | 263 } |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 static Handle<Object> GetFunctionPrototype(Isolate* isolate, | 877 static Handle<Object> GetFunctionPrototype(Isolate* isolate, |
| 875 Handle<JSFunction> function) { | 878 Handle<JSFunction> function) { |
| 876 if (!function->has_prototype()) { | 879 if (!function->has_prototype()) { |
| 877 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); | 880 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); |
| 878 JSFunction::SetPrototype(function, proto); | 881 JSFunction::SetPrototype(function, proto); |
| 879 } | 882 } |
| 880 return Handle<Object>(function->prototype(), isolate); | 883 return Handle<Object>(function->prototype(), isolate); |
| 881 } | 884 } |
| 882 | 885 |
| 883 | 886 |
| 884 static Handle<Object> SetFunctionPrototype(Isolate* isolate, | 887 MUST_USE_RESULT static MaybeHandle<Object> SetFunctionPrototype( |
| 885 Handle<JSFunction> function, | 888 Isolate* isolate, Handle<JSFunction> function, Handle<Object> value) { |
| 886 Handle<Object> value) { | |
| 887 Handle<Object> old_value; | 889 Handle<Object> old_value; |
| 888 bool is_observed = function->map()->is_observed(); | 890 bool is_observed = function->map()->is_observed(); |
| 889 if (is_observed) { | 891 if (is_observed) { |
| 890 if (function->has_prototype()) | 892 if (function->has_prototype()) |
| 891 old_value = handle(function->prototype(), isolate); | 893 old_value = handle(function->prototype(), isolate); |
| 892 else | 894 else |
| 893 old_value = isolate->factory()->NewFunctionPrototype(function); | 895 old_value = isolate->factory()->NewFunctionPrototype(function); |
| 894 } | 896 } |
| 895 | 897 |
| 896 JSFunction::SetPrototype(function, value); | 898 JSFunction::SetPrototype(function, value); |
| 897 DCHECK(function->prototype() == *value); | 899 DCHECK(function->prototype() == *value); |
| 898 | 900 |
| 899 if (is_observed && !old_value->SameValue(*value)) { | 901 if (is_observed && !old_value->SameValue(*value)) { |
| 900 JSObject::EnqueueChangeRecord( | 902 MaybeHandle<Object> result = JSObject::EnqueueChangeRecord( |
| 901 function, "update", isolate->factory()->prototype_string(), old_value); | 903 function, "update", isolate->factory()->prototype_string(), old_value); |
| 904 if (result.is_null()) return MaybeHandle<Object>(); |
| 902 } | 905 } |
| 903 | 906 |
| 904 return function; | 907 return function; |
| 905 } | 908 } |
| 906 | 909 |
| 907 | 910 |
| 908 Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, | 911 MaybeHandle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, |
| 909 Handle<Object> prototype) { | 912 Handle<Object> prototype) { |
| 910 DCHECK(function->should_have_prototype()); | 913 DCHECK(function->should_have_prototype()); |
| 911 Isolate* isolate = function->GetIsolate(); | 914 Isolate* isolate = function->GetIsolate(); |
| 912 return SetFunctionPrototype(isolate, function, prototype); | 915 return SetFunctionPrototype(isolate, function, prototype); |
| 913 } | 916 } |
| 914 | 917 |
| 915 | 918 |
| 916 void Accessors::FunctionPrototypeGetter( | 919 void Accessors::FunctionPrototypeGetter( |
| 917 v8::Local<v8::Name> name, | 920 v8::Local<v8::Name> name, |
| 918 const v8::PropertyCallbackInfo<v8::Value>& info) { | 921 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 919 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 922 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 930 v8::Local<v8::Value> val, | 933 v8::Local<v8::Value> val, |
| 931 const v8::PropertyCallbackInfo<void>& info) { | 934 const v8::PropertyCallbackInfo<void>& info) { |
| 932 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 935 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 933 HandleScope scope(isolate); | 936 HandleScope scope(isolate); |
| 934 Handle<Object> value = Utils::OpenHandle(*val); | 937 Handle<Object> value = Utils::OpenHandle(*val); |
| 935 if (SetPropertyOnInstanceIfInherited(isolate, info, name, value)) { | 938 if (SetPropertyOnInstanceIfInherited(isolate, info, name, value)) { |
| 936 return; | 939 return; |
| 937 } | 940 } |
| 938 Handle<JSFunction> object = | 941 Handle<JSFunction> object = |
| 939 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); | 942 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
| 940 SetFunctionPrototype(isolate, object, value); | 943 if (SetFunctionPrototype(isolate, object, value).is_null()) { |
| 944 isolate->OptionalRescheduleException(false); |
| 945 } |
| 941 } | 946 } |
| 942 | 947 |
| 943 | 948 |
| 944 Handle<AccessorInfo> Accessors::FunctionPrototypeInfo( | 949 Handle<AccessorInfo> Accessors::FunctionPrototypeInfo( |
| 945 Isolate* isolate, PropertyAttributes attributes) { | 950 Isolate* isolate, PropertyAttributes attributes) { |
| 946 return MakeAccessor(isolate, | 951 return MakeAccessor(isolate, |
| 947 isolate->factory()->prototype_string(), | 952 isolate->factory()->prototype_string(), |
| 948 &FunctionPrototypeGetter, | 953 &FunctionPrototypeGetter, |
| 949 &FunctionPrototypeSetter, | 954 &FunctionPrototypeSetter, |
| 950 attributes); | 955 attributes); |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 info->set_data(Smi::FromInt(index)); | 1402 info->set_data(Smi::FromInt(index)); |
| 1398 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1403 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
| 1399 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1404 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
| 1400 info->set_getter(*getter); | 1405 info->set_getter(*getter); |
| 1401 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1406 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 1402 return info; | 1407 return info; |
| 1403 } | 1408 } |
| 1404 | 1409 |
| 1405 | 1410 |
| 1406 } } // namespace v8::internal | 1411 } } // namespace v8::internal |
| OLD | NEW |