本文整理汇总了C#中ProtoCore.AssociativeGraph.UpdateNodeRef.GetUntilFirstProc方法的典型用法代码示例。如果您正苦于以下问题:C# UpdateNodeRef.GetUntilFirstProc方法的具体用法?C# UpdateNodeRef.GetUntilFirstProc怎么用?C# UpdateNodeRef.GetUntilFirstProc使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ProtoCore.AssociativeGraph.UpdateNodeRef
的用法示例。
在下文中一共展示了UpdateNodeRef.GetUntilFirstProc方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ResolveFinalNodeRefs
//
// proc ResolveFinalNodeRefs()
// foreach graphnode in graphnodeList
// def firstproc = graphnode.firstproc
// // Auto-generate the updateNodeRefs for this graphnode given the
// // list stored in the first procedure found in the assignment expression
// foreach noderef in firstProc.updatedProperties
// def n = graphnode.firstProcRefIndex
// def autogenRef = updateNodeRef[n]
// autogenRef.append(noderef)
// graphnode.pushUpdateRef(autogenRef)
// end
// end
// end
//
private void ResolveFinalNodeRefs()
{
foreach (ProtoCore.AssociativeGraph.GraphNode graphNode in codeBlock.instrStream.dependencyGraph.GraphList)
{
ProtoCore.DSASM.ProcedureNode firstProc = graphNode.firstProc;
if (null == firstProc || firstProc.IsAutoGenerated)
{
continue;
}
// TODO: The following implementation is wrong.
// Suppose for function call: x = foo().bar(); which converted
// to x = %dot(foo(), bar(), ...); the following checking skips
// it because %dot() is an internal function. -Yu Ke
// Do this only for non auto-generated function calls
//if any local var is depend on global var
if (core.Options.localDependsOnGlobalSet)
{
if (!firstProc.Name.ToCharArray()[0].Equals('_') && !firstProc.Name.ToCharArray()[0].Equals('%'))
{
//for each node
foreach (ProtoCore.AssociativeGraph.GraphNode gNode in codeBlock.instrStream.dependencyGraph.GraphList)
{
if (gNode.updateNodeRefList != null && gNode.updateNodeRefList.Count != 0)
{
if (gNode.procIndex == firstProc.ID && !gNode.updateNodeRefList[0].nodeList[0].symbol.name.ToCharArray()[0].Equals('%'))
{
foreach (ProtoCore.AssociativeGraph.GraphNode dNode in gNode.dependentList)
{
if (dNode.procIndex == ProtoCore.DSASM.Constants.kGlobalScope)
{
if (!dNode.updateNodeRefList[0].nodeList[0].symbol.name.ToCharArray()[0].Equals('%'))
{
graphNode.PushDependent(dNode);
}
}
}
}
}
}
}
}
if (firstProc.ClassID == Constants.kGlobalScope)
{
graphNode.updateNodeRefList.AddRange(firstProc.UpdatedGlobalVariables);
}
else
{
// For each property modified
foreach (ProtoCore.AssociativeGraph.UpdateNodeRef updateRef in firstProc.UpdatedProperties)
{
int index = graphNode.firstProcRefIndex;
// Is it a global function
if (ProtoCore.DSASM.Constants.kInvalidIndex != index)
{
if (core.Options.GenerateSSA)
{
foreach (ProtoCore.AssociativeGraph.GraphNode dependent in graphNode.dependentList)
{
// Do this only if first proc is a member function...
ProtoCore.AssociativeGraph.UpdateNodeRef autogenRef = new ProtoCore.AssociativeGraph.UpdateNodeRef(dependent.updateNodeRefList[0]);
autogenRef = autogenRef.GetUntilFirstProc();
// ... and the first symbol is an instance of a user-defined type
int last = autogenRef.nodeList.Count - 1;
Validity.Assert(autogenRef.nodeList[last].nodeType != ProtoCore.AssociativeGraph.UpdateNodeType.kMethod && null != autogenRef.nodeList[last].symbol);
if (autogenRef.nodeList[last].symbol.datatype.UID >= (int)PrimitiveType.kMaxPrimitives)
{
autogenRef.PushUpdateNodeRef(updateRef);
graphNode.updateNodeRefList.Add(autogenRef);
if (graphNode.lastGraphNode != null)
{
graphNode.lastGraphNode.updateNodeRefList.Add(autogenRef);
}
}
}
}
else
{
// Do this only if first proc is a member function...
ProtoCore.AssociativeGraph.UpdateNodeRef autogenRef = new ProtoCore.AssociativeGraph.UpdateNodeRef(graphNode.dependentList[0].updateNodeRefList[0]);
//.........这里部分代码省略.........
示例2: ResolveFinalNodeRefs
//
// proc ResolveFinalNodeRefs()
// foreach graphnode in graphnodeList
// def firstproc = graphnode.firstproc
// // Auto-generate the updateNodeRefs for this graphnode given the
// // list stored in the first procedure found in the assignment expression
// foreach noderef in firstProc.updatedProperties
// def n = graphnode.firstProcRefIndex
// def autogenRef = updateNodeRef[n]
// autogenRef.append(noderef)
// graphnode.pushUpdateRef(autogenRef)
// end
// end
// end
//
private void ResolveFinalNodeRefs()
{
foreach (ProtoCore.AssociativeGraph.GraphNode graphNode in codeBlock.instrStream.dependencyGraph.GraphList)
{
ProtoCore.DSASM.ProcedureNode firstProc = graphNode.firstProc;
if (null == firstProc || firstProc.isAutoGenerated)
{
continue;
}
// TODO: The following implementation is wrong.
// Suppose for function call: x = foo().bar(); which converted
// to x = %dot(foo(), bar(), ...); the following checking skips
// it because %dot() is an internal function. -Yu Ke
// Do this only for non auto-generated function calls
//if any local var is depend on global var
if (compileStateTracker.Options.localDependsOnGlobalSet)
{
if (!firstProc.name.ToCharArray()[0].Equals('_') && !firstProc.name.ToCharArray()[0].Equals('%'))
{
//for each node
foreach (ProtoCore.AssociativeGraph.GraphNode gNode in codeBlock.instrStream.dependencyGraph.GraphList)
{
if (gNode.updateNodeRefList != null && gNode.updateNodeRefList.Count != 0)
{
if (gNode.procIndex == firstProc.procId && !gNode.updateNodeRefList[0].nodeList[0].symbol.name.ToCharArray()[0].Equals('%'))
{
foreach (ProtoCore.AssociativeGraph.GraphNode dNode in gNode.dependentList)
{
if (dNode.procIndex == ProtoCore.DSASM.Constants.kGlobalScope)
{
if (!dNode.updateNodeRefList[0].nodeList[0].symbol.name.ToCharArray()[0].Equals('%'))
{
graphNode.PushDependent(dNode);
}
}
}
}
}
}
}
}
// For each property modified
foreach (ProtoCore.AssociativeGraph.UpdateNodeRef updateRef in firstProc.updatedProperties)
{
int index = graphNode.firstProcRefIndex;
// Is it a global function
if (ProtoCore.DSASM.Constants.kGlobalScope == firstProc.classScope)
{
graphNode.updateNodeRefList.AddRange(firstProc.updatedGlobals);
}
else if (ProtoCore.DSASM.Constants.kInvalidIndex != index && ProtoCore.DSASM.Constants.kGlobalScope != firstProc.classScope)
{
foreach (ProtoCore.AssociativeGraph.GraphNode dependent in graphNode.dependentList)
{
// Do this only if first proc is a member function...
ProtoCore.AssociativeGraph.UpdateNodeRef autogenRef = new ProtoCore.AssociativeGraph.UpdateNodeRef(dependent.updateNodeRefList[0]);
autogenRef = autogenRef.GetUntilFirstProc();
// ... and the first symbol is an instance of a user-defined type
int last = autogenRef.nodeList.Count - 1;
Validity.Assert(autogenRef.nodeList[last].nodeType != ProtoCore.AssociativeGraph.UpdateNodeType.kMethod && null != autogenRef.nodeList[last].symbol);
if (autogenRef.nodeList[last].symbol.datatype.UID >= (int)PrimitiveType.kMaxPrimitives)
{
autogenRef.PushUpdateNodeRef(updateRef);
graphNode.updateNodeRefList.Add(autogenRef);
}
}
}
}
if (graphNode.updatedArguments.Count > 0)
{
// For each argument modified
int n = 0;
// Create the current modified argument
foreach (KeyValuePair<string, List<ProtoCore.AssociativeGraph.UpdateNodeRef>> argNameModifiedStatementsPair in firstProc.updatedArgumentProperties)
{
// For every single arguments' modified statements
foreach (ProtoCore.AssociativeGraph.UpdateNodeRef nodeRef in argNameModifiedStatementsPair.Value)
{
//.........这里部分代码省略.........