912005267d
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680 Commit-Queue: Sigmund Cherem <sigmund@google.com> Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Stephen Adams <sra@google.com>
99 lines
2.1 KiB
Dart
99 lines
2.1 KiB
Dart
// 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)();
|
|
}
|