refactor: 优化 CallInstruction 类设计与实现
-优化类文档注释,增加对 void 返回值的说明 - 添加 isVoidReturn() 方法判断函数是否返回 void - 修改 toString() 方法,根据返回值类型调整输出格式 - 调整 operands() 方法,void 调用不包含 dest - 优化部分代码结构,提高可读性
This commit is contained in:
parent
cf3e645845
commit
d8c329ac94
@ -1,115 +1,95 @@
|
|||||||
package org.jcnc.snow.compiler.ir.instruction;
|
package org.jcnc.snow.compiler.ir.instruction;
|
||||||
|
|
||||||
|
import org.jcnc.snow.compiler.ir.common.GlobalFunctionTable;
|
||||||
import org.jcnc.snow.compiler.ir.core.IRInstruction;
|
import org.jcnc.snow.compiler.ir.core.IRInstruction;
|
||||||
import org.jcnc.snow.compiler.ir.core.IROpCode;
|
import org.jcnc.snow.compiler.ir.core.IROpCode;
|
||||||
|
import org.jcnc.snow.compiler.ir.core.IRValue;
|
||||||
import org.jcnc.snow.compiler.ir.core.IRVisitor;
|
import org.jcnc.snow.compiler.ir.core.IRVisitor;
|
||||||
import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
|
import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
|
||||||
import org.jcnc.snow.compiler.ir.core.IRValue;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CallInstruction —— 表示一次函数调用的中间代码指令
|
* CallInstruction —— 表示一次函数调用的中间代码指令
|
||||||
* 形式为:dest = CALL functionName, arg1, arg2, ...
|
* <pre>
|
||||||
|
* dest = CALL foo, arg1, arg2, ...
|
||||||
|
* </pre>
|
||||||
|
* 若被调函数返回 void,则 {@code dest} 可以为 {@code null},
|
||||||
|
* 并且不会参与寄存器分配。
|
||||||
*/
|
*/
|
||||||
public class CallInstruction extends IRInstruction {
|
public class CallInstruction extends IRInstruction {
|
||||||
/**
|
/** 调用结果目标寄存器;void 返回时可为 null */
|
||||||
* 调用结果存放的目标虚拟寄存器
|
|
||||||
*/
|
|
||||||
private final IRVirtualRegister dest;
|
private final IRVirtualRegister dest;
|
||||||
|
/** 被调用的函数名(含模块限定) */
|
||||||
/**
|
|
||||||
* 被调用的函数名
|
|
||||||
*/
|
|
||||||
private final String functionName;
|
private final String functionName;
|
||||||
|
/** 实参列表 */
|
||||||
/**
|
|
||||||
* 传递给函数的参数列表
|
|
||||||
*/
|
|
||||||
private final List<IRValue> arguments;
|
private final List<IRValue> arguments;
|
||||||
|
|
||||||
/**
|
public CallInstruction(IRVirtualRegister dest,
|
||||||
* 构造函数,创建一个函数调用指令
|
String functionName,
|
||||||
*
|
List<IRValue> args) {
|
||||||
* @param dest 调用结果存放的目标寄存器
|
|
||||||
* @param functionName 被调用的函数名
|
|
||||||
* @param args 参数列表
|
|
||||||
*/
|
|
||||||
public CallInstruction(IRVirtualRegister dest, String functionName, List<IRValue> args) {
|
|
||||||
this.dest = dest;
|
this.dest = dest;
|
||||||
this.functionName = functionName;
|
this.functionName = functionName;
|
||||||
this.arguments = List.copyOf(args);
|
this.arguments = List.copyOf(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// === 基本信息 ===
|
||||||
* 获取该指令的操作码
|
|
||||||
*
|
|
||||||
* @return 操作码 CALL
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public IROpCode op() {
|
public IROpCode op() {
|
||||||
return IROpCode.CALL;
|
return IROpCode.CALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** 仅在函数有返回值时才暴露目标寄存器 */
|
||||||
* 获取该指令涉及的操作数(目标寄存器和所有参数)
|
@Override
|
||||||
*
|
public IRVirtualRegister dest() {
|
||||||
* @return 操作数列表
|
return isVoidReturn() ? null : dest;
|
||||||
*/
|
}
|
||||||
|
|
||||||
|
/** 操作数列表:void 调用不包含 dest */
|
||||||
@Override
|
@Override
|
||||||
public List<IRValue> operands() {
|
public List<IRValue> operands() {
|
||||||
List<IRValue> ops = new ArrayList<>();
|
List<IRValue> ops = new ArrayList<>();
|
||||||
ops.add(dest);
|
if (!isVoidReturn() && dest != null) {
|
||||||
|
ops.add(dest);
|
||||||
|
}
|
||||||
ops.addAll(arguments);
|
ops.addAll(arguments);
|
||||||
return ops;
|
return ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// === Getter ===
|
||||||
* 获取目标虚拟寄存器
|
|
||||||
*
|
|
||||||
* @return 目标虚拟寄存器
|
|
||||||
*/
|
|
||||||
public IRVirtualRegister getDest() {
|
public IRVirtualRegister getDest() {
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取被调用的函数名
|
|
||||||
*
|
|
||||||
* @return 函数名
|
|
||||||
*/
|
|
||||||
public String getFunctionName() {
|
public String getFunctionName() {
|
||||||
return functionName;
|
return functionName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取参数列表
|
|
||||||
*
|
|
||||||
* @return 参数列表
|
|
||||||
*/
|
|
||||||
public List<IRValue> getArguments() {
|
public List<IRValue> getArguments() {
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// === 帮助方法 ===
|
||||||
* 接受 IRVisitor 访问
|
/** 判断被调函数是否返回 void */
|
||||||
*
|
private boolean isVoidReturn() {
|
||||||
* @param visitor 访问者
|
return "void".equals(GlobalFunctionTable.getReturnType(functionName));
|
||||||
*/
|
}
|
||||||
|
|
||||||
|
// === 访客模式 ===
|
||||||
@Override
|
@Override
|
||||||
public void accept(IRVisitor visitor) {
|
public void accept(IRVisitor visitor) {
|
||||||
visitor.visit(this);
|
visitor.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// === 字符串表示 ===
|
||||||
* 获取该指令的字符串表示
|
|
||||||
*
|
|
||||||
* @return 字符串形式
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder sb = new StringBuilder(dest + " = CALL " + functionName);
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (!isVoidReturn() && dest != null) {
|
||||||
|
sb.append(dest).append(" = ");
|
||||||
|
}
|
||||||
|
sb.append("CALL ").append(functionName);
|
||||||
for (IRValue arg : arguments) {
|
for (IRValue arg : arguments) {
|
||||||
sb.append(", ").append(arg);
|
sb.append(", ").append(arg);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user