internal int CompileSelfParameter(CompileParameter param) { var xident = X as Ident; if (xident != null) { if (xident.Symbol == null) { throw new CompileException("undefined symbol: " + xident.Name, DotPos); } // a.Do()的a 放入 switch (xident.Symbol.Usage) { case SymbolUsage.Parameter: case SymbolUsage.Variable: { X.Compile(param.SetLHS(false)); return(1); } } } return(0); }
internal override void Compile(CompileParameter param) { var newset = new ValuePhoFunc(new ObjectName("fakepkg", "constcalc"), ConstPos, 0, null); var funcParam = param.SetCmdSet(newset); // 用空的常量表 funcParam.Constants = new ConstantSet(); // 生成表达式计算指令 Value.Compile(funcParam); try { var eval = VMachine.MiniExec(newset, funcParam.Constants); var ci = param.Constants.Add(eval); Name.Symbol.RegIndex = ci; } catch (RuntimeException) { throw new CompileException("Expect constant value to caculate value", ConstPos); } }
internal override void Compile(CompileParameter param) { Condition.Compile(param.SetLHS(false)); var jnzCmd = param.CS.Add(new Command(Opcode.JZ, 0)) .SetCodePos(IfPos) .SetComment("if condition false"); Body.Compile(param.SetLHS(false)); var jmpCmd = param.CS.Add(new Command(Opcode.JMP, 0)) .SetCodePos(IfPos) .SetComment("if condition true"); // false body跳入 jnzCmd.DataA = param.CS.CurrCmdID; if (ElseBody.Stmts.Count > 0) { ElseBody.Compile(param.SetLHS(false)); } // true body执行完毕跳出 jmpCmd.DataA = param.CS.CurrCmdID; }
internal static void Import(Executable exe, ContentLoader loader, string packageName, string sourceName, ImportMode mode) { var pkg = new Package(packageName, false); var parser = new Parser(exe, loader, pkg.ScopeMgr); loader.Load(pkg, parser, sourceName, mode); exe.AddPackage(pkg); var initPos = TokenPos.Init; initPos.SourceName = sourceName; // 全局入口( 不进入函数列表, 只在Package上保存 ) var cs = new ValuePhoFunc(new ObjectName(pkg.Name, "@init"), initPos, pkg.PackageScope.RegCount, pkg.PackageScope); pkg.InitEntry = cs; var param = new CompileParameter(); param.Pkg = pkg; param.CS = cs; param.Exe = exe; param.Constants = exe.Constants; pkg.Compile(param); cs.Add(new Command(Opcode.EXIT).SetCodePos(parser.CurrTokenPos)); }
internal override void Compile(CompileParameter param) { foreach (var b in Stmts) { b.Compile(param.SetLHS(false)); } }
internal void Compile(CompileParameter param) { foreach (var f in _code) { f.AST.Compile(param); } }
internal override void Compile(CompileParameter param) { int SelfCount = 0; // 尝试放入self作为第一个参数 var selector = Func as SelectorExpr; if (selector != null) { SelfCount += selector.CompileSelfParameter(param.SetLHS(false)); } // 先放参数 foreach (var arg in Args) { arg.Compile(param.SetLHS(false)); } // 本包及动态闭包调用 Func.Compile(param.SetLHS(false)); param.CS.Add(new Command(Opcode.CALL, Args.Count + SelfCount, GetReceiverCount())).SetCodePos(LParen); }
internal void GenDefaultRet(IEnumerable <Node> nodeEnum, CompileParameter param) { bool anyCode = false; foreach (var c in nodeEnum) { anyCode = true; var retStmt = c as ReturnStmt; if (retStmt != null) { return; } } var cmd = param.CS.Add(new Command(Opcode.RET)); // 有任意代码, 且有指令, 用最后的代码位置生成RET的代码位置 if (anyCode && param.CS.CurrCmdID > 1) { cmd.SetCodePos(param.CS.Commands[param.CS.CurrCmdID - 2].CodePos); } else { // 使用函数定义地方做exit位置 cmd.SetCodePos(FuncPos); } }
internal override void Compile(CompileParameter param) { var c = Lit2Const( ); _constIndex = param.Constants.Add(c); param.CS.Add(new Command(Opcode.LOADK, _constIndex)).SetComment(c.ToString()).SetCodePos(Pos); }
internal override void Compile(CompileParameter param) { foreach (var im in Imports) { im.Compile(param); } Block.Compile(param); }
internal override void Compile(CompileParameter param) { X.Compile(param); Y.Compile(param); param.CS.Add(new Command(Token2OpCode(Op))) .SetCodePos(OpPos); }
internal void AddSecondPass(Node n, CompileParameter cp) { CompileContext ctx; ctx.node = n; ctx.parameter = cp; _secondPass.Add(ctx); }
internal override void Resolve(CompileParameter param) { // 故地重游, 再次拨叫 if (Symbol == null && BaseScope != null) { Symbol = BaseScope.FindSymbolOutter(Name); } GenCode(param, 2); }
internal override void Compile(CompileParameter param) { for (int i = Results.Count - 1; i >= 0; i--) { Results[i].Compile(param.SetLHS(false)); } param.CS.Add(new Command(Opcode.RET)).SetCodePos(RetPos); }
internal override void Compile(CompileParameter param) { nearestForStmt = LoopStmt.FindLoop(this); if (nearestForStmt == null) { throw new CompileException("'continue' should in for statement", Pos); } param.NextPassToResolve(this); cmd = param.CS.Add(new Command(Opcode.JMP, -1)) .SetCodePos(Pos).SetComment("continue"); }
internal override void Compile(CompileParameter param) { foreach (var b in X) { // ExprStmt下不出现CallExpr可能是-foo(); 1+foo() 这种奇葩写法 // 返回值无法被回收, 所以直接报错 if (!(b is CallExpr)) { throw new CompileException("invalid expression statement", DefPos); } b.Compile(param.SetLHS(false)); } }
internal override void Compile(CompileParameter param) { // 占位 CmdGen = param.CS.Add(new Command(Opcode.NOP)) .SetComment(string.Format("{0}.{1}", param.Pkg.Name, Name)) .SetCodePos(DefinePos); GenCode(param, 1); if (CmdGen.Op == Opcode.NOP && !param.IsNodeInNextPass(this)) { throw new CompileException("code not resolve", DefinePos); } }
internal override void Resolve(CompileParameter param) { var c = param.Exe.GetClassTypeByName(new ObjectName(param.Pkg.Name, ClassName.Name)); if (c == null) { throw new CompileException("unknown class name: " + ClassName.Name, TypeInfo.FuncPos); } else { int nameKey = param.Constants.AddString(Name.Name); var cc = c as ValuePhoClassType; cc.AddMethod(nameKey, _proc); } }
internal override void Compile(CompileParameter param) { var opcode = Token2OpCode(Op); if (opcode != Opcode.NOP) { X.Compile(param); } else { throw new CompileException("Unknown unary operator", OpPos); } param.CS.Add(new Command(opcode)).SetCodePos(OpPos); }
internal override void Compile(CompileParameter param) { Index.Compile(param.SetLHS(false)); X.Compile(param.SetLHS(false)); if (param.LHS) { // 赋值 param.CS.Add(new Command(Opcode.SETI)).SetCodePos(LBrackPos); } else { // 取值 param.CS.Add(new Command(Opcode.LOADI)).SetCodePos(LBrackPos); } }
internal override void Compile(CompileParameter param) { var cmd = param.CS.Add(new Command(Opcode.NEW)).SetCodePos(LBracketPos).SetComment("Builtin.Array"); cmd.EntryName = new ObjectName("Builtin", "Array"); foreach (var v in Values) { v.Compile(param); } if (Values.Count > 0) { param.CS.Add(new Command(Opcode.SETA, Values.Count)).SetCodePos(LBracketPos); } }
internal override void Compile(CompileParameter param) { var cmd = param.CS.Add(new Command(Opcode.NEW)).SetCodePos(LBracePos).SetComment("Builtin.Map"); cmd.EntryName = new ObjectName("Builtin", "Map"); var kvParam = param.SetLHS(false); foreach (var kv in Values) { kv.Key.Compile(kvParam); kv.Value.Compile(kvParam); } param.CS.Add(new Command(Opcode.SETD, Values.Count)).SetCodePos(LBracePos); }
bool ResolveParent(CompileParameter param, int pass) { var parent = param.Exe.GetClassTypeByName(new ObjectName(param.Pkg.Name, ParentName.Name)) as ValuePhoClassType; if (parent != null) { _class.ParentID = parent.ID; _class.Parent = param.Exe.FindClassByPersistantID(parent.ID); return(true); } if (pass > 1) { throw new CompileException("unknown parent class: " + ParentName.Name, ColonPos); } return(false); }
internal override void Compile(CompileParameter param) { ObjectName on = ObjectName.Empty; on.EntryName = ClassName.Name; if (PackageName != null) { on.PackageName = PackageName.Name; } else { on.PackageName = param.Pkg.Name; } _cmd = param.CS.Add(new Command(Opcode.NEW)) .SetCodePos(NewPos); _cmd.EntryName = on; _cmd.SetComment(on.ToString()); }
internal override void Compile(CompileParameter param) { LoopBeginCmdID = param.CS.CurrCmdID; Condition.Compile(param.SetLHS(false)); var jzCmd = param.CS.Add(new Command(Opcode.JZ, 0)) .SetCodePos(Pos) .SetComment("while condition"); param.LHS = false; Body.Compile(param.SetLHS(false)); param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID)) .SetCodePos(Pos) .SetComment("while loop"); // false body跳入 LoopEndCmdID = param.CS.CurrCmdID; jzCmd.DataA = LoopEndCmdID; }
internal override void Compile(CompileParameter param) { _class = new ValuePhoClassType(param.Pkg, new ObjectName(param.Pkg.Name, Name.Name)); _class.ID = param.Exe.GenPersistantID(); foreach (var m in Member) { var ki = param.Constants.AddString(m.Name); _class.AddMemeber(ki, m.Name); } param.Exe.AddClassType(_class); if (ParentName != null && !ResolveParent(param, 1)) { param.NextPassToResolve(this); } }
internal override void Compile(CompileParameter param) { if (Init != null) { Init.Compile(param.SetLHS(false)); } LoopBeginCmdID = param.CS.CurrCmdID; Command jzCmd = null; if (Condition != null) { Condition.Compile(param.SetLHS(false)); jzCmd = param.CS.Add(new Command(Opcode.JZ, -1)) .SetCodePos(Pos) .SetComment("for condition"); } Body.Compile(param.SetLHS(false)); if (Post != null) { Post.Compile(param.SetLHS(false)); } param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID)) .SetCodePos(Pos) .SetComment("for loop"); // false body跳入 if (jzCmd != null) { jzCmd.DataA = param.CS.CurrCmdID; } LoopEndCmdID = param.CS.CurrCmdID; }
internal override void Compile(CompileParameter param) { switch (Op) { case TokenType.Assign: { foreach (var e in RHS) { e.Compile(param.SetLHS(false)); } } break; case TokenType.AddAssign: case TokenType.SubAssign: case TokenType.MulAssign: case TokenType.QuoAssign: { // 这种操作只允许一个一个来 if (LHS.Count != 1 || RHS.Count != 1) { throw new CompileException("assignment require 1 operand", AssignPos); } LHS[0].Compile(param.SetLHS(false)); RHS[0].Compile(param.SetLHS(false)); param.CS.Add(new Command(Token2OpCode(Op))) .SetCodePos(AssignPos); } break; } foreach (var e in LHS) { e.Compile(param.SetLHS(true)); } }
// 手动分配1个iterator变量 // k, v, iter = ITER( x, iter ) // internal override void Compile(CompileParameter param) { var iterVar = DelcareIteratorVar(); param.CS.Add(new Command(Opcode.INITR, iterVar.Symbol.RegIndex)) .SetCodePos(Pos) .SetComment("init iterator"); LoopBeginCmdID = param.CS.CurrCmdID; X.Compile(param); iterVar.Compile(param); var jmpCmd = param.CS.Add(new Command(Opcode.VISIT, -1)) .SetCodePos(Pos) .SetComment("for kv"); Key.Compile(param.SetLHS(true)); Value.Compile(param.SetLHS(true)); iterVar.Compile(param.SetLHS(true)); Body.Compile(param.SetLHS(false)); param.CS.Add(new Command(Opcode.JMP, LoopBeginCmdID)) .SetCodePos(Pos) .SetComment("for kv loop"); // 循环结束 LoopEndCmdID = param.CS.CurrCmdID; jmpCmd.DataA = LoopEndCmdID; }
internal override void Compile(CompileParameter param) { ObjectName on = new ObjectName(param.Pkg.Name, Name.Name); if (ClassName != null) { // 成员函数必须有至少1个参数(self) if (TypeInfo.Params.Count < 1) { throw new CompileException("Expect 'self' in method", TypeInfo.FuncPos); } on.ClassName = ClassName.Name; } var newset = new ValuePhoFunc(on, TypeInfo.FuncPos, TypeInfo.ScopeInfo.CalcUsedReg(), TypeInfo.ScopeInfo); bodyCS = newset; _proc = param.Exe.AddFunc(newset); if (ClassName != null) { param.NextPassToResolve(this); } var funcParam = param.SetLHS(false).SetCmdSet(newset); Body.Compile(funcParam); TypeInfo.GenDefaultRet(Body.Child(), funcParam); newset.InputValueCount = TypeInfo.Params.Count; newset.OutputValueCount = FuncType.CalcReturnValueCount(Body.Child()); }