本文整理汇总了C#中ProtoCore.Type类的典型用法代码示例。如果您正苦于以下问题:C# Type类的具体用法?C# Type怎么用?C# Type使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
Type类属于ProtoCore命名空间,在下文中一共展示了Type类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Emit
public int Emit(CodeBlockNode codeblock)
{
bool isTopBlock = null == codeBlock.parent;
if (!isTopBlock)
{
// If this is an inner block where there can be no classes, we can start at parsing at the global function state
compilePass = ProtoCore.DSASM.ImperativeCompilePass.kGlobalFuncSig;
}
CodeRangeTable.AddCodeBlockRangeEntry(codeBlock.codeBlockId,
codeblock.line,
codeblock.col,
codeblock.endLine,
codeblock.endCol,
compileState.CurrentDSFileName);
ProtoCore.Type type = new ProtoCore.Type();
while (ProtoCore.DSASM.ImperativeCompilePass.kDone != compilePass)
{
foreach (ImperativeNode node in codeblock.Body)
{
type = new ProtoCore.Type();
type.UID = (int)PrimitiveType.kTypeVar;
type.IsIndexable = false;
DfsTraverse(node, ref type);
}
compilePass++;
}
compileState.InferedType = type;
return codeBlock.codeBlockId;
}
示例2: EmitCodeBlock
/// <summary>
/// </summary>
/// <param name="codeBlock"></param>
/// <param name="inferedType"></param>
/// <param name="subPass"></param>
private void EmitCodeBlock(
List<ImperativeNode> codeBlock,
ref ProtoCore.Type inferedType,
bool isBooleanOp = false,
ProtoCore.AssociativeGraph.GraphNode graphNode = null)
{
foreach (ImperativeNode bodyNode in codeBlock)
{
inferedType = new ProtoCore.Type();
inferedType.UID = (int)PrimitiveType.Var;
if (bodyNode is LanguageBlockNode)
{
BinaryExpressionNode langBlockNode = new BinaryExpressionNode();
langBlockNode.LeftNode = nodeBuilder.BuildIdentfier(core.GenerateTempLangageVar());
langBlockNode.Optr = ProtoCore.DSASM.Operator.assign;
langBlockNode.RightNode = bodyNode;
DfsTraverse(langBlockNode, ref inferedType, isBooleanOp, graphNode);
}
else
{
DfsTraverse(bodyNode, ref inferedType, isBooleanOp, graphNode);
}
}
}
示例3: AutoGenerateUpdateReference
private ProtoCore.AssociativeGraph.UpdateNodeRef AutoGenerateUpdateReference(AssociativeNode node, ProtoCore.AssociativeGraph.GraphNode graphNode)
{
// Get the lhs symbol list
ProtoCore.Type type = new ProtoCore.Type();
type.UID = globalClassIndex;
ProtoCore.AssociativeGraph.UpdateNodeRef leftNodeRef = new ProtoCore.AssociativeGraph.UpdateNodeRef();
DFSGetSymbolList(node, ref type, leftNodeRef);
// Auto-generate the updateNodeRefs for this graphnode given the list
// stored in the first procedure found in the assignment expression
if (functionCallStack.Count > 0)
{
ProtoCore.DSASM.ProcedureNode firstProc = functionCallStack[0];
if (!firstProc.IsAutoGenerated)
{
graphNode.firstProc = firstProc;
}
}
ProtoCore.DSASM.SymbolNode firstSymbol = null;
// See if the leftmost symbol(updateNodeRef) of the lhs expression is a property of the current class.
// If it is, then push the lhs updateNodeRef to the list of modified properties in the procedure node
if (null != localProcedure && leftNodeRef.nodeList.Count > 0)
{
firstSymbol = leftNodeRef.nodeList[0].symbol;
// Check if this symbol being modified in this function is allocated in the current scope.
// If it is, then it means this symbol is not a member and is local to this function
ProtoCore.DSASM.SymbolNode symbolnode = null;
bool isAccessible = false;
bool isLocalVariable = VerifyAllocationInScope(firstSymbol.name, globalClassIndex, globalProcIndex, out symbolnode, out isAccessible);
if (!isLocalVariable)
{
if (null != firstSymbol && leftNodeRef.nodeList[0].nodeType != ProtoCore.AssociativeGraph.UpdateNodeType.kMethod)
{
if (firstSymbol.functionIndex == ProtoCore.DSASM.Constants.kGlobalScope)
{
// Does the symbol belong on the same class or class heirarchy as the function calling it
if (firstSymbol.classScope == localProcedure.ClassID)
{
localProcedure.UpdatedProperties.Push(leftNodeRef);
}
else
{
if (localProcedure.ClassID > 0)
{
if (core.ClassTable.ClassNodes[localProcedure.ClassID].IsMyBase(firstSymbol.classScope))
{
localProcedure.UpdatedProperties.Push(leftNodeRef);
}
}
}
}
}
}
}
return leftNodeRef;
}
示例4: __To__Deprecate__AutoGenerateUpdateArgumentReference
//
// proc TraverseFunctionDef(node)
// ...
// def argList
// foreach arg in node.argdefinition
// ; Store not just the argument types, but also the argument identifier
// def argtype = buildtype(arg)
// argtype.name = arg.identname
// argList.push(argtype)
// end
// ...
// end
//
private ProtoCore.AssociativeGraph.UpdateNodeRef __To__Deprecate__AutoGenerateUpdateArgumentReference(AssociativeNode node, ProtoCore.AssociativeGraph.GraphNode graphNode)
{
// Get the lhs symbol list
ProtoCore.Type type = new ProtoCore.Type();
type.UID = globalClassIndex;
ProtoCore.AssociativeGraph.UpdateNodeRef leftNodeRef = new ProtoCore.AssociativeGraph.UpdateNodeRef();
DFSGetSymbolList(node, ref type, leftNodeRef);
ProtoCore.DSASM.SymbolNode firstSymbol = null;
// Check if we are inside a procedure
if (null != localProcedure)
{
// Check if there are at least 2 symbols in the list
if (leftNodeRef.nodeList.Count >= 2)
{
firstSymbol = leftNodeRef.nodeList[0].symbol;
if (null != firstSymbol && leftNodeRef.nodeList[0].nodeType != ProtoCore.AssociativeGraph.UpdateNodeType.kMethod)
{
// Now check if the first element of the identifier list is an argument
foreach (ProtoCore.DSASM.ArgumentInfo argInfo in localProcedure.ArgumentInfos)
{
if (argInfo.Name == firstSymbol.name)
{
leftNodeRef.nodeList.RemoveAt(0);
List<ProtoCore.AssociativeGraph.UpdateNodeRef> refList = null;
bool found = localProcedure.UpdatedArgumentProperties.TryGetValue(argInfo.Name, out refList);
if (found)
{
refList.Add(leftNodeRef);
}
else
{
refList = new List<ProtoCore.AssociativeGraph.UpdateNodeRef>();
refList.Add(leftNodeRef);
localProcedure.UpdatedArgumentProperties.Add(argInfo.Name, refList);
}
}
}
}
}
}
return leftNodeRef;
}
示例5: EmitFunctionDefinitionNode
private void EmitFunctionDefinitionNode(AssociativeNode node, ref ProtoCore.Type inferedType, ProtoCore.CompilerDefinitions.Associative.SubCompilePass subPass = ProtoCore.CompilerDefinitions.Associative.SubCompilePass.kNone, GraphNode graphNode = null)
{
bool parseGlobalFunctionBody = null == localProcedure && ProtoCore.CompilerDefinitions.Associative.CompilePass.kGlobalFuncBody == compilePass;
bool parseMemberFunctionBody = ProtoCore.DSASM.Constants.kGlobalScope != globalClassIndex && ProtoCore.CompilerDefinitions.Associative.CompilePass.kClassMemFuncBody == compilePass;
FunctionDefinitionNode funcDef = node as FunctionDefinitionNode;
localFunctionDefNode = funcDef;
if (funcDef.IsAssocOperator)
{
isAssocOperator = true;
}
else
{
isAssocOperator = false;
}
bool hasReturnStatement = false;
ProtoCore.DSASM.CodeBlockType origCodeBlockType = codeBlock.blockType;
codeBlock.blockType = ProtoCore.DSASM.CodeBlockType.kFunction;
if (IsParsingGlobalFunctionSig() || IsParsingMemberFunctionSig())
{
Validity.Assert(null == localProcedure);
localProcedure = new ProtoCore.DSASM.ProcedureNode();
localProcedure.Name = funcDef.Name;
localProcedure.PC = ProtoCore.DSASM.Constants.kInvalidIndex;
localProcedure.LocalCount = 0; // Defer till all locals are allocated
var uid = core.TypeSystem.GetType(funcDef.ReturnType.Name);
var rank = funcDef.ReturnType.rank;
var returnType = core.TypeSystem.BuildTypeObject(uid, rank);
if (returnType.UID == (int)PrimitiveType.kInvalidType)
{
string message = String.Format(ProtoCore.Properties.Resources.kReturnTypeUndefined, funcDef.ReturnType.Name, funcDef.Name);
buildStatus.LogWarning(WarningID.kTypeUndefined, message, core.CurrentDSFileName, funcDef.line, funcDef.col, graphNode);
returnType = TypeSystem.BuildPrimitiveTypeObject(PrimitiveType.kTypeVar, rank);
}
localProcedure.ReturnType = returnType;
localProcedure.IsConstructor = false;
localProcedure.IsStatic = funcDef.IsStatic;
localProcedure.RuntimeIndex = codeBlock.codeBlockId;
localProcedure.AccessModifier = funcDef.Access;
localProcedure.IsExternal = funcDef.IsExternLib;
localProcedure.IsAutoGenerated = funcDef.IsAutoGenerated;
localProcedure.ClassID = globalClassIndex;
localProcedure.IsAssocOperator = funcDef.IsAssocOperator;
localProcedure.IsAutoGeneratedThisProc = funcDef.IsAutoGeneratedThisProc;
localProcedure.MethodAttribute = funcDef.MethodAttributes;
int peekFunctionindex = ProtoCore.DSASM.Constants.kInvalidIndex;
if (ProtoCore.DSASM.Constants.kInvalidIndex == globalClassIndex)
{
peekFunctionindex = codeBlock.procedureTable.Procedures.Count;
}
else
{
peekFunctionindex = core.ClassTable.ClassNodes[globalClassIndex].ProcTable.Procedures.Count;
}
// Append arg symbols
List<KeyValuePair<string, ProtoCore.Type>> argsToBeAllocated = new List<KeyValuePair<string, ProtoCore.Type>>();
string functionDescription = localProcedure.Name;
if (null != funcDef.Signature)
{
foreach (VarDeclNode argNode in funcDef.Signature.Arguments)
{
var argInfo = BuildArgumentInfoFromVarDeclNode(argNode);
localProcedure.ArgumentInfos.Add(argInfo);
var argType = BuildArgumentTypeFromVarDeclNode(argNode, graphNode);
localProcedure.ArgumentTypes.Add(argType);
argsToBeAllocated.Add(new KeyValuePair<string, ProtoCore.Type>(argInfo.Name, argType));
functionDescription += argNode.ArgumentType.ToString();
}
localProcedure.HashID = functionDescription.GetHashCode();
localProcedure.IsVarArg = funcDef.Signature.IsVarArg;
}
if (ProtoCore.DSASM.Constants.kInvalidIndex == globalClassIndex)
{
globalProcIndex = codeBlock.procedureTable.Append(localProcedure);
}
else
{
globalProcIndex = core.ClassTable.ClassNodes[globalClassIndex].ProcTable.Append(localProcedure);
}
// Comment Jun: Catch this assert given the condition as this type of mismatch should never occur
if (ProtoCore.DSASM.Constants.kInvalidIndex != globalProcIndex)
{
argsToBeAllocated.ForEach(arg =>
{
int symbolIndex = AllocateArg(arg.Key, globalProcIndex, arg.Value);
if (ProtoCore.DSASM.Constants.kInvalidIndex == symbolIndex)
{
throw new BuildHaltException("B2CB2093");
//.........这里部分代码省略.........
示例6: AllocateMemberVariable
public int AllocateMemberVariable(int classIndex, int classScope, string name, int rank = 0, ProtoCore.CompilerDefinitions.AccessModifier access = ProtoCore.CompilerDefinitions.AccessModifier.kPublic, bool isStatic = false)
{
// TODO Jun: Create a class table for holding the primitive and custom data types
int datasize = ProtoCore.DSASM.Constants.kPointerSize;
ProtoCore.Type ptrType = new ProtoCore.Type();
if (rank == 0)
ptrType.UID = (int)PrimitiveType.kTypePointer;
else
ptrType.UID = (int)PrimitiveType.kTypeArray;
ptrType.rank = rank;
ProtoCore.DSASM.SymbolNode symnode = Allocate(classIndex, classScope, ProtoCore.DSASM.Constants.kGlobalScope, name, ptrType, datasize, isStatic, access);
if (null == symnode)
{
buildStatus.LogSemanticError(String.Format(Resources.MemberVariableAlreadyDefined, name, core.ClassTable.ClassNodes[classIndex].Name));
return ProtoCore.DSASM.Constants.kInvalidIndex;
}
return symnode.symbolTableIndex;
}
示例7: AllocateContextGlobals
private void AllocateContextGlobals()
{
if (null != context && null != context.GlobalVarList && context.GlobalVarList.Count > 0)
{
ProtoCore.Type type = new ProtoCore.Type();
foreach (string globalName in context.GlobalVarList.Keys)
{
Allocate(
ProtoCore.DSASM.Constants.kInvalidIndex,
ProtoCore.DSASM.Constants.kInvalidIndex,
ProtoCore.DSASM.Constants.kGlobalScope,
globalName,
type);
}
}
}
示例8: TraverseFunctionCall
public override ProcedureNode TraverseFunctionCall(
ProtoCore.AST.Node node,
ProtoCore.AST.Node parentNode,
int lefttype,
int depth,
ref ProtoCore.Type inferedType,
GraphNode graphNode = null,
ProtoCore.CompilerDefinitions.Associative.SubCompilePass subPass = ProtoCore.CompilerDefinitions.Associative.SubCompilePass.kNone,
ProtoCore.AST.Node bnode = null)
{
ProcedureNode procNode = null;
if (node is FunctionDotCallNode)
{
procNode = TraverseDotFunctionCall(node,
parentNode,
lefttype,
depth,
graphNode,
subPass,
bnode as BinaryExpressionNode,
ref inferedType);
if (graphNode != null && procNode != null)
{
GenerateCallsiteIdentifierForGraphNode(graphNode, procNode.Name);
}
return procNode;
}
var arglist = new List<ProtoCore.Type>();
var funcCall = node as FunctionCallNode;
var procName = funcCall.Function.Name;
int classIndex = core.ClassTable.IndexOf(procName);
// To support unamed constructor
if (classIndex != Constants.kInvalidIndex)
{
bool isAccessible;
int dummy;
ProcedureNode constructor = core.ClassTable.ClassNodes[classIndex].GetMemberFunction(procName, arglist, globalClassIndex, out isAccessible, out dummy, true);
if (constructor != null && constructor.IsConstructor)
{
var rhsFNode = node as FunctionCallNode;
var classNode = AstFactory.BuildIdentifier(procName);
var dotCallNode = CoreUtils.GenerateCallDotNode(classNode, rhsFNode, core);
procNode = TraverseDotFunctionCall(dotCallNode,
parentNode,
lefttype,
depth,
graphNode,
subPass,
bnode as BinaryExpressionNode,
ref inferedType);
if (graphNode != null && procNode != null)
{
GenerateCallsiteIdentifierForGraphNode(graphNode, procNode.Name);
}
return procNode;
}
}
foreach (AssociativeNode paramNode in funcCall.FormalArguments)
{
var paramType = TypeSystem.BuildPrimitiveTypeObject(PrimitiveType.kTypeVar, 0);
// The range expression function does not need replication guides
emitReplicationGuide = !procName.Equals(Constants.kFunctionRangeExpression)
&& !CoreUtils.IsGetterSetter(procName);
// If it's a binary node then continue type check, otherwise
// disable type check and just take the type of paramNode itself
// f(1+2.0) -> type check enabled - param is typed as double
// f(2) -> type check disabled - param is typed as int
enforceTypeCheck = !(paramNode is BinaryExpressionNode);
DfsTraverse(paramNode, ref paramType, false, graphNode, subPass, bnode);
emitReplicationGuide = false;
enforceTypeCheck = true;
arglist.Add(paramType);
}
if (subPass == ProtoCore.CompilerDefinitions.Associative.SubCompilePass.kUnboundIdentifier)
{
return null;
}
int refClassIndex = Constants.kInvalidIndex;
if (parentNode != null && parentNode is IdentifierListNode)
{
var leftnode = (parentNode as IdentifierListNode).LeftNode;
if (leftnode != null && leftnode is IdentifierNode)
{
refClassIndex = core.ClassTable.IndexOf(leftnode.Name);
}
}
//.........这里部分代码省略.........
示例9: EmitBinaryExpressionNode
private void EmitBinaryExpressionNode(ImperativeNode node, ref ProtoCore.Type inferedType, bool isBooleanOp = false, ProtoCore.AssociativeGraph.GraphNode graphNode = null,
ProtoCore.AST.ImperativeAST.BinaryExpressionNode parentNode = null)
{
if (!IsParsingGlobal() && !IsParsingGlobalFunctionBody())
return;
bool isBooleanOperation = false;
BinaryExpressionNode b = node as BinaryExpressionNode;
ProtoCore.Type leftType = new ProtoCore.Type();
leftType.UID = (int)ProtoCore.PrimitiveType.kTypeVar;
ProtoCore.Type rightType = new ProtoCore.Type();
rightType.UID = (int)ProtoCore.PrimitiveType.kTypeVar;
if (ProtoCore.DSASM.Operator.assign != b.Optr)
{
isBooleanOperation = ProtoCore.DSASM.Operator.lt == b.Optr
|| ProtoCore.DSASM.Operator.gt == b.Optr
|| ProtoCore.DSASM.Operator.le == b.Optr
|| ProtoCore.DSASM.Operator.ge == b.Optr
|| ProtoCore.DSASM.Operator.eq == b.Optr
|| ProtoCore.DSASM.Operator.nq == b.Optr
|| ProtoCore.DSASM.Operator.and == b.Optr
|| ProtoCore.DSASM.Operator.or == b.Optr;
DfsTraverse(b.LeftNode, ref inferedType, isBooleanOperation, graphNode, AssociativeSubCompilePass.kNone, parentNode);
if (inferedType.UID == (int)PrimitiveType.kTypeFunctionPointer && emitDebugInfo)
{
buildStatus.LogSemanticError("Function pointer is not allowed at binary expression other than assignment!", compileStateTracker.CurrentDSFileName, b.LeftNode.line, b.LeftNode.col);
}
leftType.UID = inferedType.UID;
leftType.IsIndexable = inferedType.IsIndexable;
}
else
{
if (b.LeftNode is IdentifierListNode)
{
ProtoCore.AST.Node lnode = b.LeftNode;
bool isCollapsed;
if (parentNode != null)
{
NodeUtils.SetNodeLocation(lnode, parentNode, parentNode);
}
else
{
NodeUtils.SetNodeLocation(lnode, b, b);
}
EmitGetterSetterForIdentList(lnode, ref inferedType, null, ProtoCore.DSASM.AssociativeSubCompilePass.kNone, out isCollapsed, b.RightNode);
// Get the lhs symbol list
ProtoCore.Type type = new ProtoCore.Type();
type.UID = globalClassIndex;
ProtoCore.AssociativeGraph.UpdateNodeRef leftNodeRef = new ProtoCore.AssociativeGraph.UpdateNodeRef();
DFSGetSymbolList(lnode, ref type, leftNodeRef);
// Get the first identifier symbol runtime index as it is required for the pushdep
List<ProtoCore.DSASM.SymbolNode> symbolList = new List<ProtoCore.DSASM.SymbolNode>();
symbolList.Add(leftNodeRef.nodeList[0].symbol);
int runtimeIndex = leftNodeRef.nodeList[0].symbol.runtimeTableIndex;
// Append the rest of the symbols in the identifierlist
for (int n = 1; n < leftNodeRef.nodeList.Count; ++n)
{
if (leftNodeRef.nodeList[n].symbol != null)
symbolList.Add(leftNodeRef.nodeList[n].symbol);
}
EmitPushDepData(symbolList);
EmitPushDep(runtimeIndex, symbolList.Count, globalClassIndex);
return;
}
}
// (Ayush) in case of PostFixNode, only traverse the identifier now. Post fix operation will be applied later.
#if ENABLE_INC_DEC_FIX
if (b.RightNode is PostFixNode)
DfsTraverse((b.RightNode as PostFixNode).Identifier, ref inferedType, isBooleanOperation);
else
{
#endif
if ((ProtoCore.DSASM.Operator.assign == b.Optr) && (b.RightNode is LanguageBlockNode))
{
inferedType.UID = (int)ProtoCore.PrimitiveType.kTypeVar;
inferedType.IsIndexable = false;
}
if (b.RightNode == null && b.Optr == Operator.assign && b.LeftNode is IdentifierNode)
{
IdentifierNode t = b.LeftNode as IdentifierNode;
ProtoCore.DSASM.SymbolNode symbolnode = null;
bool isAccessible = false;
bool hasAllocated = VerifyAllocation(t.Value, globalClassIndex, globalProcIndex, out symbolnode, out isAccessible);
if (hasAllocated)
{
b.RightNode = nodeBuilder.BuildIdentfier(t.Value);
//.........这里部分代码省略.........
示例10: DfsEmitArraySize
private void DfsEmitArraySize(ImperativeNode node)
{
// s = size * ( i * j * k..n )
if (node is ArrayNode)
{
ArrayNode array = node as ArrayNode;
ProtoCore.Type type = new ProtoCore.Type();
type.UID = (int)ProtoCore.PrimitiveType.kInvalidType;
type.IsIndexable = false;
DfsTraverse(array.Expr, ref type);
if (array.Type is ArrayNode)
{
DfsEmitArraySize(array.Type);
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regBX);
ProtoCore.DSASM.StackValue opBX = new ProtoCore.DSASM.StackValue();
opBX.optype = ProtoCore.DSASM.AddressType.Register;
opBX.opdata = (int)ProtoCore.DSASM.Registers.BX;
EmitPop(opBX, Constants.kGlobalScope);
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regAX);
ProtoCore.DSASM.StackValue opAX = new ProtoCore.DSASM.StackValue();
opAX.optype = ProtoCore.DSASM.AddressType.Register;
opAX.opdata = (int)ProtoCore.DSASM.Registers.AX;
EmitPop(opAX, Constants.kGlobalScope);
string op = opKwData.opStringTable[ProtoCore.DSASM.Operator.add];
EmitInstrConsole(op, ProtoCore.DSASM.kw.regAX, ProtoCore.DSASM.kw.regBX);
EmitBinary(opKwData.opCodeTable[ProtoCore.DSASM.Operator.add], opAX, opBX);
EmitInstrConsole(ProtoCore.DSASM.kw.push, ProtoCore.DSASM.kw.regAX);
EmitPush(opAX);
}
}
else
{
Debug.Assert(false, "ast error – check ast construction");
}
}
示例11: DfsEmitArrayIndex
// this method is used in conjuction with array indexing
private void DfsEmitArrayIndex(ImperativeNode node, int symbolindex, int index = 0)
{
// s = b + ((i * i.w) + (j * j.w) + (n * n.w))
if (node is ArrayNode)
{
ArrayNode array = node as ArrayNode;
ProtoCore.Type type = new ProtoCore.Type();
type.UID = (int)ProtoCore.PrimitiveType.kTypeVoid;
type.IsIndexable = false;
DfsTraverse(array.Expr, ref type);
// Max size of the current dimension
int w = codeBlock.symbolTable.symbolList[symbolindex].arraySizeList[index];
// TODO Jun: Performance improvement
// Avoid having to generate instructions for the current index if 'w' is 0
EmitInstrConsole(ProtoCore.DSASM.kw.push, w.ToString());
ProtoCore.DSASM.StackValue opWidth = new ProtoCore.DSASM.StackValue();
opWidth.optype = ProtoCore.DSASM.AddressType.Int;
opWidth.opdata = w;
EmitPush(opWidth);
string op = null;
ProtoCore.DSASM.StackValue opAX = new ProtoCore.DSASM.StackValue();
opAX.optype = ProtoCore.DSASM.AddressType.Register;
opAX.opdata = (int)ProtoCore.DSASM.Registers.AX;
ProtoCore.DSASM.StackValue opBX = new ProtoCore.DSASM.StackValue();
opBX.optype = ProtoCore.DSASM.AddressType.Register;
opBX.opdata = (int)ProtoCore.DSASM.Registers.BX;
ProtoCore.DSASM.StackValue opRes = new ProtoCore.DSASM.StackValue();
opRes.optype = ProtoCore.DSASM.AddressType.Register;
opRes.opdata = (int)ProtoCore.DSASM.Registers.AX;
// Multiplying the max array size by the number of elements
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regBX);
EmitPop(opBX, Constants.kGlobalScope);
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regAX);
EmitPop(opAX, Constants.kGlobalScope);
op = opKwData.opStringTable[ProtoCore.DSASM.Operator.mul];
EmitInstrConsole(op, ProtoCore.DSASM.kw.regAX, ProtoCore.DSASM.kw.regBX);
EmitBinary(opKwData.opCodeTable[ProtoCore.DSASM.Operator.mul], opAX, opBX);
EmitInstrConsole(ProtoCore.DSASM.kw.push, ProtoCore.DSASM.kw.regAX);
EmitPush(opRes);
if (array.Type is ArrayNode)
{
DfsEmitArrayIndex(array.Type, symbolindex, index + 1);
// Adding the previous arraysize to the current one
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regBX);
EmitPop(opBX, Constants.kGlobalScope);
EmitInstrConsole(ProtoCore.DSASM.kw.pop, ProtoCore.DSASM.kw.regAX);
EmitPop(opAX, Constants.kGlobalScope);
op = opKwData.opStringTable[ProtoCore.DSASM.Operator.add];
EmitInstrConsole(op, ProtoCore.DSASM.kw.regAX, ProtoCore.DSASM.kw.regBX);
EmitBinary(opKwData.opCodeTable[ProtoCore.DSASM.Operator.add], opAX, opBX);
EmitInstrConsole(ProtoCore.DSASM.kw.push, ProtoCore.DSASM.kw.regAX);
EmitPush(opRes);
}
}
else
{
Debug.Assert(false, "ast error – check ast construction");
}
}
示例12: Emit
public override int Emit(ProtoCore.AST.Node codeBlockNode, ProtoCore.AssociativeGraph.GraphNode graphNode = null)
{
compileStateTracker.startPC = this.pc;
if (compileStateTracker.ExecMode == ProtoCore.DSASM.InterpreterMode.kExpressionInterpreter)
{
return EmitExpressionInterpreter(codeBlockNode);
}
this.localCodeBlockNode = codeBlockNode;
ProtoCore.AST.ImperativeAST.CodeBlockNode codeblock = codeBlockNode as ProtoCore.AST.ImperativeAST.CodeBlockNode;
bool isTopBlock = null == codeBlock.parent;
if (!isTopBlock)
{
// If this is an inner block where there can be no classes, we can start at parsing at the global function state
compilePass = ProtoCore.DSASM.ImperativeCompilePass.kGlobalFuncSig;
}
bool hasReturnStatement = false;
ProtoCore.Type type = new ProtoCore.Type();
while (ProtoCore.DSASM.ImperativeCompilePass.kDone != compilePass)
{
foreach (ImperativeNode node in codeblock.Body)
{
type = new ProtoCore.Type();
type.UID = (int)PrimitiveType.kTypeVar;
type.IsIndexable = false;
if (node is LanguageBlockNode)
{
// Build a binary node with a temporary lhs for every stand-alone language block
var iNode = nodeBuilder.BuildIdentfier(compileStateTracker.GenerateTempLangageVar());
var langBlockNode = nodeBuilder.BuildBinaryExpression(iNode, node);
DfsTraverse(langBlockNode, ref type, false, graphNode);
}
else
{
DfsTraverse(node, ref type, false, graphNode);
}
if (ProtoCore.Utils.NodeUtils.IsReturnExpressionNode(node))
hasReturnStatement = true;
}
if (compilePass == ProtoCore.DSASM.ImperativeCompilePass.kGlobalScope && !hasReturnStatement)
{
EmitReturnNull();
}
compilePass++;
}
compileStateTracker.InferedType = type;
if (compileStateTracker.AsmOutput != Console.Out)
{
compileStateTracker.AsmOutput.Flush();
}
this.localCodeBlockNode = null;
return codeBlock.codeBlockId;
}
示例13: definitions
/*
1 Copy user-defined function definitions (excluding constructors) into a temp
2 Modify its signature to include an additional this pointer as the first argument.
The 'this' argument should take the type of the current class being traversed and be the first argument in the function.
The function name must be name mangled in order to stay unique
3 Append this temp to the current vtable
*/
private void InsertThisPointerArg(ThisPointerProcOverload procOverload)
{
// Modify its signature to include an additional this pointer as the first argument.
// The 'this' argument should take the type of the current class being traversed and be the first argument in the function.
// The function name must be name mangled in order to stay unique
ProtoCore.AST.AssociativeAST.FunctionDefinitionNode procNode = procOverload.procNode;
string className = compileStateTracker.ClassTable.ClassNodes[procOverload.classIndex].name;
string thisPtrArgName = ProtoCore.DSASM.Constants.kThisPointerArgName;
ProtoCore.AST.AssociativeAST.IdentifierNode ident = new ProtoCore.AST.AssociativeAST.IdentifierNode();
ident.Name = ident.Value = thisPtrArgName;
VarDeclNode thisPtrArg = new ProtoCore.AST.AssociativeAST.VarDeclNode()
{
memregion = ProtoCore.DSASM.MemoryRegion.kMemStack,
access = ProtoCore.DSASM.AccessSpecifier.kPublic,
NameNode = ident,
ArgumentType = new ProtoCore.Type { Name = className, UID = procOverload.classIndex, IsIndexable = false, rank = 0 }
};
procNode.Singnature.Arguments.Insert(0, thisPtrArg);
ProtoCore.Type type = new ProtoCore.Type();
}
示例14: InferTypes
private void InferTypes()
{
int size = astNodes.Count;
for (int n = 0; n < size; ++n)
{
if (astNodes[n] is BinaryExpressionNode)
{
ProtoCore.Type type = new ProtoCore.Type();
type.UID = (int)ProtoCore.PrimitiveType.kTypeVoid;
type.IsIndexable = false;
BinaryExpressionNode b = astNodes[n] as BinaryExpressionNode;
InferDFSTraverse(b.RightNode, ref type);
// Do we even need to update lhs?
Debug.Assert(b.LeftNode is IdentifierNode);
IdentifierNode t = b.LeftNode as IdentifierNode;
codeBlock.symbolTable.SetDataType(t.Name, globalProcIndex, type);
}
}
}
示例15: InferDFSTraverse
private void InferDFSTraverse(AssociativeNode node, ref ProtoCore.Type inferedType)
{
if (node is IdentifierNode)
{
IdentifierNode t = node as IdentifierNode;
if (compileStateTracker.TypeSystem.IsHigherRank(t.datatype.UID, inferedType.UID))
{
ProtoCore.Type type = new ProtoCore.Type();
type.UID = t.datatype.UID;
type.IsIndexable = false;
inferedType = type;
}
}
else if (node is FunctionCallNode)
{
FunctionCallNode f = node as FunctionCallNode;
}
else if (node is BinaryExpressionNode)
{
BinaryExpressionNode b = node as BinaryExpressionNode;
InferDFSTraverse(b.LeftNode, ref inferedType);
InferDFSTraverse(b.RightNode, ref inferedType);
}
}