From fbdfd5a5fbc385c61ce2e86c1a9011f827098cdb Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 5 Jun 2012 22:56:23 +0400 Subject: [PATCH] validate state in FrameMap.leave fix variable leave order --- .../src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 3 ++- .../backend/src/org/jetbrains/jet/codegen/FrameMap.java | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5cc23cf356a..1db5560f5ca 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.codegen; +import com.google.common.collect.Lists; import com.intellij.openapi.editor.Document; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.psi.PsiElement; @@ -875,7 +876,7 @@ public class ExpressionCodegen extends JetVisitor { Label blockEnd = new Label(); v.mark(blockEnd); - for (JetElement statement : statements) { + for (JetElement statement : Lists.reverse(statements)) { if(statement instanceof JetNamedFunction) { DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, statement); myFrameMap.leave(descriptor); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java b/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java index 0df1dd24aa2..2f01ef3c597 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java @@ -41,7 +41,11 @@ public class FrameMap { int size = myVarSizes.get(descriptor); myMaxIndex -= size; myVarSizes.remove(descriptor); - return myVarIndex.remove(descriptor); + int oldIndex = myVarIndex.remove(descriptor); + if (oldIndex != myMaxIndex) { + throw new IllegalStateException("descriptor can be left only if it is last"); + } + return oldIndex; } public int enterTemp() {