开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

lights li/quickscript

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
quickscript
/
src
/
QuickScript.Compiler
/
BytecodeCompiler.Function.cs
quickscript
/
src
/
QuickScript.Compiler
/
BytecodeCompiler.Function.cs
BytecodeCompiler.Function.cs 5.56 KB
一键复制 编辑 原始数据 按行查看 历史
lights li 提交于 2026年04月10日 13:37 +08:00 . first commit
using QuickScript.Core;
using QuickScript.Core.VM.Function;
using QuickScript.Core.VM.Opcode;
using QuickScript.Core.VM.Value;
using QuickScript.Parser;
using VmValueType = QuickScript.Core.VM.Value.VMType;
namespace QuickScript.Compiler;
/// <summary>
/// BytecodeCompiler 函数编译部分
/// </summary>
public partial class BytecodeCompiler
{
// ===== 函数声明编译 =====
private void CompileFuncDeclaration(QuickScriptParser.FuncDeclarationContext ctx)
{
var name = ctx.Identifier().GetText();
// 检测 public 修饰符
bool isPublic = ctx.PUBLIC() is not null;
// 解析返回类型
VmValueType returnType = TypeToVmType(ctx.type()); // type 必填
// 解析参数
var paramTypes = new List<VmValueType>();
var paramNames = new List<string>();
if (ctx.paramList() is { } paramListCtx)
{
foreach (var param in paramListCtx.param())
{
paramTypes.Add(TypeToVmType(param.type()));
paramNames.Add(param.Identifier().GetText());
}
}
// 创建函数签名
var signature = new FunctionSignature(paramTypes.ToArray(), returnType);
// 注册函数
int funcIndex = _funcIndex++;
_functions[name] = new FuncInfo(funcIndex, signature);
// 保存并切换编译上下文
var savedCode = new List<OpcodeInstruction>(_code);
var savedVariables = new Dictionary<string, (int Index, VmValueType Type, VmValueType ElementType)>(_variables);
var savedConstStrings = new List<string>(_constStrings);
int savedGlobalVarIndex = _globalVarIndex;
var savedLoopStack = new Stack<LoopInfo>(_loopStack.Reverse());
bool savedInFunction = _inFunction;
int savedFuncParamCount = _funcParamCount;
var savedReturnType = _currentReturnType;
_code.Clear();
_variables.Clear();
_constStrings.Clear();
_globalVarIndex = 0;
_loopStack.Clear();
// 设置函数编译上下文
_inFunction = true;
_funcParamCount = paramNames.Count;
_currentReturnType = returnType;
// 注册参数为变量
for (int i = 0; i < paramNames.Count; i++)
{
_variables[paramNames[i]] = (i, paramTypes[i], paramTypes[i]);
}
// 编译函数体
CompileBlockStatement(ctx.blockStatement());
// 如果函数没有 return 语句,确保末尾有 Rtn
if (_code.Count == 0 || (_code[^1].Opcode != Opcode.Rtn && _code[^1].Opcode != Opcode.RtnValue))
{
Emit(OpcodeInstruction.CreateRtn());
}
// 序列化函数指令为字节数组
byte[] instrBytes = SerializeFunctionCode(_code);
// 构建 ScriptFunction 反序列化所需的完整数据: [signature][instDataLen:4B][instructions]
byte[] signatureBytes = signature.Serialize();
byte[] fullData = new byte[signatureBytes.Length + 4 + instrBytes.Length];
Array.Copy(signatureBytes, 0, fullData, 0, signatureBytes.Length);
BitConverter.TryWriteBytes(fullData.AsSpan(signatureBytes.Length, 4), instrBytes.Length);
Array.Copy(instrBytes, 0, fullData, signatureBytes.Length + 4, instrBytes.Length);
// 使用安全的反序列化方法创建 ScriptFunction
var scriptFunc = ScriptFunction.Deserialize(fullData);
_compiledFunctions.Add((isPublic ? name : null, scriptFunc));
// 恢复编译上下文
_code.Clear();
_code.AddRange(savedCode);
_variables.Clear();
foreach (var kv in savedVariables) _variables[kv.Key] = kv.Value;
_constStrings.Clear();
_constStrings.AddRange(savedConstStrings);
_globalVarIndex = savedGlobalVarIndex;
_loopStack.Clear();
foreach (var loop in savedLoopStack) _loopStack.Push(loop);
_inFunction = savedInFunction;
_funcParamCount = savedFuncParamCount;
_currentReturnType = savedReturnType;
}
/// <summary>
/// 将函数体的指令列表序列化为字节数组
/// </summary>
private static byte[] SerializeFunctionCode(List<OpcodeInstruction> instructions)
{
// 计算总字节数
int totalSize = 0;
foreach (var instr in instructions)
{
totalSize += 1 + (instr.Data?.Length ?? 0);
}
byte[] result = new byte[totalSize];
int offset = 0;
foreach (var instr in instructions)
{
result[offset++] = (byte)instr.Opcode;
if (instr.Data is not null)
{
Array.Copy(instr.Data, 0, result, offset, instr.Data.Length);
offset += instr.Data.Length;
}
}
return result;
}
/// <summary>
/// 在函数体内编译变量加载(参数用 LoadArg,局部变量用 VarLdTmp)
/// </summary>
private void EmitVarLoadFunc(int index)
{
if (index < _funcParamCount)
{
// 参数使用 LoadArg
Emit(OpcodeInstruction.CreateLoadArg((byte)index));
}
else
{
// 局部变量使用 VarLdTmp
Emit(OpcodeInstruction.CreateLdcI32(index - _funcParamCount));
Emit(OpcodeInstruction.CreateVarLdTmp());
}
}
/// <summary>
/// 在函数体内编译变量存储(局部变量用 VarStTmp)
/// </summary>
private void EmitVarStoreFunc(int index)
{
Emit(OpcodeInstruction.CreateLdcI32(index - _funcParamCount));
Emit(OpcodeInstruction.CreateVarStTmp());
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

这是又一个用c# 开发 的 类c# 脚本语言。%99 由AI 编写
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/lightsever/quickscript.git
git@gitee.com:lightsever/quickscript.git
lightsever
quickscript
quickscript
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /