From 3aa9079ea217b1b5492e22562ee81a47263d2a50 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 15 Apr 2011 17:29:22 +0200 Subject: [PATCH] not yet working code for for..in loop over Java arrays --- .../jet/codegen/ExpressionCodegen.java | 49 +++++++++++++++++++ .../org/jetbrains/jet/codegen/FrameMap.java | 8 +++ .../jet/lang/resolve/BindingContext.java | 1 + .../jet/lang/resolve/BindingTraceContext.java | 5 ++ 4 files changed, 63 insertions(+) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 6c058df6985..93c08b04226 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -164,6 +164,55 @@ public class ExpressionCodegen extends JetVisitor { myLoopStarts.pop(); } + @Override + public void visitForExpression(JetForExpression expression) { + final JetExpression loopRange = expression.getLoopRange(); + final JetParameter parameter = expression.getLoopParameter(); + final DeclarationDescriptor descriptor = bindingContext.getParameterDescriptor(parameter); + Type loopRangeType = expressionType(loopRange); + if (loopRangeType.getSort() == Type.ARRAY) { + generateForInArray(expression, descriptor, loopRangeType); + } + else { + throw new UnsupportedOperationException("for/in loop currently only supported for arrays"); + } + } + + private void generateForInArray(JetForExpression expression, DeclarationDescriptor descriptor, Type loopRangeType) { + JetType paramType = bindingContext.getExpressionType(expression.getLoopParameter()); + Type asmParamType = typeMapper.mapType(paramType); + + int indexVar = myMap.enterTemp(); + v.aconst(0); + v.store(indexVar, Type.INT_TYPE); + int paramVar = myMap.getIndex(descriptor); + + Label condition = new Label(); + Label end = new Label(); + v.mark(condition); + myLoopStarts.push(condition); + + v.load(indexVar, Type.INT_TYPE); + gen(expression.getLoopRange(), loopRangeType); // index array + v.dup2(); // index array index array + v.arraylength(); // index array index array.length + v.ifge(end); // index array + v.swap(); // array index + v.aload(loopRangeType.getElementType()); + StackValue.onStack(loopRangeType.getElementType()).put(asmParamType, v); + v.store(paramVar, asmParamType); + + gen(expression.getBody(), Type.VOID_TYPE); + + v.goTo(condition); + + myLoopEnds.push(end); + + myMap.leave(descriptor); +// TODO v.visitLocalVariable(parameter.getName(), ); + myMap.leaveTemp(); + } + @Override public void visitBreakExpression(JetBreakExpression expression) { JetSimpleNameExpression labelElement = expression.getTargetLabel(); diff --git a/idea/src/org/jetbrains/jet/codegen/FrameMap.java b/idea/src/org/jetbrains/jet/codegen/FrameMap.java index 5060ff56b0d..98b46f592ca 100644 --- a/idea/src/org/jetbrains/jet/codegen/FrameMap.java +++ b/idea/src/org/jetbrains/jet/codegen/FrameMap.java @@ -24,6 +24,14 @@ public class FrameMap { return myVarIndex.remove(descriptor); } + public int enterTemp() { + return myMaxIndex++; + } + + public void leaveTemp() { + myMaxIndex--; + } + public int getIndex(DeclarationDescriptor descriptor) { return myVarIndex.contains(descriptor) ? myVarIndex.get(descriptor) : -1; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java index ee530abe7d6..6068f32d4b4 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -13,6 +13,7 @@ public interface BindingContext { TypeParameterDescriptor getTypeParameterDescriptor(JetTypeParameter declaration); FunctionDescriptor getFunctionDescriptor(JetFunction declaration); PropertyDescriptor getPropertyDescriptor(JetProperty declaration); + DeclarationDescriptor getParameterDescriptor(JetParameter declaration); JetType getExpressionType(JetExpression expression); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index 26bcdc43135..05c5ceefc19 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java @@ -111,6 +111,11 @@ public class BindingTraceContext extends BindingTrace implements BindingContext return (PropertyDescriptor) declarationsToDescriptors.get(declaration); } + @Override + public DeclarationDescriptor getParameterDescriptor(JetParameter declaration) { + return declarationsToDescriptors.get(declaration); + } + @Override public JetType resolveTypeReference(JetTypeReference typeReference) { return types.get(typeReference);