//返回一个调用函数 Object private CodeCallFunction GetFunction(CodeObject member) { CodeCallFunction ret = new CodeCallFunction(); ReadLeftParenthesis(); List <CodeObject> pars = new List <CodeObject>(); Token token = PeekToken(); while (token.Type != TokenType.RightPar) { pars.Add(GetObject()); token = PeekToken(); if (token.Type == TokenType.Comma) { ReadComma(); } else if (token.Type == TokenType.RightPar) { break; } else { throw new ParserException("Comma ',' or right parenthesis ')' expected in function declararion.", token); } } ReadRightParenthesis(); ret.Member = member; ret.Parameters = pars; return(ret); }
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)); }
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); }