Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: test/cctest/test-parsing.cc

Issue 2539123002: Preparsing inner funcs: be less pessimistic about maybe_assigned. (Closed)
Patch Set: moar Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/preparser.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/parsing/preparser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698