OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3295 {"'use strict'; let x; eval('');", true, true}, | 3295 {"'use strict'; let x; eval('');", true, true}, |
3296 {"'use strict'; eval(''); let x;", true, true}, | 3296 {"'use strict'; eval(''); let x;", true, true}, |
3297 // Non-assignments not recognized, because the analysis is approximative. | 3297 // Non-assignments not recognized, because the analysis is approximative. |
3298 {"var x; var x;", true, false}, | 3298 {"var x; var x;", true, false}, |
3299 {"var x = 5; var x;", true, false}, | 3299 {"var x = 5; var x;", true, false}, |
3300 {"var x; { var x; }", true, false}, | 3300 {"var x; { var x; }", true, false}, |
3301 {"var x; function x() {}", true, false}, | 3301 {"var x; function x() {}", true, false}, |
3302 {"function x() {}; var x;", true, false}, | 3302 {"function x() {}; var x;", true, false}, |
3303 {"var x; try {} catch (x) { var x = 5; }", true, false}, | 3303 {"var x; try {} catch (x) { var x = 5; }", true, false}, |
3304 }; | 3304 }; |
| 3305 |
| 3306 // We set allow_error_in_inner_function to true in cases where our handling of |
| 3307 // assigned variables in lazy inner functions is currently overly pessimistic. |
| 3308 // FIXME(marja): remove it when no longer needed. |
3305 struct { | 3309 struct { |
3306 const char* source; | 3310 const char* source; |
3307 bool assigned; | 3311 bool assigned; |
3308 bool with; | 3312 bool with; |
| 3313 bool allow_error_in_inner_function; |
3309 } inners[] = { | 3314 } inners[] = { |
3310 // Actual assignments. | 3315 // Actual assignments. |
3311 {"x = 1;", true, false}, | 3316 {"x = 1;", true, false, false}, |
3312 {"x++;", true, false}, | 3317 {"x++;", true, false, false}, |
3313 {"++x;", true, false}, | 3318 {"++x;", true, false, false}, |
3314 {"x--;", true, false}, | 3319 {"x--;", true, false, false}, |
3315 {"--x;", true, false}, | 3320 {"--x;", true, false, false}, |
3316 {"{ x = 1; }", true, false}, | 3321 {"{ x = 1; }", true, false, false}, |
3317 {"'use strict'; { let x; }; x = 0;", true, false}, | 3322 {"'use strict'; { let x; }; x = 0;", true, false, false}, |
3318 {"'use strict'; { const x = 1; }; x = 0;", true, false}, | 3323 {"'use strict'; { const x = 1; }; x = 0;", true, false, false}, |
3319 {"'use strict'; { function x() {} }; x = 0;", true, false}, | 3324 {"'use strict'; { function x() {} }; x = 0;", true, false, false}, |
3320 {"with ({}) { x = 1; }", true, true}, | 3325 {"with ({}) { x = 1; }", true, true, false}, |
3321 {"eval('');", true, false}, | 3326 {"eval('');", true, false, false}, |
3322 {"'use strict'; { let y; eval('') }", true, false}, | 3327 {"'use strict'; { let y; eval('') }", true, false, false}, |
3323 {"function h() { x = 0; }", true, false}, | 3328 {"function h() { x = 0; }", true, false, false}, |
3324 {"(function() { x = 0; })", true, false}, | 3329 {"(function() { x = 0; })", true, false, false}, |
3325 {"(function() { x = 0; })", true, false}, | 3330 {"(function() { x = 0; })", true, false, false}, |
3326 {"with ({}) (function() { x = 0; })", true, true}, | 3331 {"with ({}) (function() { x = 0; })", true, true, false}, |
3327 {"for (x of [1,2,3]) {}", true, false}, | 3332 {"for (x of [1,2,3]) {}", true, false, false}, |
3328 {"for (x in {a: 1}) {}", true, false}, | 3333 {"for (x in {a: 1}) {}", true, false, false}, |
3329 {"for ([x] of [[1],[2],[3]]) {}", true, false}, | 3334 {"for ([x] of [[1],[2],[3]]) {}", true, false, false}, |
3330 {"for ([x] in {ab: 1}) {}", true, false}, | 3335 {"for ([x] in {ab: 1}) {}", true, false, false}, |
3331 {"for ([...x] in {ab: 1}) {}", true, false}, | 3336 {"for ([...x] in {ab: 1}) {}", true, false, false}, |
3332 {"[x] = [1]", true, false}, | 3337 {"[x] = [1]", true, false, false}, |
3333 // Actual non-assignments. | 3338 // Actual non-assignments. |
3334 {"", false, false}, | 3339 {"", false, false, false}, |
3335 {"x;", false, false}, | 3340 {"x;", false, false, false}, |
3336 {"var x;", false, false}, | 3341 {"var x;", false, false, false}, |
3337 {"var x = 8;", false, false}, | 3342 {"var x = 8;", false, false, false}, |
3338 {"var x; x = 8;", false, false}, | 3343 {"var x; x = 8;", false, false, false}, |
3339 {"'use strict'; let x;", false, false}, | 3344 {"'use strict'; let x;", false, false, false}, |
3340 {"'use strict'; let x = 8;", false, false}, | 3345 {"'use strict'; let x = 8;", false, false, false}, |
3341 {"'use strict'; let x; x = 8;", false, false}, | 3346 {"'use strict'; let x; x = 8;", false, false, false}, |
3342 {"'use strict'; const x = 8;", false, false}, | 3347 {"'use strict'; const x = 8;", false, false, false}, |
3343 {"function x() {}", false, false}, | 3348 {"function x() {}", false, false, false}, |
3344 {"function x() { x = 0; }", false, false}, | 3349 {"function x() { x = 0; }", false, false, true}, |
3345 {"function h(x) { x = 0; }", false, false}, | 3350 {"function h(x) { x = 0; }", false, false, false}, |
3346 {"'use strict'; { let x; x = 0; }", false, false}, | 3351 {"'use strict'; { let x; x = 0; }", false, false, false}, |
3347 {"{ var x; }; x = 0;", false, false}, | 3352 {"{ var x; }; x = 0;", false, false, false}, |
3348 {"with ({}) {}", false, true}, | 3353 {"with ({}) {}", false, true, false}, |
3349 {"var x; { with ({}) { x = 1; } }", false, true}, | 3354 {"var x; { with ({}) { x = 1; } }", false, true, false}, |
3350 {"try {} catch(x) { x = 0; }", false, false}, | 3355 {"try {} catch(x) { x = 0; }", false, false, true}, |
3351 {"try {} catch(x) { with ({}) { x = 1; } }", false, true}, | 3356 {"try {} catch(x) { with ({}) { x = 1; } }", false, true, true}, |
3352 // Eval approximation. | 3357 // Eval approximation. |
3353 {"eval('');", true, false}, | 3358 {"eval('');", true, false, false}, |
3354 {"function h() { eval(''); }", true, false}, | 3359 {"function h() { eval(''); }", true, false, false}, |
3355 {"(function() { eval(''); })", true, false}, | 3360 {"(function() { eval(''); })", true, false, false}, |
3356 // Shadowing not recognized because of eval approximation. | 3361 // Shadowing not recognized because of eval approximation. |
3357 {"var x; eval('');", true, false}, | 3362 {"var x; eval('');", true, false, false}, |
3358 {"'use strict'; let x; eval('');", true, false}, | 3363 {"'use strict'; let x; eval('');", true, false, false}, |
3359 {"try {} catch(x) { eval(''); }", true, false}, | 3364 {"try {} catch(x) { eval(''); }", true, false, false}, |
3360 {"function x() { eval(''); }", true, false}, | 3365 {"function x() { eval(''); }", true, false, false}, |
3361 {"(function(x) { eval(''); })", true, false}, | 3366 {"(function(x) { eval(''); })", true, false, false}, |
3362 }; | 3367 }; |
3363 | 3368 |
3364 int prefix_len = Utf8LengthHelper(prefix); | 3369 int prefix_len = Utf8LengthHelper(prefix); |
3365 int midfix_len = Utf8LengthHelper(midfix); | 3370 int midfix_len = Utf8LengthHelper(midfix); |
3366 int suffix_len = Utf8LengthHelper(suffix); | 3371 int suffix_len = Utf8LengthHelper(suffix); |
3367 for (unsigned i = 0; i < arraysize(outers); ++i) { | 3372 for (unsigned i = 0; i < arraysize(outers); ++i) { |
3368 const char* outer = outers[i].source; | 3373 const char* outer = outers[i].source; |
3369 int outer_len = Utf8LengthHelper(outer); | 3374 int outer_len = Utf8LengthHelper(outer); |
3370 for (unsigned j = 0; j < arraysize(inners); ++j) { | 3375 for (unsigned j = 0; j < arraysize(inners); ++j) { |
3371 for (unsigned lazy = 0; lazy < 2; ++lazy) { | 3376 for (unsigned lazy = 0; lazy < 2; ++lazy) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3410 DCHECK_NULL(scope->sibling()); | 3415 DCHECK_NULL(scope->sibling()); |
3411 DCHECK(scope->is_function_scope()); | 3416 DCHECK(scope->is_function_scope()); |
3412 const i::AstRawString* var_name = | 3417 const i::AstRawString* var_name = |
3413 info->ast_value_factory()->GetOneByteString("x"); | 3418 info->ast_value_factory()->GetOneByteString("x"); |
3414 i::Variable* var = scope->Lookup(var_name); | 3419 i::Variable* var = scope->Lookup(var_name); |
3415 bool expected = outers[i].assigned || inners[j].assigned; | 3420 bool expected = outers[i].assigned || inners[j].assigned; |
3416 CHECK(var != NULL); | 3421 CHECK(var != NULL); |
3417 CHECK(var->is_used() || !expected); | 3422 CHECK(var->is_used() || !expected); |
3418 bool is_maybe_assigned = var->maybe_assigned() == i::kMaybeAssigned; | 3423 bool is_maybe_assigned = var->maybe_assigned() == i::kMaybeAssigned; |
3419 if (i::FLAG_lazy_inner_functions) { | 3424 if (i::FLAG_lazy_inner_functions) { |
3420 // If we parse inner functions lazily, allow being pessimistic about | 3425 CHECK(is_maybe_assigned == expected || |
3421 // maybe_assigned. | 3426 (is_maybe_assigned && inners[j].allow_error_in_inner_function)); |
3422 CHECK(is_maybe_assigned || (is_maybe_assigned == expected)); | |
3423 } else { | 3427 } else { |
3424 CHECK_EQ(is_maybe_assigned, expected); | 3428 CHECK_EQ(is_maybe_assigned, expected); |
3425 } | 3429 } |
3426 } | 3430 } |
3427 } | 3431 } |
3428 } | 3432 } |
3429 } | 3433 } |
3430 | 3434 |
3431 namespace { | 3435 namespace { |
3432 | 3436 |
(...skipping 5124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8557 DCHECK_NOT_NULL(scope); | 8561 DCHECK_NOT_NULL(scope); |
8558 DCHECK_NULL(scope->sibling()); | 8562 DCHECK_NULL(scope->sibling()); |
8559 DCHECK(scope->is_function_scope()); | 8563 DCHECK(scope->is_function_scope()); |
8560 const i::AstRawString* var_name = | 8564 const i::AstRawString* var_name = |
8561 info.ast_value_factory()->GetOneByteString("my_var"); | 8565 info.ast_value_factory()->GetOneByteString("my_var"); |
8562 i::Variable* var = scope->Lookup(var_name); | 8566 i::Variable* var = scope->Lookup(var_name); |
8563 CHECK_EQ(inners[i].ctxt_allocate, | 8567 CHECK_EQ(inners[i].ctxt_allocate, |
8564 i::ScopeTestHelper::MustAllocateInContext(var)); | 8568 i::ScopeTestHelper::MustAllocateInContext(var)); |
8565 } | 8569 } |
8566 } | 8570 } |
OLD | NEW |