Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Side by Side Diff: src/accessors.cc

Issue 1632603002: [api] Default native data property setter to replace the setter if the property is writable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/accessors.h ('k') | src/api.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/accessors.h" 5 #include "src/accessors.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/contexts.h" 8 #include "src/contexts.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/execution.h" 10 #include "src/execution.h"
(...skipping 16 matching lines...) Expand all
27 AccessorNameSetterCallback setter, 27 AccessorNameSetterCallback setter,
28 PropertyAttributes attributes) { 28 PropertyAttributes attributes) {
29 Factory* factory = isolate->factory(); 29 Factory* factory = isolate->factory();
30 Handle<AccessorInfo> info = factory->NewAccessorInfo(); 30 Handle<AccessorInfo> info = factory->NewAccessorInfo();
31 info->set_property_attributes(attributes); 31 info->set_property_attributes(attributes);
32 info->set_all_can_read(false); 32 info->set_all_can_read(false);
33 info->set_all_can_write(false); 33 info->set_all_can_write(false);
34 info->set_is_special_data_property(true); 34 info->set_is_special_data_property(true);
35 info->set_name(*name); 35 info->set_name(*name);
36 Handle<Object> get = v8::FromCData(isolate, getter); 36 Handle<Object> get = v8::FromCData(isolate, getter);
37 if (setter == nullptr) setter = &ReconfigureToDataProperty;
37 Handle<Object> set = v8::FromCData(isolate, setter); 38 Handle<Object> set = v8::FromCData(isolate, setter);
38 info->set_getter(*get); 39 info->set_getter(*get);
39 info->set_setter(*set); 40 info->set_setter(*set);
40 return info; 41 return info;
41 } 42 }
42 43
43 44
44 static V8_INLINE bool CheckForName(Handle<Name> name, 45 static V8_INLINE bool CheckForName(Handle<Name> name,
45 Handle<String> property_name, 46 Handle<String> property_name,
46 int offset, 47 int offset,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 case JS_DATA_VIEW_TYPE: 119 case JS_DATA_VIEW_TYPE:
119 return CheckForName(name, isolate->factory()->byte_length_string(), 120 return CheckForName(name, isolate->factory()->byte_length_string(),
120 JSDataView::kByteLengthOffset, object_offset) || 121 JSDataView::kByteLengthOffset, object_offset) ||
121 CheckForName(name, isolate->factory()->byte_offset_string(), 122 CheckForName(name, isolate->factory()->byte_offset_string(),
122 JSDataView::kByteOffsetOffset, object_offset); 123 JSDataView::kByteOffsetOffset, object_offset);
123 default: 124 default:
124 return false; 125 return false;
125 } 126 }
126 } 127 }
127 128
129 MUST_USE_RESULT static MaybeHandle<Object> ReplaceAccessorWithDataProperty(
130 Isolate* isolate, Handle<JSObject> receiver, Handle<JSObject> holder,
131 Handle<Name> name, Handle<Object> value, bool observe) {
132 LookupIterator it(receiver, name, holder,
133 LookupIterator::OWN_SKIP_INTERCEPTOR);
134 // Skip any access checks we might hit. This accessor should never hit in a
135 // situation where the caller does not have access.
136 if (it.state() == LookupIterator::ACCESS_CHECK) {
137 CHECK(it.HasAccess());
138 it.Next();
139 }
140 CHECK_EQ(LookupIterator::ACCESSOR, it.state());
141
142 Handle<Object> old_value;
143 bool is_observed = observe && receiver->map()->is_observed();
144 if (is_observed) {
145 MaybeHandle<Object> maybe_old =
146 Object::GetPropertyWithAccessor(&it, SLOPPY);
147 if (!maybe_old.ToHandle(&old_value)) return maybe_old;
148 }
149
150 it.ReconfigureDataProperty(value, it.property_attributes());
151
152 if (is_observed && !old_value->SameValue(*value)) {
153 return JSObject::EnqueueChangeRecord(receiver, "update", name, old_value);
154 }
155
156 return value;
157 }
158
159 void Accessors::ReconfigureToDataProperty(
160 v8::Local<v8::Name> key, v8::Local<v8::Value> val,
161 const v8::PropertyCallbackInfo<void>& info) {
162 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
163 HandleScope scope(isolate);
164 Handle<JSObject> receiver =
165 Handle<JSObject>::cast(Utils::OpenHandle(*info.This()));
166 Handle<JSObject> holder =
167 Handle<JSObject>::cast(Utils::OpenHandle(*info.Holder()));
168 Handle<Name> name = Utils::OpenHandle(*key);
169 Handle<Object> value = Utils::OpenHandle(*val);
170 MaybeHandle<Object> result = ReplaceAccessorWithDataProperty(
171 isolate, receiver, holder, name, value, false);
172 if (result.is_null()) isolate->OptionalRescheduleException(false);
173 }
128 174
129 // 175 //
130 // Accessors::ArgumentsIterator 176 // Accessors::ArgumentsIterator
131 // 177 //
132 178
133 179
134 void Accessors::ArgumentsIteratorGetter( 180 void Accessors::ArgumentsIteratorGetter(
135 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 181 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
136 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 182 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
137 DisallowHeapAllocation no_allocation; 183 DisallowHeapAllocation no_allocation;
138 HandleScope scope(isolate); 184 HandleScope scope(isolate);
139 Object* result = isolate->native_context()->array_values_iterator(); 185 Object* result = isolate->native_context()->array_values_iterator();
140 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); 186 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate)));
141 } 187 }
142 188
143 189
144 void Accessors::ArgumentsIteratorSetter(
145 v8::Local<v8::Name> name, v8::Local<v8::Value> val,
146 const v8::PropertyCallbackInfo<void>& info) {
147 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
148 HandleScope scope(isolate);
149 Handle<JSObject> object_handle =
150 Handle<JSObject>::cast(Utils::OpenHandle(*info.This()));
151 Handle<Object> value_handle = Utils::OpenHandle(*val);
152 Handle<Name> name_handle = Utils::OpenHandle(*name);
153
154 if (JSObject::DefinePropertyOrElementIgnoreAttributes(
155 object_handle, name_handle, value_handle, NONE)
156 .is_null()) {
157 isolate->OptionalRescheduleException(false);
158 }
159 }
160
161
162 Handle<AccessorInfo> Accessors::ArgumentsIteratorInfo( 190 Handle<AccessorInfo> Accessors::ArgumentsIteratorInfo(
163 Isolate* isolate, PropertyAttributes attributes) { 191 Isolate* isolate, PropertyAttributes attributes) {
164 Handle<Name> name = isolate->factory()->iterator_symbol(); 192 Handle<Name> name = isolate->factory()->iterator_symbol();
165 return MakeAccessor(isolate, name, &ArgumentsIteratorGetter, 193 return MakeAccessor(isolate, name, &ArgumentsIteratorGetter, nullptr,
166 &ArgumentsIteratorSetter, attributes); 194 attributes);
167 } 195 }
168 196
169 197
170 // 198 //
171 // Accessors::ArrayLength 199 // Accessors::ArrayLength
172 // 200 //
173 201
174 202
175 void Accessors::ArrayLengthGetter( 203 void Accessors::ArrayLengthGetter(
176 v8::Local<v8::Name> name, 204 v8::Local<v8::Name> name,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 if (!value->IsString()) { 278 if (!value->IsString()) {
251 // Not a string value. That means that we either got a String wrapper or 279 // Not a string value. That means that we either got a String wrapper or
252 // a Value with a String wrapper in its prototype chain. 280 // a Value with a String wrapper in its prototype chain.
253 value = JSValue::cast(*Utils::OpenHandle(*info.Holder()))->value(); 281 value = JSValue::cast(*Utils::OpenHandle(*info.Holder()))->value();
254 } 282 }
255 Object* result = Smi::FromInt(String::cast(value)->length()); 283 Object* result = Smi::FromInt(String::cast(value)->length());
256 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); 284 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate)));
257 } 285 }
258 286
259 287
260 void Accessors::StringLengthSetter(
261 v8::Local<v8::Name> name,
262 v8::Local<v8::Value> value,
263 const v8::PropertyCallbackInfo<void>& info) {
264 UNREACHABLE();
265 }
266
267
268 Handle<AccessorInfo> Accessors::StringLengthInfo( 288 Handle<AccessorInfo> Accessors::StringLengthInfo(
269 Isolate* isolate, PropertyAttributes attributes) { 289 Isolate* isolate, PropertyAttributes attributes) {
270 return MakeAccessor(isolate, 290 return MakeAccessor(isolate, isolate->factory()->length_string(),
271 isolate->factory()->length_string(), 291 &StringLengthGetter, nullptr, attributes);
272 &StringLengthGetter,
273 &StringLengthSetter,
274 attributes);
275 } 292 }
276 293
277 294
278 // 295 //
279 // Accessors::ScriptColumnOffset 296 // Accessors::ScriptColumnOffset
280 // 297 //
281 298
282 299
283 void Accessors::ScriptColumnOffsetGetter( 300 void Accessors::ScriptColumnOffsetGetter(
284 v8::Local<v8::Name> name, 301 v8::Local<v8::Name> name,
285 const v8::PropertyCallbackInfo<v8::Value>& info) { 302 const v8::PropertyCallbackInfo<v8::Value>& info) {
286 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 303 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
287 DisallowHeapAllocation no_allocation; 304 DisallowHeapAllocation no_allocation;
288 HandleScope scope(isolate); 305 HandleScope scope(isolate);
289 Object* object = *Utils::OpenHandle(*info.This()); 306 Object* object = *Utils::OpenHandle(*info.This());
290 Object* res = Smi::FromInt( 307 Object* res = Smi::FromInt(
291 Script::cast(JSValue::cast(object)->value())->column_offset()); 308 Script::cast(JSValue::cast(object)->value())->column_offset());
292 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 309 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
293 } 310 }
294 311
295 312
296 void Accessors::ScriptColumnOffsetSetter(
297 v8::Local<v8::Name> name,
298 v8::Local<v8::Value> value,
299 const v8::PropertyCallbackInfo<void>& info) {
300 UNREACHABLE();
301 }
302
303
304 Handle<AccessorInfo> Accessors::ScriptColumnOffsetInfo( 313 Handle<AccessorInfo> Accessors::ScriptColumnOffsetInfo(
305 Isolate* isolate, PropertyAttributes attributes) { 314 Isolate* isolate, PropertyAttributes attributes) {
306 Handle<String> name(isolate->factory()->InternalizeOneByteString( 315 Handle<String> name(isolate->factory()->InternalizeOneByteString(
307 STATIC_CHAR_VECTOR("column_offset"))); 316 STATIC_CHAR_VECTOR("column_offset")));
308 return MakeAccessor(isolate, 317 return MakeAccessor(isolate, name, &ScriptColumnOffsetGetter, nullptr,
309 name,
310 &ScriptColumnOffsetGetter,
311 &ScriptColumnOffsetSetter,
312 attributes); 318 attributes);
313 } 319 }
314 320
315 321
316 // 322 //
317 // Accessors::ScriptId 323 // Accessors::ScriptId
318 // 324 //
319 325
320 326
321 void Accessors::ScriptIdGetter( 327 void Accessors::ScriptIdGetter(
322 v8::Local<v8::Name> name, 328 v8::Local<v8::Name> name,
323 const v8::PropertyCallbackInfo<v8::Value>& info) { 329 const v8::PropertyCallbackInfo<v8::Value>& info) {
324 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 330 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
325 DisallowHeapAllocation no_allocation; 331 DisallowHeapAllocation no_allocation;
326 HandleScope scope(isolate); 332 HandleScope scope(isolate);
327 Object* object = *Utils::OpenHandle(*info.This()); 333 Object* object = *Utils::OpenHandle(*info.This());
328 Object* id = Smi::FromInt(Script::cast(JSValue::cast(object)->value())->id()); 334 Object* id = Smi::FromInt(Script::cast(JSValue::cast(object)->value())->id());
329 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(id, isolate))); 335 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(id, isolate)));
330 } 336 }
331 337
332 338
333 void Accessors::ScriptIdSetter(
334 v8::Local<v8::Name> name,
335 v8::Local<v8::Value> value,
336 const v8::PropertyCallbackInfo<void>& info) {
337 UNREACHABLE();
338 }
339
340
341 Handle<AccessorInfo> Accessors::ScriptIdInfo( 339 Handle<AccessorInfo> Accessors::ScriptIdInfo(
342 Isolate* isolate, PropertyAttributes attributes) { 340 Isolate* isolate, PropertyAttributes attributes) {
343 Handle<String> name( 341 Handle<String> name(
344 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("id"))); 342 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("id")));
345 return MakeAccessor(isolate, 343 return MakeAccessor(isolate, name, &ScriptIdGetter, nullptr, attributes);
346 name,
347 &ScriptIdGetter,
348 &ScriptIdSetter,
349 attributes);
350 } 344 }
351 345
352 346
353 // 347 //
354 // Accessors::ScriptName 348 // Accessors::ScriptName
355 // 349 //
356 350
357 351
358 void Accessors::ScriptNameGetter( 352 void Accessors::ScriptNameGetter(
359 v8::Local<v8::Name> name, 353 v8::Local<v8::Name> name,
360 const v8::PropertyCallbackInfo<v8::Value>& info) { 354 const v8::PropertyCallbackInfo<v8::Value>& info) {
361 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 355 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
362 DisallowHeapAllocation no_allocation; 356 DisallowHeapAllocation no_allocation;
363 HandleScope scope(isolate); 357 HandleScope scope(isolate);
364 Object* object = *Utils::OpenHandle(*info.This()); 358 Object* object = *Utils::OpenHandle(*info.This());
365 Object* source = Script::cast(JSValue::cast(object)->value())->name(); 359 Object* source = Script::cast(JSValue::cast(object)->value())->name();
366 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate))); 360 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate)));
367 } 361 }
368 362
369 363
370 void Accessors::ScriptNameSetter(
371 v8::Local<v8::Name> name,
372 v8::Local<v8::Value> value,
373 const v8::PropertyCallbackInfo<void>& info) {
374 UNREACHABLE();
375 }
376
377
378 Handle<AccessorInfo> Accessors::ScriptNameInfo( 364 Handle<AccessorInfo> Accessors::ScriptNameInfo(
379 Isolate* isolate, PropertyAttributes attributes) { 365 Isolate* isolate, PropertyAttributes attributes) {
380 return MakeAccessor(isolate, 366 return MakeAccessor(isolate, isolate->factory()->name_string(),
381 isolate->factory()->name_string(), 367 &ScriptNameGetter, nullptr, attributes);
382 &ScriptNameGetter,
383 &ScriptNameSetter,
384 attributes);
385 } 368 }
386 369
387 370
388 // 371 //
389 // Accessors::ScriptSource 372 // Accessors::ScriptSource
390 // 373 //
391 374
392 375
393 void Accessors::ScriptSourceGetter( 376 void Accessors::ScriptSourceGetter(
394 v8::Local<v8::Name> name, 377 v8::Local<v8::Name> name,
395 const v8::PropertyCallbackInfo<v8::Value>& info) { 378 const v8::PropertyCallbackInfo<v8::Value>& info) {
396 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 379 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
397 DisallowHeapAllocation no_allocation; 380 DisallowHeapAllocation no_allocation;
398 HandleScope scope(isolate); 381 HandleScope scope(isolate);
399 Object* object = *Utils::OpenHandle(*info.This()); 382 Object* object = *Utils::OpenHandle(*info.This());
400 Object* source = Script::cast(JSValue::cast(object)->value())->source(); 383 Object* source = Script::cast(JSValue::cast(object)->value())->source();
401 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate))); 384 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate)));
402 } 385 }
403 386
404 387
405 void Accessors::ScriptSourceSetter(
406 v8::Local<v8::Name> name,
407 v8::Local<v8::Value> value,
408 const v8::PropertyCallbackInfo<void>& info) {
409 UNREACHABLE();
410 }
411
412
413 Handle<AccessorInfo> Accessors::ScriptSourceInfo( 388 Handle<AccessorInfo> Accessors::ScriptSourceInfo(
414 Isolate* isolate, PropertyAttributes attributes) { 389 Isolate* isolate, PropertyAttributes attributes) {
415 return MakeAccessor(isolate, 390 return MakeAccessor(isolate, isolate->factory()->source_string(),
416 isolate->factory()->source_string(), 391 &ScriptSourceGetter, nullptr, attributes);
417 &ScriptSourceGetter,
418 &ScriptSourceSetter,
419 attributes);
420 } 392 }
421 393
422 394
423 // 395 //
424 // Accessors::ScriptLineOffset 396 // Accessors::ScriptLineOffset
425 // 397 //
426 398
427 399
428 void Accessors::ScriptLineOffsetGetter( 400 void Accessors::ScriptLineOffsetGetter(
429 v8::Local<v8::Name> name, 401 v8::Local<v8::Name> name,
430 const v8::PropertyCallbackInfo<v8::Value>& info) { 402 const v8::PropertyCallbackInfo<v8::Value>& info) {
431 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 403 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
432 DisallowHeapAllocation no_allocation; 404 DisallowHeapAllocation no_allocation;
433 HandleScope scope(isolate); 405 HandleScope scope(isolate);
434 Object* object = *Utils::OpenHandle(*info.This()); 406 Object* object = *Utils::OpenHandle(*info.This());
435 Object* res = 407 Object* res =
436 Smi::FromInt(Script::cast(JSValue::cast(object)->value())->line_offset()); 408 Smi::FromInt(Script::cast(JSValue::cast(object)->value())->line_offset());
437 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 409 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
438 } 410 }
439 411
440 412
441 void Accessors::ScriptLineOffsetSetter(
442 v8::Local<v8::Name> name,
443 v8::Local<v8::Value> value,
444 const v8::PropertyCallbackInfo<void>& info) {
445 UNREACHABLE();
446 }
447
448
449 Handle<AccessorInfo> Accessors::ScriptLineOffsetInfo( 413 Handle<AccessorInfo> Accessors::ScriptLineOffsetInfo(
450 Isolate* isolate, PropertyAttributes attributes) { 414 Isolate* isolate, PropertyAttributes attributes) {
451 Handle<String> name(isolate->factory()->InternalizeOneByteString( 415 Handle<String> name(isolate->factory()->InternalizeOneByteString(
452 STATIC_CHAR_VECTOR("line_offset"))); 416 STATIC_CHAR_VECTOR("line_offset")));
453 return MakeAccessor(isolate, 417 return MakeAccessor(isolate, name, &ScriptLineOffsetGetter, nullptr,
454 name,
455 &ScriptLineOffsetGetter,
456 &ScriptLineOffsetSetter,
457 attributes); 418 attributes);
458 } 419 }
459 420
460 421
461 // 422 //
462 // Accessors::ScriptType 423 // Accessors::ScriptType
463 // 424 //
464 425
465 426
466 void Accessors::ScriptTypeGetter( 427 void Accessors::ScriptTypeGetter(
467 v8::Local<v8::Name> name, 428 v8::Local<v8::Name> name,
468 const v8::PropertyCallbackInfo<v8::Value>& info) { 429 const v8::PropertyCallbackInfo<v8::Value>& info) {
469 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 430 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
470 DisallowHeapAllocation no_allocation; 431 DisallowHeapAllocation no_allocation;
471 HandleScope scope(isolate); 432 HandleScope scope(isolate);
472 Object* object = *Utils::OpenHandle(*info.This()); 433 Object* object = *Utils::OpenHandle(*info.This());
473 Object* res = 434 Object* res =
474 Smi::FromInt(Script::cast(JSValue::cast(object)->value())->type()); 435 Smi::FromInt(Script::cast(JSValue::cast(object)->value())->type());
475 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 436 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
476 } 437 }
477 438
478 439
479 void Accessors::ScriptTypeSetter(
480 v8::Local<v8::Name> name,
481 v8::Local<v8::Value> value,
482 const v8::PropertyCallbackInfo<void>& info) {
483 UNREACHABLE();
484 }
485
486
487 Handle<AccessorInfo> Accessors::ScriptTypeInfo( 440 Handle<AccessorInfo> Accessors::ScriptTypeInfo(
488 Isolate* isolate, PropertyAttributes attributes) { 441 Isolate* isolate, PropertyAttributes attributes) {
489 Handle<String> name( 442 Handle<String> name(
490 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("type"))); 443 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("type")));
491 return MakeAccessor(isolate, 444 return MakeAccessor(isolate, name, &ScriptTypeGetter, nullptr, attributes);
492 name,
493 &ScriptTypeGetter,
494 &ScriptTypeSetter,
495 attributes);
496 } 445 }
497 446
498 447
499 // 448 //
500 // Accessors::ScriptCompilationType 449 // Accessors::ScriptCompilationType
501 // 450 //
502 451
503 452
504 void Accessors::ScriptCompilationTypeGetter( 453 void Accessors::ScriptCompilationTypeGetter(
505 v8::Local<v8::Name> name, 454 v8::Local<v8::Name> name,
506 const v8::PropertyCallbackInfo<v8::Value>& info) { 455 const v8::PropertyCallbackInfo<v8::Value>& info) {
507 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 456 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
508 DisallowHeapAllocation no_allocation; 457 DisallowHeapAllocation no_allocation;
509 HandleScope scope(isolate); 458 HandleScope scope(isolate);
510 Object* object = *Utils::OpenHandle(*info.This()); 459 Object* object = *Utils::OpenHandle(*info.This());
511 Object* res = Smi::FromInt( 460 Object* res = Smi::FromInt(
512 Script::cast(JSValue::cast(object)->value())->compilation_type()); 461 Script::cast(JSValue::cast(object)->value())->compilation_type());
513 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 462 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
514 } 463 }
515 464
516 465
517 void Accessors::ScriptCompilationTypeSetter(
518 v8::Local<v8::Name> name,
519 v8::Local<v8::Value> value,
520 const v8::PropertyCallbackInfo<void>& info) {
521 UNREACHABLE();
522 }
523
524
525 Handle<AccessorInfo> Accessors::ScriptCompilationTypeInfo( 466 Handle<AccessorInfo> Accessors::ScriptCompilationTypeInfo(
526 Isolate* isolate, PropertyAttributes attributes) { 467 Isolate* isolate, PropertyAttributes attributes) {
527 Handle<String> name(isolate->factory()->InternalizeOneByteString( 468 Handle<String> name(isolate->factory()->InternalizeOneByteString(
528 STATIC_CHAR_VECTOR("compilation_type"))); 469 STATIC_CHAR_VECTOR("compilation_type")));
529 return MakeAccessor(isolate, 470 return MakeAccessor(isolate, name, &ScriptCompilationTypeGetter, nullptr,
530 name,
531 &ScriptCompilationTypeGetter,
532 &ScriptCompilationTypeSetter,
533 attributes); 471 attributes);
534 } 472 }
535 473
536 474
537 // 475 //
538 // Accessors::ScriptGetLineEnds 476 // Accessors::ScriptGetLineEnds
539 // 477 //
540 478
541 479
542 void Accessors::ScriptLineEndsGetter( 480 void Accessors::ScriptLineEndsGetter(
543 v8::Local<v8::Name> name, 481 v8::Local<v8::Name> name,
544 const v8::PropertyCallbackInfo<v8::Value>& info) { 482 const v8::PropertyCallbackInfo<v8::Value>& info) {
545 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 483 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
546 HandleScope scope(isolate); 484 HandleScope scope(isolate);
547 Handle<Object> object = Utils::OpenHandle(*info.This()); 485 Handle<Object> object = Utils::OpenHandle(*info.This());
548 Handle<Script> script( 486 Handle<Script> script(
549 Script::cast(Handle<JSValue>::cast(object)->value()), isolate); 487 Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
550 Script::InitLineEnds(script); 488 Script::InitLineEnds(script);
551 DCHECK(script->line_ends()->IsFixedArray()); 489 DCHECK(script->line_ends()->IsFixedArray());
552 Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends())); 490 Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends()));
553 // We do not want anyone to modify this array from JS. 491 // We do not want anyone to modify this array from JS.
554 DCHECK(*line_ends == isolate->heap()->empty_fixed_array() || 492 DCHECK(*line_ends == isolate->heap()->empty_fixed_array() ||
555 line_ends->map() == isolate->heap()->fixed_cow_array_map()); 493 line_ends->map() == isolate->heap()->fixed_cow_array_map());
556 Handle<JSArray> js_array = 494 Handle<JSArray> js_array =
557 isolate->factory()->NewJSArrayWithElements(line_ends); 495 isolate->factory()->NewJSArrayWithElements(line_ends);
558 info.GetReturnValue().Set(Utils::ToLocal(js_array)); 496 info.GetReturnValue().Set(Utils::ToLocal(js_array));
559 } 497 }
560 498
561 499
562 void Accessors::ScriptLineEndsSetter(
563 v8::Local<v8::Name> name,
564 v8::Local<v8::Value> value,
565 const v8::PropertyCallbackInfo<void>& info) {
566 UNREACHABLE();
567 }
568
569
570 Handle<AccessorInfo> Accessors::ScriptLineEndsInfo( 500 Handle<AccessorInfo> Accessors::ScriptLineEndsInfo(
571 Isolate* isolate, PropertyAttributes attributes) { 501 Isolate* isolate, PropertyAttributes attributes) {
572 Handle<String> name(isolate->factory()->InternalizeOneByteString( 502 Handle<String> name(isolate->factory()->InternalizeOneByteString(
573 STATIC_CHAR_VECTOR("line_ends"))); 503 STATIC_CHAR_VECTOR("line_ends")));
574 return MakeAccessor(isolate, 504 return MakeAccessor(isolate, name, &ScriptLineEndsGetter, nullptr,
575 name,
576 &ScriptLineEndsGetter,
577 &ScriptLineEndsSetter,
578 attributes); 505 attributes);
579 } 506 }
580 507
581 508
582 // 509 //
583 // Accessors::ScriptSourceUrl 510 // Accessors::ScriptSourceUrl
584 // 511 //
585 512
586 513
587 void Accessors::ScriptSourceUrlGetter( 514 void Accessors::ScriptSourceUrlGetter(
588 v8::Local<v8::Name> name, 515 v8::Local<v8::Name> name,
589 const v8::PropertyCallbackInfo<v8::Value>& info) { 516 const v8::PropertyCallbackInfo<v8::Value>& info) {
590 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 517 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
591 DisallowHeapAllocation no_allocation; 518 DisallowHeapAllocation no_allocation;
592 HandleScope scope(isolate); 519 HandleScope scope(isolate);
593 Object* object = *Utils::OpenHandle(*info.This()); 520 Object* object = *Utils::OpenHandle(*info.This());
594 Object* url = Script::cast(JSValue::cast(object)->value())->source_url(); 521 Object* url = Script::cast(JSValue::cast(object)->value())->source_url();
595 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate))); 522 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate)));
596 } 523 }
597 524
598 525
599 void Accessors::ScriptSourceUrlSetter(
600 v8::Local<v8::Name> name,
601 v8::Local<v8::Value> value,
602 const v8::PropertyCallbackInfo<void>& info) {
603 UNREACHABLE();
604 }
605
606
607 Handle<AccessorInfo> Accessors::ScriptSourceUrlInfo( 526 Handle<AccessorInfo> Accessors::ScriptSourceUrlInfo(
608 Isolate* isolate, PropertyAttributes attributes) { 527 Isolate* isolate, PropertyAttributes attributes) {
609 return MakeAccessor(isolate, 528 return MakeAccessor(isolate, isolate->factory()->source_url_string(),
610 isolate->factory()->source_url_string(), 529 &ScriptSourceUrlGetter, nullptr, attributes);
611 &ScriptSourceUrlGetter,
612 &ScriptSourceUrlSetter,
613 attributes);
614 } 530 }
615 531
616 532
617 // 533 //
618 // Accessors::ScriptSourceMappingUrl 534 // Accessors::ScriptSourceMappingUrl
619 // 535 //
620 536
621 537
622 void Accessors::ScriptSourceMappingUrlGetter( 538 void Accessors::ScriptSourceMappingUrlGetter(
623 v8::Local<v8::Name> name, 539 v8::Local<v8::Name> name,
624 const v8::PropertyCallbackInfo<v8::Value>& info) { 540 const v8::PropertyCallbackInfo<v8::Value>& info) {
625 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 541 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
626 DisallowHeapAllocation no_allocation; 542 DisallowHeapAllocation no_allocation;
627 HandleScope scope(isolate); 543 HandleScope scope(isolate);
628 Object* object = *Utils::OpenHandle(*info.This()); 544 Object* object = *Utils::OpenHandle(*info.This());
629 Object* url = 545 Object* url =
630 Script::cast(JSValue::cast(object)->value())->source_mapping_url(); 546 Script::cast(JSValue::cast(object)->value())->source_mapping_url();
631 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate))); 547 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate)));
632 } 548 }
633 549
634 550
635 void Accessors::ScriptSourceMappingUrlSetter(
636 v8::Local<v8::Name> name,
637 v8::Local<v8::Value> value,
638 const v8::PropertyCallbackInfo<void>& info) {
639 UNREACHABLE();
640 }
641
642
643 Handle<AccessorInfo> Accessors::ScriptSourceMappingUrlInfo( 551 Handle<AccessorInfo> Accessors::ScriptSourceMappingUrlInfo(
644 Isolate* isolate, PropertyAttributes attributes) { 552 Isolate* isolate, PropertyAttributes attributes) {
645 return MakeAccessor(isolate, 553 return MakeAccessor(isolate, isolate->factory()->source_mapping_url_string(),
646 isolate->factory()->source_mapping_url_string(), 554 &ScriptSourceMappingUrlGetter, nullptr, attributes);
647 &ScriptSourceMappingUrlGetter,
648 &ScriptSourceMappingUrlSetter,
649 attributes);
650 } 555 }
651 556
652 557
653 // 558 //
654 // Accessors::ScriptIsEmbedderDebugScript 559 // Accessors::ScriptIsEmbedderDebugScript
655 // 560 //
656 561
657 562
658 void Accessors::ScriptIsEmbedderDebugScriptGetter( 563 void Accessors::ScriptIsEmbedderDebugScriptGetter(
659 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 564 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
660 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 565 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
661 DisallowHeapAllocation no_allocation; 566 DisallowHeapAllocation no_allocation;
662 HandleScope scope(isolate); 567 HandleScope scope(isolate);
663 Object* object = *Utils::OpenHandle(*info.This()); 568 Object* object = *Utils::OpenHandle(*info.This());
664 bool is_embedder_debug_script = Script::cast(JSValue::cast(object)->value()) 569 bool is_embedder_debug_script = Script::cast(JSValue::cast(object)->value())
665 ->origin_options() 570 ->origin_options()
666 .IsEmbedderDebugScript(); 571 .IsEmbedderDebugScript();
667 Object* res = *isolate->factory()->ToBoolean(is_embedder_debug_script); 572 Object* res = *isolate->factory()->ToBoolean(is_embedder_debug_script);
668 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 573 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
669 } 574 }
670 575
671 576
672 void Accessors::ScriptIsEmbedderDebugScriptSetter(
673 v8::Local<v8::Name> name, v8::Local<v8::Value> value,
674 const v8::PropertyCallbackInfo<void>& info) {
675 UNREACHABLE();
676 }
677
678
679 Handle<AccessorInfo> Accessors::ScriptIsEmbedderDebugScriptInfo( 577 Handle<AccessorInfo> Accessors::ScriptIsEmbedderDebugScriptInfo(
680 Isolate* isolate, PropertyAttributes attributes) { 578 Isolate* isolate, PropertyAttributes attributes) {
681 Handle<String> name(isolate->factory()->InternalizeOneByteString( 579 Handle<String> name(isolate->factory()->InternalizeOneByteString(
682 STATIC_CHAR_VECTOR("is_debugger_script"))); 580 STATIC_CHAR_VECTOR("is_debugger_script")));
683 return MakeAccessor(isolate, name, &ScriptIsEmbedderDebugScriptGetter, 581 return MakeAccessor(isolate, name, &ScriptIsEmbedderDebugScriptGetter,
684 &ScriptIsEmbedderDebugScriptSetter, attributes); 582 nullptr, attributes);
685 } 583 }
686 584
687 585
688 // 586 //
689 // Accessors::ScriptGetContextData 587 // Accessors::ScriptGetContextData
690 // 588 //
691 589
692 590
693 void Accessors::ScriptContextDataGetter( 591 void Accessors::ScriptContextDataGetter(
694 v8::Local<v8::Name> name, 592 v8::Local<v8::Name> name,
695 const v8::PropertyCallbackInfo<v8::Value>& info) { 593 const v8::PropertyCallbackInfo<v8::Value>& info) {
696 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 594 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
697 DisallowHeapAllocation no_allocation; 595 DisallowHeapAllocation no_allocation;
698 HandleScope scope(isolate); 596 HandleScope scope(isolate);
699 Object* object = *Utils::OpenHandle(*info.This()); 597 Object* object = *Utils::OpenHandle(*info.This());
700 Object* res = Script::cast(JSValue::cast(object)->value())->context_data(); 598 Object* res = Script::cast(JSValue::cast(object)->value())->context_data();
701 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate))); 599 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
702 } 600 }
703 601
704 602
705 void Accessors::ScriptContextDataSetter(
706 v8::Local<v8::Name> name,
707 v8::Local<v8::Value> value,
708 const v8::PropertyCallbackInfo<void>& info) {
709 UNREACHABLE();
710 }
711
712
713 Handle<AccessorInfo> Accessors::ScriptContextDataInfo( 603 Handle<AccessorInfo> Accessors::ScriptContextDataInfo(
714 Isolate* isolate, PropertyAttributes attributes) { 604 Isolate* isolate, PropertyAttributes attributes) {
715 Handle<String> name(isolate->factory()->InternalizeOneByteString( 605 Handle<String> name(isolate->factory()->InternalizeOneByteString(
716 STATIC_CHAR_VECTOR("context_data"))); 606 STATIC_CHAR_VECTOR("context_data")));
717 return MakeAccessor(isolate, 607 return MakeAccessor(isolate, name, &ScriptContextDataGetter, nullptr,
718 name,
719 &ScriptContextDataGetter,
720 &ScriptContextDataSetter,
721 attributes); 608 attributes);
722 } 609 }
723 610
724 611
725 // 612 //
726 // Accessors::ScriptGetEvalFromScript 613 // Accessors::ScriptGetEvalFromScript
727 // 614 //
728 615
729 616
730 void Accessors::ScriptEvalFromScriptGetter( 617 void Accessors::ScriptEvalFromScriptGetter(
(...skipping 11 matching lines...) Expand all
742 if (eval_from_shared->script()->IsScript()) { 629 if (eval_from_shared->script()->IsScript()) {
743 Handle<Script> eval_from_script(Script::cast(eval_from_shared->script())); 630 Handle<Script> eval_from_script(Script::cast(eval_from_shared->script()));
744 result = Script::GetWrapper(eval_from_script); 631 result = Script::GetWrapper(eval_from_script);
745 } 632 }
746 } 633 }
747 634
748 info.GetReturnValue().Set(Utils::ToLocal(result)); 635 info.GetReturnValue().Set(Utils::ToLocal(result));
749 } 636 }
750 637
751 638
752 void Accessors::ScriptEvalFromScriptSetter(
753 v8::Local<v8::Name> name,
754 v8::Local<v8::Value> value,
755 const v8::PropertyCallbackInfo<void>& info) {
756 UNREACHABLE();
757 }
758
759
760 Handle<AccessorInfo> Accessors::ScriptEvalFromScriptInfo( 639 Handle<AccessorInfo> Accessors::ScriptEvalFromScriptInfo(
761 Isolate* isolate, PropertyAttributes attributes) { 640 Isolate* isolate, PropertyAttributes attributes) {
762 Handle<String> name(isolate->factory()->InternalizeOneByteString( 641 Handle<String> name(isolate->factory()->InternalizeOneByteString(
763 STATIC_CHAR_VECTOR("eval_from_script"))); 642 STATIC_CHAR_VECTOR("eval_from_script")));
764 return MakeAccessor(isolate, 643 return MakeAccessor(isolate, name, &ScriptEvalFromScriptGetter, nullptr,
765 name,
766 &ScriptEvalFromScriptGetter,
767 &ScriptEvalFromScriptSetter,
768 attributes); 644 attributes);
769 } 645 }
770 646
771 647
772 // 648 //
773 // Accessors::ScriptGetEvalFromScriptPosition 649 // Accessors::ScriptGetEvalFromScriptPosition
774 // 650 //
775 651
776 652
777 void Accessors::ScriptEvalFromScriptPositionGetter( 653 void Accessors::ScriptEvalFromScriptPositionGetter(
(...skipping 10 matching lines...) Expand all
788 script->eval_from_shared())->code()); 664 script->eval_from_shared())->code());
789 result = Handle<Object>(Smi::FromInt(code->SourcePosition( 665 result = Handle<Object>(Smi::FromInt(code->SourcePosition(
790 code->instruction_start() + 666 code->instruction_start() +
791 script->eval_from_instructions_offset())), 667 script->eval_from_instructions_offset())),
792 isolate); 668 isolate);
793 } 669 }
794 info.GetReturnValue().Set(Utils::ToLocal(result)); 670 info.GetReturnValue().Set(Utils::ToLocal(result));
795 } 671 }
796 672
797 673
798 void Accessors::ScriptEvalFromScriptPositionSetter(
799 v8::Local<v8::Name> name,
800 v8::Local<v8::Value> value,
801 const v8::PropertyCallbackInfo<void>& info) {
802 UNREACHABLE();
803 }
804
805
806 Handle<AccessorInfo> Accessors::ScriptEvalFromScriptPositionInfo( 674 Handle<AccessorInfo> Accessors::ScriptEvalFromScriptPositionInfo(
807 Isolate* isolate, PropertyAttributes attributes) { 675 Isolate* isolate, PropertyAttributes attributes) {
808 Handle<String> name(isolate->factory()->InternalizeOneByteString( 676 Handle<String> name(isolate->factory()->InternalizeOneByteString(
809 STATIC_CHAR_VECTOR("eval_from_script_position"))); 677 STATIC_CHAR_VECTOR("eval_from_script_position")));
810 return MakeAccessor(isolate, 678 return MakeAccessor(isolate, name, &ScriptEvalFromScriptPositionGetter,
811 name, 679 nullptr, attributes);
812 &ScriptEvalFromScriptPositionGetter,
813 &ScriptEvalFromScriptPositionSetter,
814 attributes);
815 } 680 }
816 681
817 682
818 // 683 //
819 // Accessors::ScriptGetEvalFromFunctionName 684 // Accessors::ScriptGetEvalFromFunctionName
820 // 685 //
821 686
822 687
823 void Accessors::ScriptEvalFromFunctionNameGetter( 688 void Accessors::ScriptEvalFromFunctionNameGetter(
824 v8::Local<v8::Name> name, 689 v8::Local<v8::Name> name,
825 const v8::PropertyCallbackInfo<v8::Value>& info) { 690 const v8::PropertyCallbackInfo<v8::Value>& info) {
826 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 691 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
827 HandleScope scope(isolate); 692 HandleScope scope(isolate);
828 Handle<Object> object = Utils::OpenHandle(*info.This()); 693 Handle<Object> object = Utils::OpenHandle(*info.This());
829 Handle<Script> script( 694 Handle<Script> script(
830 Script::cast(Handle<JSValue>::cast(object)->value()), isolate); 695 Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
831 Handle<Object> result; 696 Handle<Object> result;
832 Handle<SharedFunctionInfo> shared( 697 Handle<SharedFunctionInfo> shared(
833 SharedFunctionInfo::cast(script->eval_from_shared())); 698 SharedFunctionInfo::cast(script->eval_from_shared()));
834 // Find the name of the function calling eval. 699 // Find the name of the function calling eval.
835 if (!shared->name()->IsUndefined()) { 700 if (!shared->name()->IsUndefined()) {
836 result = Handle<Object>(shared->name(), isolate); 701 result = Handle<Object>(shared->name(), isolate);
837 } else { 702 } else {
838 result = Handle<Object>(shared->inferred_name(), isolate); 703 result = Handle<Object>(shared->inferred_name(), isolate);
839 } 704 }
840 info.GetReturnValue().Set(Utils::ToLocal(result)); 705 info.GetReturnValue().Set(Utils::ToLocal(result));
841 } 706 }
842 707
843 708
844 void Accessors::ScriptEvalFromFunctionNameSetter(
845 v8::Local<v8::Name> name,
846 v8::Local<v8::Value> value,
847 const v8::PropertyCallbackInfo<void>& info) {
848 UNREACHABLE();
849 }
850
851
852 Handle<AccessorInfo> Accessors::ScriptEvalFromFunctionNameInfo( 709 Handle<AccessorInfo> Accessors::ScriptEvalFromFunctionNameInfo(
853 Isolate* isolate, PropertyAttributes attributes) { 710 Isolate* isolate, PropertyAttributes attributes) {
854 Handle<String> name(isolate->factory()->InternalizeOneByteString( 711 Handle<String> name(isolate->factory()->InternalizeOneByteString(
855 STATIC_CHAR_VECTOR("eval_from_function_name"))); 712 STATIC_CHAR_VECTOR("eval_from_function_name")));
856 return MakeAccessor(isolate, 713 return MakeAccessor(isolate, name, &ScriptEvalFromFunctionNameGetter, nullptr,
857 name,
858 &ScriptEvalFromFunctionNameGetter,
859 &ScriptEvalFromFunctionNameSetter,
860 attributes); 714 attributes);
861 } 715 }
862 716
863 717
864 // 718 //
865 // Accessors::FunctionPrototype 719 // Accessors::FunctionPrototype
866 // 720 //
867 721
868 static Handle<Object> GetFunctionPrototype(Isolate* isolate, 722 static Handle<Object> GetFunctionPrototype(Isolate* isolate,
869 Handle<JSFunction> function) { 723 Handle<JSFunction> function) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 length = function->shared()->length(); 821 length = function->shared()->length();
968 } 822 }
969 if (isolate->has_pending_exception()) { 823 if (isolate->has_pending_exception()) {
970 isolate->OptionalRescheduleException(false); 824 isolate->OptionalRescheduleException(false);
971 } 825 }
972 } 826 }
973 Handle<Object> result(Smi::FromInt(length), isolate); 827 Handle<Object> result(Smi::FromInt(length), isolate);
974 info.GetReturnValue().Set(Utils::ToLocal(result)); 828 info.GetReturnValue().Set(Utils::ToLocal(result));
975 } 829 }
976 830
977 831 void Accessors::ObservedReconfigureToDataProperty(
978 MUST_USE_RESULT static MaybeHandle<Object> ReplaceAccessorWithDataProperty( 832 v8::Local<v8::Name> key, v8::Local<v8::Value> val,
979 Isolate* isolate, Handle<JSObject> object, Handle<Name> name,
980 Handle<Object> value, bool is_observed, Handle<Object> old_value) {
981 LookupIterator it(object, name);
982 CHECK_EQ(LookupIterator::ACCESSOR, it.state());
983 DCHECK(it.HolderIsReceiverOrHiddenPrototype());
984 it.ReconfigureDataProperty(value, it.property_details().attributes());
985
986 if (is_observed && !old_value->SameValue(*value)) {
987 return JSObject::EnqueueChangeRecord(object, "update", name, old_value);
988 }
989
990 return value;
991 }
992
993
994 MUST_USE_RESULT static MaybeHandle<Object> SetFunctionLength(
995 Isolate* isolate, Handle<JSFunction> function, Handle<Object> value) {
996 Handle<Object> old_value;
997 bool is_observed = function->map()->is_observed();
998 if (is_observed) {
999 old_value = handle(Smi::FromInt(function->shared()->length()), isolate);
1000 }
1001
1002 return ReplaceAccessorWithDataProperty(isolate, function,
1003 isolate->factory()->length_string(),
1004 value, is_observed, old_value);
1005 }
1006
1007
1008 void Accessors::FunctionLengthSetter(
1009 v8::Local<v8::Name> name,
1010 v8::Local<v8::Value> val,
1011 const v8::PropertyCallbackInfo<void>& info) { 833 const v8::PropertyCallbackInfo<void>& info) {
1012 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 834 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
1013 HandleScope scope(isolate); 835 HandleScope scope(isolate);
836 Handle<JSObject> receiver =
837 Handle<JSObject>::cast(Utils::OpenHandle(*info.This()));
838 Handle<JSObject> holder =
839 Handle<JSObject>::cast(Utils::OpenHandle(*info.Holder()));
840 Handle<Name> name = Utils::OpenHandle(*key);
1014 Handle<Object> value = Utils::OpenHandle(*val); 841 Handle<Object> value = Utils::OpenHandle(*val);
1015 842 MaybeHandle<Object> result = ReplaceAccessorWithDataProperty(
1016 Handle<JSFunction> object = 843 isolate, receiver, holder, name, value, true);
1017 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); 844 if (result.is_null()) isolate->OptionalRescheduleException(false);
1018 if (SetFunctionLength(isolate, object, value).is_null()) {
1019 isolate->OptionalRescheduleException(false);
1020 }
1021 } 845 }
1022 846
1023 847
1024 Handle<AccessorInfo> Accessors::FunctionLengthInfo( 848 Handle<AccessorInfo> Accessors::FunctionLengthInfo(
1025 Isolate* isolate, PropertyAttributes attributes) { 849 Isolate* isolate, PropertyAttributes attributes) {
1026 return MakeAccessor(isolate, 850 return MakeAccessor(isolate, isolate->factory()->length_string(),
1027 isolate->factory()->length_string(), 851 &FunctionLengthGetter, &ObservedReconfigureToDataProperty,
1028 &FunctionLengthGetter,
1029 &FunctionLengthSetter,
1030 attributes); 852 attributes);
1031 } 853 }
1032 854
1033 855
1034 // 856 //
1035 // Accessors::FunctionName 857 // Accessors::FunctionName
1036 // 858 //
1037 859
1038 860
1039 void Accessors::FunctionNameGetter( 861 void Accessors::FunctionNameGetter(
1040 v8::Local<v8::Name> name, 862 v8::Local<v8::Name> name,
1041 const v8::PropertyCallbackInfo<v8::Value>& info) { 863 const v8::PropertyCallbackInfo<v8::Value>& info) {
1042 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 864 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
1043 HandleScope scope(isolate); 865 HandleScope scope(isolate);
1044 Handle<JSFunction> function = 866 Handle<JSFunction> function =
1045 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); 867 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
1046 Handle<Object> result; 868 Handle<Object> result;
1047 if (function->shared()->name_should_print_as_anonymous()) { 869 if (function->shared()->name_should_print_as_anonymous()) {
1048 result = isolate->factory()->anonymous_string(); 870 result = isolate->factory()->anonymous_string();
1049 } else { 871 } else {
1050 result = handle(function->shared()->name(), isolate); 872 result = handle(function->shared()->name(), isolate);
1051 } 873 }
1052 info.GetReturnValue().Set(Utils::ToLocal(result)); 874 info.GetReturnValue().Set(Utils::ToLocal(result));
1053 } 875 }
1054 876
1055
1056 MUST_USE_RESULT static MaybeHandle<Object> SetFunctionName(
1057 Isolate* isolate, Handle<JSFunction> function, Handle<Object> value) {
1058 Handle<Object> old_value;
1059 bool is_observed = function->map()->is_observed();
1060 if (is_observed) {
1061 old_value = handle(function->shared()->name(), isolate);
1062 }
1063
1064 return ReplaceAccessorWithDataProperty(isolate, function,
1065 isolate->factory()->name_string(),
1066 value, is_observed, old_value);
1067 }
1068
1069
1070 void Accessors::FunctionNameSetter(
1071 v8::Local<v8::Name> name,
1072 v8::Local<v8::Value> val,
1073 const v8::PropertyCallbackInfo<void>& info) {
1074 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
1075 HandleScope scope(isolate);
1076 Handle<Object> value = Utils::OpenHandle(*val);
1077
1078 Handle<JSFunction> object =
1079 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
1080 if (SetFunctionName(isolate, object, value).is_null()) {
1081 isolate->OptionalRescheduleException(false);
1082 }
1083 }
1084
1085
1086 Handle<AccessorInfo> Accessors::FunctionNameInfo( 877 Handle<AccessorInfo> Accessors::FunctionNameInfo(
1087 Isolate* isolate, PropertyAttributes attributes) { 878 Isolate* isolate, PropertyAttributes attributes) {
1088 return MakeAccessor(isolate, 879 return MakeAccessor(isolate, isolate->factory()->name_string(),
1089 isolate->factory()->name_string(), 880 &FunctionNameGetter, &ObservedReconfigureToDataProperty,
1090 &FunctionNameGetter,
1091 &FunctionNameSetter,
1092 attributes); 881 attributes);
1093 } 882 }
1094 883
1095 884
1096 // 885 //
1097 // Accessors::FunctionArguments 886 // Accessors::FunctionArguments
1098 // 887 //
1099 888
1100 889
1101 static Handle<Object> ArgumentsForInlinedFunction( 890 static Handle<Object> ArgumentsForInlinedFunction(
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 const v8::PropertyCallbackInfo<v8::Value>& info) { 998 const v8::PropertyCallbackInfo<v8::Value>& info) {
1210 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); 999 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
1211 HandleScope scope(isolate); 1000 HandleScope scope(isolate);
1212 Handle<JSFunction> function = 1001 Handle<JSFunction> function =
1213 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); 1002 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
1214 Handle<Object> result = GetFunctionArguments(isolate, function); 1003 Handle<Object> result = GetFunctionArguments(isolate, function);
1215 info.GetReturnValue().Set(Utils::ToLocal(result)); 1004 info.GetReturnValue().Set(Utils::ToLocal(result));
1216 } 1005 }
1217 1006
1218 1007
1219 void Accessors::FunctionArgumentsSetter(
1220 v8::Local<v8::Name> name,
1221 v8::Local<v8::Value> val,
1222 const v8::PropertyCallbackInfo<void>& info) {
1223 // Function arguments is non writable, non configurable.
1224 UNREACHABLE();
1225 }
1226
1227
1228 Handle<AccessorInfo> Accessors::FunctionArgumentsInfo( 1008 Handle<AccessorInfo> Accessors::FunctionArgumentsInfo(
1229 Isolate* isolate, PropertyAttributes attributes) { 1009 Isolate* isolate, PropertyAttributes attributes) {
1230 return MakeAccessor(isolate, 1010 return MakeAccessor(isolate, isolate->factory()->arguments_string(),
1231 isolate->factory()->arguments_string(), 1011 &FunctionArgumentsGetter, nullptr, attributes);
1232 &FunctionArgumentsGetter,
1233 &FunctionArgumentsSetter,
1234 attributes);
1235 } 1012 }
1236 1013
1237 1014
1238 // 1015 //
1239 // Accessors::FunctionCaller 1016 // Accessors::FunctionCaller
1240 // 1017 //
1241 1018
1242 1019
1243 static inline bool AllowAccessToFunction(Context* current_context, 1020 static inline bool AllowAccessToFunction(Context* current_context,
1244 JSFunction* function) { 1021 JSFunction* function) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 Handle<JSFunction> caller; 1131 Handle<JSFunction> caller;
1355 if (maybe_caller.ToHandle(&caller)) { 1132 if (maybe_caller.ToHandle(&caller)) {
1356 result = caller; 1133 result = caller;
1357 } else { 1134 } else {
1358 result = isolate->factory()->null_value(); 1135 result = isolate->factory()->null_value();
1359 } 1136 }
1360 info.GetReturnValue().Set(Utils::ToLocal(result)); 1137 info.GetReturnValue().Set(Utils::ToLocal(result));
1361 } 1138 }
1362 1139
1363 1140
1364 void Accessors::FunctionCallerSetter(
1365 v8::Local<v8::Name> name,
1366 v8::Local<v8::Value> val,
1367 const v8::PropertyCallbackInfo<void>& info) {
1368 // Function caller is non writable, non configurable.
1369 UNREACHABLE();
1370 }
1371
1372
1373 Handle<AccessorInfo> Accessors::FunctionCallerInfo( 1141 Handle<AccessorInfo> Accessors::FunctionCallerInfo(
1374 Isolate* isolate, PropertyAttributes attributes) { 1142 Isolate* isolate, PropertyAttributes attributes) {
1375 return MakeAccessor(isolate, 1143 return MakeAccessor(isolate, isolate->factory()->caller_string(),
1376 isolate->factory()->caller_string(), 1144 &FunctionCallerGetter, nullptr, attributes);
1377 &FunctionCallerGetter,
1378 &FunctionCallerSetter,
1379 attributes);
1380 } 1145 }
1381 1146
1382 1147
1383 // 1148 //
1384 // Accessors::MakeModuleExport 1149 // Accessors::MakeModuleExport
1385 // 1150 //
1386 1151
1387 static void ModuleGetExport(v8::Local<v8::Name> property, 1152 static void ModuleGetExport(v8::Local<v8::Name> property,
1388 const v8::PropertyCallbackInfo<v8::Value>& info) { 1153 const v8::PropertyCallbackInfo<v8::Value>& info) {
1389 JSModule* instance = JSModule::cast(*v8::Utils::OpenHandle(*info.Holder())); 1154 JSModule* instance = JSModule::cast(*v8::Utils::OpenHandle(*info.Holder()));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1433 Isolate* isolate = name->GetIsolate(); 1198 Isolate* isolate = name->GetIsolate();
1434 Handle<AccessorInfo> info = MakeAccessor(isolate, name, &ModuleGetExport, 1199 Handle<AccessorInfo> info = MakeAccessor(isolate, name, &ModuleGetExport,
1435 &ModuleSetExport, attributes); 1200 &ModuleSetExport, attributes);
1436 info->set_data(Smi::FromInt(index)); 1201 info->set_data(Smi::FromInt(index));
1437 return info; 1202 return info;
1438 } 1203 }
1439 1204
1440 1205
1441 } // namespace internal 1206 } // namespace internal
1442 } // namespace v8 1207 } // namespace v8
OLDNEW
« no previous file with comments | « src/accessors.h ('k') | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698