本文整理汇总了C#中Kernel.EmitPush方法的典型用法代码示例。如果您正苦于以下问题:C# Kernel.EmitPush方法的具体用法?C# Kernel.EmitPush怎么用?C# Kernel.EmitPush使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Kernel
的用法示例。
在下文中一共展示了Kernel.EmitPush方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Compile
public override void Compile(Kernel k)
{
k.EmitPush("1u");
k.Emit(Opcode.ALLOC).SetDebug(File, Line, Column, DebugType.Define, this.VariableName);
k.CurrentScope.MemorySpace += 1;
Symbol symbol = new Symbol()
{
Name = this.VariableName,
SMode = Symbol.Mode.Intern,
SType = Symbol.Type.Variable,
Id = k.CurrentScope.RequestId()
};
k.RegisterSymbol(symbol);
if (this.Value == null)
{
k.Emit(Opcode.PUSHNIL).Comment = "clear memory for variable";
}
else
{
this.Value.Compile(k);
}
k.EmitPush(symbol.Id.ToString() + "u");
k.Emit(Opcode.STLO).SetDebug(File, Line, Column, DebugType.Set, this.VariableName);
}
示例2: Compile
public override void Compile(Kernel k)
{
Symbol symbol = k.Lookup(this.VariableName);
if(this.Value == null)
{
k.Emit(Opcode.PUSHNIL).Comment = "set variable to nil";
}
else
{
this.Value.Compile(k);
}
if (symbol.SScope == k.CurrentScope)
{
k.EmitPush(symbol.Id.ToString() + "u").Comment = "store into variable " + this.VariableName;
k.Emit(Opcode.STLO).SetDebug(File, Line, Column, DebugType.Set, this.VariableName);
}
else
{
uint mem = k.CurrentScope.WalkMemoryBack(symbol.SScope);
mem -= symbol.Id;
k.EmitPush(mem.ToString() + "u").Comment = "store into variable " + this.VariableName;
k.Emit(Opcode.STNLO).SetDebug(File, Line, Column, DebugType.Set, this.VariableName);
}
}
示例3: Compile
public override void Compile(Kernel k)
{
Symbol returnSymbol = k.Lookup("+return");
if (this.Value != null)
this.Value.Compile(k);
else
k.Emit(Opcode.PUSHNIL);
var rvn = new RetrieveVariableNode(-1, -1) {VariableName = "+return"};
rvn.PrePass(k);
rvn.PreCompile(k);
rvn.Compile(k);
uint mem = 0;
Scope current = k.CurrentScope;
while(current != returnSymbol.SScope)
{
mem += current.MemorySpace;
current.PopMemory(k, false);
current = current.Parent;
}
mem += current.MemorySpace;
current.PopMemory(k, false);
k.EmitPush(mem + "u").Comment = "deallocate function memory";
k.Emit(Opcode.DEALLOC);
k.Emit(Opcode.JUMP).SetDebug(File, Line, Column, DebugType.Return, "");
}
示例4: Compile
public override void Compile(Kernel k)
{
if(this.Value == null)
{
k.Emit(Opcode.PUSHNIL).SetDebug(File, Line, Column, DebugType.Value, "nil");
}
else
{
k.EmitPush(this.Value).SetDebug(File, Line, Column, DebugType.Value, this.Value);
}
}
示例5: Compile
public override void Compile(Kernel k)
{
Symbol symbol = k.Lookup(this.VariableName);
if (symbol.SType != Symbol.Type.Variable)
{
throw new CompileException(String.Format("Symbol {0} is not a variable", this.VariableName));
}
if (symbol.SScope == k.CurrentScope)
{
k.EmitPush(symbol.Id.ToString() + "u").Comment = "retrieve variable " + this.VariableName;
k.Emit(Opcode.LDLO).SetDebug(File, Line, Column, DebugType.Retrieve, this.VariableName);
}
else
{
uint mem = k.CurrentScope.WalkMemoryBack(symbol.SScope);
mem -= symbol.Id;
k.EmitPush(mem.ToString() + "u").Comment = "retrieve variable " + this.VariableName;
k.Emit(Opcode.LDNLO).SetDebug(File, Line, Column, DebugType.Retrieve, this.VariableName);
}
}
示例6: 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);
}
示例7: Compile
public override void Compile(Kernel k)
{
Symbol breakSymbol = k.Lookup("+break");
uint mem = 0;
Scope current = k.CurrentScope;
while (current != breakSymbol.SScope)
{
mem += current.MemorySpace;
current.PopMemory(k, false);
current = current.Parent;
}
current.PopMemory(k, false);
k.EmitPush(mem + "u").Comment = "deallocate scope memory";
k.Emit(Opcode.DEALLOC);
k.Emit(Opcode.GOTO, "\"" + breakSymbol.AsmName + "\"").SetDebug(File, Line, Column, DebugType.Break, "");
}
示例8: CompileExtern
protected void CompileExtern(Kernel k)
{
for(int i = this.Arguments.Count - 1; i >= 0; i--)
{
this.Arguments[i].Compile(k);
}
k.EmitPush('"' + this.Function + '"');
k.Emit(Opcode.ECALL).SetDebug(File, Line, Column, DebugType.ECall, this.Function);
}
示例9: 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";
}