add prerequisites for method block codegen

This commit is contained in:
404Simon 2024-05-08 10:41:01 +02:00
parent b61af71076
commit dbbb181ba5
17 changed files with 127 additions and 34 deletions

View File

@ -0,0 +1,11 @@
package de.maishai.typedast;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MethodContext {
}

View File

@ -1,4 +1,7 @@
package de.maishai.typedast;
import org.objectweb.asm.MethodVisitor;
public interface TypedStatement extends TypedNode {
public void codeGen(MethodVisitor mv, MethodContext ctx);
}

View File

@ -2,11 +2,9 @@ package de.maishai.typedast.typedclass;
import de.maishai.ast.AssignSign;
import de.maishai.ast.records.Assignment;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@ -41,4 +39,9 @@ public class TypedAssignment implements TypedStatement {
typedAssignment.setValue((TypedExpression) value.convertToTypedAST(localVar, classes, untyped.value()));
return typedAssignment;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -2,10 +2,12 @@ package de.maishai.typedast.typedclass;
import de.maishai.ast.records.Block;
import de.maishai.ast.records.LocalVariable;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.List;
import java.util.Map;
@ -46,4 +48,13 @@ public class TypedBlock implements TypedNode {
}
return null;
}
public void codeGen(MethodVisitor mv, MethodContext ctx) {
for (TypedLocalVariable var : vars) {
var.codeGen(mv, ctx);
}
for (TypedStatement stmt : stmts) {
stmt.codeGen(mv, ctx);
}
}
}

View File

@ -1,9 +1,11 @@
package de.maishai.typedast.typedclass;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -17,4 +19,9 @@ public class TypedBreak implements TypedStatement {
public TypedNode convertToTypedAST(Map<String, Type> localVar, Map<String, TypedClass> classes, de.maishai.ast.records.Node unTypedAST) {
return new TypedBreak();
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -4,6 +4,7 @@ import de.maishai.ast.records.Block;
import de.maishai.ast.records.Constructor;
import de.maishai.ast.records.Parameter;
import de.maishai.typedast.CodeGenUtils;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.Type;
import lombok.AllArgsConstructor;
@ -69,12 +70,12 @@ public class TypedConstructor implements TypedNode {
MethodVisitor mv = cw.visitMethod(accessModifier, "<init>", CodeGenUtils.generateDescriptor(typedParameters, Type.VOID), null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
//super();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
//TODO: deal with block
MethodContext context = new MethodContext();
typedBlock.codeGen(mv, context);
mv.visitInsn(Opcodes.RETURN);

View File

@ -1,9 +1,11 @@
package de.maishai.typedast.typedclass;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -18,4 +20,9 @@ public class TypedContinue implements TypedStatement {
public TypedNode convertToTypedAST(Map<String, Type> localVar, Map<String, TypedClass> classes, de.maishai.ast.records.Node unTypedAST) {
return new TypedContinue();
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,11 +1,9 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.DoWhile;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -31,4 +29,9 @@ public class TypedDoWhile implements TypedStatement {
return typedDoWhile;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,13 +1,11 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.For;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@ -40,4 +38,9 @@ public class TypedFor implements TypedStatement {
return typedFor;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,11 +1,9 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.IfElse;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@ -39,4 +37,9 @@ public class TypedIfElse implements TypedStatement {
return typedIfElse;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,12 +1,14 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.LocalVariable;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.Type;
import de.maishai.typedast.TypeMapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -35,4 +37,7 @@ public final class TypedLocalVariable implements TypedNode {
return typedLocalVariable;
}
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -2,10 +2,11 @@ package de.maishai.typedast.typedclass;
import de.maishai.ast.records.Method;
import de.maishai.ast.records.Parameter;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.Type;
import de.maishai.typedast.TypeMapper;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.List;
import java.util.Map;
@ -70,5 +71,18 @@ public class TypedMethod implements TypedNode {
return typedParameter;
}
public void codeGen(ClassWriter cw) {
int accessModifier = Opcodes.ACC_PUBLIC; // ist laut Andi ok
MethodVisitor mv = cw.visitMethod(accessModifier, typedId.getName(),
CodeGenUtils.generateDescriptor(typedParameters, returnType), null, null);
mv.visitCode();
MethodContext context = new MethodContext();
typedBlock.codeGen(mv, context);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
}

View File

@ -1,10 +1,8 @@
package de.maishai.typedast.typedclass;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.List;
import java.util.Map;
@ -27,4 +25,9 @@ public class TypedMethodCall implements TypedExpression, TypedStatement {
//TODO: Implement this
return null;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -3,6 +3,7 @@ package de.maishai.typedast.typedclass;
import de.maishai.ast.records.New;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.List;
import java.util.Map;
@ -47,4 +48,9 @@ public class TypedNew implements TypedExpression, TypedStatement {
}
return typedNew;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -2,11 +2,9 @@ package de.maishai.typedast.typedclass;
import de.maishai.ast.records.Return;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -25,4 +23,9 @@ public class TypedReturn implements TypedStatement {
typedReturn.setRet((TypedExpression) ret.convertToTypedAST(localVar, classes, untyped.ret()));
return typedReturn;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,10 +1,12 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.Method;
import de.maishai.typedast.MethodContext;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@Data
@ -23,4 +25,9 @@ public class TypedReturnVoid implements TypedStatement {
}
return new TypedReturnVoid();
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}

View File

@ -1,11 +1,9 @@
package de.maishai.typedast.typedclass;
import de.maishai.ast.records.While;
import de.maishai.typedast.TypedExpression;
import de.maishai.typedast.TypedNode;
import de.maishai.typedast.TypedStatement;
import de.maishai.typedast.Type;
import de.maishai.typedast.*;
import lombok.Data;
import org.objectweb.asm.MethodVisitor;
import java.util.Map;
@ -29,4 +27,9 @@ public class TypedWhile implements TypedStatement {
typedWhile.setTypedBlock((TypedBlock) typedBlock.convertToTypedAST(localVar, classes, untyped.block()));
return typedWhile;
}
@Override
public void codeGen(MethodVisitor mv, MethodContext ctx) {
}
}