diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2020-01-18 14:01:12 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2020-01-26 15:50:35 -0500 |
commit | 90d19b0a319a2e153069896453e02a53b1e2cd06 (patch) | |
tree | 4f94fa878b334494c1814525bf9e4b06aa4d0861 | |
parent | f7bb7e81e3a6aa272e8ffa80e6f94ac340e7d1fb (diff) | |
download | UXP-90d19b0a319a2e153069896453e02a53b1e2cd06.tar UXP-90d19b0a319a2e153069896453e02a53b1e2cd06.tar.gz UXP-90d19b0a319a2e153069896453e02a53b1e2cd06.tar.lz UXP-90d19b0a319a2e153069896453e02a53b1e2cd06.tar.xz UXP-90d19b0a319a2e153069896453e02a53b1e2cd06.zip |
Bug 1355479 - Remove isindex on the Java side and allow the C++ side to reduce malloc in attribute handling.
Tag UXP Issue #1344
10 files changed, 180 insertions, 336 deletions
diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/AttributeName.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/AttributeName.java index 3377a1f60..24f89ddb0 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/AttributeName.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/AttributeName.java @@ -33,7 +33,6 @@ import nu.validator.htmlparser.annotation.NsUri; import nu.validator.htmlparser.annotation.Prefix; import nu.validator.htmlparser.annotation.QName; import nu.validator.htmlparser.annotation.Unsigned; -import nu.validator.htmlparser.annotation.Virtual; import nu.validator.htmlparser.common.Interner; public final class AttributeName @@ -275,35 +274,19 @@ public final class AttributeName */ static AttributeName nameByBuffer(@NoLength char[] buf, int offset, int length - // [NOCPP[ - , boolean checkNcName - // ]NOCPP] , Interner interner) { // XXX deal with offset @Unsigned int hash = AttributeName.bufToHash(buf, length); int index = Arrays.binarySearch(AttributeName.ATTRIBUTE_HASHES, hash); if (index < 0) { - return AttributeName.createAttributeName( - Portability.newLocalNameFromBuffer(buf, offset, length, - interner) - // [NOCPP[ - , checkNcName - // ]NOCPP] - ); - } else { - AttributeName attributeName = AttributeName.ATTRIBUTE_NAMES[index]; - @Local String name = attributeName.getLocal(AttributeName.HTML); - if (!Portability.localEqualsBuffer(name, buf, offset, length)) { - return AttributeName.createAttributeName( - Portability.newLocalNameFromBuffer(buf, offset, length, - interner) - // [NOCPP[ - , checkNcName - // ]NOCPP] - ); - } - return attributeName; + return null; + } + AttributeName attributeName = AttributeName.ATTRIBUTE_NAMES[index]; + @Local String name = attributeName.getLocal(AttributeName.HTML); + if (!Portability.localEqualsBuffer(name, buf, offset, length)) { + return null; } + return attributeName; } /** @@ -385,6 +368,8 @@ public final class AttributeName */ private final @Prefix @NoLength String[] prefix; + // CPPONLY: private final boolean custom; + // [NOCPP[ private final int flags; @@ -410,7 +395,7 @@ public final class AttributeName * @param xmlns * whether this is an xmlns attribute */ - protected AttributeName(@NsUri @NoLength String[] uri, + private AttributeName(@NsUri @NoLength String[] uri, @Local @NoLength String[] local, @Prefix @NoLength String[] prefix // [NOCPP[ , int flags @@ -423,8 +408,27 @@ public final class AttributeName this.qName = COMPUTE_QNAME(local, prefix); this.flags = flags; // ]NOCPP] + // CPPONLY: this.custom = false; } + // CPPONLY: public AttributeName() { + // CPPONLY: this.uri = AttributeName.ALL_NO_NS; + // CPPONLY: this.local = AttributeName.SAME_LOCAL(null); + // CPPONLY: this.prefix = ALL_NO_PREFIX; + // CPPONLY: this.custom = true; + // CPPONLY: } + // CPPONLY: + // CPPONLY: public boolean isInterned() { + // CPPONLY: return !custom; + // CPPONLY: } + // CPPONLY: + // CPPONLY: public void setNameForNonInterned(@Local String name) { + // CPPONLY: assert custom; + // CPPONLY: local[0] = name; + // CPPONLY: local[1] = name; + // CPPONLY: local[2] = name; + // CPPONLY: } + /** * Creates an <code>AttributeName</code> for a local name. * @@ -434,7 +438,7 @@ public final class AttributeName * whether to check ncnameness * @return an <code>AttributeName</code> */ - private static AttributeName createAttributeName(@Local String name + static AttributeName createAttributeName(@Local String name // [NOCPP[ , boolean checkNcName // ]NOCPP] @@ -452,32 +456,12 @@ public final class AttributeName } /** - * Deletes runtime-allocated instances in C++. - */ - @Virtual void release() { - // No-op in Java. - // Implement as |delete this;| in subclass. - } - - /** * The C++ destructor. */ - @SuppressWarnings("unused") @Virtual private void destructor() { + @SuppressWarnings("unused") private void destructor() { Portability.deleteArray(local); } - /** - * Clones the attribute using an interner. Returns <code>this</code> in Java - * and for non-dynamic instances in C++. - * - * @param interner - * an interner - * @return a clone - */ - @Virtual public AttributeName cloneAttributeName(Interner interner) { - return this; - } - // [NOCPP[ /** * Creator for use when the XML violation policy requires an attribute name diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java index 01d76d700..3d87422aa 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/CoalescingTreeBuilder.java @@ -22,10 +22,10 @@ package nu.validator.htmlparser.impl; -import nu.validator.htmlparser.annotation.NoLength; - import org.xml.sax.SAXException; +import nu.validator.htmlparser.annotation.NoLength; + /** * A common superclass for tree builders that coalesce their text nodes. * @@ -48,13 +48,6 @@ public abstract class CoalescingTreeBuilder<T> extends TreeBuilder<T> { appendCharacters(parent, new String(buf, start, length)); } - /** - * @see nu.validator.htmlparser.impl.TreeBuilder#appendIsindexPrompt(java.lang.Object) - */ - @Override protected void appendIsindexPrompt(T parent) throws SAXException { - appendCharacters(parent, "This is a searchable index. Enter search keywords: "); - } - protected abstract void appendCharacters(T parent, String text) throws SAXException; /** diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/ElementName.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/ElementName.java index b3ca30286..e961c4397 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/ElementName.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/ElementName.java @@ -192,6 +192,11 @@ public final class ElementName assert this.flags == (TreeBuilder.OTHER | NOT_INTERNED); } + // CPPONLY: public static final ElementName ISINDEX = new ElementName("isindex", "isindex", TreeBuilder.ISINDEX | SPECIAL); + // [NOCPP[ + public static final ElementName ISINDEX = new ElementName("isindex", "isindex", TreeBuilder.OTHER); + // ]NOCPP] + // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate // /** @@ -421,6 +426,9 @@ public final class ElementName // } // for (int i = 0; i < ELEMENT_NAMES.length; i++) { // ElementName el = ELEMENT_NAMES[i]; +// if ("isindex".equals(el.name)) { +// continue; +// } // System.out.println("public static final ElementName " // + el.constName() + " = new ElementName" + el.toString() // + ";"); @@ -439,6 +447,7 @@ public final class ElementName // System.out.println("};"); // } + // START GENERATED CODE public static final ElementName AND = new ElementName("and", "and", TreeBuilder.OTHER); public static final ElementName ARG = new ElementName("arg", "arg", TreeBuilder.OTHER); @@ -828,7 +837,6 @@ public final class ElementName public static final ElementName APPROX = new ElementName("approx", "approx", TreeBuilder.OTHER); public static final ElementName FECOLORMATRIX = new ElementName("fecolormatrix", "feColorMatrix", TreeBuilder.OTHER); public static final ElementName FECONVOLVEMATRIX = new ElementName("feconvolvematrix", "feConvolveMatrix", TreeBuilder.OTHER); - public static final ElementName ISINDEX = new ElementName("isindex", "isindex", TreeBuilder.ISINDEX | SPECIAL); public static final ElementName MATRIX = new ElementName("matrix", "matrix", TreeBuilder.OTHER); public static final ElementName APPLY = new ElementName("apply", "apply", TreeBuilder.OTHER); public static final ElementName BODY = new ElementName("body", "body", TreeBuilder.BODY | SPECIAL | OPTIONAL_END_TAG); diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/HtmlAttributes.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/HtmlAttributes.java index 45c9c6c3e..c24ae74f2 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/HtmlAttributes.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/HtmlAttributes.java @@ -25,7 +25,9 @@ package nu.validator.htmlparser.impl; -import nu.validator.htmlparser.annotation.Auto; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + import nu.validator.htmlparser.annotation.IdType; import nu.validator.htmlparser.annotation.Local; import nu.validator.htmlparser.annotation.NsUri; @@ -34,9 +36,6 @@ import nu.validator.htmlparser.annotation.QName; import nu.validator.htmlparser.common.Interner; import nu.validator.htmlparser.common.XmlViolationPolicy; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; - /** * Be careful with this class. QName is the name in from HTML tokenization. * Otherwise, please refer to the interface doc. @@ -46,14 +45,10 @@ import org.xml.sax.SAXException; */ public final class HtmlAttributes implements Attributes { - // [NOCPP[ - private static final AttributeName[] EMPTY_ATTRIBUTENAMES = new AttributeName[0]; private static final String[] EMPTY_STRINGS = new String[0]; - // ]NOCPP] - public static final HtmlAttributes EMPTY_ATTRIBUTES = new HtmlAttributes( AttributeName.HTML); @@ -61,13 +56,9 @@ public final class HtmlAttributes implements Attributes { private int length; - private @Auto AttributeName[] names; - - private @Auto String[] values; // XXX perhaps make this @NoLength? - - // CPPONLY: private @Auto int[] lines; // XXX perhaps make this @NoLength? + private AttributeName[] names; - // [NOCPP[ + private String[] values; private String idValue; @@ -77,21 +68,15 @@ public final class HtmlAttributes implements Attributes { private String[] xmlnsValues; - // ]NOCPP] - public HtmlAttributes(int mode) { this.mode = mode; this.length = 0; /* * The length of 5 covers covers 98.3% of elements - * according to Hixie, but lets round to the next power of two for - * jemalloc. + * according to Hixie. */ - this.names = new AttributeName[8]; - this.values = new String[8]; - // CPPONLY: this.lines = new int[8]; - - // [NOCPP[ + this.names = new AttributeName[5]; + this.values = new String[5]; this.idValue = null; @@ -101,25 +86,6 @@ public final class HtmlAttributes implements Attributes { this.xmlnsValues = HtmlAttributes.EMPTY_STRINGS; - // ]NOCPP] - } - /* - public HtmlAttributes(HtmlAttributes other) { - this.mode = other.mode; - this.length = other.length; - this.names = new AttributeName[other.length]; - this.values = new String[other.length]; - // [NOCPP[ - this.idValue = other.idValue; - this.xmlnsLength = other.xmlnsLength; - this.xmlnsNames = new AttributeName[other.xmlnsLength]; - this.xmlnsValues = new String[other.xmlnsLength]; - // ]NOCPP] - } - */ - - void destructor() { - clear(0); } /** @@ -161,7 +127,6 @@ public final class HtmlAttributes implements Attributes { * @return the local name at index */ public @Local String getLocalNameNoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; return names[index].getLocal(mode); } @@ -171,7 +136,6 @@ public final class HtmlAttributes implements Attributes { * @return the namespace URI at index */ public @NsUri String getURINoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; return names[index].getUri(mode); } @@ -181,7 +145,6 @@ public final class HtmlAttributes implements Attributes { * @return the namespace prefix at index */ public @Prefix String getPrefixNoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; return names[index].getPrefix(mode); } @@ -191,7 +154,6 @@ public final class HtmlAttributes implements Attributes { * @return the attribute value at index */ public String getValueNoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; return values[index]; } @@ -201,21 +163,9 @@ public final class HtmlAttributes implements Attributes { * @return the attribute name at index */ public AttributeName getAttributeNameNoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; return names[index]; } - // CPPONLY: /** - // CPPONLY: * Obtains a line number without bounds check. - // CPPONLY: * @param index a valid attribute index - // CPPONLY: * @return the line number at index or -1 if unknown - // CPPONLY: */ - // CPPONLY: public int getLineNoBoundsCheck(int index) { - // CPPONLY: assert index < length && index >= 0: "Index out of bounds"; - // CPPONLY: return lines[index]; - // CPPONLY: } - - // [NOCPP[ /** * Variant of <code>getQName(int index)</code> without bounds check. @@ -404,15 +354,9 @@ public final class HtmlAttributes implements Attributes { } } - // ]NOCPP] - void addAttribute(AttributeName name, String value - // [NOCPP[ , XmlViolationPolicy xmlnsPolicy - // ]NOCPP] - // CPPONLY: , int line ) throws SAXException { - // [NOCPP[ if (name == AttributeName.ID) { idValue = value; } @@ -441,8 +385,6 @@ public final class HtmlAttributes implements Attributes { } } - // ]NOCPP] - if (names.length == length) { int newLen = length << 1; // The first growth covers virtually // 100% of elements according to @@ -453,53 +395,25 @@ public final class HtmlAttributes implements Attributes { String[] newValues = new String[newLen]; System.arraycopy(values, 0, newValues, 0, values.length); values = newValues; - // CPPONLY: int[] newLines = new int[newLen]; - // CPPONLY: System.arraycopy(lines, 0, newLines, 0, lines.length); - // CPPONLY: lines = newLines; } names[length] = name; values[length] = value; - // CPPONLY: lines[length] = line; length++; } void clear(int m) { for (int i = 0; i < length; i++) { - names[i].release(); names[i] = null; - Portability.releaseString(values[i]); values[i] = null; } length = 0; mode = m; - // [NOCPP[ idValue = null; for (int i = 0; i < xmlnsLength; i++) { xmlnsNames[i] = null; xmlnsValues[i] = null; } xmlnsLength = 0; - // ]NOCPP] - } - - /** - * This is used in C++ to release special <code>isindex</code> - * attribute values whose ownership is not transferred. - */ - void releaseValue(int i) { - Portability.releaseString(values[i]); - } - - /** - * This is only used for <code>AttributeName</code> ownership transfer - * in the isindex case to avoid freeing custom names twice in C++. - */ - void clearWithoutReleasingContents() { - for (int i = 0; i < length; i++) { - names[i] = null; - values[i] = null; - } - length = 0; } boolean contains(AttributeName name) { @@ -508,13 +422,11 @@ public final class HtmlAttributes implements Attributes { return true; } } - // [NOCPP[ for (int i = 0; i < xmlnsLength; i++) { if (name.equalsAnother(xmlnsNames[i])) { return true; } } - // ]NOCPP] return false; } @@ -529,27 +441,20 @@ public final class HtmlAttributes implements Attributes { public HtmlAttributes cloneAttributes(Interner interner) throws SAXException { assert (length == 0 - // [NOCPP[ && xmlnsLength == 0 - // ]NOCPP] ) || mode == 0 || mode == 3; HtmlAttributes clone = new HtmlAttributes(0); for (int i = 0; i < length; i++) { - clone.addAttribute(names[i].cloneAttributeName(interner), - Portability.newStringFromString(values[i]) - // [NOCPP[ + clone.addAttribute(names[i], + values[i] , XmlViolationPolicy.ALLOW - // ]NOCPP] - // CPPONLY: , lines[i] ); } - // [NOCPP[ for (int i = 0; i < xmlnsLength; i++) { clone.addAttribute(xmlnsNames[i], xmlnsValues[i], XmlViolationPolicy.ALLOW); } - // ]NOCPP] return clone; // XXX!!! } @@ -568,9 +473,10 @@ public final class HtmlAttributes implements Attributes { for (int j = 0; j < otherLength; j++) { if (ownLocal == other.names[j].getLocal(AttributeName.HTML)) { found = true; - if (!Portability.stringEqualsString(values[i], other.values[j])) { + if (!values[i].equals(other.values[j])) { return false; } + break; } } if (!found) { @@ -579,9 +485,7 @@ public final class HtmlAttributes implements Attributes { } return true; } - - // [NOCPP[ - + void processNonNcNames(TreeBuilder<?> treeBuilder, XmlViolationPolicy namePolicy) throws SAXException { for (int i = 0; i < length; i++) { AttributeName attName = names[i]; @@ -613,8 +517,4 @@ public final class HtmlAttributes implements Attributes { } } } - - - // ]NOCPP] - } diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/Tokenizer.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/Tokenizer.java index 59ff3bd7e..435f071e9 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/Tokenizer.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/Tokenizer.java @@ -434,6 +434,8 @@ public class Tokenizer implements Locator { */ protected AttributeName attributeName = null; + // CPPONLY: private AttributeName nonInternedAttributeName = null; + // [NOCPP[ /** @@ -530,6 +532,7 @@ public class Tokenizer implements Locator { this.tagName = null; this.nonInternedTagName = new ElementName(); this.attributeName = null; + // CPPONLY: this.nonInternedAttributeName = new AttributeName(); this.doctypeName = null; this.publicIdentifier = null; this.systemIdentifier = null; @@ -560,6 +563,7 @@ public class Tokenizer implements Locator { this.tagName = null; this.nonInternedTagName = new ElementName(); this.attributeName = null; + // CPPONLY: this.nonInternedAttributeName = new AttributeName(); this.doctypeName = null; this.publicIdentifier = null; this.systemIdentifier = null; @@ -1174,11 +1178,17 @@ public class Tokenizer implements Locator { } private void attributeNameComplete() throws SAXException { - attributeName = AttributeName.nameByBuffer(strBuf, 0, strBufLen - // [NOCPP[ - , namePolicy != XmlViolationPolicy.ALLOW - // ]NOCPP] - , interner); + attributeName = AttributeName.nameByBuffer(strBuf, 0, strBufLen, interner); + if (attributeName == null) { + // [NOCPP[ + attributeName = AttributeName.createAttributeName( + Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen, + interner), + namePolicy != XmlViolationPolicy.ALLOW); + // ]NOCPP] + // CPPONLY: nonInternedAttributeName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen, interner)); + // CPPONLY: attributeName = nonInternedAttributeName; + } clearStrBufAfterUse(); if (attributes == null) { @@ -1195,7 +1205,6 @@ public class Tokenizer implements Locator { */ if (attributes.contains(attributeName)) { errDuplicateAttribute(); - attributeName.release(); attributeName = null; } } @@ -1244,8 +1253,7 @@ public class Tokenizer implements Locator { // [NOCPP[ } // ]NOCPP] - attributeName = null; // attributeName has been adopted by the - // |attributes| object + attributeName = null; } else { clearStrBufAfterUse(); } @@ -1276,8 +1284,7 @@ public class Tokenizer implements Locator { // ]NOCPP] // CPPONLY: , attributeLine ); - attributeName = null; // attributeName has been adopted by the - // |attributes| object + attributeName = null; } else { // We have a duplicate attribute. Explicitly discard its value. clearStrBufAfterUse(); @@ -6667,10 +6674,8 @@ public class Tokenizer implements Locator { } tagName = null; nonInternedTagName.setNameForNonInterned(null); - if (attributeName != null) { - attributeName.release(); - attributeName = null; - } + attributeName = null; + // CPPONLY: nonInternedAttributeName.setNameForNonInterned(null); tokenHandler.endTokenization(); if (attributes != null) { // [NOCPP[ @@ -6747,13 +6752,8 @@ public class Tokenizer implements Locator { endTag = false; shouldSuspend = false; initDoctypeFields(); - if (tagName != null) { - tagName = null; - } - if (attributeName != null) { - attributeName.release(); - attributeName = null; - } + tagName = null; + attributeName = null; if (newAttributesEachTime) { if (attributes != null) { Portability.delete(attributes); @@ -6818,22 +6818,27 @@ public class Tokenizer implements Locator { } else if (other.tagName.isInterned()) { tagName = other.tagName; } else { - // In the C++ case, We might be loading state from another - // tokenizer that has atoms from a different tokenizer-scoped - // atom table. Therefore, we have to obtain the correspoding - // atom from our own atom table. + // In the C++ case, the atoms in the other tokenizer are from a + // different tokenizer-scoped atom table. Therefore, we have to + // obtain the correspoding atom from our own atom table. nonInternedTagName.setNameForNonInterned(Portability.newLocalFromLocal(other.tagName.getName(), interner)); tagName = nonInternedTagName; } - if (attributeName != null) { - attributeName.release(); - } - if (other.attributeName == null) { - attributeName = null; - } else { - attributeName = other.attributeName.cloneAttributeName(interner); - } + // [NOCPP[ + attributeName = other.attributeName; + // ]NOCPP] + // CPPONLY: if (other.attributeName == null) { + // CPPONLY: attributeName = null; + // CPPONLY: } else if (other.attributeName.isInterned()) { + // CPPONLY: attributeName = other.attributeName; + // CPPONLY: } else { + // CPPONLY: // In the C++ case, the atoms in the other tokenizer are from a + // CPPONLY: // different tokenizer-scoped atom table. Therefore, we have to + // CPPONLY: // obtain the correspoding atom from our own atom table. + // CPPONLY: nonInternedAttributeName.setNameForNonInterned(Portability.newLocalFromLocal(other.attributeName.getLocal(AttributeName.HTML), interner)); + // CPPONLY: attributeName = nonInternedAttributeName; + // CPPONLY: } Portability.delete(attributes); if (other.attributes == null) { @@ -7075,6 +7080,7 @@ public class Tokenizer implements Locator { void destructor() { Portability.delete(nonInternedTagName); + // CPPONLY: Portability.delete(nonInternedAttributeName); nonInternedTagName = null; // The translator will write refcount tracing stuff here Portability.delete(attributes); diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/TreeBuilder.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/TreeBuilder.java index db0775e18..5e1a93bfd 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/TreeBuilder.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/impl/TreeBuilder.java @@ -2326,85 +2326,74 @@ public abstract class TreeBuilder<T> implements TokenHandler, selfClosing = false; attributes = null; // CPP break starttagloop; - case ISINDEX: - errIsindex(); - if (formPointer != null && !isTemplateContents()) { - break starttagloop; - } - implicitlyCloseP(); - HtmlAttributes formAttrs = new HtmlAttributes(0); - int actionIndex = attributes.getIndex(AttributeName.ACTION); - if (actionIndex > -1) { - formAttrs.addAttribute( - AttributeName.ACTION, - attributes.getValueNoBoundsCheck(actionIndex) - // [NOCPP[ - , XmlViolationPolicy.ALLOW - // ]NOCPP] - // CPPONLY: , attributes.getLineNoBoundsCheck(actionIndex) - ); - } - appendToCurrentNodeAndPushFormElementMayFoster(formAttrs); - appendVoidElementToCurrentMayFoster( - ElementName.HR, - HtmlAttributes.EMPTY_ATTRIBUTES); - appendToCurrentNodeAndPushElementMayFoster( - ElementName.LABEL, - HtmlAttributes.EMPTY_ATTRIBUTES); - int promptIndex = attributes.getIndex(AttributeName.PROMPT); - if (promptIndex > -1) { - @Auto char[] prompt = Portability.newCharArrayFromString(attributes.getValueNoBoundsCheck(promptIndex)); - appendCharacters(stack[currentPtr].node, - prompt, 0, prompt.length); - } else { - appendIsindexPrompt(stack[currentPtr].node); - } - HtmlAttributes inputAttributes = new HtmlAttributes( - 0); - inputAttributes.addAttribute( - AttributeName.NAME, - Portability.newStringFromLiteral("isindex") - // [NOCPP[ - , XmlViolationPolicy.ALLOW - // ]NOCPP] - // CPPONLY: , tokenizer.getLineNumber() - ); - for (int i = 0; i < attributes.getLength(); i++) { - AttributeName attributeQName = attributes.getAttributeNameNoBoundsCheck(i); - if (AttributeName.NAME == attributeQName - || AttributeName.PROMPT == attributeQName) { - attributes.releaseValue(i); - } else if (AttributeName.ACTION != attributeQName) { - inputAttributes.addAttribute( - attributeQName, - attributes.getValueNoBoundsCheck(i) - // [NOCPP[ - , XmlViolationPolicy.ALLOW - // ]NOCPP] - // CPPONLY: , attributes.getLineNoBoundsCheck(i) - ); - } - } - attributes.clearWithoutReleasingContents(); - appendVoidElementToCurrentMayFoster( - "input", - inputAttributes, formPointer); - pop(); // label - appendVoidElementToCurrentMayFoster( - ElementName.HR, - HtmlAttributes.EMPTY_ATTRIBUTES); - pop(); // form - - if (!isTemplateContents()) { - formPointer = null; - } - - selfClosing = false; - // Portability.delete(formAttrs); - // Portability.delete(inputAttributes); - // Don't delete attributes, they are deleted - // later - break starttagloop; + // CPPONLY:case ISINDEX: + // CPPONLY: errIsindex(); + // CPPONLY: if (formPointer != null && !isTemplateContents()) { + // CPPONLY: break starttagloop; + // CPPONLY: } + // CPPONLY: implicitlyCloseP(); + // CPPONLY: HtmlAttributes formAttrs = new HtmlAttributes(0); + // CPPONLY: int actionIndex = attributes.getIndex(AttributeName.ACTION); + // CPPONLY: if (actionIndex > -1) { + // CPPONLY: formAttrs.addAttribute( + // CPPONLY: AttributeName.ACTION, + // CPPONLY: attributes.getValueNoBoundsCheck(actionIndex), + // CPPONLY: attributes.getLineNoBoundsCheck(actionIndex) + // CPPONLY: ); + // CPPONLY: } + // CPPONLY: appendToCurrentNodeAndPushFormElementMayFoster(formAttrs); + // CPPONLY: appendVoidElementToCurrentMayFoster( + // CPPONLY: ElementName.HR, + // CPPONLY: HtmlAttributes.EMPTY_ATTRIBUTES); + // CPPONLY: appendToCurrentNodeAndPushElementMayFoster( + // CPPONLY: ElementName.LABEL, + // CPPONLY: HtmlAttributes.EMPTY_ATTRIBUTES); + // CPPONLY: int promptIndex = attributes.getIndex(AttributeName.PROMPT); + // CPPONLY: if (promptIndex > -1) { + // CPPONLY: @Auto char[] prompt = Portability.newCharArrayFromString(attributes.getValueNoBoundsCheck(promptIndex)); + // CPPONLY: appendCharacters(stack[currentPtr].node, + // CPPONLY: prompt, 0, prompt.length); + // CPPONLY: } else { + // CPPONLY: appendIsindexPrompt(stack[currentPtr].node); + // CPPONLY: } + // CPPONLY: HtmlAttributes inputAttributes = new HtmlAttributes( + // CPPONLY: 0); + // CPPONLY: inputAttributes.addAttribute( + // CPPONLY: AttributeName.NAME, + // CPPONLY: Portability.newStringFromLiteral("isindex"), + // CPPONLY: tokenizer.getLineNumber() + // CPPONLY: ); + // CPPONLY: for (int i = 0; i < attributes.getLength(); i++) { + // CPPONLY: @Local String attributeQName = attributes.getLocalNameNoBoundsCheck(i); + // CPPONLY: if ("name" == attributeQName + // CPPONLY: || "prompt" == attributeQName) { + // CPPONLY: attributes.releaseValue(i); + // CPPONLY: } else if ("action" != attributeQName) { + // CPPONLY: inputAttributes.AddAttributeWithLocal( + // CPPONLY: attributeQName, + // CPPONLY: attributes.getValueNoBoundsCheck(i), + // CPPONLY: attributes.getLineNoBoundsCheck(i) + // CPPONLY: ); + // CPPONLY: } + // CPPONLY: } + // CPPONLY: attributes.clearWithoutReleasingContents(); + // CPPONLY: appendVoidElementToCurrentMayFoster( + // CPPONLY: "input", + // CPPONLY: inputAttributes, formPointer); + // CPPONLY: pop(); // label + // CPPONLY: appendVoidElementToCurrentMayFoster( + // CPPONLY: ElementName.HR, + // CPPONLY: HtmlAttributes.EMPTY_ATTRIBUTES); + // CPPONLY: pop(); // form + // CPPONLY: + // CPPONLY: if (!isTemplateContents()) { + // CPPONLY: formPointer = null; + // CPPONLY: } + // CPPONLY: + // CPPONLY: selfClosing = false; + // CPPONLY: // Don't delete attributes, they are deleted + // CPPONLY: // later + // CPPONLY: break starttagloop; case TEXTAREA: appendToCurrentNodeAndPushElementMayFoster( elementName, @@ -3837,7 +3826,7 @@ public abstract class TreeBuilder<T> implements TokenHandler, case INPUT: case KEYGEN: // XXX?? case HR: - case ISINDEX: + // CPPONLY: case ISINDEX: case IFRAME: case NOEMBED: // XXX??? case NOFRAMES: // XXX?? @@ -5681,7 +5670,7 @@ public abstract class TreeBuilder<T> implements TokenHandler, protected abstract void appendCharacters(T parent, @NoLength char[] buf, int start, int length) throws SAXException; - protected abstract void appendIsindexPrompt(T parent) throws SAXException; + // CPPONLY: protected abstract void appendIsindexPrompt(T parent) throws SAXException; protected abstract void appendComment(T parent, @NoLength char[] buf, int start, int length) throws SAXException; @@ -6377,9 +6366,9 @@ public abstract class TreeBuilder<T> implements TokenHandler, err("Saw a start tag \u201Cimage\u201D."); } - private void errIsindex() throws SAXException { - err("\u201Cisindex\u201D seen."); - } + // CPPONLY: private void errIsindex() throws SAXException { + // CPPONLY: err("\u201Cisindex\u201D seen."); + // CPPONLY: } private void errFooSeenWhenFooOpen(@Local String name) throws SAXException { if (errorHandler == null) { diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXStreamer.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXStreamer.java index 07ff5da4a..d2dc60bdb 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXStreamer.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXStreamer.java @@ -23,26 +23,24 @@ package nu.validator.htmlparser.sax; -import nu.validator.htmlparser.impl.HtmlAttributes; -import nu.validator.htmlparser.impl.TreeBuilder; - import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.ext.LexicalHandler; -class SAXStreamer extends TreeBuilder<Attributes>{ +import nu.validator.htmlparser.impl.HtmlAttributes; +import nu.validator.htmlparser.impl.TreeBuilder; - private static final char[] ISINDEX_PROMPT = "This is a searchable index. Enter search keywords: ".toCharArray(); +class SAXStreamer extends TreeBuilder<Attributes>{ private ContentHandler contentHandler = null; private LexicalHandler lexicalHandler = null; - + SAXStreamer() { super(); } - + @Override protected void addAttributesToElement(Attributes element, HtmlAttributes attributes) throws SAXException { Attributes existingAttrs = element; @@ -59,14 +57,6 @@ class SAXStreamer extends TreeBuilder<Attributes>{ contentHandler.characters(buf, start, length); } - /** - * @see nu.validator.htmlparser.impl.TreeBuilder#appendIsindexPrompt(java.lang.Object) - */ - @Override protected void appendIsindexPrompt(Attributes parent) - throws SAXException { - contentHandler.characters(ISINDEX_PROMPT, 0, ISINDEX_PROMPT.length); - } - @Override protected void appendChildrenToNewParent(Attributes oldParent, Attributes newParent) throws SAXException { fatal(); diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXTreeBuilder.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXTreeBuilder.java index ef51d2a51..3e099b579 100644 --- a/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXTreeBuilder.java +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/sax/SAXTreeBuilder.java @@ -23,6 +23,8 @@ package nu.validator.htmlparser.sax; +import org.xml.sax.SAXException; + import nu.validator.htmlparser.impl.HtmlAttributes; import nu.validator.htmlparser.impl.TreeBuilder; import nu.validator.saxtree.Characters; @@ -34,12 +36,8 @@ import nu.validator.saxtree.Element; import nu.validator.saxtree.Node; import nu.validator.saxtree.ParentNode; -import org.xml.sax.SAXException; - class SAXTreeBuilder extends TreeBuilder<Element> { - private static final char[] ISINDEX_PROMPT = "This is a searchable index. Enter search keywords: ".toCharArray(); - private Document document; private Node cachedTable = null; @@ -65,14 +63,6 @@ class SAXTreeBuilder extends TreeBuilder<Element> { parent.appendChild(new Characters(tokenizer, buf, start, length)); } - /** - * @see nu.validator.htmlparser.impl.TreeBuilder#appendIsindexPrompt(java.lang.Object) - */ - @Override protected void appendIsindexPrompt(Element parent) - throws SAXException { - parent.appendChild(new Characters(tokenizer, ISINDEX_PROMPT, 0, ISINDEX_PROMPT.length)); - } - @Override protected boolean hasChildren(Element element) { return element.getFirstChild() != null; diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java index af042ce96..9a2a85795 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppVisitor.java @@ -448,13 +448,6 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { printer.print("#include \""); printer.print(className); printer.printLn(".h\""); - if ("AttributeName".equals(javaClassName)) { - printer.print("#include \""); - printer.print(cppTypes.classPrefix()); - printer.print("Releasable"); - printer.print(javaClassName); - printer.printLn(".h\""); - } printer.printLn(); } @@ -1386,18 +1379,12 @@ public class CppVisitor extends AnnotationHelperVisitor<LocalSymbolTable> { suppressPointer = true; printTypeArgs(n.getTypeArgs(), arg); - if ("createAttributeName".equals(currentMethod)) { - printer.print(cppTypes.classPrefix()); - printer.print("Releasable"); - printer.print(n.getType().getName()); - } else { - n.getType().accept(this, arg); - } + n.getType().accept(this, arg); suppressPointer = false; if ("AttributeName".equals(n.getType().getName())) { List<Expression> args = n.getArgs(); - while (args.size() > 3) { + while (args != null && args.size() > 3) { args.remove(3); } } diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java index 53347bd42..09602ccba 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/Main.java @@ -37,19 +37,18 @@ package nu.validator.htmlparser.cpptranslate; -import japa.parser.JavaParser; -import japa.parser.ParseException; -import japa.parser.ast.CompilationUnit; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import japa.parser.JavaParser; +import japa.parser.ParseException; +import japa.parser.ast.CompilationUnit; + public class Main { static final String[] H_LIST = { @@ -58,7 +57,6 @@ public class Main { "MetaScanner", "AttributeName", "ElementName", - "HtmlAttributes", "StackNode", "UTF16Buffer", "StateSnapshot", @@ -71,7 +69,6 @@ public class Main { "MetaScanner", "AttributeName", "ElementName", - "HtmlAttributes", "StackNode", "UTF16Buffer", "StateSnapshot", |