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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); | 167 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); |
168 } | 168 } |
169 | 169 |
170 | 170 |
171 void Accessors::ArrayLengthSetter( | 171 void Accessors::ArrayLengthSetter( |
172 v8::Local<v8::String> name, | 172 v8::Local<v8::String> name, |
173 v8::Local<v8::Value> val, | 173 v8::Local<v8::Value> val, |
174 const v8::PropertyCallbackInfo<void>& info) { | 174 const v8::PropertyCallbackInfo<void>& info) { |
175 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 175 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
176 HandleScope scope(isolate); | 176 HandleScope scope(isolate); |
177 Handle<JSObject> object = Handle<JSObject>::cast( | 177 Handle<JSObject> object = Utils::OpenHandle(*info.This()); |
178 Utils::OpenHandle(*info.This())); | |
179 Handle<Object> value = Utils::OpenHandle(*val); | 178 Handle<Object> value = Utils::OpenHandle(*val); |
180 // This means one of the object's prototypes is a JSArray and the | 179 // This means one of the object's prototypes is a JSArray and the |
181 // object does not have a 'length' property. Calling SetProperty | 180 // object does not have a 'length' property. Calling SetProperty |
182 // causes an infinite loop. | 181 // causes an infinite loop. |
183 if (!object->IsJSArray()) { | 182 if (!object->IsJSArray()) { |
| 183 // This behaves sloppy since we lost the actual strict-mode. |
| 184 // TODO(verwaest): Fix by making ExecutableAccessorInfo behave like data |
| 185 // properties. |
| 186 if (!object->map()->is_extensible()) return; |
184 MaybeHandle<Object> maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | 187 MaybeHandle<Object> maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
185 object, isolate->factory()->length_string(), value, NONE); | 188 object, isolate->factory()->length_string(), value, NONE); |
186 maybe_result.Check(); | 189 maybe_result.Check(); |
187 return; | 190 return; |
188 } | 191 } |
189 | 192 |
190 value = FlattenNumber(isolate, value); | 193 value = FlattenNumber(isolate, value); |
191 | 194 |
192 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); | 195 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); |
193 MaybeHandle<Object> maybe; | 196 MaybeHandle<Object> maybe; |
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1351 info->set_data(Smi::FromInt(index)); | 1354 info->set_data(Smi::FromInt(index)); |
1352 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1355 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
1353 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1356 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
1354 info->set_getter(*getter); | 1357 info->set_getter(*getter); |
1355 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1358 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
1356 return info; | 1359 return info; |
1357 } | 1360 } |
1358 | 1361 |
1359 | 1362 |
1360 } } // namespace v8::internal | 1363 } } // namespace v8::internal |
OLD | NEW |