From c53da4061d51e63a2a23b2611439db75f22fa974 Mon Sep 17 00:00:00 2001 From: Sam Cao Date: Fri, 1 Nov 2024 15:18:44 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=84=20refactor:=20Redesign=20logical?= =?UTF-8?q?=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../buddy/ts2java/ast/Ts2JavaAstBinExpr.java | 9 ++- .../buddy/ts2java/ast/Ts2JavaAstBinaryOp.java | 55 ++++++++++++++--- .../ts2java/compiler/JavaFunctionContext.java | 29 +++++++++ .../ts2java/ast/TestLogicalOperations.java | 60 +++++++++++++++++++ 4 files changed, 144 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java index bf79bc5..15a920e 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java @@ -73,8 +73,15 @@ public TypeDescription manipulate(JavaFunctionContext functionContext, Swc4jAstB case EqEqEq: case NotEq: case NotEqEq: - stackManipulation = Ts2JavaAstBinaryOp.getLogicalStackManipulation(ast.getOp(), upCaseType); + stackManipulation = Ts2JavaAstBinaryOp.getLogicalStackManipulation( + functionContext, ast.getOp(), upCaseType); break; +// case BitAnd: +// stackManipulation = Ts2JavaAstBinaryOp.getBitAndStackManipulation(functionContext); +// break; +// case BitOr: +// stackManipulation = Ts2JavaAstBinaryOp.getBitOrStackManipulation(functionContext); +// break; default: throw new Ts2JavaAstException( ast, diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinaryOp.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinaryOp.java index 91d905a..9d21650 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinaryOp.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinaryOp.java @@ -16,6 +16,7 @@ package com.caoccao.javet.buddy.ts2java.ast; +import com.caoccao.javet.buddy.ts2java.compiler.JavaFunctionContext; import com.caoccao.javet.buddy.ts2java.exceptions.Ts2JavaException; import com.caoccao.javet.swc4j.ast.enums.Swc4jAstBinaryOp; import com.caoccao.javet.utils.SimpleFreeMarkerFormat; @@ -49,6 +50,24 @@ public static Addition getAddition(TypeDescription type) { SimpleMap.of("type", type.getName()))); } + public static StackManipulation getBitAndStackManipulation(JavaFunctionContext functionContext) { + return new StackManipulation.Simple(( + MethodVisitor methodVisitor, + Implementation.Context implementationContext) -> { + // TODO + return new StackManipulation.Size(-1, 0); + }); + } + + public static StackManipulation getBitOrStackManipulation(JavaFunctionContext functionContext) { + return new StackManipulation.Simple(( + MethodVisitor methodVisitor, + Implementation.Context implementationContext) -> { + // TODO + return new StackManipulation.Size(-1, 0); + }); + } + public static Division getDivision(TypeDescription type) { if (type.represents(int.class)) { return Division.INTEGER; @@ -64,9 +83,12 @@ public static Division getDivision(TypeDescription type) { SimpleMap.of("type", type.getName()))); } - public static StackManipulation getLogicalStackManipulation(Swc4jAstBinaryOp binaryOp, TypeDescription type) { - Label labelFalse = new Label(); - Label labelTrue = new Label(); + public static StackManipulation getLogicalStackManipulation( + JavaFunctionContext functionContext, + Swc4jAstBinaryOp binaryOp, + TypeDescription type) { + functionContext.increaseLogicalDepth(); + Label labelFalse = functionContext.getLogicalLabels().get(functionContext.getLogicalLabels().size() - 2); List stackManipulations = new ArrayList<>(); if (type.represents(int.class) || type.represents(short.class) @@ -229,19 +251,36 @@ public static StackManipulation getLogicalStackManipulation(Swc4jAstBinaryOp bin SimpleFreeMarkerFormat.format("Unsupported type ${type} in logical operation.", SimpleMap.of("type", type.getName()))); } - stackManipulations.add(new StackManipulation.Simple(( + if (functionContext.getLogicalDepth() == 1) { + stackManipulations.add(getLogicalStackManipulationEnd(functionContext.getLogicalLabels())); + } + functionContext.decreaseLogicalDepth(); + return new StackManipulation.Compound(stackManipulations); + } + + private static StackManipulation getLogicalStackManipulationEnd(List