浏览代码

Changed how captured fields are gotten, still needs improvement!

kindlich 6 年前
父节点
当前提交
5f4fb90d5d
找不到此签名对应的密钥

+ 35
- 27
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java 查看文件

@@ -7,8 +7,6 @@ import org.objectweb.asm.Type;
7 7
 import org.openzen.zencode.shared.CompileException;
8 8
 import org.openzen.zencode.shared.CompileExceptionCode;
9 9
 import org.openzen.zenscript.codemodel.CompareType;
10
-import org.openzen.zenscript.codemodel.FunctionHeader;
11
-import org.openzen.zenscript.codemodel.FunctionParameter;
12 10
 import org.openzen.zenscript.codemodel.expression.*;
13 11
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
14 12
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
@@ -1575,7 +1573,6 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1575 1573
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1576 1574
 
1577 1575
 
1578
-
1579 1576
 		javaWriter.newObject(name);
1580 1577
 		javaWriter.dup();
1581 1578
 
@@ -1608,30 +1605,32 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1608 1605
 		constructorWriter.end();
1609 1606
 
1610 1607
 
1611
-
1612 1608
         functionWriter.start();
1613 1609
 
1614 1610
 
1615
-		final JavaStatementVisitor CSV = new JavaStatementVisitor(new JavaExpressionVisitor(functionWriter) {
1616
-			//@Override
1617
-			public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
1618
-				final int position = calculateMemberPosition(varExpression, expression) ;
1619
-				if (position < 0)
1620
-					throw new CompileException(varExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
1621
-				functionWriter.loadObject(0);
1622
-				functionWriter.getField(name, "captured" + position, varExpression.variable.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
1623
-				return null;
1624
-			}
1625
-		});
1626
-
1611
+        final JavaStatementVisitor CSV = new JavaStatementVisitor(new JavaExpressionVisitor(functionWriter) {
1612
+            //@Override
1613
+            public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
1614
+                final int position = calculateMemberPosition(varExpression, expression);
1615
+                functionWriter.loadObject(0);
1616
+                functionWriter.getField(name, "captured" + position, varExpression.variable.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
1617
+                return null;
1618
+            }
1627 1619
 
1628
-		expression.body.accept(CSV);
1620
+            @Override
1621
+            public Void visitCapturedParameter(CapturedParameterExpression varExpression) {
1622
+                final int position = calculateMemberPosition(varExpression, expression);
1623
+                functionWriter.loadObject(0);
1624
+                functionWriter.getField(name, "captured" + position, varExpression.parameter.type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
1625
+                return null;
1626
+            }
1627
+        });
1629 1628
 
1630 1629
 
1630
+		expression.body.accept(CSV);
1631 1631
         functionWriter.ret();
1632 1632
 
1633 1633
 
1634
-
1635 1634
 		functionWriter.end();
1636 1635
         lambdaCW.visitEnd();
1637 1636
 
@@ -1648,17 +1647,28 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1648 1647
 
1649 1648
     //TODO replace with visitor?
1650 1649
     private static int calculateMemberPosition(GetLocalVariableExpression localVariableExpression, FunctionExpression expression) {
1650
+        int h = 1;//expression.header.parameters.length;
1651
+            for (CapturedExpression capture : expression.closure.captures) {
1652
+                if (capture instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) capture).variable == localVariableExpression.variable)
1653
+                    return h;
1654
+                if (capture instanceof CapturedClosureExpression && ((CapturedClosureExpression) capture).value instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) ((CapturedClosureExpression) capture).value).variable == localVariableExpression.variable)
1655
+                    return h;
1656
+                h++;
1657
+            }
1658
+        throw new CompileException(localVariableExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
1659
+    }
1660
+
1661
+    private static int calculateMemberPosition(CapturedParameterExpression functionParameterExpression, FunctionExpression expression) {
1651 1662
         int h = 1;//expression.header.parameters.length;
1652 1663
         for (CapturedExpression capture : expression.closure.captures) {
1653
-            if (capture instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) capture).variable == localVariableExpression.variable)
1654
-                return h;
1655
-            if (capture instanceof CapturedClosureExpression && ((CapturedClosureExpression) capture).value instanceof CapturedLocalVariableExpression && ((CapturedLocalVariableExpression) ((CapturedClosureExpression) capture).value).variable == localVariableExpression.variable)
1664
+            if (capture instanceof CapturedParameterExpression && ((CapturedParameterExpression) capture).parameter == functionParameterExpression.parameter)
1656 1665
                 return h;
1657 1666
             h++;
1658 1667
         }
1659
-        return -1;
1668
+        throw new CompileException(functionParameterExpression.position, CompileExceptionCode.INTERNAL_ERROR, "Captured Statement error");
1660 1669
     }
1661 1670
 
1671
+
1662 1672
     private String calcFunctionSignature(LambdaClosure closure) {
1663 1673
         StringJoiner joiner = new StringJoiner("", "(", ")V");
1664 1674
 
@@ -1681,11 +1691,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1681 1691
     public Void visitGetFunctionParameter(GetFunctionParameterExpression expression) {
1682 1692
         JavaParameterInfo parameter = expression.parameter.getTag(JavaParameterInfo.class);
1683 1693
 
1684
-        if(parameter == null) {
1685
-			System.err.println("NULL PARAMETER!!!");
1686
-			//FIXME
1687
-			parameter = new JavaParameterInfo(1, Type.INT_TYPE);
1688
-		}
1694
+        if (parameter == null) {
1695
+            throw new CompileException(expression.position, CompileExceptionCode.LAMBDA_HEADER_INVALID, "Could not resolve lambda parameter" + expression.parameter);
1696
+        }
1689 1697
 
1690 1698
         javaWriter.load(expression.parameter.type.accept(JavaTypeVisitor.INSTANCE), parameter.index);
1691 1699
         return null;

正在加载...
取消
保存