public SerializableExternalFLFunction( string name, SerializableFLProgram externalProgram, FLExecutableElementModifiers mod) : base(name) { ExternalProgram = externalProgram; Modifiers = mod; }
public ExternalFlFunction( string name, SerializableFLProgram external, FLInstructionSet iset, FLExecutableElementModifiers modifiers) : base("ext-func") { Name = name; Modifiers = modifiers; ExternalFunctionBlueprint = external; InstructionSet = iset; }
public override object Deserialize(PrimitiveValueWrapper s) { string name = s.ReadString(); FLExecutableElementModifiers emod = new FLExecutableElementModifiers(name, s.ReadArray <string>()); byte[] payload = s.ReadBytes(); MemoryStream ms = new MemoryStream(payload); return(new SerializableExternalFLFunction( name, FLSerializer.LoadProgram(ms, instructionSet), emod )); }
protected override void Validate( SerializableFLProgram prog, SerializableFLFunction func, SerializableFLInstruction inst, SerializableFLInstructionArgument arg) { FLExecutableElementModifiers calledFunc = prog.Functions.FirstOrDefault(x => x.Name == arg.Identifier)?.Modifiers ?? prog.ExternalFunctions.First(x => x.Name == arg.Identifier).Modifiers; if (calledFunc.NoCall) { throw new FLInvalidFLElementModifierUseException( func.Name, FLKeywords.NoCallKeyword, $"Can not use instruction {inst.InstructionKey} with a Defined Function that is marked with the nocall modifier." ); } }
public override object Process(object o) { SerializableFLProgram input = (SerializableFLProgram)o; Dictionary <string, SerializableFLFunction> staticFunctions = new Dictionary <string, SerializableFLFunction>(); for (int i = input.Functions.Count - 1; i >= 0; i--) { SerializableFLFunction staticFunction = input.Functions[i]; if (!staticFunction.Modifiers.IsStatic || staticFunction.Name == FLKeywords.EntryFunctionKey) { continue; } string funcName = "_ext_" + staticFunction.Name; staticFunctions.Add(funcName, staticFunction); input.Functions.RemoveAt(i); List <string> source = staticFunction.Instructions.Select(x => x.ToString()).ToList(); source.Insert(0, FLKeywords.EntryFunctionKey + ":"); FLParserInput pi = new FLParserInput( "Exported Function: " + staticFunction .Name, source.ToArray(), false ); pi.KernelData = new List <EmbeddedKernelData>(input.KernelData); SerializableFLProgram ext = (SerializableFLProgram)Target.Process(pi); List <string> mods = new List <string> { FLKeywords.NoJumpKeyword }; if (staticFunction.Modifiers.ComputeOnce) { mods.Add(FLKeywords.ComputeOnceKeyword); } FLExecutableElementModifiers e = new FLExecutableElementModifiers(funcName, mods.ToArray()); input.ExternalFunctions.Add(new SerializableExternalFLFunction(funcName, ext, e)); } foreach (KeyValuePair <string, SerializableFLFunction> staticFunction in staticFunctions) { foreach (SerializableFLFunction serializableFlFunction in input.Functions) { foreach (SerializableFLInstruction serializableFlInstruction in serializableFlFunction.Instructions) { for (int i = 0; i < serializableFlInstruction.Arguments.Count; i++) { SerializableFLInstructionArgument arg = serializableFlInstruction.Arguments[i]; if (arg.Identifier == staticFunction.Value.Name) { serializableFlInstruction.Arguments[i] = new SerializeExternalFunctionArgument(staticFunction.Key); } } } } } return(input); }