示例#1
0
        /// <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);
            }
        }
示例#2
0
        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);
            }
        }