From 5b862aa38c4fcb1c91797c947ff86b5f70b3ba54 Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sat, 18 Jan 2020 10:31:06 -0500 Subject: Bug 1352082 - Avoid shifting a signed integer left in C++. Tag UXP Issue #1344 --- .../validator/htmlparser/annotation/Unsigned.java | 30 ++++++++++++++++++++++ .../validator/htmlparser/impl/AttributeName.java | 11 ++++---- .../nu/validator/htmlparser/impl/ElementName.java | 7 ++--- .../cpptranslate/AnnotationHelperVisitor.java | 4 +++ .../htmlparser/cpptranslate/CppTypes.java | 4 +++ .../htmlparser/cpptranslate/CppVisitor.java | 6 ++++- 6 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 parser/html/java/htmlparser/src/nu/validator/htmlparser/annotation/Unsigned.java (limited to 'parser') diff --git a/parser/html/java/htmlparser/src/nu/validator/htmlparser/annotation/Unsigned.java b/parser/html/java/htmlparser/src/nu/validator/htmlparser/annotation/Unsigned.java new file mode 100644 index 000000000..53606572a --- /dev/null +++ b/parser/html/java/htmlparser/src/nu/validator/htmlparser/annotation/Unsigned.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017 Mozilla Foundation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * Applied to an integer type to generate the unsigned variant in C++. + */ +package nu.validator.htmlparser.annotation; + +public @interface Unsigned { + +} 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 48d82036c..9cab8c3d0 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 @@ -31,6 +31,7 @@ import nu.validator.htmlparser.annotation.NoLength; 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; @@ -278,7 +279,7 @@ public final class AttributeName // ]NOCPP] , Interner interner) { // XXX deal with offset - int hash = AttributeName.bufToHash(buf, length); + @Unsigned int hash = AttributeName.bufToHash(buf, length); int index = Arrays.binarySearch(AttributeName.ATTRIBUTE_HASHES, hash); if (index < 0) { return AttributeName.createAttributeName( @@ -312,9 +313,9 @@ public final class AttributeName * @param len * @return */ - private static int bufToHash(@NoLength char[] buf, int len) { - int hash2 = 0; - int hash = len; + private static @Unsigned int bufToHash(@NoLength char[] buf, int len) { + @Unsigned int hash2 = 0; + @Unsigned int hash = len; hash <<= 5; hash += buf[0] - 0x60; int j = len; @@ -396,7 +397,7 @@ public final class AttributeName @Local @NoLength String[] local, @Prefix @NoLength String[] prefix // [NOCPP[ , int flags - // ]NOCPP] + // ]NOCPP] ) { this.uri = uri; this.local = local; 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 ee0493318..39cff44ee 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 @@ -29,6 +29,7 @@ import java.util.Arrays; import nu.validator.htmlparser.annotation.Inline; import nu.validator.htmlparser.annotation.Local; import nu.validator.htmlparser.annotation.NoLength; +import nu.validator.htmlparser.annotation.Unsigned; import nu.validator.htmlparser.annotation.Virtual; import nu.validator.htmlparser.common.Interner; @@ -110,7 +111,7 @@ public final class ElementName } static ElementName elementNameByBuffer(@NoLength char[] buf, int offset, int length, Interner interner) { - int hash = ElementName.bufToHash(buf, length); + @Unsigned int hash = ElementName.bufToHash(buf, length); int index = Arrays.binarySearch(ElementName.ELEMENT_HASHES, hash); if (index < 0) { return new ElementName(Portability.newLocalNameFromBuffer(buf, offset, length, interner)); @@ -133,8 +134,8 @@ public final class ElementName * @param len * @return */ - private static int bufToHash(@NoLength char[] buf, int len) { - int hash = len; + private static @Unsigned int bufToHash(@NoLength char[] buf, int len) { + @Unsigned int hash = len; hash <<= 5; hash += buf[0] - 0x60; int j = len; diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java index 337394a89..dc524820f 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/AnnotationHelperVisitor.java @@ -72,6 +72,10 @@ public class AnnotationHelperVisitor extends VoidVisitorAdapter { return hasAnnotation("NoLength"); } + protected boolean unsigned() { + return hasAnnotation("Unsigned"); + } + protected boolean auto() { return hasAnnotation("Auto"); } diff --git a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java index 80216da0e..6cbba4162 100644 --- a/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java +++ b/parser/html/java/htmlparser/translator-src/nu/validator/htmlparser/cpptranslate/CppTypes.java @@ -192,6 +192,10 @@ public class CppTypes { return "int32_t"; } + public String unsignedIntType() { + return "uint32_t"; + } + public String stringType() { return "nsHtml5String"; } 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 f4f00070a..bf5775eb6 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 @@ -548,7 +548,11 @@ public class CppVisitor extends AnnotationHelperVisitor { case Float: throw new IllegalStateException("Unsupported primitive."); case Int: - printer.print(cppTypes.intType()); + if (unsigned()) { + printer.print(cppTypes.unsignedIntType()); + } else { + printer.print(cppTypes.intType()); + } break; case Long: throw new IllegalStateException("Unsupported primitive."); -- cgit v1.2.3