/// <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(PlannerID, "Action", "flow[]", "symbol"); emitter.MakeMethodVirtual(emitter.CurrentMethod); LoadClosuredVariables(Closures, emitter); emitter.EmitLoadParameter(0); emitter.EmitLoadParameter(1); Action.Compile(emitter); // append the arguments to the user emitter.EmitReturn(); }
/// <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(); } }