| Index: tests/compiler/dart2js_native/native_field_name_test.dart
|
| diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d479d82522347153fbd5a10eedf45dc4245de1ff
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js_native/native_field_name_test.dart
|
| @@ -0,0 +1,63 @@
|
| +// Copyright (c) 2011, 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.
|
| +
|
| +// Check that native fields are not incorrectly renamed.
|
| +
|
| +class A native "*A" {
|
| + int myLongPropertyName;
|
| + int getValue;
|
| +
|
| + int method(int z) => myLongPropertyName;
|
| +}
|
| +
|
| +
|
| +// This code is inside the setup function, so the function names are not
|
| +// accessible, but the makeA variable is global through the magic of JS scoping.
|
| +// The contents of this are of course not analyzable by the compiler.
|
| +void setup() native r"""
|
| +function getter() {
|
| + return ++this.getValue;
|
| +}
|
| +
|
| +function setter(x) {
|
| + this.getValue += 10;
|
| +}
|
| +
|
| +function A(){
|
| + var a = Object.create(
|
| + { constructor: { name: 'A'}},
|
| + { myLongPropertyName: { get: getter,
|
| + set: setter,
|
| + configurable: false,
|
| + writeable: false
|
| + }
|
| + });
|
| + a.getValue = 0;
|
| + return a;
|
| +}
|
| +
|
| +makeA = function(){return new A;};
|
| +""";
|
| +
|
| +A makeA() native { return new A(); }
|
| +
|
| +main() {
|
| + setup();
|
| + var a = makeA();
|
| + a.myLongPropertyName = 21;
|
| + int gotten = a.myLongPropertyName;
|
| + Expect.equals(11, gotten);
|
| +
|
| + var a2 = makeA();
|
| + if (a2 is A) {
|
| + // Inside this 'if' the compiler knows that a2 is an A, so it is tempted
|
| + // to access myLongPropertyName directly, using its minified name. But
|
| + // renaming of native properties can only work using getters and setters
|
| + // that access the original name.
|
| + a2.myLongPropertyName = 21;
|
| + int gotten = a2.myLongPropertyName;
|
| + Expect.equals(11, gotten);
|
| + }
|
| +}
|
| +
|
|
|