Changeset 7083


Ignore:
Timestamp:
11/15/16 20:04:04 (8 years ago)
Author:
Oliver Schonefeld
Message:
  • enhance performance: prevent allocation of char arrays for codepoint
File:
1 edited

Legend:

Unmodified
Added
Removed
  • FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/parser/QueryParser.java

    r7082 r7083  
    799799
    800800    private static String unescapeString(String s) {
    801         StringBuilder sb = new StringBuilder();
     801        /*
     802         * buffer to store chars by Character.toChars; pre-allocate to avoid
     803         * allocation for every codepoint.
     804         */
     805        final char[] buf = new char[2];
     806
     807        final StringBuilder sb = new StringBuilder();
    802808        for (int i = 0; i < s.length(); i++) {
    803809            int cp = s.codePointAt(i);
     
    810816                    sb.append("\\");
    811817                    break;
    812                 case '"': /* double quote */
     818                case '"':   /* double quote */
    813819                    sb.append("\"");
    814820                    break;
    815                 case '\'': /* single-quote */
     821                case '\'':  /* single quote */
    816822                    sb.append("'");
    817823                    break;
    818                 case 'n': /* new line */
     824                case 'n':   /* new line */
    819825                    sb.append("\n");
    820826                    break;
    821                 case 't': /* tabulator */
     827                case 't':   /* tabulator */
    822828                    sb.append("\t");
    823829                    break;
    824                 case 'x':
    825                     i = unescapeUnicode(s, i, 2, sb);
     830                case 'x':   /* x HEX HEX */
     831                    i = unescapeUnicode(s, i, 2, sb, buf);
    826832                    break;
    827                 case 'u':
    828                     i = unescapeUnicode(s, i, 4, sb);
     833                case 'u':   /* u HEX HEX HEX HEX */
     834                    i = unescapeUnicode(s, i, 4, sb, buf);
    829835                    break;
    830                 case 'U':
    831                     i = unescapeUnicode(s, i, 8, sb);
     836                case 'U':   /* U HEX HEX HEX HEX HEX HEX HEX HEX */
     837                    i = unescapeUnicode(s, i, 8, sb, buf);
    832838                    break;
    833839                }
    834840            } else {
    835841                try {
    836                     sb.append(Character.toChars(cp));
     842                    final int len = Character.toChars(cp, buf, 0);
     843                    sb.append(buf, 0, len);
    837844                } catch (IllegalArgumentException e) {
    838845                    throw new ExpressionTreeBuilderException(
    839                             "invalid codepoint: 0x" + Integer.toHexString(cp));
     846                            "invalid codepoint: 0x" +
     847                                    Integer.toHexString(cp).toUpperCase());
    840848                }
    841849            }
     
    846854
    847855    private static final int unescapeUnicode(String s, int i, int size,
    848             StringBuilder sb) {
     856            StringBuilder sb, char[] buf) {
    849857        if ((s.length() - i - 1) >= size) {
    850858            int cp = 0;
     
    854862                    cp = cp << 4;
    855863                }
    856                 cp |= parseHexString(s.charAt(i));
     864                cp |= parseHexString(s.codePointAt(i));
    857865            }
    858866            try {
    859                 sb.append(Character.toChars(cp));
     867                final int len = Character.toChars(cp, buf, 0);
     868                sb.append(buf, 0, len);
    860869            } catch (IllegalArgumentException e) {
    861870                throw new ExpressionTreeBuilderException(
     
    870879
    871880
    872     private static final int parseHexString(char c) {
     881    private static final int parseHexString(int c) {
    873882        switch (c) {
    874883        case '0':
     
    917926            return 15;
    918927        default:
     928            /*
     929             * actually, this should never happen, as ANTLR's lexer should catch
     930             * illegal HEX characters
     931             */
    919932            throw new ExpressionTreeBuilderException(
    920                     "invalud hex character: " + c);
     933                    "invalud hex character: " +
     934                            new String(Character.toChars(c)));
    921935        }
    922936    }
Note: See TracChangeset for help on using the changeset viewer.