/// <summary> /// Preload specified variables /// </summary> /// <param name="flags">the flags</param> public void Preload(FunctionPreloadFlags flags) { //preloaded variables start at register 1 int reg = 1; //order is important if (flags.HasFlag(FunctionPreloadFlags.PreloadThis)) { Registers[reg] = Value.FromObject(Scope); ++reg; } if (flags.HasFlag(FunctionPreloadFlags.PreloadArguments)) { throw new NotImplementedException(); } if (flags.HasFlag(FunctionPreloadFlags.PreloadSuper)) { throw new NotImplementedException(); } if (flags.HasFlag(FunctionPreloadFlags.PreloadRoot)) { Registers[reg] = Value.FromObject(Apt.Root.ScriptObject); ++reg; } if (flags.HasFlag(FunctionPreloadFlags.PreloadParent)) { Registers[reg] = Value.FromObject(Scope.GetParent()); ++reg; } if (flags.HasFlag(FunctionPreloadFlags.PreloadGlobal)) { Registers[reg] = Value.FromObject(Apt.AVM.GlobalObject); ++reg; } if (flags.HasFlag(FunctionPreloadFlags.PreloadExtern)) { Registers[reg] = Value.FromObject(Apt.AVM.ExternObject); ++reg; } if (!flags.HasFlag(FunctionPreloadFlags.SupressSuper)) { throw new NotImplementedException(); } if (!flags.HasFlag(FunctionPreloadFlags.SupressArguments)) { throw new NotImplementedException(); } if (!flags.HasFlag(FunctionPreloadFlags.SupressThis)) { Locals["this"] = Value.FromObject(Scope); } }
public override void Execute(ActionContext context) { var name = Parameters[0].ToString(); var nParams = Parameters[1].ToInteger(); var nRegisters = Parameters[2].ToInteger(); FunctionPreloadFlags flags = (FunctionPreloadFlags)Parameters[3].ToInteger(); var size = Parameters[4 + nParams * 2].ToInteger(); //create a list of parameters var paramList = Parameters .Skip(4) .Take(nParams * 2) .ToList(); //get all the instructions var code = context.Stream.GetInstructions(size); var func = new Function() { Parameters = paramList, Instructions = code, NumberRegisters = nRegisters, Constants = new List <Value>(context.Scope.Constants), Flags = flags, IsNewVersion = true }; var funcVal = Value.FromFunction(func); if (name.Length > 0) { context.Scope.Variables[name] = funcVal; } //anonymous function/lambda function else { context.Stack.Push(funcVal); } }