Пример #1
0
 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;
     }
 }
Пример #2
0
 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);
     }
 }