本文整理汇总了C#中Kernel.PopScope方法的典型用法代码示例。如果您正苦于以下问题:C# Kernel.PopScope方法的具体用法?C# Kernel.PopScope怎么用?C# Kernel.PopScope使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Kernel
的用法示例。
在下文中一共展示了Kernel.PopScope方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Compile
public override void Compile(Kernel k)
{
k.CurrentScope.PushMemory(k);
Scope scope = k.PushScope();
scope.Name = "while" + scope.Parent.RequestLabelId();
string whileLabel = "sl_wl_" + k.GetScopeName();
string endLabel = "sl_wlh_" + k.GetScopeName();
Symbol breakSymbol = new Symbol()
{
Name = "+break",
AsmName = endLabel
};
k.RegisterSymbol(breakSymbol);
k.Emit(Opcode.LABEL, whileLabel).Comment = "while loop";
k.Emit(Opcode.NOOP).SetDebug(File, Line, Column, DebugType.WhileLoop, "");
this.Check.Compile(k);
k.Emit(Opcode.NOT);
k.Emit(Opcode.GOTOF, '"' + endLabel + '"');
scope.PushMemory(k);
Scope innerScope = k.PushScope();
innerScope.Name = "in";
if (this.Body != null)
this.Body.Compile(k);
k.EmitPush(innerScope.MemorySpace.ToString() + "u");
k.Emit(Opcode.DEALLOC);
k.PopScope();
scope.PopMemory(k);
k.Emit(Opcode.GOTO, '"' + whileLabel + '"');
k.Emit(Opcode.LABEL, endLabel).Comment = "end while";
k.PopScope();
k.CurrentScope.PopMemory(k);
}
示例2: Compile
public override void Compile(Kernel k)
{
k.CurrentScope.PushMemory(k);
Scope ifScope = k.PushScope();
ifScope.Name = "if" + ifScope.Parent.RequestLabelId();
string trueLabel = "sl_if_" + k.GetScopeName();
string falseLabel = "sl_fe_" + k.GetScopeName();
string endLabel = "sl_fh_" + k.GetScopeName();
this.Check.Compile(k);
k.Emit(Opcode.GOTOF, '"' + trueLabel + '"').SetDebug(File, Line, Column, DebugType.Branch, "");
k.Emit(Opcode.GOTO, '"' + falseLabel + '"');
k.Emit(Opcode.LABEL, trueLabel);
k.CurrentScope.PushMemory(k);
Scope trueScope = k.PushScope();
trueScope.Name = "true";
if (this.BranchTrue != null)
this.BranchTrue.Compile(k);
k.PopScope();
k.CurrentScope.PopMemory(k);
if(this.BranchFalse == null)
{
k.Emit(Opcode.LABEL, falseLabel).Comment = "no else block, used as end label";
}
else if(this.BranchFalse != null)
{
k.Emit(Opcode.GOTO, '"' + endLabel + '"');
k.Emit(Opcode.LABEL, falseLabel);
k.CurrentScope.PushMemory(k);
Scope falseScope = k.PushScope();
falseScope.Name = "false";
this.BranchFalse.Compile(k);
k.PopScope();
k.CurrentScope.PopMemory(k);
k.Emit(Opcode.LABEL, endLabel).Comment = "end if";
}
k.PopScope();
k.CurrentScope.PopMemory(k);
}
示例3: Compile
public override void Compile(Kernel k)
{
Symbol symbol = new Symbol()
{
Name = this.Function,
SMode = Symbol.Mode.Intern,
SType = Symbol.Type.Function,
Args = (uint)this.Arguments.Count
};
k.RegisterSymbol(symbol);
Scope scope = k.PushScope();
scope.Name = this.Function;
scope.MemorySpace += (uint)this.Arguments.Count + 1;
symbol.AsmName = string.Format("sl_f_{0}", k.GetScopeName());
switch(k.CurrentImportMode)
{
case ImportMode.Library:
k.PopScope();
symbol.SMode = Symbol.Mode.Library;
symbol.Id = k.CurrentScope.RequestId();
k.CurrentScope.MemorySpace++;
k.AddImport(symbol);
return;
case ImportMode.Export:
k.AddExport(symbol);
break;
}
k.Emit(Opcode.LABEL, symbol.AsmName).Comment = "function " + this.Function; // function label
k.Emit(Opcode.NOOP).SetDebug(File, Line, Column, DebugType.Function, this.Function);
k.EmitPush(scope.MemorySpace.ToString() + "u").Comment = "allocate function parameter memory"; // allocate memory space for arguments and return location
k.Emit(Opcode.ALLOC);
Symbol returnSymbol = new Symbol()
{
Name = "+return",
SMode = Symbol.Mode.Intern,
SType = Symbol.Type.Variable,
Id = k.CurrentScope.RequestId()
};
k.RegisterSymbol(returnSymbol);
k.EmitPush(returnSymbol.Id.ToString() + "u").Comment = "store return location"; // store the return location
k.Emit(Opcode.STLO);
foreach(string arg in this.Arguments)
{
Symbol argSymbol = new Symbol()
{
Name = arg,
SMode = Symbol.Mode.Intern,
SType = Symbol.Type.Variable,
Id = k.CurrentScope.RequestId()
};
k.RegisterSymbol(argSymbol);
k.EmitPush(argSymbol.Id.ToString() + "u").Comment = "store argument " + arg; // store the argument
k.Emit(Opcode.STLO);
}
k.Emit(Opcode.NOOP).Comment = "function body";
if (this.Body != null)
this.Body.Compile(k);
new ReturnNode(-1, -1).Compile(k);
k.PopScope();
k.Emit(Opcode.NOOP).Comment = "end of function";
}