| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // A native class has no defined constructor. | 5 // A native class has no defined constructor. |
| 6 // This regression test verifies that compiler accounts for hidden constructor | 6 // This regression test verifies that compiler accounts for hidden constructor |
| 7 // when analysing field values. | 7 // when analysing field values. |
| 8 | 8 |
| 9 import "dart:_js_helper"; | 9 import "dart:_js_helper"; |
| 10 import "package:expect/expect.dart"; | 10 import "package:expect/expect.dart"; |
| 11 | 11 |
| 12 @Native("Node") | 12 @Native("Node") |
| 13 class Node { | 13 class Node { |
| 14 | |
| 15 final Node parentNode; | 14 final Node parentNode; |
| 16 | 15 |
| 17 ModelSource _modelSource; // If null, inherited from parent. | 16 ModelSource _modelSource; // If null, inherited from parent. |
| 18 | 17 |
| 19 ModelSource get modelSource { | 18 ModelSource get modelSource { |
| 20 for (Node node = this; node != null; node = node.parentNode) { | 19 for (Node node = this; node != null; node = node.parentNode) { |
| 21 ModelSource source = node._modelSource; | 20 ModelSource source = node._modelSource; |
| 22 if (source != null) return source; | 21 if (source != null) return source; |
| 23 } | 22 } |
| 24 return null; | 23 return null; |
| 25 } | 24 } |
| 26 | 25 |
| 27 // Copy of above code renamed with suffix '2'. | 26 // Copy of above code renamed with suffix '2'. |
| 28 | 27 |
| 29 ModelSource _modelSource2; // If null, inherited from parent. | 28 ModelSource _modelSource2; // If null, inherited from parent. |
| 30 | 29 |
| 31 ModelSource get modelSource2 { | 30 ModelSource get modelSource2 { |
| 32 for (Node node = this; node != null; node = node.parentNode) { | 31 for (Node node = this; node != null; node = node.parentNode) { |
| 33 ModelSource source = node._modelSource2; | 32 ModelSource source = node._modelSource2; |
| 34 if (source != null) return source; | 33 if (source != null) return source; |
| 35 } | 34 } |
| 36 return null; | 35 return null; |
| 37 } | 36 } |
| 38 } | 37 } |
| 39 | 38 |
| 40 makeNode(parent) native; | 39 makeNode(parent) native ; |
| 41 | 40 |
| 42 class ModelSource { | 41 class ModelSource { |
| 43 var name; | 42 var name; |
| 44 ModelSource(this.name); | 43 ModelSource(this.name); |
| 45 toString() => 'ModelSource($name)'; | 44 toString() => 'ModelSource($name)'; |
| 46 } | 45 } |
| 47 | 46 |
| 48 void setup() native """ | 47 void setup() native """ |
| 49 // This code is all inside 'setup' and so not accesible from the global scope. | 48 // This code is all inside 'setup' and so not accesible from the global scope. |
| 50 function Node(parent){ this.parentNode = parent; } | 49 function Node(parent){ this.parentNode = parent; } |
| 51 makeNode = function(p){return new Node(p);}; | 50 makeNode = function(p){return new Node(p);}; |
| 52 """; | 51 """; |
| 53 | 52 |
| 54 | |
| 55 main() { | 53 main() { |
| 56 setup(); | 54 setup(); |
| 57 | 55 |
| 58 var n1 = makeNode(null); | 56 var n1 = makeNode(null); |
| 59 var n2 = makeNode(n1); | 57 var n2 = makeNode(n1); |
| 60 var n3 = makeNode(n2); | 58 var n3 = makeNode(n2); |
| 61 | 59 |
| 62 var m1 = new ModelSource('1'); | 60 var m1 = new ModelSource('1'); |
| 63 n2._modelSource = null; // null write. | 61 n2._modelSource = null; // null write. |
| 64 n2._modelSource = m1; // Non-null write. | 62 n2._modelSource = m1; // Non-null write. |
| 65 var x1 = n3.modelSource; | 63 var x1 = n3.modelSource; |
| 66 Expect.identical(m1, x1); | 64 Expect.identical(m1, x1); |
| 67 | 65 |
| 68 var m2 = new ModelSource('2'); | 66 var m2 = new ModelSource('2'); |
| 69 n2._modelSource2 = m2; // The only write is non-null. | 67 n2._modelSource2 = m2; // The only write is non-null. |
| 70 var x2 = n3.modelSource2; | 68 var x2 = n3.modelSource2; |
| 71 Expect.identical(m2, x2); | 69 Expect.identical(m2, x2); |
| 72 } | 70 } |
| OLD | NEW |