Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --strong-mode --harmony_rest_parameters --harmony_arrow_functions --ha rmony_classes --harmony-computed-property-names | 5 // Flags: --strong-mode --harmony_rest_parameters --harmony_arrow_functions --ha rmony_classes --harmony-computed-property-names |
| 6 | 6 |
| 7 // Note that it's essential for these tests that the reference is inside dead | 7 // Note that it's essential for these tests that the reference is inside dead |
| 8 // code (because we already produce ReferenceErrors for run-time unresolved | 8 // code (because we already produce ReferenceErrors for run-time unresolved |
| 9 // variables and don't want to confuse those with strong mode errors). But the | 9 // variables and don't want to confuse those with strong mode errors). But the |
| 10 // errors should *not* be inside lazy, unexecuted functions, since lazy parsing | 10 // errors should *not* be inside lazy, unexecuted functions, since lazy parsing |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 | 103 |
| 104 assertThrowsHelper( | 104 assertThrowsHelper( |
| 105 "'use strong'; if (false) { let C = class C2 { method() { C; } } }", | 105 "'use strong'; if (false) { let C = class C2 { method() { C; } } }", |
| 106 ReferenceError); | 106 ReferenceError); |
| 107 | 107 |
| 108 assertThrowsHelper( | 108 assertThrowsHelper( |
| 109 "'use strong'; if (false) { let C = class C2 { " + | 109 "'use strong'; if (false) { let C = class C2 { " + |
| 110 "static a() { return 'A'; } [C.a()]() { return 'B'; } }; }", | 110 "static a() { return 'A'; } [C.a()]() { return 'B'; } }; }", |
| 111 ReferenceError); | 111 ReferenceError); |
| 112 | 112 |
| 113 // TODO(marja, rossberg): More tests related to computed property names in | 113 assertThrowsHelper( |
| 114 // classes + recognize more errors. This one is not recognized as an error | 114 "'use strong'; if (false) { let C = class C2 { " + |
| 115 // yet: | 115 "static a() { return 'A'; } [C2.a()]() { return 'B'; } }; }", |
| 116 // let C = class C2 { | 116 ReferenceError); |
| 117 // static a() { return 'A'; } | 117 |
| 118 // [C2.a()]() { return 'B'; } << C2 should not be allowed here | 118 assertThrowsHelper( |
| 119 // }; | 119 "'use strong'; if (false) { let C = class C2 { " + |
| 120 "[(function() { C; return 'A';})()]() { return 'B'; } }; }", | |
| 121 ReferenceError); | |
| 122 | |
| 123 // The reference to C or C2 is inside a function, but not a method. | |
| 124 assertThrowsHelper( | |
| 125 "'use strong'; if (false) { let C = class C2 { " + | |
| 126 "[(function() { C2; return 'A';})()]() { return 'B'; } }; }", | |
| 127 ReferenceError); | |
| 128 | |
| 129 assertThrowsHelper( | |
| 130 "'use strong'; if (false) { let C = class C2 { " + | |
| 131 "[(function() { C; return 'A';})()]() { return 'B'; } }; }", | |
| 132 ReferenceError); | |
| 133 | |
| 134 // The reference to C or C2 is inside a method, but it's not a method of the | |
| 135 // relevant class (C2). | |
| 136 assertThrowsHelper( | |
| 137 "'use strong'; if (false) { let C = class C2 { " + | |
| 138 "[(new (class D { m() { C2; return 'A'; } })).m()]() " + | |
| 139 "{ return 'B'; } } }", | |
| 140 ReferenceError); | |
| 141 | |
| 142 assertThrowsHelper( | |
| 143 "'use strong'; if (false) { let C = class C2 { " + | |
| 144 "[(new (class D { m() { C; return 'A'; } })).m()]() " + | |
| 145 "{ return 'B'; } } }", | |
| 146 ReferenceError); | |
|
Dmitry Lomov (no reviews)
2015/03/06 14:48:01
Add a test that tests the wrong behavior:
class C
marja
2015/03/06 16:14:23
Done.
| |
| 120 })(); | 147 })(); |
| 121 | 148 |
| 122 | 149 |
| 123 (function UsesWhichAreFine() { | 150 (function UsesWhichAreFine() { |
| 124 "use strong"; | 151 "use strong"; |
| 125 | 152 |
| 126 let var1 = 0; | 153 let var1 = 0; |
| 127 var1; | 154 var1; |
| 128 | 155 |
| 129 let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; | 156 let var2a = 0, var2b = var2a + 1, var2c = 2 + var2b; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 var1, var2a, var2b, var2c; | 200 var1, var2a, var2b, var2c; |
| 174 } | 201 } |
| 175 | 202 |
| 176 (function eval1() { | 203 (function eval1() { |
| 177 let var7 = 0; // Declaration position will be something large. | 204 let var7 = 0; // Declaration position will be something large. |
| 178 // But use position will be something small, however, this is not an error, | 205 // But use position will be something small, however, this is not an error, |
| 179 // since the use is inside an eval scope. | 206 // since the use is inside an eval scope. |
| 180 eval("var7;"); | 207 eval("var7;"); |
| 181 })(); | 208 })(); |
| 182 | 209 |
| 183 // https://code.google.com/p/v8/issues/detail?id=3927 | |
| 184 // class C1 { constructor() { C1; } }; new C1(); | |
| 185 // let C2 = class C3 { constructor() { C3; } }; new C2(); | |
| 186 | 210 |
| 187 // class C4 { method() { C4; method; } }; new C4(); | 211 class C1 { constructor() { C1; } }; new C1(); |
| 188 // let C5 = class C6 { method() { C6; method; } }; new C5(); | 212 let C2 = class C3 { constructor() { C3; } }; new C2(); |
| 213 | |
| 214 class C4 { method() { C4; } }; new C4(); | |
| 215 let C5 = class C6 { method() { C6; } }; new C5(); | |
| 216 | |
| 217 class C7 { static method() { C7; } }; new C7(); | |
| 218 let C8 = class C9 { static method() { C9; } }; new C8(); | |
|
Dmitry Lomov (no reviews)
2015/03/06 14:48:01
Add a test for inner class referencing outer class
marja
2015/03/06 16:14:23
Done (not sure what you meant w/ object literal me
Dmitry Lomov (no reviews)
2015/03/07 18:17:10
Yes, it does
| |
| 189 })(); | 219 })(); |
| OLD | NEW |