private object CompileAtomizeValueExpr(object expr, XQuerySequenceType type) { if (type.Equals(XQuerySequenceType.Item)) return Lisp.List(ID.Atomize, expr); else if (type.IsNode || type.Cardinality != XmlTypeCardinality.One) { Type resType = type.AtomizedValueType; if (type.Cardinality == XmlTypeCardinality.One || type.Cardinality == XmlTypeCardinality.OneOrMore) { if (resType != typeof(System.Object)) return Lisp.List(Funcs.Cast, Lisp.List(ID.AtomizeX, expr), resType); else return Lisp.List(ID.AtomizeX, expr); } else { if (resType != typeof(System.Object)) return Lisp.List(Funcs.Cast, Lisp.List(ID.Atomize, expr), resType); else return Lisp.List(ID.Atomize, expr); } } else { if (type.ItemType != typeof(System.Object)) return Lisp.List(Funcs.Cast, expr, type.ItemType); else return expr; } }
private object CompileAtomizeNumberExpr(object expr, XQuerySequenceType type) { if (type.Equals(XQuerySequenceType.Item)) return Lisp.List(ID.CastToNumber1, Lisp.List(ID.Atomize, expr)); else if (type.IsNode || type.Cardinality != XmlTypeCardinality.One) { Type resType = type.AtomizedValueType; if (resType == typeof(UntypedAtomic) && (_context.SchemaProcessing == SchemaProcessingMode.Force || _context.NeedValidatedParser)) resType = typeof(System.Object); if (type.Cardinality == XmlTypeCardinality.One || type.Cardinality == XmlTypeCardinality.OneOrMore) { if (ValueProxy.IsNumeric(resType)) return Lisp.List(Funcs.Cast, Lisp.List(ID.AtomizeX, expr), resType); else if (resType == typeof(UntypedAtomic)) return Lisp.List(ID.CastToNumber2, Lisp.List(ID.AtomizeX, expr)); else return Lisp.List(ID.CastToNumber1, Lisp.List(ID.AtomizeX, expr)); } else { if (ValueProxy.IsNumeric(resType)) return Lisp.List(Funcs.Cast, Lisp.List(ID.Atomize, expr), resType); else if (resType == typeof(UntypedAtomic)) return Lisp.List(ID.CastToNumber2, Lisp.List(ID.Atomize, expr)); else return Lisp.List(ID.CastToNumber1, Lisp.List(ID.Atomize, expr)); } } else { if (type.IsNumeric) return Lisp.List(Funcs.Cast, expr, type.ItemType); else if (type.IsUntypedAtomic) return Lisp.List(ID.CastToNumber2, expr); else return Lisp.List(ID.CastToNumber1, expr); } }