internal ScriptValue Call([CanBeNull] ScriptObject function, ScriptValue thisValue, [NotNull] IReadOnlyList <ScriptValue> arguments)
 {
     //https://tc39.github.io/ecma262/#sec-call
     if (function == null || !function.IsCallable)
     {
         throw CreateTypeError();
     }
     return(function.Call(thisValue, arguments));
 }
        ScriptObject ParseCall(CodeCallFunction scriptFunction)
        {
            ScriptObject obj = ResolveOperand(scriptFunction.Member);
            int          num = scriptFunction.Parameters.Count;

            ScriptObject[] parameters = new ScriptObject[num];
            for (int i = 0; i < num; ++i)
            {
                parameters[i] = ResolveOperand(scriptFunction.Parameters[i]);
            }
            m_script.PushStackInfo();
            return(obj.Call(parameters));
        }
        ScriptObject ParseCall(CodeCallFunction scriptFunction, bool needRet)
        {
            ScriptObject obj = ResolveOperand(scriptFunction.Member);
            int          num = scriptFunction.Parameters.Count;

            ScriptObject[] parameters = new ScriptObject[num];
            for (int i = 0; i < num; ++i)
            {
                parameters[i] = ResolveOperand(scriptFunction.Parameters[i]);
            }
            m_script.PushStackInfo();
            object ret = obj.Call(parameters);

            return(needRet ? m_script.CreateObject(ret) : null);
        }
        ScriptObject ParseCall(CodeCallFunction scriptFunction, bool needRet)
        {
            ScriptObject obj = ResolveOperand(scriptFunction.Member);
            int          num = scriptFunction.ParametersCount;

            ScriptObject[] parameters = new ScriptObject[num];
            for (int i = 0; i < num; ++i)
            {
                //此处要调用Assign 如果传入number string等基础类型  在函数内自运算的话 会影响 传入的值
                parameters[i] = ResolveOperand(scriptFunction.Parameters[i]).Assign();
            }
            m_script.PushStackInfo();
            object ret = obj.Call(parameters);

            return(needRet ? m_script.CreateObject(ret) : null);
        }
        private ScriptObject ParseCall(CodeCallFunction scriptFunction, bool needRet)
        {
            ScriptObject obj2            = this.ResolveOperand(scriptFunction.Member);
            int          parametersCount = scriptFunction.ParametersCount;

            ScriptObject[] parameters = new ScriptObject[parametersCount];
            for (int i = 0; i < parametersCount; i++)
            {
                parameters[i] = this.ResolveOperand(scriptFunction.Parameters[i]).Assign();
            }
            this.m_script.PushStackInfo();
            object obj3 = obj2.Call(parameters);

            this.m_script.PopStackInfo();
            if (!needRet)
            {
                return(null);
            }
            return(this.m_script.CreateObject(obj3));
        }
Exemple #6
0
        ScriptObject ParseCall(CodeCallFunction scriptFunction, bool needRet)
        {
            ScriptObject obj = ResolveOperand(scriptFunction.Member);

            // 安装function this 信息
            if (obj is ScriptScriptFunction)
            {
                ScriptScriptFunction suf = obj as ScriptScriptFunction;
                if (!suf.isCloure)
                {
                    if (scriptFunction.Member is CodeMember)
                    {
                        CodeMember member = scriptFunction.Member as CodeMember;
                        if (member.Parent == null)
                        {
                            suf.SetTable(m_script.GetGlobalTable());
                        }
                        else
                        {
                            ScriptObject sotable = ResolveOperand(member.Parent);
                            if (sotable is ScriptTable)
                            {
                                suf.SetTable(sotable as ScriptTable);
                            }
                        }
                    }
                }
            }

            int num = scriptFunction.ParametersCount;

            ScriptObject[] parameters = new ScriptObject[num];
            for (int i = 0; i < num; ++i)
            {
                //此处要调用Assign 如果传入number string等基础类型  在函数内自运算的话 会影响 传入的值
                parameters[i] = ResolveOperand(scriptFunction.Parameters[i]).Assign();

                // 创建闭包
                if (parameters[i] is ScriptScriptFunction)
                {
                    ScriptScriptFunction ssf = parameters[i] as ScriptScriptFunction;
                    ssf.isCloure = true;
                    if (scriptFunction.Parameters[i] is CodeMember)
                    {
                        CodeMember member = scriptFunction.Parameters[i] as CodeMember;
                        if (member.Parent == null)
                        {
                            ssf.SetTable(m_script.GetGlobalTable());
                        }
                        else
                        {
                            ScriptObject sotable = ResolveOperand(member.Parent);
                            if (sotable is ScriptTable)
                            {
                                ssf.SetTable(sotable as ScriptTable);
                            }
                        }
                    }
                    else if (scriptFunction.Parameters[i] is CodeFunction)
                    {
                        if (obj is ScriptScriptFunction)
                        {
                            ScriptScriptFunction suf = obj as ScriptScriptFunction;
                            ssf.SetTable((ScriptTable)suf.GetValue("this"));
                        }
                    }
                }
            }
            m_script.PushStackInfo();

            object ret = obj.Call(parameters);

            m_script.PopStackInfo();
            return(needRet ? m_script.CreateObject(ret) : null);
        }