本文整理汇总了C#中ProtoCore.DSASM.StackFrame.SetAt方法的典型用法代码示例。如果您正苦于以下问题:C# StackFrame.SetAt方法的具体用法?C# StackFrame.SetAt怎么用?C# StackFrame.SetAt使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ProtoCore.DSASM.StackFrame
的用法示例。
在下文中一共展示了StackFrame.SetAt方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Callr
//.........这里部分代码省略.........
core.DebugProps.SetUpCallrForDebug(core, this, fNode, pc, isBaseCall, callsite, arguments, replicationGuides, stackFrame, dotCallDimensions, hasDebugInfo);
}
sv = callsite.JILDispatch(arguments, replicationGuides, stackFrame, core, runtimeContext);
}
else
{
FindRecursivePoints();
string message = String.Format(ProtoCore.RuntimeData.WarningMessage.kMethodStackOverflow, core.recursivePoint[0].name);
core.RuntimeStatus.LogWarning(RuntimeData.WarningID.kInvalidRecursion, message);
core.recursivePoint = new List<FunctionCounter>();
core.funcCounterTable = new List<FunctionCounter>();
sv = StackValue.Null;
}
}
else
{
if (core.Options.IDEDebugMode && core.ExecMode != InterpreterMode.kExpressionInterpreter)
{
bool isBaseCall = false;
if (core.ContinuationStruct.IsFirstCall)
{
core.DebugProps.SetUpCallrForDebug(core, this, fNode, pc, isBaseCall, callsite, arguments, replicationGuides, stackFrame, dotCallDimensions, hasDebugInfo);
}
else
{
core.DebugProps.SetUpCallrForDebug(core, this, fNode, pc, isBaseCall, callsite, core.ContinuationStruct.InitialArguments, replicationGuides, stackFrame,
core.ContinuationStruct.InitialDotCallDimensions, hasDebugInfo);
}
}
SX = svBlockDeclaration;
stackFrame.SetAt(StackFrame.AbsoluteIndex.kRegisterSX, svBlockDeclaration);
//Dispatch without recursion tracking
explicitCall = false;
isExplicitCall = explicitCall;
#if __DEBUG_REPLICATE
// TODO: This if block is currently executed only for a replicating function call in Debug Mode (including each of its continuations)
// This condition will no longer be required once the same Dispatch function can decide whether to perform a fast dispatch (parallel mode)
// OR a Serial/Debug mode dispatch, in which case this same block should work for Serial mode execution w/o the Debug mode check - pratapa
if (core.Options.IDEDebugMode)
{
DebugFrame debugFrame = core.DebugProps.DebugStackFrame.Peek();
//if (debugFrame.IsReplicating || core.ContinuationStruct.IsContinuation)
if (debugFrame.IsReplicating)
{
FunctionEndPoint fep = null;
ContinuationStructure cs = core.ContinuationStruct;
if (core.Options.ExecutionMode == ProtoCore.ExecutionMode.Serial || core.Options.IDEDebugMode)
{
// This needs to be done only for the initial argument arrays (ie before the first replicating call) - pratapa
if(core.ContinuationStruct.IsFirstCall)
{
core.ContinuationStruct.InitialDepth = depth;
core.ContinuationStruct.InitialPC = pc;
core.ContinuationStruct.InitialArguments = arguments;
core.ContinuationStruct.InitialDotCallDimensions = dotCallDimensions;
for (int i = 0; i < arguments.Count; ++i)
{
GCUtils.GCRetain(arguments[i], core);
示例2: ExecWithZeroRI
//Single function call
/// <summary>
/// Dispatch without replication
/// </summary>
private StackValue ExecWithZeroRI(List<FunctionEndPoint> functionEndPoint, ProtoCore.Runtime.Context c,
List<StackValue> formalParameters, StackFrame stackFrame, Core core,
FunctionGroup funcGroup, SingleRunTraceData previousTraceData, SingleRunTraceData newTraceData)
{
if(core.CancellationPending)
{
throw new ExecutionCancelledException();
}
//@PERF: Todo add a fast path here for the case where we have a homogenious array so we can directly dispatch
FunctionEndPoint finalFep = SelectFinalFep(c, functionEndPoint, formalParameters, stackFrame, core);
if (functionEndPoint == null)
{
core.RuntimeStatus.LogWarning(ProtoCore.RuntimeData.WarningID.kMethodResolutionFailure,
"Function dispatch could not be completed {2EB39E1B-557C-4819-94D8-CF7C9F933E8A}");
return StackValue.Null;
}
if (core.Options.IDEDebugMode && core.ExecMode != ProtoCore.DSASM.InterpreterMode.kExpressionInterpreter)
{
DebugFrame debugFrame = core.DebugProps.DebugStackFrame.Peek();
debugFrame.FinalFepChosen = finalFep;
}
List<StackValue> coercedParameters = finalFep.CoerceParameters(formalParameters, core);
// Correct block id where the function is defined.
StackValue funcBlock = stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionBlock);
funcBlock.opdata = finalFep.BlockScope;
stackFrame.SetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionBlock, funcBlock);
//TraceCache -> TLS
//Extract left most high-D pack
ISerializable traceD = previousTraceData.GetLeftMostData();
if (traceD != null)
{
//There was data associated with the previous execution, push this into the TLS
Dictionary<string, ISerializable> dataDict = new Dictionary<string, ISerializable>();
dataDict.Add(TRACE_KEY, traceD);
TraceUtils.SetObjectToTLS(dataDict);
}
else
{
//There was no trace data for this run
TraceUtils.ClearAllKnownTLSKeys();
}
//EXECUTE
StackValue ret = finalFep.Execute(c, coercedParameters, stackFrame, core);
if (ret.IsNull)
{
//wipe the trace cache
TraceUtils.ClearTLSKey(TRACE_KEY);
}
//TLS -> TraceCache
Dictionary<String, ISerializable> traceRet = TraceUtils.GetObjectFromTLS();
if (traceRet.ContainsKey(TRACE_KEY))
{
var val = traceRet[TRACE_KEY];
newTraceData.Data = val;
}
// An explicit call requires return coercion at the return instruction
if (!ret.IsExplicitCall)
{
ret = PerformReturnTypeCoerce(finalFep, core, ret);
}
return ret;
}
示例3: CallrForMemberFunction
private StackValue CallrForMemberFunction(int classIndex,
int procIndex,
bool hasDebugInfo,
ref bool isExplicitCall)
{
var arrayDim = rmem.Pop();
Validity.Assert(arrayDim.IsArrayDimension());
var blockIndex = rmem.Pop();
Validity.Assert(blockIndex.IsBlockIndex());
ClassNode classNode = exe.classTable.ClassNodes[classIndex];
ProcedureNode procNode = classNode.vtable.procList[procIndex];
// Get all arguments and replications
var arguments = new List<StackValue>();
var repGuides = new List<List<ReplicationGuide>>();
PopArgumentsFromStack(procNode.argTypeList.Count,
ref arguments,
ref repGuides);
arguments.Reverse();
repGuides = GetCachedReplicationGuides(core, arguments.Count + 1);
StackValue lhs = rmem.Pop();
StackValue thisObject = lhs;
if (StackUtils.IsArray(lhs))
{
ArrayUtils.GetFirstNonArrayStackValue(lhs, ref thisObject, core);
arguments.Insert(0, lhs);
}
if (!thisObject.IsObject() && !thisObject.IsArray())
{
core.RuntimeStatus.LogWarning(WarningID.kDereferencingNonPointer,
WarningMessage.kDeferencingNonPointer);
return StackValue.Null;
}
var registers = new List<StackValue>();
SaveRegisters(registers);
var stackFrame = new StackFrame(thisObject, // thisptr
classIndex, // function class index
procIndex, // function index
pc + 1, // return address
0, // member function always declared in block 0 */
core.RunningBlock, // caller block
fepRun ? StackFrameType.kTypeFunction : StackFrameType.kTypeLanguage,
StackFrameType.kTypeFunction, // frame type
0, // block depth
rmem.FramePointer,
registers,
new List<bool>());
var callsite = core.GetCallSite(core.ExecutingGraphnode,
classIndex,
procNode.name);
Validity.Assert(null != callsite);
bool setDebugProperty = core.Options.IDEDebugMode &&
core.ExecMode != InterpreterMode.kExpressionInterpreter &&
procNode != null;
if (setDebugProperty)
{
core.DebugProps.SetUpCallrForDebug(core,
this,
procNode,
pc,
false,
callsite,
arguments,
repGuides,
stackFrame,
null,
hasDebugInfo);
}
SX = StackValue.BuildBlockIndex(0);
stackFrame.SetAt(StackFrame.AbsoluteIndex.kRegisterSX, SX);
StackValue sv = callsite.JILDispatch(arguments,
repGuides,
stackFrame,
core,
new Runtime.Context());
isExplicitCall = sv.IsExplicitCall();
if (isExplicitCall)
{
Properties.functionCallArguments = arguments;
Properties.functionCallDotCallDimensions = new List<StackValue>();
int entryPC = (int)sv.opdata;
CallExplicit(entryPC);
}
return sv;
}
示例4: Execute
public void Execute(ProtoCore.Core core, ProtoCore.Runtime.Context context)
{
try
{
core.NotifyExecutionEvent(ProtoCore.ExecutionStateEventArgs.State.kExecutionBegin);
foreach (ProtoCore.DSASM.CodeBlock codeblock in core.CodeBlockList)
{
//ProtoCore.Runtime.Context context = new ProtoCore.Runtime.Context();
int locals = 0;
// Comment Jun:
// On first bounce, the stackframe depth is initialized to -1 in the Stackfame constructor.
// Passing it to bounce() increments it so the first depth is always 0
ProtoCore.DSASM.StackFrame stackFrame = new ProtoCore.DSASM.StackFrame(core.GlobOffset);
// Comment Jun: Tell the new bounce stackframe that this is an implicit bounce
// Register TX is used for this.
StackValue svCallConvention = StackValue.BuildCallingConversion((int)ProtoCore.DSASM.CallingConvention.BounceType.kImplicit);
stackFrame.SetAt(ProtoCore.DSASM.StackFrame.AbsoluteIndex.kRegisterTX, svCallConvention);
core.Bounce(codeblock.codeBlockId, codeblock.instrStream.entrypoint, context, stackFrame, locals, EventSink);
}
core.NotifyExecutionEvent(ProtoCore.ExecutionStateEventArgs.State.kExecutionEnd);
}
catch
{
core.NotifyExecutionEvent(ProtoCore.ExecutionStateEventArgs.State.kExecutionEnd);
throw;
}
}
示例5: ExecWithZeroRI
/// <summary>
/// Dispatch without replication
/// </summary>
private StackValue ExecWithZeroRI(List<FunctionEndPoint> functionEndPoint, ProtoCore.Runtime.Context c,
List<StackValue> formalParameters, StackFrame stackFrame, Core core,
FunctionGroup funcGroup)
{
//@PERF: Todo add a fast path here for the case where we have a homogenious array so we can directly dispatch
FunctionEndPoint finalFep = SelectFinalFep(c, functionEndPoint, formalParameters, stackFrame, core);
/*functionEndPoint = ResolveFunctionEndPointWithoutReplication(c,funcGroup, formalParameters,
stackFrame, core);*/
if (functionEndPoint == null)
{
core.RuntimeStatus.LogWarning(ProtoCore.RuntimeData.WarningID.kMethodResolutionFailure,
"Function dispatch could not be completed {2EB39E1B-557C-4819-94D8-CF7C9F933E8A}");
return StackUtils.BuildNull();
}
if (core.Options.IDEDebugMode && core.ExecMode != ProtoCore.DSASM.InterpreterMode.kExpressionInterpreter)
{
DebugFrame debugFrame = core.DebugProps.DebugStackFrame.Peek();
debugFrame.FinalFepChosen = finalFep;
}
//@TODO(Luke): Should this coerce?
List<StackValue> coercedParameters = finalFep.CoerceParameters(formalParameters, core);
// Correct block id where the function is defined.
StackValue funcBlock = stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionBlock);
funcBlock.opdata = finalFep.BlockScope;
stackFrame.SetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionBlock, funcBlock);
StackValue ret = finalFep.Execute(c, coercedParameters, stackFrame, core);
// An explicit call requires return coercion at the return instruction
if (ret.optype != AddressType.ExplicitCall)
{
ret = PerformReturnTypeCoerce(finalFep, core, ret);
}
return ret;
}
示例6: ExecuteContinuation
public StackValue ExecuteContinuation(FunctionEndPoint jilFep, StackFrame stackFrame, Core core)
{
// Pushing a dummy stackframe onto the Stack for the current fep
int ci = -1;
int fi = 0;
// Hardcoded for Increment as member function
if (jilFep.procedureNode == null)
{
ci = 14;
jilFep.procedureNode = core.DSExecutable.classTable.ClassNodes[ci].vtable.procList[fi];
}
Validity.Assert(jilFep.procedureNode != null);
if (core.Options.IDEDebugMode)
{
DebugFrame debugFrame = core.DebugProps.DebugStackFrame.Peek();
debugFrame.FinalFepChosen = jilFep;
}
ProtoCore.DSASM.StackValue svThisPtr = stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kThisPtr);
ProtoCore.DSASM.StackValue svBlockDecl = stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionBlock);
int blockCaller = (int)stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kFunctionCallerBlock).opdata;
int depth = (int)stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kStackFrameDepth).opdata;
DSASM.StackFrameType type = (DSASM.StackFrameType)stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kStackFrameType).opdata;
int locals = 0;
int returnAddr = (int)stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kReturnAddress).opdata;
int framePointer = core.Rmem.FramePointer;
DSASM.StackFrameType callerType = (DSASM.StackFrameType)stackFrame.GetAt(DSASM.StackFrame.AbsoluteIndex.kCallerStackFrameType).opdata;
StackValue svCallConvention = ProtoCore.DSASM.StackUtils.BuildNode(ProtoCore.DSASM.AddressType.CallingConvention, (long)ProtoCore.DSASM.CallingConvention.CallType.kExplicit);
// Set TX register
stackFrame.SetAt(DSASM.StackFrame.AbsoluteIndex.kRegisterTX, svCallConvention);
// Set SX register
stackFrame.SetAt(DSASM.StackFrame.AbsoluteIndex.kRegisterSX, svBlockDecl);
List<ProtoCore.DSASM.StackValue> registers = new List<DSASM.StackValue>();
registers.AddRange(stackFrame.GetRegisters());
core.Rmem.PushStackFrame(svThisPtr, ci, fi, returnAddr, (int)svBlockDecl.opdata, blockCaller, callerType, type, depth, framePointer, registers, locals, 0);
return StackUtils.BuildNode(AddressType.ExplicitCall, jilFep.procedureNode.pc);
}