private void TransformFunctionNode(AbstractFunctionPtg afp, ParseNode[] children, byte desiredOperandClass, bool callerForceArrayFlag) { bool localForceArrayFlag; byte defaultReturnOperandClass = afp.DefaultOperandClass; if (callerForceArrayFlag) { switch (defaultReturnOperandClass) { case Ptg.CLASS_REF: if (desiredOperandClass == Ptg.CLASS_REF) { afp.PtgClass = (Ptg.CLASS_REF); } else { afp.PtgClass = (Ptg.CLASS_ARRAY); } localForceArrayFlag = false; break; case Ptg.CLASS_ARRAY: afp.PtgClass = (Ptg.CLASS_ARRAY); localForceArrayFlag = false; break; case Ptg.CLASS_VALUE: afp.PtgClass = (Ptg.CLASS_ARRAY); localForceArrayFlag = true; break; default: throw new InvalidOperationException("Unexpected operand class (" + defaultReturnOperandClass + ")"); } } else { if (defaultReturnOperandClass == desiredOperandClass) { localForceArrayFlag = false; // an alternative would have been To for non-base Ptgs To Set their operand class // from their default, but this would require the call in many subclasses because // the default OC is not known until the end of the constructor afp.PtgClass = (defaultReturnOperandClass); } else { switch (desiredOperandClass) { case Ptg.CLASS_VALUE: // always OK To Set functions To return 'value' afp.PtgClass = (Ptg.CLASS_VALUE); localForceArrayFlag = false; break; case Ptg.CLASS_ARRAY: switch (defaultReturnOperandClass) { case Ptg.CLASS_REF: afp.PtgClass = (Ptg.CLASS_REF); // afp.SetClass(Ptg.CLASS_ARRAY); break; case Ptg.CLASS_VALUE: afp.PtgClass = (Ptg.CLASS_ARRAY); break; default: throw new InvalidOperationException("Unexpected operand class (" + defaultReturnOperandClass + ")"); } localForceArrayFlag = (defaultReturnOperandClass == Ptg.CLASS_VALUE); break; case Ptg.CLASS_REF: switch (defaultReturnOperandClass) { case Ptg.CLASS_ARRAY: afp.PtgClass=(Ptg.CLASS_ARRAY); break; case Ptg.CLASS_VALUE: afp.PtgClass=(Ptg.CLASS_VALUE); break; default: throw new InvalidOperationException("Unexpected operand class (" + defaultReturnOperandClass + ")"); } localForceArrayFlag = false; break; default: throw new InvalidOperationException("Unexpected operand class (" + desiredOperandClass + ")"); } } } for (int i = 0; i < children.Length; i++) { ParseNode child = children[i]; byte paramOperandClass = afp.GetParameterClass(i); TransformNode(child, paramOperandClass, localForceArrayFlag); } }