public override int Emit(ProtoCore.AST.Node codeBlockNode, ProtoCore.AssociativeGraph.GraphNode graphNode = null) { core.startPC = this.pc; if (core.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.Compiler.Imperative.CompilePass.kGlobalFuncSig; } bool hasReturnStatement = false; ProtoCore.Type type = new ProtoCore.Type(); while (ProtoCore.Compiler.Imperative.CompilePass.kDone != compilePass) { foreach (ImperativeNode node in codeblock.Body) { type = TypeSystem.BuildPrimitiveTypeObject(PrimitiveType.kTypeVar, 0); if (node is LanguageBlockNode) { // Build a binary node with a temporary lhs for every stand-alone language block var iNode = nodeBuilder.BuildIdentfier(core.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.Compiler.Imperative.CompilePass.kGlobalScope && !hasReturnStatement) { EmitReturnNull(); } compilePass++; } core.InferedType = type; if (core.AsmOutput != Console.Out) { core.AsmOutput.Flush(); } this.localCodeBlockNode = null; return codeBlock.codeBlockId; }
private int EmitExpressionInterpreter(ProtoCore.AST.Node codeBlockNode) { core.startPC = this.pc; compilePass = ProtoCore.Compiler.Imperative.CompilePass.kGlobalScope; ProtoCore.AST.ImperativeAST.CodeBlockNode codeblock = codeBlockNode as ProtoCore.AST.ImperativeAST.CodeBlockNode; ProtoCore.Type inferedType = new ProtoCore.Type(); foreach (ImperativeNode node in codeblock.Body) { inferedType = TypeSystem.BuildPrimitiveTypeObject(PrimitiveType.kTypeVar, 0); DfsTraverse(node, ref inferedType); BinaryExpressionNode binaryNode = node as BinaryExpressionNode; } core.InferedType = inferedType; this.pc = core.startPC; return codeBlock.codeBlockId; }