| 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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 | 184 |
| 185 void Accessors::ArrayLengthSetter( | 185 void Accessors::ArrayLengthSetter( |
| 186 v8::Local<v8::String> name, | 186 v8::Local<v8::String> name, |
| 187 v8::Local<v8::Value> val, | 187 v8::Local<v8::Value> val, |
| 188 const v8::PropertyCallbackInfo<void>& info) { | 188 const v8::PropertyCallbackInfo<void>& info) { |
| 189 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 189 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 190 HandleScope scope(isolate); | 190 HandleScope scope(isolate); |
| 191 Handle<JSObject> object = Handle<JSObject>::cast( | 191 Handle<JSObject> object = Handle<JSObject>::cast( |
| 192 Utils::OpenHandle(*info.This())); | 192 Utils::OpenHandle(*info.This())); |
| 193 Handle<Object> value = Utils::OpenHandle(*val); | 193 Handle<Object> value = Utils::OpenHandle(*val); |
| 194 // This means one of the object's prototypes is a JSArray and the | 194 ASSERT(object->IsJSArray()); |
| 195 // object does not have a 'length' property. Calling SetProperty | |
| 196 // causes an infinite loop. | |
| 197 if (!object->IsJSArray()) { | |
| 198 MaybeHandle<Object> maybe_result = | |
| 199 JSObject::SetOwnPropertyIgnoreAttributes( | |
| 200 object, isolate->factory()->length_string(), value, NONE); | |
| 201 maybe_result.Check(); | |
| 202 return; | |
| 203 } | |
| 204 | 195 |
| 205 value = FlattenNumber(isolate, value); | 196 value = FlattenNumber(isolate, value); |
| 206 | 197 |
| 207 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); | 198 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); |
| 208 MaybeHandle<Object> maybe; | 199 MaybeHandle<Object> maybe; |
| 209 Handle<Object> uint32_v; | 200 Handle<Object> uint32_v; |
| 210 maybe = Execution::ToUint32(isolate, value); | 201 maybe = Execution::ToUint32(isolate, value); |
| 211 if (!maybe.ToHandle(&uint32_v)) { | 202 if (!maybe.ToHandle(&uint32_v)) { |
| 212 isolate->OptionalRescheduleException(false); | 203 isolate->OptionalRescheduleException(false); |
| 213 return; | 204 return; |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 Handle<JSObject> receiver, | 855 Handle<JSObject> receiver, |
| 865 Handle<Object> value) { | 856 Handle<Object> value) { |
| 866 Handle<JSFunction> function; | 857 Handle<JSFunction> function; |
| 867 { | 858 { |
| 868 DisallowHeapAllocation no_allocation; | 859 DisallowHeapAllocation no_allocation; |
| 869 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, *receiver); | 860 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, *receiver); |
| 870 if (function_raw == NULL) return isolate->factory()->undefined_value(); | 861 if (function_raw == NULL) return isolate->factory()->undefined_value(); |
| 871 function = Handle<JSFunction>(function_raw, isolate); | 862 function = Handle<JSFunction>(function_raw, isolate); |
| 872 } | 863 } |
| 873 | 864 |
| 874 if (!function->should_have_prototype()) { | 865 ASSERT(function->should_have_prototype()); |
| 875 // Since we hit this accessor, object will have no prototype property. | |
| 876 MaybeHandle<Object> maybe_result = | |
| 877 JSObject::SetOwnPropertyIgnoreAttributes( | |
| 878 receiver, isolate->factory()->prototype_string(), value, NONE); | |
| 879 return maybe_result.ToHandleChecked(); | |
| 880 } | |
| 881 | 866 |
| 882 Handle<Object> old_value; | 867 Handle<Object> old_value; |
| 883 bool is_observed = *function == *receiver && function->map()->is_observed(); | 868 bool is_observed = *function == *receiver && function->map()->is_observed(); |
| 884 if (is_observed) { | 869 if (is_observed) { |
| 885 if (function->has_prototype()) | 870 if (function->has_prototype()) |
| 886 old_value = handle(function->prototype(), isolate); | 871 old_value = handle(function->prototype(), isolate); |
| 887 else | 872 else |
| 888 old_value = isolate->factory()->NewFunctionPrototype(function); | 873 old_value = isolate->factory()->NewFunctionPrototype(function); |
| 889 } | 874 } |
| 890 | 875 |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1422 info->set_data(Smi::FromInt(index)); | 1407 info->set_data(Smi::FromInt(index)); |
| 1423 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1408 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
| 1424 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1409 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
| 1425 info->set_getter(*getter); | 1410 info->set_getter(*getter); |
| 1426 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1411 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 1427 return info; | 1412 return info; |
| 1428 } | 1413 } |
| 1429 | 1414 |
| 1430 | 1415 |
| 1431 } } // namespace v8::internal | 1416 } } // namespace v8::internal |
| OLD | NEW |