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