From a46a25dcec4a09ba999a416f9b674deba17ed0ef Mon Sep 17 00:00:00 2001 From: Sam Cao Date: Thu, 31 Oct 2024 11:23:41 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=84=20refactor:=20Rename=20stack=20fra?= =?UTF-8?q?me=20to=20lexical=20scope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ts2java/ast/Ts2JavaAstClassFunction.java | 6 ++-- .../ts2java/compiler/JavaFunctionContext.java | 34 ++++++++++--------- ...aStackFrame.java => JavaLexicalScope.java} | 4 +-- .../javet/buddy/ts2java/TestAssignments.java | 2 +- 4 files changed, 24 insertions(+), 22 deletions(-) rename src/main/java/com/caoccao/javet/buddy/ts2java/compiler/{JavaStackFrame.java => JavaLexicalScope.java} (91%) diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java index 8fcca49..cc9398a 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java @@ -21,11 +21,11 @@ import com.caoccao.javet.swc4j.ast.enums.Swc4jAstAccessibility; import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.description.type.TypeList; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.bytecode.StackManipulation; -import java.util.List; import java.util.Objects; public final class Ts2JavaAstClassFunction implements ITs2JavaAstTranspile { @@ -63,9 +63,9 @@ public DynamicType.Builder transpile( ast.getParams().stream() .map(Ts2JavaAstParam::getLocalVariable) .forEach(functionContext::addLocalVariable); - final List parameters = functionContext.getParameters(); + final TypeList parameters = functionContext.getParameters(); final int initialOffset = functionContext.getMaxOffset(); - functionContext.pushStackFrame(); + functionContext.pushLexicalScope(); ast.getBody().ifPresent(blockStmt -> new Ts2JavaAstBlockStmt().manipulate(functionContext, blockStmt)); final StackManipulation[] stackManipulations = functionContext.getStackManipulations().toArray(new StackManipulation[0]); diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaFunctionContext.java b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaFunctionContext.java index 325ab02..f9543a1 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaFunctionContext.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaFunctionContext.java @@ -21,6 +21,7 @@ import com.caoccao.javet.utils.SimpleList; import com.caoccao.javet.utils.SimpleMap; import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.description.type.TypeList; import net.bytebuddy.implementation.bytecode.StackManipulation; import java.util.ArrayList; @@ -30,8 +31,8 @@ public final class JavaFunctionContext { private final boolean _static; + private final List lexicalScopes; private final TypeDescription returnType; - private final List stackFrames; private final List stackManipulations; private int maxOffset; private int nextOffset; @@ -40,14 +41,14 @@ public JavaFunctionContext(boolean _static, TypeDescription returnType) { this._static = _static; nextOffset = _static ? 0 : 1; maxOffset = nextOffset; - this.stackFrames = SimpleList.of(new JavaStackFrame(0)); + this.lexicalScopes = SimpleList.of(new JavaLexicalScope(0)); this.returnType = Objects.requireNonNull(returnType); this.stackManipulations = new ArrayList<>(); } public void addLocalVariable(JavaLocalVariable localVariable) { - JavaStackFrame stackFrame = stackFrames.get(stackFrames.size() - 1); - stackFrame.putLocalVariable(localVariable); + JavaLexicalScope lexicalScope = lexicalScopes.get(lexicalScopes.size() - 1); + lexicalScope.putLocalVariable(localVariable); localVariable.setOffset(nextOffset); nextOffset += localVariable.getType().getStackSize().getSize(); if (nextOffset > maxOffset) { @@ -60,9 +61,9 @@ public void addStackManipulation(StackManipulation stackManipulation) { } public JavaLocalVariable getLocalVariable(String name) { - for (int stackFrameIndex = stackFrames.size() - 1; stackFrameIndex >= 0; stackFrameIndex--) { - JavaStackFrame stackFrame = stackFrames.get(stackFrameIndex); - JavaLocalVariable localVariable = stackFrame.getLocalVariable(name); + for (int lexicalScopeIndex = lexicalScopes.size() - 1; lexicalScopeIndex >= 0; lexicalScopeIndex--) { + JavaLexicalScope lexicalScope = lexicalScopes.get(lexicalScopeIndex); + JavaLocalVariable localVariable = lexicalScope.getLocalVariable(name); if (localVariable != null) { return localVariable; } @@ -80,10 +81,11 @@ public int getNextOffset() { return nextOffset; } - public List getParameters() { - return stackFrames.get(0).getLocalVariables().stream() - .map(JavaLocalVariable::getType) - .collect(Collectors.toList()); + public TypeList getParameters() { + return new TypeList.Explicit( + lexicalScopes.get(0).getLocalVariables().stream() + .map(JavaLocalVariable::getType) + .collect(Collectors.toList())); } public TypeDescription getReturnType() { @@ -98,14 +100,14 @@ public boolean isStatic() { return _static; } - public void popStackFrame() { - JavaStackFrame stackFrame = stackFrames.remove(stackFrames.size() - 1); - nextOffset -= stackFrame.getLocalVariables().stream() + public void popLexicalScope() { + JavaLexicalScope lexicalScope = lexicalScopes.remove(lexicalScopes.size() - 1); + nextOffset -= lexicalScope.getLocalVariables().stream() .mapToInt(v -> v.getType().getStackSize().getSize()) .sum(); } - public void pushStackFrame() { - stackFrames.add(new JavaStackFrame(stackFrames.size())); + public void pushLexicalScope() { + lexicalScopes.add(new JavaLexicalScope(lexicalScopes.size())); } } diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaStackFrame.java b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaLexicalScope.java similarity index 91% rename from src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaStackFrame.java rename to src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaLexicalScope.java index 39ef21c..6811257 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaStackFrame.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/compiler/JavaLexicalScope.java @@ -21,11 +21,11 @@ import java.util.List; import java.util.Map; -public final class JavaStackFrame { +public final class JavaLexicalScope { private final int index; private final Map localVariableMap; - public JavaStackFrame(int index) { + public JavaLexicalScope(int index) { this.index = index; localVariableMap = new LinkedHashMap<>(); } diff --git a/src/test/java/com/caoccao/javet/buddy/ts2java/TestAssignments.java b/src/test/java/com/caoccao/javet/buddy/ts2java/TestAssignments.java index 03604f2..1b22bc6 100644 --- a/src/test/java/com/caoccao/javet/buddy/ts2java/TestAssignments.java +++ b/src/test/java/com/caoccao/javet/buddy/ts2java/TestAssignments.java @@ -91,7 +91,7 @@ protected void init() { @Test public void testAssignAndCast() throws Exception { - assertEquals(3L, assignAndCast(1, 2L)); + assertEquals(3.0D, assignAndCast(1, 2L), 0.001D); Method method = clazz.getMethod("assignAndCast", int.class, long.class); assertNotNull(method); assertEquals(double.class, method.getReturnType());