| // Copyright (c) 2017, 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. |
| // Dart test program for testing setting/getting of instance fields. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| // dart2js used to have a bug where a local called '_' in the constructor |
| // shadowed the parameter named after a field. This lead to the field being |
| // initialized to 'this' (a cycle) rather than the correct initializer value. |
| // |
| // This test is in the language tests rather than dart2js specific tests since |
| // the dart2js specific tests are not run in all configurations that could |
| // tickle this issue. |
| |
| int ii = 0; |
| |
| class Thing { |
| var _; |
| var $_; |
| // Extra fields to make use of local in constructor beneficial and to exhaust |
| // single-character names. |
| var a = ++ii, b = ++ii, c = ++ii, d = ++ii, e = ++ii; |
| var f = ++ii, g = ++ii, h = ++ii, i = ++ii, j = ++ii; |
| var k = ++ii, l = ++ii, m = ++ii, n = ++ii, o = ++ii; |
| var p = ++ii, q = ++ii, r = ++ii, s = ++ii, t = ++ii; |
| var u = ++ii, v = ++ii, w = ++ii, x = ++ii, y = ++ii; |
| var z = ++ii; |
| var A = ++ii, B = ++ii, C = ++ii, D = ++ii, E = ++ii; |
| var F = ++ii, G = ++ii, H = ++ii, I = ++ii, J = ++ii; |
| var K = ++ii, L = ++ii, M = ++ii, N = ++ii, O = ++ii; |
| var P = ++ii, Q = ++ii, R = ++ii, S = ++ii, T = ++ii; |
| var U = ++ii, V = ++ii, W = ++ii, X = ++ii, Y = ++ii; |
| var Z = ++ii; |
| var $ = ++ii; |
| |
| var f30 = ++ii, f31 = ++ii, f32 = ++ii, f33 = ++ii, f34 = ++ii; |
| var f35 = ++ii, f36 = ++ii, f37 = ++ii, f38 = ++ii, f39 = ++ii; |
| var f40 = ++ii, f41 = ++ii, f42 = ++ii, f43 = ++ii, f44 = ++ii; |
| var f45 = ++ii, f46 = ++ii, f47 = ++ii, f48 = ++ii, f49 = ++ii; |
| var f50 = ++ii, f51 = ++ii, f52 = ++ii, f53 = ++ii, f54 = ++ii; |
| var f55 = ++ii, f56 = ++ii, f57 = ++ii, f58 = ++ii, f59 = ++ii; |
| |
| @pragma('dart2js:noInline') |
| Thing(this._, this.$_); |
| toString() { |
| if (depth > 0) return 'recursion!'; |
| try { |
| ++depth; |
| var sum = a + |
| b + |
| c + |
| d + |
| e + |
| f + |
| g + |
| h + |
| i + |
| j + |
| k + |
| l + |
| m + |
| n + |
| o + |
| p + |
| q + |
| r + |
| s + |
| t + |
| u + |
| v + |
| w + |
| x + |
| y + |
| z + |
| A + |
| B + |
| C + |
| D + |
| E + |
| F + |
| G + |
| H + |
| I + |
| J + |
| K + |
| L + |
| M + |
| N + |
| O + |
| P + |
| Q + |
| R + |
| S + |
| T + |
| U + |
| V + |
| W + |
| X + |
| Y + |
| Z + |
| $ + |
| f30 + |
| f31 + |
| f32 + |
| f33 + |
| f34 + |
| f35 + |
| f36 + |
| f37 + |
| f38 + |
| f39 + |
| f40 + |
| f41 + |
| f42 + |
| f43 + |
| f44 + |
| f45 + |
| f46 + |
| f47 + |
| f48 + |
| f49 + |
| f50 + |
| f51 + |
| f52 + |
| f53 + |
| f54 + |
| f55 + |
| f56 + |
| f57 + |
| f58 + |
| f59; |
| return 'Thing(${_}, ${$_}, ${sum})'; |
| } finally { |
| --depth; |
| } |
| } |
| |
| static int depth = 0; |
| } |
| |
| main() { |
| var t1 = new Thing(1, 2); |
| var t2 = new Thing(3, 4); |
| var t3 = []; |
| |
| Expect.equals( |
| '[Thing(1, 2, 3486), Thing(3, 4, 10375), []]', '${[t1, t2, t3]}'); |
| } |