internal object GetVariableValue(VariableAction variable)
{
int variablekey = variable.VarKey;
if (variable.IsGlobal)
{
ActionFrame rootFrame = (ActionFrame)this.actionStack[0];
object result = rootFrame.GetVariable(variablekey);
if (result != null)
{
return(result);
}
// Variable wasn't evaluated yet
if (variable.Stylesheetid == -1)
{
throw XsltException.Create(Res.Xslt_CircularReference, variable.NameStr);
}
int saveStackSize = this.actionStack.Length;
ActionFrame varFrame = PushNewFrame();
varFrame.Inherit(rootFrame);
varFrame.Init(variable, rootFrame.NodeSet);
do
{
bool endOfFrame = ((ActionFrame)this.actionStack.Peek()).Execute(this);
if (endOfFrame)
{
this.actionStack.Pop();
}
} while (saveStackSize < this.actionStack.Length);
Debug.Assert(saveStackSize == this.actionStack.Length);
result = rootFrame.GetVariable(variablekey);
Debug.Assert(result != null, "Variable was just calculated and result can't be null");
return(result);
}
else
{
return(((ActionFrame)this.actionStack.Peek()).GetVariable(variablekey));
}
}