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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 bool Accessors::IsJSObjectFieldAccessor<HeapType>(Handle<HeapType> type, | 167 bool Accessors::IsJSObjectFieldAccessor<HeapType>(Handle<HeapType> type, |
168 Handle<String> name, | 168 Handle<String> name, |
169 int* object_offset); | 169 int* object_offset); |
170 | 170 |
171 | 171 |
172 // | 172 // |
173 // Accessors::ArrayLength | 173 // Accessors::ArrayLength |
174 // | 174 // |
175 | 175 |
176 | 176 |
177 Object* Accessors::ArrayGetLength(Isolate* isolate, | |
178 Object* object, | |
179 void*) { | |
180 // Traverse the prototype chain until we reach an array. | |
181 JSArray* holder = FindInstanceOf<JSArray>(isolate, object); | |
182 return holder == NULL ? Smi::FromInt(0) : holder->length(); | |
183 } | |
184 | |
185 | |
186 // The helper function will 'flatten' Number objects. | 177 // The helper function will 'flatten' Number objects. |
187 Handle<Object> Accessors::FlattenNumber(Isolate* isolate, | 178 Handle<Object> Accessors::FlattenNumber(Isolate* isolate, |
188 Handle<Object> value) { | 179 Handle<Object> value) { |
189 if (value->IsNumber() || !value->IsJSValue()) return value; | 180 if (value->IsNumber() || !value->IsJSValue()) return value; |
190 Handle<JSValue> wrapper = Handle<JSValue>::cast(value); | 181 Handle<JSValue> wrapper = Handle<JSValue>::cast(value); |
191 ASSERT(wrapper->GetIsolate()->context()->native_context()->number_function()-> | 182 ASSERT(wrapper->GetIsolate()->context()->native_context()->number_function()-> |
192 has_initial_map()); | 183 has_initial_map()); |
193 if (wrapper->map() == | 184 if (wrapper->map() == |
194 isolate->context()->native_context()->number_function()->initial_map()) { | 185 isolate->context()->native_context()->number_function()->initial_map()) { |
195 return handle(wrapper->value(), isolate); | 186 return handle(wrapper->value(), isolate); |
196 } | 187 } |
197 | 188 |
198 return value; | 189 return value; |
199 } | 190 } |
200 | 191 |
201 | 192 |
202 Object* Accessors::ArraySetLength(Isolate* isolate, | 193 void Accessors::ArrayLengthGetter( |
203 JSObject* object_raw, | 194 v8::Local<v8::String> name, |
204 Object* value_raw, | 195 const v8::PropertyCallbackInfo<v8::Value>& info) { |
205 void*) { | 196 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 197 DisallowHeapAllocation no_allocation; |
206 HandleScope scope(isolate); | 198 HandleScope scope(isolate); |
207 Handle<JSObject> object(object_raw, isolate); | 199 Object* object = *Utils::OpenHandle(*info.This()); |
208 Handle<Object> value(value_raw, isolate); | 200 // Traverse the prototype chain until we reach an array. |
| 201 JSArray* holder = FindInstanceOf<JSArray>(isolate, object); |
| 202 Object* result; |
| 203 if (holder != NULL) { |
| 204 result = holder->length(); |
| 205 } else { |
| 206 result = Smi::FromInt(0); |
| 207 } |
| 208 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); |
| 209 } |
209 | 210 |
| 211 |
| 212 void Accessors::ArrayLengthSetter( |
| 213 v8::Local<v8::String> name, |
| 214 v8::Local<v8::Value> val, |
| 215 const v8::PropertyCallbackInfo<void>& info) { |
| 216 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 217 HandleScope scope(isolate); |
| 218 Handle<JSObject> object = Utils::OpenHandle(*info.This()); |
| 219 Handle<Object> value = Utils::OpenHandle(*val); |
210 // This means one of the object's prototypes is a JSArray and the | 220 // This means one of the object's prototypes is a JSArray and the |
211 // object does not have a 'length' property. Calling SetProperty | 221 // object does not have a 'length' property. Calling SetProperty |
212 // causes an infinite loop. | 222 // causes an infinite loop. |
213 if (!object->IsJSArray()) { | 223 if (!object->IsJSArray()) { |
214 Handle<Object> result; | 224 MaybeHandle<Object> maybe_result = |
215 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
216 isolate, result, | |
217 JSObject::SetLocalPropertyIgnoreAttributes( | 225 JSObject::SetLocalPropertyIgnoreAttributes( |
218 object, isolate->factory()->length_string(), value, NONE)); | 226 object, isolate->factory()->length_string(), value, NONE); |
219 return *result; | 227 maybe_result.ToHandleChecked(); |
| 228 return; |
220 } | 229 } |
221 | 230 |
222 value = FlattenNumber(isolate, value); | 231 value = FlattenNumber(isolate, value); |
223 | 232 |
224 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); | 233 Handle<JSArray> array_handle = Handle<JSArray>::cast(object); |
225 | 234 MaybeHandle<Object> maybe; |
226 Handle<Object> uint32_v; | 235 Handle<Object> uint32_v; |
227 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 236 maybe = Execution::ToUint32(isolate, value); |
228 isolate, uint32_v, Execution::ToUint32(isolate, value)); | 237 if (!maybe.ToHandle(&uint32_v)) { |
| 238 isolate->OptionalRescheduleException(false); |
| 239 return; |
| 240 } |
229 Handle<Object> number_v; | 241 Handle<Object> number_v; |
230 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 242 maybe = Execution::ToNumber(isolate, value); |
231 isolate, number_v, Execution::ToNumber(isolate, value)); | 243 if (!maybe.ToHandle(&number_v)) { |
| 244 isolate->OptionalRescheduleException(false); |
| 245 return; |
| 246 } |
232 | 247 |
233 if (uint32_v->Number() == number_v->Number()) { | 248 if (uint32_v->Number() == number_v->Number()) { |
234 Handle<Object> result; | 249 MaybeHandle<Object> result; |
235 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 250 result = JSArray::SetElementsLength(array_handle, uint32_v); |
236 isolate, result, | 251 USE(result); |
237 JSArray::SetElementsLength(array_handle, uint32_v)); | 252 return; |
238 return *result; | |
239 } | 253 } |
240 return isolate->Throw( | 254 |
| 255 isolate->ScheduleThrow( |
241 *isolate->factory()->NewRangeError("invalid_array_length", | 256 *isolate->factory()->NewRangeError("invalid_array_length", |
242 HandleVector<Object>(NULL, 0))); | 257 HandleVector<Object>(NULL, 0))); |
243 } | 258 } |
244 | 259 |
245 | 260 |
246 const AccessorDescriptor Accessors::ArrayLength = { | 261 Handle<AccessorInfo> Accessors::ArrayLengthInfo( |
247 ArrayGetLength, | 262 Isolate* isolate, PropertyAttributes attributes) { |
248 ArraySetLength, | 263 return MakeAccessor(isolate, |
249 0 | 264 isolate->factory()->length_string(), |
250 }; | 265 &ArrayLengthGetter, |
| 266 &ArrayLengthSetter, |
| 267 attributes); |
| 268 } |
| 269 |
251 | 270 |
252 | 271 |
253 // | 272 // |
254 // Accessors::StringLength | 273 // Accessors::StringLength |
255 // | 274 // |
256 | 275 |
257 void Accessors::StringLengthGetter( | 276 void Accessors::StringLengthGetter( |
258 v8::Local<v8::String> name, | 277 v8::Local<v8::String> name, |
259 const v8::PropertyCallbackInfo<v8::Value>& info) { | 278 const v8::PropertyCallbackInfo<v8::Value>& info) { |
260 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 279 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
(...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 info->set_data(Smi::FromInt(index)); | 1361 info->set_data(Smi::FromInt(index)); |
1343 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1362 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
1344 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1363 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
1345 info->set_getter(*getter); | 1364 info->set_getter(*getter); |
1346 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1365 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
1347 return info; | 1366 return info; |
1348 } | 1367 } |
1349 | 1368 |
1350 | 1369 |
1351 } } // namespace v8::internal | 1370 } } // namespace v8::internal |
OLD | NEW |