| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'native_testing.dart'; | |
| // Test that compiler is cautious with optimizations on native fields. The | |
| // motivation is that DOM properties are getters and setters with arbitrary | |
| // effects. Setting CSSStyleDeclaration.borderLeft can canonicalize the value | |
| // and changes the value of CSSStyleDeclaration.border. | |
| @Native("Foo") | |
| class Foo { | |
| var a; | |
| var b; | |
| var ab; | |
| } | |
| Foo makeFoo() native; | |
| void setup() { | |
| JS('', r""" | |
| (function(){ | |
| function Foo() { this.i = 0; } | |
| Object.defineProperty(Foo.prototype, 'a', { | |
| get: function () { return (this._a || '') + ++this.i; }, | |
| set: function (v) { this._a = v.toLowerCase(); } | |
| }); | |
| Object.defineProperty(Foo.prototype, 'b', { | |
| get: function () { return this._b || ''; }, | |
| set: function (v) { this._b = v.toLowerCase(); } | |
| }); | |
| Object.defineProperty(Foo.prototype, 'ab', { | |
| get: function () { return this.a + ' ' + this.b; }, | |
| set: function (v) { | |
| var s = v.split(' '); | |
| this.a = s[0]; | |
| this.b = s[1]; | |
| } | |
| }); | |
| self.makeFoo = function() { return new Foo() }; | |
| self.nativeConstructor(Foo); | |
| })()"""); | |
| applyTestExtensions(['Foo']); | |
| } | |
| test1() { | |
| var f = makeFoo(); | |
| f.a = 'Hi'; | |
| f.b = 'There'; | |
| Expect.equals('hi1 there', f.ab); | |
| } | |
| test2() { | |
| // Test for CSE. dart2js currently does CSE loads. Is this the right choice? | |
| var f = makeFoo(); | |
| var a1 = f.a; | |
| var b1 = f.b; | |
| var a2 = f.a; | |
| Expect.equals('1', a1); | |
| if (a2 == a1) { | |
| // We did CSE. | |
| } else { | |
| Expect.equals('2', a2); | |
| } | |
| } | |
| test3() { | |
| // Must not CSE over a native field store. | |
| var f = makeFoo(); | |
| var a1 = f.a; | |
| f.ab = 'X Y'; | |
| var a2 = f.a; | |
| Expect.equals('1', a1); | |
| Expect.equals('x2', a2); | |
| } | |
| test4() { | |
| // Must not store-forward. | |
| var f = makeFoo(); | |
| f.a = 'A'; | |
| var a2 = f.a; | |
| Expect.equals('a1', a2); | |
| } | |
| main() { | |
| nativeTesting(); | |
| setup(); | |
| (test1)(); | |
| (test2)(); | |
| (test3)(); | |
| (test4)(); | |
| } |