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