mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-28 17:28:03 +00:00
more binary operator support
This commit is contained in:
parent
9a7d296ecc
commit
69548745c2
@ -1,6 +1,5 @@
|
|||||||
package de.maishai.typedast;
|
package de.maishai.typedast;
|
||||||
|
|
||||||
import de.maishai.VariableGenerator;
|
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import org.objectweb.asm.Label;
|
import org.objectweb.asm.Label;
|
||||||
import org.objectweb.asm.MethodVisitor;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
@ -7,6 +7,7 @@ import de.maishai.typedast.TypedExpression;
|
|||||||
import de.maishai.typedast.Type;
|
import de.maishai.typedast.Type;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.objectweb.asm.Label;
|
||||||
import org.objectweb.asm.MethodVisitor;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
@ -69,6 +70,54 @@ public class TypedBinary implements TypedExpression {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void codeGen(MethodContext ctx) {
|
public void codeGen(MethodContext ctx) {
|
||||||
|
if (op == Operator.AND) {
|
||||||
|
Label end = new Label();
|
||||||
|
Label returnTrue = new Label();
|
||||||
|
Label returnFalse = new Label();
|
||||||
|
left.codeGen(ctx);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.IFNE, returnFalse);
|
||||||
|
right.codeGen(ctx);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.IFNE, returnFalse);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, returnTrue);
|
||||||
|
|
||||||
|
ctx.getMv().visitLabel(returnFalse);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_0);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, end);
|
||||||
|
ctx.getMv().visitLabel(returnTrue);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_1);
|
||||||
|
ctx.getMv().visitLabel(end);
|
||||||
|
} else if (op == Operator.OR) {
|
||||||
|
Label end = new Label();
|
||||||
|
Label returnTrue = new Label();
|
||||||
|
Label returnFalse = new Label();
|
||||||
|
left.codeGen(ctx);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.IFNE, returnTrue);
|
||||||
|
right.codeGen(ctx);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.IFNE, returnTrue);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, returnFalse);
|
||||||
|
|
||||||
|
ctx.getMv().visitLabel(returnFalse);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_0);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, end);
|
||||||
|
ctx.getMv().visitLabel(returnTrue);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_1);
|
||||||
|
ctx.getMv().visitLabel(end);
|
||||||
|
} else if (op == Operator.EQ) {
|
||||||
|
Label end = new Label();
|
||||||
|
Label returnTrue = new Label();
|
||||||
|
Label returnFalse = new Label();
|
||||||
|
left.codeGen(ctx);
|
||||||
|
right.codeGen(ctx);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.IF_ICMPNE, returnFalse);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, returnTrue);
|
||||||
|
|
||||||
|
ctx.getMv().visitLabel(returnFalse);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_0);
|
||||||
|
ctx.getMv().visitJumpInsn(Opcodes.GOTO, end);
|
||||||
|
ctx.getMv().visitLabel(returnTrue);
|
||||||
|
ctx.getMv().visitInsn(Opcodes.ICONST_1);
|
||||||
|
ctx.getMv().visitLabel(end);
|
||||||
|
} else {
|
||||||
left.codeGen(ctx);
|
left.codeGen(ctx);
|
||||||
right.codeGen(ctx);
|
right.codeGen(ctx);
|
||||||
if (op == Operator.ADD) {
|
if (op == Operator.ADD) {
|
||||||
@ -78,6 +127,7 @@ public class TypedBinary implements TypedExpression {
|
|||||||
} else if (op == Operator.MUL) {
|
} else if (op == Operator.MUL) {
|
||||||
ctx.getMv().visitInsn(Opcodes.IMUL);
|
ctx.getMv().visitInsn(Opcodes.IMUL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//TODO: implement other operators
|
//TODO: implement other operators
|
||||||
ctx.popStack();
|
ctx.popStack();
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ public class TypedReturn implements TypedStatement {
|
|||||||
if (ret == null) {
|
if (ret == null) {
|
||||||
ctx.getMv().visitInsn(Opcodes.RETURN);
|
ctx.getMv().visitInsn(Opcodes.RETURN);
|
||||||
} else {
|
} else {
|
||||||
|
System.out.println("return: " + ret);
|
||||||
ret.codeGen(ctx);
|
ret.codeGen(ctx);
|
||||||
if (ret.getType().getKind() != Type.Kind.REFERENCE) {
|
if (ret.getType().getKind() != Type.Kind.REFERENCE) {
|
||||||
ctx.getMv().visitInsn(Opcodes.IRETURN);
|
ctx.getMv().visitInsn(Opcodes.IRETURN);
|
||||||
|
@ -3,9 +3,9 @@ public class ClassCanBeTyped {
|
|||||||
public int x;
|
public int x;
|
||||||
public boolean y;
|
public boolean y;
|
||||||
|
|
||||||
public ClassCanBeTyped(int x, boolean y) {
|
|
||||||
this.c.x = 2 * x;
|
public boolean test(boolean b, boolean c) {
|
||||||
this.y = !y;
|
return b == c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user