OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "test/cctest/test-api.h" | 7 #include "test/cctest/test-api.h" |
8 | 8 |
9 #include "include/v8-util.h" | 9 #include "include/v8-util.h" |
10 #include "src/api.h" | 10 #include "src/api.h" |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 v8::FunctionTemplate::New(CcTest::isolate()); | 397 v8::FunctionTemplate::New(CcTest::isolate()); |
398 templ->InstanceTemplate()->SetHandler( | 398 templ->InstanceTemplate()->SetHandler( |
399 v8::NamedPropertyHandlerConfiguration(0, 0, QueryCallback)); | 399 v8::NamedPropertyHandlerConfiguration(0, 0, QueryCallback)); |
400 LocalContext env; | 400 LocalContext env; |
401 env->Global() | 401 env->Global() |
402 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) | 402 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) |
403 .ToLocalChecked() | 403 .ToLocalChecked() |
404 ->NewInstance(env.local()) | 404 ->NewInstance(env.local()) |
405 .ToLocalChecked()) | 405 .ToLocalChecked()) |
406 .FromJust(); | 406 .FromJust(); |
407 CHECK_EQ(query_counter_int, 0); | 407 CHECK_EQ(0, query_counter_int); |
408 v8::Local<Value> result = | 408 v8::Local<Value> result = |
409 v8_compile("Object.getOwnPropertyDescriptor(obj, 'x');") | 409 v8_compile("Object.getOwnPropertyDescriptor(obj, 'x');") |
410 ->Run(env.local()) | 410 ->Run(env.local()) |
411 .ToLocalChecked(); | 411 .ToLocalChecked(); |
412 CHECK_EQ(query_counter_int, 1); | 412 CHECK_EQ(1, query_counter_int); |
413 CHECK_EQ(v8::PropertyAttribute::None, | 413 CHECK_EQ(v8::PropertyAttribute::None, |
414 static_cast<v8::PropertyAttribute>( | 414 static_cast<v8::PropertyAttribute>( |
415 result->Int32Value(env.local()).FromJust())); | 415 result->Int32Value(env.local()).FromJust())); |
416 | 416 |
417 v8_compile("Object.defineProperty(obj, 'not_enum', {value: 17});") | 417 v8_compile("Object.defineProperty(obj, 'not_enum', {value: 17});") |
418 ->Run(env.local()) | 418 ->Run(env.local()) |
419 .ToLocalChecked(); | 419 .ToLocalChecked(); |
420 CHECK_EQ(query_counter_int, 2); | 420 CHECK_EQ(2, query_counter_int); |
421 | 421 |
422 v8_compile( | 422 v8_compile( |
423 "Object.defineProperty(obj, 'enum', {value: 17, enumerable: true, " | 423 "Object.defineProperty(obj, 'enum', {value: 17, enumerable: true, " |
424 "writable: true});") | 424 "writable: true});") |
425 ->Run(env.local()) | 425 ->Run(env.local()) |
426 .ToLocalChecked(); | 426 .ToLocalChecked(); |
427 CHECK_EQ(query_counter_int, 3); | 427 CHECK_EQ(3, query_counter_int); |
428 | 428 |
429 CHECK(v8_compile("obj.propertyIsEnumerable('enum');") | 429 CHECK(v8_compile("obj.propertyIsEnumerable('enum');") |
430 ->Run(env.local()) | 430 ->Run(env.local()) |
431 .ToLocalChecked() | 431 .ToLocalChecked() |
432 ->BooleanValue(env.local()) | 432 ->BooleanValue(env.local()) |
433 .FromJust()); | 433 .FromJust()); |
434 CHECK_EQ(query_counter_int, 4); | 434 CHECK_EQ(4, query_counter_int); |
435 | 435 |
436 CHECK(!v8_compile("obj.propertyIsEnumerable('not_enum');") | 436 CHECK(!v8_compile("obj.propertyIsEnumerable('not_enum');") |
437 ->Run(env.local()) | 437 ->Run(env.local()) |
438 .ToLocalChecked() | 438 .ToLocalChecked() |
439 ->BooleanValue(env.local()) | 439 ->BooleanValue(env.local()) |
440 .FromJust()); | 440 .FromJust()); |
441 CHECK_EQ(query_counter_int, 5); | 441 CHECK_EQ(5, query_counter_int); |
442 | 442 |
443 CHECK(v8_compile("obj.hasOwnProperty('enum');") | 443 CHECK(v8_compile("obj.hasOwnProperty('enum');") |
444 ->Run(env.local()) | 444 ->Run(env.local()) |
445 .ToLocalChecked() | 445 .ToLocalChecked() |
446 ->BooleanValue(env.local()) | 446 ->BooleanValue(env.local()) |
447 .FromJust()); | 447 .FromJust()); |
448 CHECK_EQ(query_counter_int, 5); | 448 CHECK_EQ(5, query_counter_int); |
449 | 449 |
450 CHECK(v8_compile("obj.hasOwnProperty('not_enum');") | 450 CHECK(v8_compile("obj.hasOwnProperty('not_enum');") |
451 ->Run(env.local()) | 451 ->Run(env.local()) |
452 .ToLocalChecked() | 452 .ToLocalChecked() |
453 ->BooleanValue(env.local()) | 453 ->BooleanValue(env.local()) |
454 .FromJust()); | 454 .FromJust()); |
455 CHECK_EQ(query_counter_int, 5); | 455 CHECK_EQ(5, query_counter_int); |
456 | 456 |
457 CHECK(!v8_compile("obj.hasOwnProperty('x');") | 457 CHECK(!v8_compile("obj.hasOwnProperty('x');") |
458 ->Run(env.local()) | 458 ->Run(env.local()) |
459 .ToLocalChecked() | 459 .ToLocalChecked() |
460 ->BooleanValue(env.local()) | 460 ->BooleanValue(env.local()) |
461 .FromJust()); | 461 .FromJust()); |
462 CHECK_EQ(query_counter_int, 6); | 462 CHECK_EQ(6, query_counter_int); |
463 | 463 |
464 CHECK(!v8_compile("obj.propertyIsEnumerable('undef');") | 464 CHECK(!v8_compile("obj.propertyIsEnumerable('undef');") |
465 ->Run(env.local()) | 465 ->Run(env.local()) |
466 .ToLocalChecked() | 466 .ToLocalChecked() |
467 ->BooleanValue(env.local()) | 467 ->BooleanValue(env.local()) |
468 .FromJust()); | 468 .FromJust()); |
469 CHECK_EQ(query_counter_int, 7); | 469 CHECK_EQ(7, query_counter_int); |
470 | 470 |
471 v8_compile("Object.defineProperty(obj, 'enum', {value: 42});") | 471 v8_compile("Object.defineProperty(obj, 'enum', {value: 42});") |
472 ->Run(env.local()) | 472 ->Run(env.local()) |
473 .ToLocalChecked(); | 473 .ToLocalChecked(); |
474 CHECK_EQ(query_counter_int, 8); | 474 CHECK_EQ(8, query_counter_int); |
475 | 475 |
476 v8_compile("Object.isFrozen('obj.x');")->Run(env.local()).ToLocalChecked(); | 476 v8_compile("Object.isFrozen('obj.x');")->Run(env.local()).ToLocalChecked(); |
477 CHECK_EQ(query_counter_int, 8); | 477 CHECK_EQ(8, query_counter_int); |
478 } | 478 } |
479 | 479 |
480 namespace { | 480 namespace { |
481 | 481 |
482 bool get_was_called = false; | 482 bool get_was_called = false; |
483 bool set_was_called = false; | 483 bool set_was_called = false; |
484 | 484 |
485 int set_was_called_counter = 0; | 485 int set_was_called_counter = 0; |
486 | 486 |
487 void GetterCallback(Local<Name> property, | 487 void GetterCallback(Local<Name> property, |
(...skipping 23 matching lines...) Expand all Loading... |
511 ->NewInstance(env.local()) | 511 ->NewInstance(env.local()) |
512 .ToLocalChecked()) | 512 .ToLocalChecked()) |
513 .FromJust(); | 513 .FromJust(); |
514 | 514 |
515 get_was_called = false; | 515 get_was_called = false; |
516 set_was_called = false; | 516 set_was_called = false; |
517 | 517 |
518 v8_compile("Object.defineProperty(obj, 'x', {set: function() {return 17;}});") | 518 v8_compile("Object.defineProperty(obj, 'x', {set: function() {return 17;}});") |
519 ->Run(env.local()) | 519 ->Run(env.local()) |
520 .ToLocalChecked(); | 520 .ToLocalChecked(); |
521 CHECK_EQ(get_was_called, true); | 521 CHECK_EQ(true, get_was_called); |
522 CHECK_EQ(set_was_called, false); | 522 CHECK_EQ(false, set_was_called); |
523 } | 523 } |
524 | 524 |
525 // Check that set callback is called for function declarations. | 525 // Check that set callback is called for function declarations. |
526 THREADED_TEST(SetterCallbackFunctionDeclarationInterceptor) { | 526 THREADED_TEST(SetterCallbackFunctionDeclarationInterceptor) { |
527 v8::HandleScope scope(CcTest::isolate()); | 527 v8::HandleScope scope(CcTest::isolate()); |
528 LocalContext env; | 528 LocalContext env; |
529 v8::Local<v8::FunctionTemplate> templ = | 529 v8::Local<v8::FunctionTemplate> templ = |
530 v8::FunctionTemplate::New(CcTest::isolate()); | 530 v8::FunctionTemplate::New(CcTest::isolate()); |
531 | 531 |
532 v8::Local<ObjectTemplate> object_template = templ->InstanceTemplate(); | 532 v8::Local<ObjectTemplate> object_template = templ->InstanceTemplate(); |
533 object_template->SetHandler( | 533 object_template->SetHandler( |
534 v8::NamedPropertyHandlerConfiguration(nullptr, SetterCallback)); | 534 v8::NamedPropertyHandlerConfiguration(nullptr, SetterCallback)); |
535 v8::Local<v8::Context> ctx = | 535 v8::Local<v8::Context> ctx = |
536 v8::Context::New(CcTest::isolate(), nullptr, object_template); | 536 v8::Context::New(CcTest::isolate(), nullptr, object_template); |
537 | 537 |
538 set_was_called_counter = 0; | 538 set_was_called_counter = 0; |
539 | 539 |
540 // Declare function. | 540 // Declare function. |
541 v8::Local<v8::String> code = v8_str("function x() {return 42;}; x();"); | 541 v8::Local<v8::String> code = v8_str("function x() {return 42;}; x();"); |
542 CHECK_EQ(42, v8::Script::Compile(ctx, code) | 542 CHECK_EQ(42, v8::Script::Compile(ctx, code) |
543 .ToLocalChecked() | 543 .ToLocalChecked() |
544 ->Run(ctx) | 544 ->Run(ctx) |
545 .ToLocalChecked() | 545 .ToLocalChecked() |
546 ->Int32Value(ctx) | 546 ->Int32Value(ctx) |
547 .FromJust()); | 547 .FromJust()); |
548 CHECK_EQ(set_was_called_counter, 1); | 548 CHECK_EQ(1, set_was_called_counter); |
549 | 549 |
550 // Redeclare function. | 550 // Redeclare function. |
551 code = v8_str("function x() {return 43;}; x();"); | 551 code = v8_str("function x() {return 43;}; x();"); |
552 CHECK_EQ(43, v8::Script::Compile(ctx, code) | 552 CHECK_EQ(43, v8::Script::Compile(ctx, code) |
553 .ToLocalChecked() | 553 .ToLocalChecked() |
554 ->Run(ctx) | 554 ->Run(ctx) |
555 .ToLocalChecked() | 555 .ToLocalChecked() |
556 ->Int32Value(ctx) | 556 ->Int32Value(ctx) |
557 .FromJust()); | 557 .FromJust()); |
558 CHECK_EQ(set_was_called_counter, 2); | 558 CHECK_EQ(2, set_was_called_counter); |
559 | 559 |
560 // Redefine function. | 560 // Redefine function. |
561 code = v8_str("x = function() {return 44;}; x();"); | 561 code = v8_str("x = function() {return 44;}; x();"); |
562 CHECK_EQ(44, v8::Script::Compile(ctx, code) | 562 CHECK_EQ(44, v8::Script::Compile(ctx, code) |
563 .ToLocalChecked() | 563 .ToLocalChecked() |
564 ->Run(ctx) | 564 ->Run(ctx) |
565 .ToLocalChecked() | 565 .ToLocalChecked() |
566 ->Int32Value(ctx) | 566 ->Int32Value(ctx) |
567 .FromJust()); | 567 .FromJust()); |
568 CHECK_EQ(set_was_called_counter, 3); | 568 CHECK_EQ(3, set_was_called_counter); |
569 } | 569 } |
570 | 570 |
571 namespace { | 571 namespace { |
572 void QueryCallbackSetDontDelete( | 572 void QueryCallbackSetDontDelete( |
573 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { | 573 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
574 info.GetReturnValue().Set(v8::PropertyAttribute::DontDelete); | 574 info.GetReturnValue().Set(v8::PropertyAttribute::DontDelete); |
575 } | 575 } |
576 | 576 |
577 } // namespace | 577 } // namespace |
578 | 578 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 "configurable: false, " | 617 "configurable: false, " |
618 "writable: false});" | 618 "writable: false});" |
619 "x();"); | 619 "x();"); |
620 CHECK_EQ(42, v8::Script::Compile(ctx, code) | 620 CHECK_EQ(42, v8::Script::Compile(ctx, code) |
621 .ToLocalChecked() | 621 .ToLocalChecked() |
622 ->Run(ctx) | 622 ->Run(ctx) |
623 .ToLocalChecked() | 623 .ToLocalChecked() |
624 ->Int32Value(ctx) | 624 ->Int32Value(ctx) |
625 .FromJust()); | 625 .FromJust()); |
626 | 626 |
627 CHECK_EQ(set_was_called, true); | 627 CHECK_EQ(true, set_was_called); |
628 | 628 |
629 v8::TryCatch try_catch(CcTest::isolate()); | 629 v8::TryCatch try_catch(CcTest::isolate()); |
630 set_was_called = false; | 630 set_was_called = false; |
631 | 631 |
632 // Redeclare function that is read-only. | 632 // Redeclare function that is read-only. |
633 code = v8_str("function x() {return 43;};"); | 633 code = v8_str("function x() {return 43;};"); |
634 CHECK(v8::Script::Compile(ctx, code).ToLocalChecked()->Run(ctx).IsEmpty()); | 634 CHECK(v8::Script::Compile(ctx, code).ToLocalChecked()->Run(ctx).IsEmpty()); |
635 CHECK(try_catch.HasCaught()); | 635 CHECK(try_catch.HasCaught()); |
636 | 636 |
637 CHECK_EQ(set_was_called, false); | 637 CHECK_EQ(false, set_was_called); |
638 } | 638 } |
639 | 639 |
640 | 640 |
641 namespace { | 641 namespace { |
642 | 642 |
643 bool get_was_called_in_order = false; | 643 bool get_was_called_in_order = false; |
644 bool define_was_called_in_order = false; | 644 bool define_was_called_in_order = false; |
645 | 645 |
646 void GetterCallbackOrder(Local<Name> property, | 646 void GetterCallbackOrder(Local<Name> property, |
647 const v8::PropertyCallbackInfo<v8::Value>& info) { | 647 const v8::PropertyCallbackInfo<v8::Value>& info) { |
648 get_was_called_in_order = true; | 648 get_was_called_in_order = true; |
649 CHECK_EQ(define_was_called_in_order, true); | 649 CHECK_EQ(true, define_was_called_in_order); |
650 info.GetReturnValue().Set(property); | 650 info.GetReturnValue().Set(property); |
651 } | 651 } |
652 | 652 |
653 void DefinerCallbackOrder(Local<Name> property, | 653 void DefinerCallbackOrder(Local<Name> property, |
654 const v8::PropertyDescriptor& desc, | 654 const v8::PropertyDescriptor& desc, |
655 const v8::PropertyCallbackInfo<v8::Value>& info) { | 655 const v8::PropertyCallbackInfo<v8::Value>& info) { |
656 CHECK_EQ(get_was_called_in_order, false); // Define called before get. | 656 CHECK_EQ(false, get_was_called_in_order); // Define called before get. |
657 define_was_called_in_order = true; | 657 define_was_called_in_order = true; |
658 } | 658 } |
659 | 659 |
660 } // namespace | 660 } // namespace |
661 | 661 |
662 // Check that definer callback is called before getter callback. | 662 // Check that definer callback is called before getter callback. |
663 THREADED_TEST(DefinerCallbackGetAndDefine) { | 663 THREADED_TEST(DefinerCallbackGetAndDefine) { |
664 v8::HandleScope scope(CcTest::isolate()); | 664 v8::HandleScope scope(CcTest::isolate()); |
665 v8::Local<v8::FunctionTemplate> templ = | 665 v8::Local<v8::FunctionTemplate> templ = |
666 v8::FunctionTemplate::New(CcTest::isolate()); | 666 v8::FunctionTemplate::New(CcTest::isolate()); |
667 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( | 667 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( |
668 GetterCallbackOrder, SetterCallback, 0, 0, 0, DefinerCallbackOrder)); | 668 GetterCallbackOrder, SetterCallback, 0, 0, 0, DefinerCallbackOrder)); |
669 LocalContext env; | 669 LocalContext env; |
670 env->Global() | 670 env->Global() |
671 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) | 671 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) |
672 .ToLocalChecked() | 672 .ToLocalChecked() |
673 ->NewInstance(env.local()) | 673 ->NewInstance(env.local()) |
674 .ToLocalChecked()) | 674 .ToLocalChecked()) |
675 .FromJust(); | 675 .FromJust(); |
676 | 676 |
677 CHECK_EQ(get_was_called_in_order, false); | 677 CHECK_EQ(false, get_was_called_in_order); |
678 CHECK_EQ(define_was_called_in_order, false); | 678 CHECK_EQ(false, define_was_called_in_order); |
679 | 679 |
680 v8_compile("Object.defineProperty(obj, 'x', {set: function() {return 17;}});") | 680 v8_compile("Object.defineProperty(obj, 'x', {set: function() {return 17;}});") |
681 ->Run(env.local()) | 681 ->Run(env.local()) |
682 .ToLocalChecked(); | 682 .ToLocalChecked(); |
683 CHECK_EQ(get_was_called_in_order, true); | 683 CHECK_EQ(true, get_was_called_in_order); |
684 CHECK_EQ(define_was_called_in_order, true); | 684 CHECK_EQ(true, define_was_called_in_order); |
685 } | 685 } |
686 | 686 |
687 namespace { // namespace for InObjectLiteralDefinitionWithInterceptor | 687 namespace { // namespace for InObjectLiteralDefinitionWithInterceptor |
688 | 688 |
689 // Workaround for no-snapshot builds: only intercept once Context::New() is | 689 // Workaround for no-snapshot builds: only intercept once Context::New() is |
690 // done, otherwise we'll intercept | 690 // done, otherwise we'll intercept |
691 // bootstrapping like defining array on the global object. | 691 // bootstrapping like defining array on the global object. |
692 bool context_is_done = false; | 692 bool context_is_done = false; |
693 bool getter_callback_was_called = false; | 693 bool getter_callback_was_called = false; |
694 | 694 |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 v8::FunctionTemplate::New(CcTest::isolate()); | 1470 v8::FunctionTemplate::New(CcTest::isolate()); |
1471 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( | 1471 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( |
1472 EchoNamedProperty, 0, 0, 0, 0, v8_str("data"))); | 1472 EchoNamedProperty, 0, 0, 0, 0, v8_str("data"))); |
1473 LocalContext env; | 1473 LocalContext env; |
1474 env->Global() | 1474 env->Global() |
1475 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) | 1475 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) |
1476 .ToLocalChecked() | 1476 .ToLocalChecked() |
1477 ->NewInstance(env.local()) | 1477 ->NewInstance(env.local()) |
1478 .ToLocalChecked()) | 1478 .ToLocalChecked()) |
1479 .FromJust(); | 1479 .FromJust(); |
1480 CHECK_EQ(echo_named_call_count, 0); | 1480 CHECK_EQ(0, echo_named_call_count); |
1481 v8_compile("obj.x")->Run(env.local()).ToLocalChecked(); | 1481 v8_compile("obj.x")->Run(env.local()).ToLocalChecked(); |
1482 CHECK_EQ(echo_named_call_count, 1); | 1482 CHECK_EQ(1, echo_named_call_count); |
1483 const char* code = "var str = 'oddle'; obj[str] + obj.poddle;"; | 1483 const char* code = "var str = 'oddle'; obj[str] + obj.poddle;"; |
1484 v8::Local<Value> str = CompileRun(code); | 1484 v8::Local<Value> str = CompileRun(code); |
1485 String::Utf8Value value(str); | 1485 String::Utf8Value value(str); |
1486 CHECK_EQ(0, strcmp(*value, "oddlepoddle")); | 1486 CHECK_EQ(0, strcmp(*value, "oddlepoddle")); |
1487 // Check default behavior | 1487 // Check default behavior |
1488 CHECK_EQ(10, v8_compile("obj.flob = 10;") | 1488 CHECK_EQ(10, v8_compile("obj.flob = 10;") |
1489 ->Run(env.local()) | 1489 ->Run(env.local()) |
1490 .ToLocalChecked() | 1490 .ToLocalChecked() |
1491 ->Int32Value(env.local()) | 1491 ->Int32Value(env.local()) |
1492 .FromJust()); | 1492 .FromJust()); |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2022 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration( | 2022 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
2023 EchoIndexedProperty, 0, 0, 0, 0, v8_num(637))); | 2023 EchoIndexedProperty, 0, 0, 0, 0, v8_num(637))); |
2024 LocalContext env; | 2024 LocalContext env; |
2025 env->Global() | 2025 env->Global() |
2026 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) | 2026 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local()) |
2027 .ToLocalChecked() | 2027 .ToLocalChecked() |
2028 ->NewInstance(env.local()) | 2028 ->NewInstance(env.local()) |
2029 .ToLocalChecked()) | 2029 .ToLocalChecked()) |
2030 .FromJust(); | 2030 .FromJust(); |
2031 Local<Script> script = v8_compile("obj[900]"); | 2031 Local<Script> script = v8_compile("obj[900]"); |
2032 CHECK_EQ(script->Run(env.local()) | 2032 CHECK_EQ(900, script->Run(env.local()) |
2033 .ToLocalChecked() | 2033 .ToLocalChecked() |
2034 ->Int32Value(env.local()) | 2034 ->Int32Value(env.local()) |
2035 .FromJust(), | 2035 .FromJust()); |
2036 900); | |
2037 } | 2036 } |
2038 | 2037 |
2039 | 2038 |
2040 THREADED_TEST(PropertyHandlerInPrototype) { | 2039 THREADED_TEST(PropertyHandlerInPrototype) { |
2041 LocalContext env; | 2040 LocalContext env; |
2042 v8::Isolate* isolate = env->GetIsolate(); | 2041 v8::Isolate* isolate = env->GetIsolate(); |
2043 v8::HandleScope scope(isolate); | 2042 v8::HandleScope scope(isolate); |
2044 | 2043 |
2045 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 2044 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2046 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration( | 2045 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2652 v8::NamedPropertyHandlerConfiguration(SetXOnPrototypeGetter)); | 2651 v8::NamedPropertyHandlerConfiguration(SetXOnPrototypeGetter)); |
2653 LocalContext context; | 2652 LocalContext context; |
2654 context->Global() | 2653 context->Global() |
2655 ->Set(context.local(), v8_str("F"), | 2654 ->Set(context.local(), v8_str("F"), |
2656 function_template->GetFunction(context.local()).ToLocalChecked()) | 2655 function_template->GetFunction(context.local()).ToLocalChecked()) |
2657 .FromJust(); | 2656 .FromJust(); |
2658 // Create an instance of F and introduce a map transition for x. | 2657 // Create an instance of F and introduce a map transition for x. |
2659 CompileRun("var o = new F(); o.x = 23;"); | 2658 CompileRun("var o = new F(); o.x = 23;"); |
2660 // Create an instance of F and invoke the getter. The result should be 23. | 2659 // Create an instance of F and invoke the getter. The result should be 23. |
2661 Local<Value> result = CompileRun("o = new F(); o.x"); | 2660 Local<Value> result = CompileRun("o = new F(); o.x"); |
2662 CHECK_EQ(result->Int32Value(context.local()).FromJust(), 23); | 2661 CHECK_EQ(23, result->Int32Value(context.local()).FromJust()); |
2663 } | 2662 } |
2664 | 2663 |
2665 | 2664 |
2666 static void IndexedPropertyGetter( | 2665 static void IndexedPropertyGetter( |
2667 uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { | 2666 uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { |
2668 ApiTestFuzzer::Fuzz(); | 2667 ApiTestFuzzer::Fuzz(); |
2669 if (index == 37) { | 2668 if (index == 37) { |
2670 info.GetReturnValue().Set(v8_num(625)); | 2669 info.GetReturnValue().Set(v8_num(625)); |
2671 } | 2670 } |
2672 } | 2671 } |
(...skipping 2272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4945 ->Set(env.local(), v8_str("Fun"), | 4944 ->Set(env.local(), v8_str("Fun"), |
4946 fun_templ->GetFunction(env.local()).ToLocalChecked()) | 4945 fun_templ->GetFunction(env.local()).ToLocalChecked()) |
4947 .FromJust()); | 4946 .FromJust()); |
4948 | 4947 |
4949 CompileRun( | 4948 CompileRun( |
4950 "var f = new Fun();" | 4949 "var f = new Fun();" |
4951 "Number.prototype.__proto__ = f;" | 4950 "Number.prototype.__proto__ = f;" |
4952 "var a = 42;" | 4951 "var a = 42;" |
4953 "for (var i = 0; i<3; i++) { a.foo; }"); | 4952 "for (var i = 0; i<3; i++) { a.foo; }"); |
4954 } | 4953 } |
OLD | NEW |