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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Issue 2739203006: Reject non-local jumps. (Closed)
Patch Set: Created 3 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/co19/co19-kernel.status » ('j') | tests/co19/co19-kernel.status » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index b460e20609e4e450d9450d397a1c7d61ba9b413f..bf91364583bf9cf8d915fca6da28457a9e59c223 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -271,7 +271,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
@override
JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) {
- return new JumpTarget(kind, member, charOffset);
+ return new JumpTarget(kind, functionNestingLevel, member, charOffset);
}
@override
@@ -1925,7 +1925,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
debugEvent("beginLabeledStatement");
List<Label> labels = popList(labelCount);
enterLocalScope();
- LabelTarget target = new LabelTarget(member, token.charOffset);
+ LabelTarget target =
+ new LabelTarget(member, functionNestingLevel, token.charOffset);
for (Label label in labels) {
scope.declareLabel(label.name, target);
}
@@ -2117,6 +2118,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
!target.isBreakTarget) {
push(compileTimeErrorInLoopOrSwitch = buildCompileTimeErrorStatement(
"Can't break to '$name'.", breakKeyword.next.charOffset));
+ } else if (target.functionNestingLevel != functionNestingLevel) {
+ push(compileTimeErrorInLoopOrSwitch = buildCompileTimeErrorStatement(
+ "Can't break to '$name' in a different function.",
+ breakKeyword.next.charOffset));
} else {
BreakStatement statement = new BreakStatement(null)
..fileOffset = breakKeyword.charOffset;
@@ -2162,6 +2167,10 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
} else if (!target.isContinueTarget) {
push(compileTimeErrorInLoopOrSwitch = buildCompileTimeErrorStatement(
"Can't continue at '$name'.", continueKeyword.next.charOffset));
+ } else if (target.functionNestingLevel != functionNestingLevel) {
+ push(compileTimeErrorInLoopOrSwitch = buildCompileTimeErrorStatement(
+ "Can't continue at '$name' in a different function.",
+ continueKeyword.next.charOffset));
} else {
BreakStatement statement = new BreakStatement(null)
..fileOffset = continueKeyword.charOffset;
@@ -2517,7 +2526,10 @@ class JumpTarget extends Builder {
final JumpTargetKind kind;
- JumpTarget(this.kind, MemberBuilder member, int charOffset)
+ final int functionNestingLevel;
+
+ JumpTarget(this.kind, this.functionNestingLevel, MemberBuilder member,
+ int charOffset)
: super(member, charOffset, member.fileUri);
bool get isBreakTarget => kind == JumpTargetKind.Break;
@@ -2573,10 +2585,13 @@ class LabelTarget extends Builder implements JumpTarget {
final JumpTarget continueTarget;
- LabelTarget(MemberBuilder member, int charOffset)
- : breakTarget = new JumpTarget(JumpTargetKind.Break, member, charOffset),
- continueTarget =
- new JumpTarget(JumpTargetKind.Continue, member, charOffset),
+ final int functionNestingLevel;
+
+ LabelTarget(MemberBuilder member, this.functionNestingLevel, int charOffset)
+ : breakTarget = new JumpTarget(
+ JumpTargetKind.Break, functionNestingLevel, member, charOffset),
+ continueTarget = new JumpTarget(
+ JumpTargetKind.Continue, functionNestingLevel, member, charOffset),
super(member, charOffset, member.fileUri);
bool get hasUsers => breakTarget.hasUsers || continueTarget.hasUsers;
« no previous file with comments | « no previous file | tests/co19/co19-kernel.status » ('j') | tests/co19/co19-kernel.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698