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 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 "Object.defineProperty(this.__proto__, 'x', {" | 617 "Object.defineProperty(this.__proto__, 'x', {" |
618 " get : function() { return this; }," | 618 " get : function() { return this; }," |
619 " set : function() { set_value = this; }" | 619 " set : function() { set_value = this; }" |
620 "});" | 620 "});" |
621 "function getter() { return x; }" | 621 "function getter() { return x; }" |
622 "function setter() { x = 1; }" | 622 "function setter() { x = 1; }" |
623 "for (var i = 0; i < 4; i++) { getter(); setter(); }"); | 623 "for (var i = 0; i < 4; i++) { getter(); setter(); }"); |
624 CHECK(v8::Utils::OpenHandle(*CompileRun("getter()"))->IsJSGlobalProxy()); | 624 CHECK(v8::Utils::OpenHandle(*CompileRun("getter()"))->IsJSGlobalProxy()); |
625 CHECK(v8::Utils::OpenHandle(*CompileRun("set_value"))->IsJSGlobalProxy()); | 625 CHECK(v8::Utils::OpenHandle(*CompileRun("set_value"))->IsJSGlobalProxy()); |
626 } | 626 } |
627 | |
628 | |
629 static i::MaybeObject* ZeroAccessorGet(i::Isolate*, i::Object*, void*) { | |
630 return i::Smi::FromInt(0); | |
631 } | |
632 | |
633 | |
634 static i::MaybeObject* ReadOnlySetAccessor( | |
635 i::Isolate* isolate, i::JSObject*, i::Object* value, void*) { | |
636 return value; | |
637 } | |
638 | |
639 | |
640 const i::AccessorDescriptor kCallbackDescriptor = { | |
641 ZeroAccessorGet, | |
642 ReadOnlySetAccessor, | |
643 0 | |
644 }; | |
645 | |
646 | |
647 THREADED_TEST(RedefineReadOnlyConfigurableForeignCallbackAccessor) { | |
648 // Verify that property redefinition over foreign callbacks-backed | |
649 // properties works as expected if the property is non-writable, | |
650 // but writable. Such a property can be redefined without first | |
651 // making the property writable (ES5.1 - 8.12.9.10.b) | |
652 // (bug 3045.) | |
653 LocalContext env; | |
654 v8::Isolate* isolate = env->GetIsolate(); | |
655 i::Factory* factory = CcTest::i_isolate()->factory(); | |
656 | |
657 v8::HandleScope scope(isolate); | |
658 | |
659 i::Handle<i::Map> map = | |
660 factory->NewMap(i::JS_OBJECT_TYPE, i::JSObject::kHeaderSize); | |
661 i::Handle<i::DescriptorArray> instance_descriptors( | |
662 map->instance_descriptors()); | |
663 ASSERT(instance_descriptors->IsEmpty()); | |
664 | |
665 i::Handle<i::DescriptorArray> descriptors = factory->NewDescriptorArray(0, 1); | |
666 i::DescriptorArray::WhitenessWitness witness(*descriptors); | |
667 map->set_instance_descriptors(*descriptors); | |
668 | |
669 i::Handle<i::Foreign> foreign = factory->NewForeign(&kCallbackDescriptor); | |
670 i::Handle<i::String> name = | |
671 factory->InternalizeUtf8String(i::Vector<const char>("prop", 4)); | |
672 | |
673 // Want a non-writable and configurable property. | |
674 PropertyAttributes attribs = | |
675 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); | |
676 i::CallbacksDescriptor d(*name, *foreign, attribs); | |
677 map->AppendDescriptor(&d, witness); | |
678 | |
679 i::Handle<i::Object> object = factory->NewJSObjectFromMap(map); | |
680 | |
681 // Put the object on the global object. | |
682 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "Foreign"), | |
683 v8::Utils::ToLocal(object)); | |
684 | |
685 // ..and redefine the property through JavaScript, returning its value. | |
686 const char* script = | |
687 "Object.defineProperty(Foreign, 'prop', {value: 2}); Foreign.prop"; | |
688 v8::Handle<v8::Value> result = v8::Script::Compile( | |
689 v8::String::NewFromUtf8(CcTest::isolate(), script))->Run(); | |
690 CHECK_EQ(2, result->Int32Value()); | |
691 } | |
OLD | NEW |