public override void Compile(Emitter.Emitter emitter) { // check for variable definitions being the only expressions in a block if (Statements.Count == 1 && (Statements[0] is VarDeclarationNode || Statements[0] is VarSplatNode)) Error(Resources.errVariableDefinitionOnly, Statements[0].Lexem); emitter.CurrentMethod.Scope.EnterSubScope(); foreach (var curr in Statements) { curr.Compile(emitter); // eliminate dead code if (curr is ReturnNode || (curr is IfNode && (curr as IfNode).AllPathsReturn)) { AllPathsReturn = true; break; } // remove clutter from stack if (!curr.GetExpressionType(emitter).IsAnyOf("", "void")) emitter.EmitPop(); } emitter.CurrentMethod.Scope.LeaveSubScope(); }
/// <summary> /// Generate action and condition (possibly) for the currently defined emitter /// </summary> /// <param name="emitter"></param> private void CompileBody(Emitter.Emitter emitter) { // compile action emitter.CurrentMethod = emitter.FindMethod(EmitterID, "Action"); emitter.MakeMethodVirtual(emitter.CurrentMethod); LoadClosuredVariables(ActionClosures, emitter); Action.Compile(emitter); if (!Action.GetExpressionType(emitter).IsAnyOf("void", "")) emitter.EmitPop(); emitter.EmitReturn(); // compile condition, if any if (Condition != null) { if (Condition.GetExpressionType(emitter) != "bool") Error(Resources.errEmitConditionExpected); emitter.CurrentMethod = emitter.FindMethod(EmitterID, "Condition"); emitter.MakeMethodVirtual(emitter.CurrentMethod); LoadClosuredVariables(ConditionClosures, emitter); Condition.Compile(emitter); emitter.EmitReturn(); } }