Author: atsushi
Date: 2006-01-13 04:38:11 -0500 (Fri, 13 Jan 2006)
New Revision: 55497

Modified:
   trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/ChangeLog
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpObjects.cs
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpPatterns.cs
   trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
   trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDatatype.cs
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDefaultDatatypes.cs
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/XsdDatatypeProvider.cs
Log:
2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>

        * RdpObjects.cs, RdpPatterns.cs : introduced "IsContextDependent"
          optimization; when a pattern is (namespace) context independent
          (almost all cases except for QName validation), new TextDeriv()
          overload that takes MemoizationStore memoizes TextDeriv results.

        * RelaxngDatatype.cs, RelaxngDefaultDatatypes.cs,
          XsdDatatypeProvider.cs, RelaxngValidatingReader.cs :
          Memoize TextDeriv() results for context independent inputs.

          Due to the API freeze they are kept as internal virtual for now.



Modified: trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
===================================================================
--- trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog   
2006-01-13 09:00:47 UTC (rev 55496)
+++ trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog   
2006-01-13 09:38:11 UTC (rev 55497)
@@ -1,3 +1,11 @@
+2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>
+
+       * RelaxngDatatype.cs, RelaxngDefaultDatatypes.cs,
+         XsdDatatypeProvider.cs, RelaxngValidatingReader.cs :
+         Memoize TextDeriv() results for context independent inputs.
+
+         Due to the API freeze they are kept as internal virtual for now.
+
 2006-01-12  Atsushi Enomoto <[EMAIL PROTECTED]>
 
        * RelaxngValidatingReader.cs : Use RdpPattern.EmptyTextDeriv(). It

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDatatype.cs
===================================================================
--- trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDatatype.cs  
2006-01-13 09:00:47 UTC (rev 55496)
+++ trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDatatype.cs  
2006-01-13 09:38:11 UTC (rev 55497)
@@ -38,6 +38,11 @@
                public abstract string Name { get; }
                public abstract string NamespaceURI { get; }
 
+               internal virtual bool IsContextDependent {
+                       // safe default value
+                       get { return true; }
+               }
+
                public abstract object Parse (string text, XmlReader reader);
 
                public virtual bool Compare (object o1, object o2)

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDefaultDatatypes.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDefaultDatatypes.cs
  2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngDefaultDatatypes.cs
  2006-01-13 09:38:11 UTC (rev 55497)
@@ -48,6 +48,10 @@
                public override string Name { get { return "string"; } }
                public override string NamespaceURI { get { return 
String.Empty; } }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override bool IsValid (string text, XmlReader reader)
                {
                        return true;
@@ -79,6 +83,10 @@
                public override string Name { get { return "token"; } }
                public override string NamespaceURI { get { return 
String.Empty; } }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override bool IsValid (string text, XmlReader reader)
                {
                        return true;

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
  2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
  2006-01-13 09:38:11 UTC (rev 55497)
@@ -472,8 +472,8 @@
 
                RdpPattern TextDeriv (RdpPattern p, string value, XmlReader 
context)
                {
-                       if (p.IsTextValueDependent)
-                               return p.TextDeriv (value, context);
+                       if (value.Length > 0 && p.IsTextValueDependent)
+                               return memo.TextDeriv (p, value, context);
                        else
                                return memo.EmptyTextDeriv (p);
                }
@@ -548,6 +548,7 @@
                Hashtable textOnly = new Hashtable ();
                Hashtable mixedText = new Hashtable ();
                Hashtable emptyText = new Hashtable ();
+               Hashtable text = new Hashtable ();
 
                enum DerivativeType {
                        StartTagOpen,
@@ -674,6 +675,25 @@
                        return m;
                }
 
+               public RdpPattern TextDeriv (RdpPattern p, string value, 
XmlReader context)
+               {
+                       if (p.IsContextDependent)
+                               return p.TextDeriv (value, context);
+
+                       Hashtable h = text [p] as Hashtable;
+                       if (h == null) {
+                               h = new Hashtable ();
+                               text [p] = h;
+                       }
+
+                       RdpPattern m = h [value] as RdpPattern;
+                       if (m != null)
+                               return m;
+                       m = p.TextDeriv (value, context, this);
+                       h [value] = m;
+                       return m;
+               }
+
                public RdpPattern EmptyTextDeriv (RdpPattern p)
                {
                        RdpPattern m = emptyText [p] as RdpPattern;

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/XsdDatatypeProvider.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/XsdDatatypeProvider.cs  
    2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/XsdDatatypeProvider.cs  
    2006-01-13 09:38:11 UTC (rev 55497)
@@ -197,6 +197,10 @@
                        get { return type.QualifiedName.Namespace; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return type.Datatype != null && 
type.Datatype.TokenizedType == XmlTokenizedType.QName; }
+               }
+
                public override object Parse (string value, XmlReader reader)
                {
                        // Now we create XmlValidatingReader to handle
@@ -229,6 +233,10 @@
                        dt = xstype;
                }
 
+               internal override bool IsContextDependent {
+                       get { return dt.TokenizedType == 
XmlTokenizedType.QName; }
+               }
+
                public override string Name {
                        get { return name; }
                }
@@ -260,6 +268,10 @@
                        get { return 
"http://www.w3.org/2001/XMLSchema-datatypes";; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return true; }
+               }
+
                public override object Parse (string s, XmlReader reader) 
                {
                        int colonAt = s.IndexOf (':');

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/ChangeLog
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/ChangeLog    
    2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/ChangeLog    
    2006-01-13 09:38:11 UTC (rev 55497)
@@ -1,3 +1,10 @@
+2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>
+
+       * RdpObjects.cs, RdpPatterns.cs : introduced "IsContextDependent"
+         optimization; when a pattern is (namespace) context independent
+         (almost all cases except for QName validation), new TextDeriv()
+         overload that takes MemoizationStore memoizes TextDeriv results.
+
 2006-01-12  Atsushi Enomoto <[EMAIL PROTECTED]>
 
        * RdpPattern.cs :

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpObjects.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpObjects.cs
    2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpObjects.cs
    2006-01-13 09:38:11 UTC (rev 55497)
@@ -95,6 +95,10 @@
                        get { return localName; }
                }
 
+               public bool IsContextDependent {
+                       get { return datatype.IsContextDependent; }
+               }
+
                public virtual bool IsAllowed (string value, XmlReader reader)
                {
                        return datatype.IsValid (value, reader);

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpPatterns.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpPatterns.cs
   2006-01-13 09:00:47 UTC (rev 55496)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpPatterns.cs
   2006-01-13 09:38:11 UTC (rev 55497)
@@ -294,6 +294,10 @@
                        get { return false; }
                }
 
+               internal virtual bool IsContextDependent {
+                       get { return false; }
+               }
+
                // fills QName collection
                public void GetLabels (LabelList elements, LabelList attributes)
                {
@@ -326,9 +330,14 @@
                        return RdpNotAllowed.Instance;
                }
 
+               internal virtual RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       return TextDeriv (s, reader);
+               }
+
                internal virtual RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
-                       return TextDeriv (String.Empty, null);
+                       return TextDeriv (String.Empty, null, memo);
                }
 
                internal virtual RdpPattern TextOnlyDeriv ()
@@ -511,6 +520,10 @@
                        get { return false; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                static RdpEmpty instance;
                public static RdpEmpty Instance {
                        get { return instance; }
@@ -568,6 +581,10 @@
                        get { return false; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override RdpPattern ApplyAfter (RdpApplyAfterHandler h)
                {
                        return RdpNotAllowed.Instance;
@@ -624,6 +641,10 @@
                        get { return false; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Text; }
                }
@@ -801,6 +822,19 @@
                        }
                }
 
+               bool isContextDependentComputed;
+               bool isContextDependent;
+
+               internal override bool IsContextDependent {
+                       get {
+                               if (!isContextDependentComputed) {
+                                       isContextDependent = 
LValue.IsContextDependent || RValue.IsContextDependent;
+                                       isContextDependentComputed = true;
+                               }
+                               return isContextDependent;
+                       }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Choice; }
                }
@@ -863,6 +897,11 @@
                        return LValue.TextDeriv (s, reader).Choice 
(RValue.TextDeriv (s, reader));
                }
 
+               internal override RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       return memo.TextDeriv (LValue, s, reader).Choice 
(memo.TextDeriv (RValue, s, reader));
+               }
+
                internal override RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
                        return memo.EmptyTextDeriv (LValue)
@@ -1000,6 +1039,10 @@
                        get { return LValue.IsTextValueDependent || 
RValue.IsTextValueDependent; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return LValue.IsContextDependent || 
RValue.IsContextDependent; }
+               }
+
                public override void GetLabels (LabelList elements, LabelList 
attributes, bool collectNameClass)
                {
                        LValue.GetLabels (elements, attributes, 
collectNameClass);
@@ -1029,6 +1072,12 @@
                                .Choice (LValue.Interleave (RValue.TextDeriv 
(s, reader)));
                }
 
+               internal override RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       return memo.TextDeriv (LValue, s, reader).Interleave 
(RValue)
+                               .Choice (LValue.Interleave (memo.TextDeriv 
(RValue, s, reader)));
+               }
+
                internal override RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
                        return memo.EmptyTextDeriv (LValue).Interleave (RValue)
@@ -1172,6 +1221,10 @@
                        get { return LValue.IsTextValueDependent || 
(LValue.Nullable ? RValue.IsTextValueDependent : false); }
                }
 
+               internal override bool IsContextDependent {
+                       get { return LValue.IsContextDependent || 
(LValue.Nullable ? RValue.IsContextDependent : false); }
+               }
+
                public override void GetLabels (LabelList elements, LabelList 
attributes, bool collectNameClass)
                {
                        LValue.GetLabels (elements, attributes, 
collectNameClass);
@@ -1188,6 +1241,13 @@
                                p.Choice (RValue.TextDeriv (s, reader)) : p;
                }
 
+               internal override RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       RdpPattern p = memo.TextDeriv (LValue, s, reader).Group 
(RValue);
+                       return LValue.Nullable ?
+                               p.Choice (memo.TextDeriv (RValue, s, reader)) : 
p;
+               }
+
                internal override RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
                        RdpPattern p = memo.EmptyTextDeriv (LValue).Group 
(RValue);
@@ -1371,6 +1431,10 @@
                        get { return Child.IsTextValueDependent; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return Child.IsContextDependent; }
+               }
+
                public override void GetLabels (LabelList elements, LabelList 
attributes, bool collectNameClass)
                {
                        Child.GetLabels (elements, attributes, 
collectNameClass);
@@ -1398,6 +1462,11 @@
                        return Child.TextDeriv (s, reader).Group (this.Choice 
(RdpEmpty.Instance));
                }
 
+               internal override RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       return memo.TextDeriv (Child, s, reader).Group 
(this.Choice (RdpEmpty.Instance));
+               }
+
                internal virtual RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
                        return memo.EmptyTextDeriv (Child).Group (this.Choice 
(RdpEmpty.Instance));
@@ -1529,6 +1598,10 @@
                        get { return true; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return Child.IsContextDependent; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.List; }
                }
@@ -1589,6 +1662,10 @@
                        get { return true; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return dt.IsContextDependent; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Data; }
                }
@@ -1713,6 +1790,10 @@
                        get { return true; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return dt.IsContextDependent; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Value; }
                }
@@ -1778,6 +1859,10 @@
                        get { return false; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Attribute; }
                }
@@ -1918,6 +2003,10 @@
                        get { return false; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return false; }
+               }
+
                public override RelaxngPatternType PatternType {
                        get { return RelaxngPatternType.Element; }
                }
@@ -2038,6 +2127,10 @@
                        get { return LValue.IsTextValueDependent; }
                }
 
+               internal override bool IsContextDependent {
+                       get { return LValue.IsContextDependent; }
+               }
+
                public override void GetLabels (LabelList elements, LabelList 
attributes, bool collectNameClass)
                {
                        LValue.GetLabels (elements, attributes, 
collectNameClass);
@@ -2048,6 +2141,11 @@
                        return LValue.TextDeriv (s, reader).After (RValue);
                }
 
+               internal override RdpPattern TextDeriv (string s, XmlReader 
reader, MemoizationStore memo)
+               {
+                       return memo.TextDeriv (LValue, s, reader).After 
(RValue);
+               }
+
                internal override RdpPattern EmptyTextDeriv (MemoizationStore 
memo)
                {
                        return memo.EmptyTextDeriv (LValue).After (RValue);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to