blob: 7ce2740fe2d44571a0d60e7acb5ec0697599d203 [file] [log] [blame]
// 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)();
}