private ScriptObject GetVariable(CodeMember member)
{
ScriptObject ret = null;
if (member.Parent == null) {
string name = (string)member.MemberValue;
ScriptObject obj = GetVariableObject(name);
ret = (obj == null ? m_script.GetValue(name) : obj);
ret.Name = name;
} else {
ScriptObject parent = ResolveOperand(member.Parent);
/*此处设置一下堆栈位置 否则 函数返回值取值出错会报错位置 例如
function Get() {
return null
}
Get().a
上述代码报错会报道 return null 那一行 但实际出错 是 .a 的时候 下面这句话就是把堆栈设置回 .a 那一行
*/
m_script.SetStackInfo(member.StackInfo);
if (member.Type == MEMBER_TYPE.VALUE) {
object name = member.MemberValue;
ret = parent.GetValue(name);
ret.Name = parent.Name + "." + name.ToString();
} else {
object name = ResolveOperand(member.MemberObject).KeyValue;
ret = parent.GetValue(name);
ret.Name = parent.Name + "." + name.ToString();
}
}
if (ret == null) throw new ExecutionException(m_script, "GetVariable member is error");
if (member.Calc != CALC.NONE) {
ScriptNumber num = ret as ScriptNumber;
if (num == null) throw new ExecutionException(m_script, "++或者--只能应用于Number类型");
return num.Calc(member.Calc);
}
return ret;
}
private void SetVariable(CodeMember member, ScriptObject variable)