Chromium Code Reviews| 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 // Test various setter situations, testing special cases in optimizing compiler. | 4 // Test various setter situations, testing special cases in optimizing compiler. |
| 5 // VMOptions=--optimization-counter-threshold=10 --no-use-osr | |
| 5 | 6 |
| 6 import "package:expect/expect.dart"; | 7 import "package:expect/expect.dart"; |
| 7 | 8 |
| 8 class A { | 9 class A { |
| 9 int field = 0; | 10 int field = 0; |
| 10 } | 11 } |
| 11 | 12 |
| 12 class B extends A { | 13 class B extends A { |
| 13 } | 14 } |
| 14 | 15 |
| 15 | 16 |
| 16 void sameImplicitSetter() { | 17 void sameImplicitSetter() { |
| 17 oneTarget(var a, var v) { | 18 oneTarget(var a, var v) { |
| 18 a.field = v; | 19 a.field = v; |
| 19 } | 20 } |
| 20 | 21 |
| 21 A a = new A(); | 22 A a = new A(); |
| 22 B b = new B(); | 23 B b = new B(); |
| 23 // Optimize 'oneTarget' for one class, one target. | 24 // Optimize 'oneTarget' for one class, one target. |
| 24 for (int i = 0; i < 2000; i++) { | 25 for (int i = 0; i < 20; i++) { |
| 25 oneTarget(a, 5); | 26 oneTarget(a, 5); |
| 26 Expect.equals(5, a.field); | 27 Expect.equals(5, a.field); |
| 27 } | 28 } |
| 28 // Deoptimize 'oneTarget', since class B is not expected. | 29 // Deoptimize 'oneTarget', since class B is not expected. |
| 29 oneTarget(b, 6); | 30 oneTarget(b, 6); |
| 30 Expect.equals(6, b.field); | 31 Expect.equals(6, b.field); |
| 31 // Optimize 'oneTarget' for A and B classes, one target. | 32 // Optimize 'oneTarget' for A and B classes, one target. |
| 32 for (int i = 0; i < 2000; i++) { | 33 for (int i = 0; i < 20; i++) { |
| 33 oneTarget(a, 7); | 34 oneTarget(a, 7); |
| 34 Expect.equals(7, a.field); | 35 Expect.equals(7, a.field); |
| 35 } | 36 } |
| 36 oneTarget(b, 8); | 37 oneTarget(b, 8); |
| 37 Expect.equals(8, b.field); | 38 Expect.equals(8, b.field); |
| 38 } | 39 } |
| 39 | 40 |
| 40 | 41 |
| 41 // Deoptimize when no feedback exists. | 42 // Deoptimize when no feedback exists. |
| 42 void setterNoFeedback() { | 43 void setterNoFeedback() { |
| 43 maybeSet(var a, var v, bool set_it) { | 44 maybeSet(var a, var v, bool set_it) { |
| 44 if (set_it) { | 45 if (set_it) { |
| 45 return a.field = v; | 46 return a.field = v; |
| 46 } | 47 } |
| 47 return -1; | 48 return -1; |
| 48 } | 49 } |
| 49 | 50 |
| 50 A a = new A(); | 51 A a = new A(); |
| 51 for (int i = 0; i < 2000; i++) { | 52 for (int i = 0; i < 20; i++) { |
| 52 var r = maybeSet(a, 5, false); | 53 var r = maybeSet(a, 5, false); |
| 53 Expect.equals(0, a.field); | 54 Expect.equals(0, a.field); |
| 54 Expect.equals(-1, r); | 55 Expect.equals(-1, r); |
| 55 } | 56 } |
| 56 var r = maybeSet(a, 5, true); | 57 var r = maybeSet(a, 5, true); |
| 57 Expect.equals(5, a.field); | 58 Expect.equals(5, a.field); |
| 58 Expect.equals(5, r); | 59 Expect.equals(5, r); |
| 59 for (int i = 0; i < 2000; i++) { | 60 for (int i = 0; i < 20; i++) { |
| 60 var r = maybeSet(a, 6, true); | 61 var r = maybeSet(a, 6, true); |
| 61 Expect.equals(6, a.field); | 62 Expect.equals(6, a.field); |
| 62 Expect.equals(6, r); | 63 Expect.equals(6, r); |
| 63 } | 64 } |
| 64 } | 65 } |
| 65 | 66 |
| 66 // Check non-implicit setter | 67 // Check non-implicit setter |
| 67 class X { | 68 class X { |
| 68 int pField = 0; | 69 int pField = 0; |
| 69 set field(v) { pField = v; } | 70 set field(v) { pField = v; } |
| 70 get field => 10; | 71 get field => 10; |
| 71 } | 72 } |
| 72 | 73 |
| 73 void sameNotImplicitSetter() { | 74 void sameNotImplicitSetter() { |
| 74 oneTarget(var a, var v) { | 75 oneTarget(var a, var v) { |
| 75 return a.field = v; | 76 return a.field = v; |
| 76 } | 77 } |
| 77 | 78 |
| 78 incField(var a) { | 79 incField(var a) { |
| 79 a.field++; | 80 a.field++; |
| 80 } | 81 } |
| 81 | 82 |
| 82 X x = new X(); | 83 X x = new X(); |
| 83 for (int i = 0; i < 2000; i++) { | 84 for (int i = 0; i < 20; i++) { |
| 84 var r = oneTarget(x, 3); | 85 var r = oneTarget(x, 3); |
| 85 Expect.equals(3, x.pField); | 86 Expect.equals(3, x.pField); |
| 86 Expect.equals(3, r); | 87 Expect.equals(3, r); |
| 87 } | 88 } |
| 88 oneTarget(x, 0); | 89 oneTarget(x, 0); |
| 89 for (int i = 0; i < 2000; i++) { | 90 for (int i = 0; i < 20; i++) { |
| 90 incField(x); | 91 incField(x); |
| 91 } | 92 } |
| 92 Expect.equals(11, x.pField); | 93 Expect.equals(11, x.pField); |
| 93 } | 94 } |
| 94 | 95 |
| 95 class Y { | 96 class Y { |
| 96 int field = 0; | 97 int field = 0; |
| 97 } | 98 } |
| 98 | 99 |
| 99 | 100 |
| 100 multiImplicitSetter() { | 101 multiImplicitSetter() { |
| 101 oneTarget(var a, var v) { | 102 oneTarget(var a, var v) { |
| 102 return a.field = v; | 103 return a.field = v; |
| 103 } | 104 } |
| 104 | 105 |
| 105 // Both classes 'Y' and 'A' have a distinct field getter. | 106 // Both classes 'Y' and 'A' have a distinct field getter. |
| 106 A a = new A(); | 107 A a = new A(); |
| 107 Y y = new Y(); | 108 Y y = new Y(); |
| 108 for (int i = 0; i < 2000; i++) { | 109 for (int i = 0; i < 20; i++) { |
| 109 var r = oneTarget(a, 5); | 110 var r = oneTarget(a, 5); |
| 110 Expect.equals(5, a.field); | 111 Expect.equals(5, a.field); |
| 111 Expect.equals(5, r); | 112 Expect.equals(5, r); |
| 112 r = oneTarget(y, 6); | 113 r = oneTarget(y, 6); |
| 113 Expect.equals(6, y.field); | 114 Expect.equals(6, y.field); |
| 114 Expect.equals(6, r); | 115 Expect.equals(6, r); |
| 115 } | 116 } |
| 116 } | 117 } |
| 117 | 118 |
| 118 class Z { | 119 class Z { |
| 119 int pField = 0; | 120 int pField = 0; |
| 120 set field(v) { pField = v; } | 121 set field(v) { pField = v; } |
| 121 get field => 10; | 122 get field => 10; |
| 122 } | 123 } |
| 123 | 124 |
| 124 multiNotImplicitSetter() { | 125 multiNotImplicitSetter() { |
| 125 oneTarget(var a, var v) { | 126 oneTarget(var a, var v) { |
| 126 return a.field = v; | 127 return a.field = v; |
| 127 } | 128 } |
| 128 | 129 |
| 129 Y y = new Y(); | 130 Y y = new Y(); |
| 130 Z z = new Z(); | 131 Z z = new Z(); |
| 131 for (int i = 0; i < 2000; i++) { | 132 for (int i = 0; i < 20; i++) { |
| 132 var r = oneTarget(y, 8); | 133 var r = oneTarget(y, 8); |
| 133 Expect.equals(8, y.field); | 134 Expect.equals(8, y.field); |
| 134 Expect.equals(8, r); | 135 Expect.equals(8, r); |
| 135 r = oneTarget(z, 12); | 136 r = oneTarget(z, 12); |
| 136 Expect.equals(12, z.pField); | 137 Expect.equals(12, z.pField); |
| 137 Expect.equals(12, r); | 138 Expect.equals(12, r); |
| 138 } | 139 } |
| 139 A a = new A(); | 140 A a = new A(); |
| 140 var r = oneTarget(a, 11); | 141 var r = oneTarget(a, 11); |
| 141 Expect.equals(11, a.field); | 142 Expect.equals(11, a.field); |
| 142 Expect.equals(11, r); | 143 Expect.equals(11, r); |
| 143 } | 144 } |
| 144 | 145 |
| 145 void main() { | 146 void main() { |
| 146 for (int i = 0; i< 2000; i++) {} | 147 for (int i = 0; i< 20; i++) {} |
|
zra
2013/07/11 20:11:28
What's the point of this loop?
srdjan
2013/07/11 20:15:32
Don't know. Will remove it.
| |
| 147 sameImplicitSetter(); | 148 sameImplicitSetter(); |
| 148 setterNoFeedback(); | 149 setterNoFeedback(); |
| 149 sameNotImplicitSetter(); | 150 sameNotImplicitSetter(); |
| 150 | 151 |
| 151 multiImplicitSetter(); | 152 multiImplicitSetter(); |
| 152 multiNotImplicitSetter(); | 153 multiNotImplicitSetter(); |
| 153 } | 154 } |
| OLD | NEW |