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) { _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) { 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()); }
void GenCode(CompileParameter param, int pass) { // 赋值 if (param.LHS) { // TODO 左值在下方被定义 if (Symbol == null) { throw new CompileException(string.Format("undeclared symbol {0}", Name), DefinePos); } if (Symbol.IsGlobal) { CmdGen.Op = Opcode.SETG; CmdGen.DataA = param.Pkg.ID; CmdGen.DataB = Symbol.RegIndex; } else if (UpValue) { CmdGen.Op = Opcode.SETU; CmdGen.DataA = Symbol.RegIndex; } else { CmdGen.Op = Opcode.SETR; CmdGen.DataA = Symbol.RegIndex; } } else { // 取值 if (Symbol == null) { if (pass == 1) { param.NextPassToResolve(this); } else { throw new CompileException(string.Format("undeclared symbol {0}", Name), DefinePos); } } else { switch (Symbol.Usage) { case SymbolUsage.Delegate: case SymbolUsage.Func: { CmdGen.Op = Opcode.LOADF; CmdGen.EntryName = new ObjectName(param.Pkg.Name, Name); // 函数入口, 留到VM链接时处理 } break; case SymbolUsage.Variable: case SymbolUsage.Parameter: case SymbolUsage.SelfParameter: { // 将自己视为变量 if (Symbol.IsGlobal) { CmdGen.Op = Opcode.LOADG; CmdGen.DataA = param.Pkg.ID; CmdGen.DataB = Symbol.RegIndex; } else if (UpValue) { CmdGen.Op = Opcode.LOADU; CmdGen.DataA = Symbol.RegIndex; } else { CmdGen.Op = Opcode.LOADR; CmdGen.DataA = Symbol.RegIndex; } } break; case SymbolUsage.Class: { } break; case SymbolUsage.Constant: { CmdGen.Op = Opcode.LOADK; CmdGen.DataA = Symbol.RegIndex; } break; default: throw new CompileException("Unknown usage", DefinePos); } } } }