--- old/src/java.base/share/classes/java/lang/Integer.java 2016-01-15 13:31:14.243265172 +0300
+++ new/src/java.base/share/classes/java/lang/Integer.java 2016-01-15 13:31:14.131265739 +0300
@@ -339,7 +339,6 @@
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
-
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedInt(val, shift, buf, 0, chars);
@@ -477,8 +476,13 @@
* values, to cover the Integer.MIN_VALUE case. Converting otherwise
* (negative to positive) will expose -Integer.MIN_VALUE that overflows
* integer.
+ *
+ * @param i value to convert
+ * @param index next index, after the least significant digit
+ * @param buf target buffer, Latin1-encoded
+ * @return index of the most significant digit or minus sign, if present
*/
- static void getChars(int i, int index, byte[] buf) {
+ static int getChars(int i, int index, byte[] buf) {
int q, r;
int charPos = index;
@@ -509,9 +513,19 @@
if (negative) {
buf[--charPos] = (byte)'-';
}
+ return charPos;
}
- static void getCharsUTF16(int i, int index, byte[] buf) {
+ /**
+ * This is a variant of {@link #getChars(int, int, byte[])}, but for
+ * UTF-16 coder.
+ *
+ * @param i value to convert
+ * @param index next index, after the least significant digit
+ * @param buf target buffer, UTF16-coded.
+ * @return index of the most significant digit or minus sign, if present
+ */
+ static int getCharsUTF16(int i, int index, byte[] buf) {
int q, r;
int charPos = index;
@@ -542,6 +556,7 @@
if (negative) {
StringUTF16.putChar(buf, --charPos, '-');
}
+ return charPos;
}
// Left here for compatibility reasons, see JDK-8143900.
--- old/src/java.base/share/classes/java/lang/Long.java 2016-01-15 13:31:14.731262709 +0300
+++ new/src/java.base/share/classes/java/lang/Long.java 2016-01-15 13:31:14.631263214 +0300
@@ -379,7 +379,6 @@
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
-
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedLong0(val, shift, buf, 0, chars);
@@ -489,8 +488,13 @@
* values, to cover the Long.MIN_VALUE case. Converting otherwise
* (negative to positive) will expose -Long.MIN_VALUE that overflows
* long.
+ *
+ * @param i value to convert
+ * @param index next index, after the least significant digit
+ * @param buf target buffer, Latin1-encoded
+ * @return index of the most significant digit or minus sign, if present
*/
- static void getChars(long i, int index, byte[] buf) {
+ static int getChars(long i, int index, byte[] buf) {
long q;
int r;
int charPos = index;
@@ -533,9 +537,19 @@
if (negative) {
buf[--charPos] = (byte)'-';
}
+ return charPos;
}
- static void getCharsUTF16(long i, int index, byte[] buf) {
+ /**
+ * This is a variant of {@link #getChars(long, int, byte[])}, but for
+ * UTF-16 coder.
+ *
+ * @param i value to convert
+ * @param index next index, after the least significant digit
+ * @param buf target buffer, UTF16-coded.
+ * @return index of the most significant digit or minus sign, if present
+ */
+ static int getCharsUTF16(long i, int index, byte[] buf) {
long q;
int r;
int charPos = index;
@@ -578,6 +592,7 @@
if (negative) {
StringUTF16.putChar(buf, --charPos, '-');
}
+ return charPos;
}
/**
--- old/test/com/sun/jdi/LineNumberInfo.java 2016-01-15 13:31:15.859257011 +0300
+++ new/test/com/sun/jdi/LineNumberInfo.java 2016-01-15 13:31:15.735257640 +0300
@@ -29,7 +29,7 @@
*
* @modules jdk.jdi
* @run build TestScaffold VMConnection TargetListener TargetAdapter
- * @run compile -g LineNumberInfo.java ControlFlow.java
+ * @run compile -XDstringConcat=inline -g LineNumberInfo.java ControlFlow.java
*
* @run driver LineNumberInfo
*/
--- old/test/com/sun/jdi/sde/InstallSDE.java 2016-01-15 13:31:16.503253761 +0300
+++ new/test/com/sun/jdi/sde/InstallSDE.java 2016-01-15 13:31:16.395254307 +0300
@@ -253,12 +253,16 @@
case 3: // Integer
case 4: // Float
case 12: // NameAndType
+ case 18: // InvokeDynamic
copy(4);
break;
case 5: // Long
case 6: // Double
copy(8);
break;
+ case 15: // MethodHandle
+ copy(3);
+ break;
case 1: // Utf8
int len = readU2();
writeU2(len);
--- old/test/java/lang/invoke/InvokeDynamicPrintArgs.java 2016-01-15 13:31:17.083250830 +0300
+++ new/test/java/lang/invoke/InvokeDynamicPrintArgs.java 2016-01-15 13:31:16.967251416 +0300
@@ -28,7 +28,7 @@
* @compile InvokeDynamicPrintArgs.java
* @run main/othervm
* indify.Indify
- * --verify-specifier-count=3
+ * --verify-specifier-count=8
* --expand-properties --classpath ${test.classes}
* --java test.java.lang.invoke.InvokeDynamicPrintArgs --check-output
* @run main/othervm
--- old/test/java/lang/invoke/MethodHandleConstants.java 2016-01-15 13:31:17.659247924 +0300
+++ new/test/java/lang/invoke/MethodHandleConstants.java 2016-01-15 13:31:17.555248449 +0300
@@ -28,7 +28,7 @@
* @compile MethodHandleConstants.java
* @run main/othervm
* indify.Indify
- * --verify-specifier-count=0
+ * --verify-specifier-count=4
* --expand-properties --classpath ${test.classes}
* --java test.java.lang.invoke.MethodHandleConstants --check-output
* @run main/othervm
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/src/java.base/share/classes/java/lang/StringConcatHelper.java 2016-01-15 13:31:18.155245417 +0300
@@ -0,0 +1,345 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang;
+
+/**
+ * Helper for string concatenation. These methods are mostly looked up with private lookups
+ * from {@link java.lang.invoke.StringConcatFactory}, and used in {@link java.lang.invoke.MethodHandle}
+ * combinators there.
+ */
+final class StringConcatHelper {
+
+ private StringConcatHelper() {
+ // no instantiation
+ }
+
+ /**
+ * Check for overflow, throw the exception on overflow.
+ * @param len String length
+ * @return length
+ */
+ private static int checkOverflow(int len) {
+ if (len < 0) {
+ throw new OutOfMemoryError("Overflow: String length out of range");
+ }
+ return len;
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, boolean value) {
+ return checkOverflow(current + (value ? 4 : 5));
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, byte value) {
+ return mixLen(current, (int)value);
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, char value) {
+ return checkOverflow(current + 1);
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, short value) {
+ return mixLen(current, (int)value);
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, int value) {
+ return checkOverflow(current + Integer.stringSize(value));
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, long value) {
+ return checkOverflow(current + Long.stringSize(value));
+ }
+
+ /**
+ * Mix value length into current length
+ * @param current current length
+ * @param value value to mix in
+ * @return new length
+ */
+ static int mixLen(int current, String value) {
+ return checkOverflow(current + value.length());
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, char value) {
+ return (byte)(current | (StringLatin1.canEncode(value) ? 0 : 1));
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, String value) {
+ return (byte)(current | value.coder());
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, boolean value) {
+ // Booleans are represented with Latin1
+ return current;
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, byte value) {
+ // Bytes are represented with Latin1
+ return current;
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, short value) {
+ // Shorts are represented with Latin1
+ return current;
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, int value) {
+ // Ints are represented with Latin1
+ return current;
+ }
+
+ /**
+ * Mix coder into current coder
+ * @param current current coder
+ * @param value value to mix in
+ * @return new coder
+ */
+ static byte mixCoder(byte current, long value) {
+ // Longs are represented with Latin1
+ return current;
+ }
+
+ /**
+ * Prepends the stringly representation of boolean value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value boolean value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, boolean value) {
+ if (coder == String.LATIN1) {
+ if (value) {
+ buf[--index] = 'e';
+ buf[--index] = 'u';
+ buf[--index] = 'r';
+ buf[--index] = 't';
+ } else {
+ buf[--index] = 'e';
+ buf[--index] = 's';
+ buf[--index] = 'l';
+ buf[--index] = 'a';
+ buf[--index] = 'f';
+ }
+ } else {
+ if (value) {
+ StringUTF16.putChar(buf, --index, 'e');
+ StringUTF16.putChar(buf, --index, 'u');
+ StringUTF16.putChar(buf, --index, 'r');
+ StringUTF16.putChar(buf, --index, 't');
+ } else {
+ StringUTF16.putChar(buf, --index, 'e');
+ StringUTF16.putChar(buf, --index, 's');
+ StringUTF16.putChar(buf, --index, 'l');
+ StringUTF16.putChar(buf, --index, 'a');
+ StringUTF16.putChar(buf, --index, 'f');
+ }
+ }
+ return index;
+ }
+
+ /**
+ * Prepends the stringly representation of byte value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value byte value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, byte value) {
+ return prepend(index, buf, coder, (int)value);
+ }
+
+ /**
+ * Prepends the stringly representation of char value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value char value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, char value) {
+ if (coder == String.LATIN1) {
+ buf[--index] = (byte) (value & 0xFF);
+ } else {
+ StringUTF16.putChar(buf, --index, value);
+ }
+ return index;
+ }
+
+ /**
+ * Prepends the stringly representation of short value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value short value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, short value) {
+ return prepend(index, buf, coder, (int)value);
+ }
+
+ /**
+ * Prepends the stringly representation of integer value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value integer value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, int value) {
+ if (coder == String.LATIN1) {
+ return Integer.getChars(value, index, buf);
+ } else {
+ return Integer.getCharsUTF16(value, index, buf);
+ }
+ }
+
+ /**
+ * Prepends the stringly representation of long value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value long value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, long value) {
+ if (coder == String.LATIN1) {
+ return Long.getChars(value, index, buf);
+ } else {
+ return Long.getCharsUTF16(value, index, buf);
+ }
+ }
+
+ /**
+ * Prepends the stringly representation of String value into buffer,
+ * given the coder and final index. Index is measured in chars, not in bytes!
+ *
+ * @param index final char index in the buffer
+ * @param buf buffer to append to
+ * @param coder coder to add with
+ * @param value String value to encode
+ * @return new index
+ */
+ static int prepend(int index, byte[] buf, byte coder, String value) {
+ index -= value.length();
+ value.getBytes(buf, index, coder);
+ return index;
+ }
+
+ /**
+ * Instantiates the String with given buffer and coder
+ * @param buf buffer to use
+ * @param coder coder to use
+ * @return String resulting string
+ */
+ static String newString(byte[] buf, byte coder) {
+ // Use the private, non-copying constructor (unsafe!)
+ return new String(buf, coder);
+ }
+
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/src/java.base/share/classes/java/lang/invoke/StringConcatException.java 2016-01-15 13:31:18.715242591 +0300
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang.invoke;
+
+/**
+ * StringConcatException is thrown by {@link StringConcatFactory} when linkage
+ * invariants are violated.
+ */
+public class StringConcatException extends Exception {
+ private static final long serialVersionUID = 292L + 9L;
+
+ /**
+ * Constructs an exception with a message
+ * @param msg exception message
+ */
+ public StringConcatException(String msg) {
+ super(msg);
+ }
+
+ /**
+ * Constructs an exception with a message and a linked throwable
+ * @param msg exception message
+ * @param cause throwable cause
+ */
+ public StringConcatException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java 2016-01-15 13:31:19.275239764 +0300
@@ -0,0 +1,1789 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang.invoke;
+
+import jdk.internal.org.objectweb.asm.ClassWriter;
+import jdk.internal.org.objectweb.asm.Label;
+import jdk.internal.org.objectweb.asm.MethodVisitor;
+import jdk.internal.org.objectweb.asm.Opcodes;
+import sun.misc.Unsafe;
+
+import java.lang.invoke.MethodHandles.Lookup;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
+
+import static jdk.internal.org.objectweb.asm.Opcodes.*;
+
+/**
+ *
Methods to facilitate the creation of String concatenation methods, that
+ * can be used to efficiently concatenate a known number of arguments of known
+ * types, possibly after type adaptation and partial evaluation of arguments.
+ * These methods are typically used as bootstrap methods for {@code
+ * invokedynamic} call sites, to support the string concatenation
+ * feature of the Java Programming Language.
+ *
+ *
Indirect access to the behavior specified by the provided {@code
+ * MethodHandle} proceeds in order through two phases:
+ *
+ *
+ * Linkage occurs when the methods in this class are invoked.
+ * They take as arguments a method type describing the concatenated arguments
+ * count and types, and optionally the String recipe , plus the
+ * constants that participate in the String concatenation. The details on
+ * accepted recipe shapes are described further below. Linkage may involve
+ * dynamically loading a new class that implements the expected concatenation
+ * behavior. The {@code CallSite} holds the {@code MethodHandle} pointing to the
+ * exact concatenation method. The concatenation methods may be shared among
+ * different {@code CallSite}s, e.g. if linkage methods produce them as pure
+ * functions.
+ *
+ * Invocation occurs when a generated concatenation method is
+ * invoked with the exact dynamic arguments. This may occur many times for a
+ * single concatenation method. The method referenced by the behavior {@code
+ * MethodHandle} is invoked with the static arguments and any additional dynamic
+ * arguments provided on invocation, as if by {@link MethodHandle#invoke(Object...)}.
+ *
+ *
+ * This class provides two forms of linkage methods: a simple version
+ * ({@link #makeConcat(java.lang.invoke.MethodHandles.Lookup, String,
+ * MethodType)}) using only the dynamic arguments, and an advanced version
+ * ({@link #makeConcatWithConstants(java.lang.invoke.MethodHandles.Lookup,
+ * String, MethodType, String, Object...)} using the advanced forms of capturing
+ * the constant arguments. The advanced strategy can produce marginally better
+ * invocation bytecode, at the expense of exploding the number of shapes of
+ * string concatenation methods present at runtime, because those shapes would
+ * include constant static arguments as well.
+ *
+ * @author Aleksey Shipilev
+ * @author Remi Forax
+ * @author Peter Levart
+ *
+ * @apiNote
+ *
There is a JVM limit (classfile structural constraint): no method
+ * can call with more than 255 slots. This limits the number of static and
+ * dynamic arguments one can pass to bootstrap method. Since there are potential
+ * concatenation strategies that use {@code MethodHandle} combinators, we need
+ * to reserve a few empty slots on the parameter lists to to capture the
+ * temporal results. This is why bootstrap methods in this factory do not accept
+ * more than 200 argument slots. Users requiring more than 200 argument slots in
+ * concatenation are expected to split the large concatenation in smaller
+ * expressions.
+ */
+public final class StringConcatFactory {
+
+ /**
+ * Tag used to demarcate an ordinary argument.
+ */
+ private static final char TAG_ARG = '\u0001';
+
+ /**
+ * Tag used to demarcate a constant.
+ */
+ private static final char TAG_CONST = '\u0002';
+
+ /**
+ * Maximum number of argument slots in String Concat call.
+ *
+ * While the maximum number of argument slots that indy call can handle is 253,
+ * we do not use all those slots, to let the strategies with MethodHandle
+ * combinators to use some arguments.
+ */
+ private static final int MAX_INDY_CONCAT_ARG_SLOTS = 200;
+
+ /**
+ * Concatenation strategy to use. See {@link Strategy} for possible options.
+ * This option is controllable with -Djava.lang.invoke.stringConcat JDK option.
+ */
+ private static final Strategy STRATEGY;
+
+ /**
+ * Default strategy to use for concatenation.
+ */
+ private static final Strategy DEFAULT_STRATEGY = Strategy.BC_SB_SIZED;
+
+ private enum Strategy {
+ /**
+ * Bytecode generator, calling into {@link java.lang.StringBuilder}.
+ */
+ BC_SB,
+
+ /**
+ * Bytecode generator, calling into {@link java.lang.StringBuilder};
+ * but trying to estimate the required storage.
+ */
+ BC_SB_SIZED,
+
+ /**
+ * Bytecode generator, calling into {@link java.lang.StringBuilder};
+ * but computing the required storage exactly.
+ */
+ BC_SB_SIZED_EXACT,
+
+ /**
+ * MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
+ * This strategy also tries to estimate the required storage.
+ */
+ MH_SB_SIZED,
+
+ /**
+ * MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
+ * This strategy also estimate the required storage exactly.
+ */
+ MH_SB_SIZED_EXACT,
+
+ /**
+ * MethodHandle-based generator, that constructs its own byte[] array from
+ * the arguments. It computes the required storage exactly.
+ */
+ MH_INLINE_SIZED_EXACT
+ }
+
+ /**
+ * Enables debugging: this may print debugging messages, perform additional (non-neutral for performance)
+ * checks, etc.
+ */
+ private static final boolean DEBUG;
+
+ /**
+ * Enables caching of strategy stubs. This may improve the linkage time by reusing the generated
+ * code, at the expense of contaminating the profiles.
+ */
+ private static final boolean CACHE_ENABLE;
+
+ private static final ConcurrentMap CACHE;
+
+ static {
+ // Poke the privileged block once, taking everything we need:
+ final Object[] values = new Object[3];
+ AccessController.doPrivileged((PrivilegedAction) () -> {
+ values[0] = System.getProperty("java.lang.invoke.stringConcat");
+ values[1] = Boolean.getBoolean("java.lang.invoke.stringConcat.cache");
+ values[2] = Boolean.getBoolean("java.lang.invoke.stringConcat.debug");
+ return null;
+ });
+
+ final String strategy = (String) values[0];
+ CACHE_ENABLE = (Boolean) values[1];
+ DEBUG = (Boolean) values[2];
+
+ STRATEGY = (strategy == null) ? DEFAULT_STRATEGY : Strategy.valueOf(strategy);
+ CACHE = CACHE_ENABLE ? new ConcurrentHashMap<>() : null;
+ }
+
+ private static final class Key {
+ final MethodType mt;
+ final Recipe recipe;
+
+ public Key(MethodType mt, Recipe recipe) {
+ this.mt = mt;
+ this.recipe = recipe;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Key key = (Key) o;
+
+ if (!mt.equals(key.mt)) return false;
+ if (!recipe.equals(key.recipe)) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mt.hashCode();
+ result = 31 * result + recipe.hashCode();
+ return result;
+ }
+ }
+
+ /**
+ * Parses the recipe string, and produces the traversable collection of
+ * {@link java.lang.invoke.StringConcatFactory.RecipeElement}-s for generator
+ * strategies. Notably, this class parses out the constants from the recipe
+ * and from other static arguments.
+ */
+ private static final class Recipe {
+ private final List elements;
+ private final List elementsRev;
+
+ public Recipe(String src, Object[] constants) {
+ List el = new ArrayList<>();
+
+ int constC = 0;
+ int argC = 0;
+
+ StringBuilder acc = new StringBuilder();
+
+ for (int i = 0; i < src.length(); i++) {
+ char c = src.charAt(i);
+
+ if (c == TAG_CONST || c == TAG_ARG) {
+ // Detected a special tag, flush all accumulated characters
+ // as a constant first:
+ if (acc.length() > 0) {
+ el.add(new RecipeElement(acc.toString()));
+ acc.setLength(0);
+ }
+ if (c == TAG_CONST) {
+ Object cnst = constants[constC++];
+ el.add(new RecipeElement(cnst));
+ }
+ if (c == TAG_ARG) {
+ el.add(new RecipeElement(argC++));
+ }
+ } else {
+ // Not a special characters, this is a constant embedded into
+ // the recipe itself.
+ acc.append(c);
+ }
+ }
+
+ // Flush the remaining characters as constant:
+ if (acc.length() > 0) {
+ el.add(new RecipeElement(acc.toString()));
+ }
+
+ elements = new ArrayList<>(el);
+ Collections.reverse(el);
+ elementsRev = el;
+ }
+
+ public Collection getElements() {
+ return elements;
+ }
+
+ public Collection getElementsReversed() {
+ return elementsRev;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Recipe recipe = (Recipe) o;
+ return elements.equals(recipe.elements);
+ }
+
+ @Override
+ public int hashCode() {
+ return elements.hashCode();
+ }
+ }
+
+ private static final class RecipeElement {
+ private final Object value;
+ private final int argPos;
+ private final Tag tag;
+
+ public RecipeElement(Object cnst) {
+ this.value = Objects.requireNonNull(cnst);
+ this.argPos = -1;
+ this.tag = Tag.CONST;
+ }
+
+ public RecipeElement(int arg) {
+ this.value = null;
+ this.argPos = arg;
+ this.tag = Tag.ARG;
+ }
+
+ public Object getValue() {
+ assert (tag == Tag.CONST);
+ return value;
+ }
+
+ public int getArgPos() {
+ assert (tag == Tag.ARG);
+ return argPos;
+ }
+
+ public Tag getTag() {
+ return tag;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ RecipeElement that = (RecipeElement) o;
+
+ if (tag != that.tag) return false;
+ if (tag == Tag.CONST && (!value.equals(that.value))) return false;
+ if (tag == Tag.ARG && (argPos != that.argPos)) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return tag.hashCode();
+ }
+ }
+
+ private enum Tag {
+ CONST, ARG
+ }
+
+ /**
+ * Facilitates the creation of optimized String concatenation methods, that
+ * can be used to efficiently concatenate a known number of arguments of
+ * known types, possibly after type adaptation and partial evaluation of
+ * arguments. Typically used as a bootstrap method for {@code
+ * invokedynamic} call sites, to support the string concatenation
+ * feature of the Java Programming Language.
+ *
+ * When the target of the {@code CallSite} returned from this method is
+ * invoked, it returns the result of String concatenation, taking all
+ * function arguments passed to the linkage method as inputs for
+ * concatenation. The target signature is given by {@code concatType}.
+ * The arguments are concatenated as per requirements stated in JLS 15.18.1
+ * "String Concatenation Operator +". Notably, the inputs are converted as
+ * per JLS 5.1.11 "String Conversion", and combined from left to right.
+ *
+ *
Assume the linkage arguments are as follows:
+ *
+ *
+ * {@code concatType}, describing the {@code CallSite} signature
+ *
+ *
+ * Then the following linkage invariants must hold:
+ *
+ *
+ * The parameter count in {@code concatType} is less than or equal to 200
+ *
+ * The return type in {@code concatType} is assignable from {@link java.lang.String}
+ *
+ *
+ * @param lookup Represents a lookup context with the accessibility
+ * privileges of the caller. When used with {@code
+ * invokedynamic}, this is stacked automatically by the VM.
+ * @param name The name of the method to implement. This name is
+ * arbitrary, and has no meaning for this linkage method.
+ * When used with {@code invokedynamic}, this is provided by
+ * the {@code NameAndType} of the {@code InvokeDynamic}
+ * structure and is stacked automatically by the VM.
+ * @param concatType The expected signature of the {@code CallSite}. The
+ * parameter types represent the types of concatenation
+ * arguments; the return type is always assignable from {@link
+ * java.lang.String}. When used with {@code invokedynamic},
+ * this is provided by the {@code NameAndType} of the {@code
+ * InvokeDynamic} structure and is stacked automatically by
+ * the VM.
+ * @return a CallSite whose target can be used to perform String
+ * concatenation, with dynamic concatenation arguments described by the given
+ * {@code concatType}.
+ * @throws StringConcatException If any of the linkage invariants described
+ * here are violated.
+ * @throws NullPointerException If any of the incoming arguments is null.
+ * This will never happen when a bootstrap method
+ * is called with invokedynamic.
+ *
+ * @jls 5.1.11 String Conversion
+ * @jls 15.18.1 String Concatenation Operator +
+ */
+ public static CallSite makeConcat(MethodHandles.Lookup lookup,
+ String name,
+ MethodType concatType) throws StringConcatException {
+ if (DEBUG) {
+ System.out.println("StringConcatFactory " + STRATEGY + " is here for " + concatType);
+ }
+
+ return doStringConcat(lookup, name, concatType, true, null);
+ }
+
+ /**
+ * Facilitates the creation of optimized String concatenation methods, that
+ * can be used to efficiently concatenate a known number of arguments of
+ * known types, possibly after type adaptation and partial evaluation of
+ * arguments. Typically used as a bootstrap method for {@code
+ * invokedynamic} call sites, to support the string concatenation
+ * feature of the Java Programming Language.
+ *
+ * When the target of the {@code CallSite} returned from this method is
+ * invoked, it returns the result of String concatenation, taking all
+ * function arguments and constants passed to the linkage method as inputs for
+ * concatenation. The target signature is given by {@code concatType}, and
+ * does not include constants. The arguments are concatenated as per requirements
+ * stated in JLS 15.18.1 "String Concatenation Operator +". Notably, the inputs
+ * are converted as per JLS 5.1.11 "String Conversion", and combined from left
+ * to right.
+ *
+ *
The concatenation recipe is a String description for the way to
+ * construct a concatenated String from the arguments and constants. The
+ * recipe is processed from left to right, and each character represents an
+ * input to concatenation. Recipe characters mean:
+ *
+ *
+ *
+ * \1 (Unicode point 0001) : an ordinary argument. This
+ * input is passed through dynamic argument, and is provided during the
+ * concatenation method invocation. This input can be null.
+ *
+ * \2 (Unicode point 0002): a constant. This input passed
+ * through static bootstrap argument. This constant can be any value
+ * representable in constant pool. If necessary, the factory would call
+ * {@code toString} to perform a one-time String conversion.
+ *
+ * Any other char value: a single character constant.
+ *
+ *
+ * Assume the linkage arguments are as follows:
+ *
+ *
+ * {@code concatType}, describing the {@code CallSite} signature
+ * {@code recipe}, describing the String recipe
+ * {@code constants}, the vararg array of constants
+ *
+ *
+ * Then the following linkage invariants must hold:
+ *
+ *
+ * The parameter count in {@code concatType} is less than or equal to
+ * 200
+ *
+ * The parameter count in {@code concatType} equals to number of \1 tags
+ * in {@code recipe}
+ *
+ * The return type in {@code concatType} is assignable
+ * from {@link java.lang.String}, and matches the return type of the
+ * returned {@link MethodHandle}
+ *
+ * The number of elements in {@code constants} equals to number of \2
+ * tags in {@code recipe}
+ *
+ *
+ * @param lookup Represents a lookup context with the accessibility
+ * privileges of the caller. When used with {@code
+ * invokedynamic}, this is stacked automatically by the
+ * VM.
+ * @param name The name of the method to implement. This name is
+ * arbitrary, and has no meaning for this linkage method.
+ * When used with {@code invokedynamic}, this is provided
+ * by the {@code NameAndType} of the {@code InvokeDynamic}
+ * structure and is stacked automatically by the VM.
+ * @param concatType The expected signature of the {@code CallSite}. The
+ * parameter types represent the types of dynamic concatenation
+ * arguments; the return type is always assignable from {@link
+ * java.lang.String}. When used with {@code
+ * invokedynamic}, this is provided by the {@code
+ * NameAndType} of the {@code InvokeDynamic} structure and
+ * is stacked automatically by the VM.
+ * @param recipe Concatenation recipe, described above.
+ * @param constants A vararg parameter representing the constants passed to
+ * the linkage method.
+ * @return a CallSite whose target can be used to perform String
+ * concatenation, with dynamic concatenation arguments described by the given
+ * {@code concatType}.
+ * @throws StringConcatException If any of the linkage invariants described
+ * here are violated.
+ * @throws NullPointerException If any of the incoming arguments is null, or
+ * any constant in {@code recipe} is null.
+ * This will never happen when a bootstrap method
+ * is called with invokedynamic.
+ * @apiNote Code generators have three distinct ways to process a constant
+ * string operand S in a string concatenation expression. First, S can be
+ * materialized as a reference (using ldc) and passed as an ordinary argument
+ * (recipe '\1'). Or, S can be stored in the constant pool and passed as a
+ * constant (recipe '\2') . Finally, if S contains neither of the recipe
+ * tag characters ('\1', '\2') then S can be interpolated into the recipe
+ * itself, causing its characters to be inserted into the result.
+ *
+ * @jls 5.1.11 String Conversion
+ * @jls 15.18.1 String Concatenation Operator +
+ */
+ public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup,
+ String name,
+ MethodType concatType,
+ String recipe,
+ Object... constants) throws StringConcatException {
+ if (DEBUG) {
+ System.out.println("StringConcatFactory " + STRATEGY + " is here for " + concatType + ", {" + recipe + "}, " + Arrays.toString(constants));
+ }
+
+ return doStringConcat(lookup, name, concatType, false, recipe, constants);
+ }
+
+ private static CallSite doStringConcat(MethodHandles.Lookup lookup,
+ String name,
+ MethodType concatType,
+ boolean generateRecipe,
+ String recipe,
+ Object... constants) throws StringConcatException {
+ Objects.requireNonNull(lookup, "Lookup is null");
+ Objects.requireNonNull(name, "Name is null");
+ Objects.requireNonNull(concatType, "Concat type is null");
+ Objects.requireNonNull(constants, "Constants are null");
+
+ for (Object o : constants) {
+ Objects.requireNonNull(o, "Cannot accept null constants");
+ }
+
+ int cCount = 0;
+ int oCount = 0;
+ if (generateRecipe) {
+ // Mock the recipe to reuse the concat generator code
+ char[] value = new char[concatType.parameterCount()];
+ Arrays.fill(value, TAG_ARG);
+ recipe = new String(value);
+ oCount = concatType.parameterCount();
+ } else {
+ Objects.requireNonNull(recipe, "Recipe is null");
+
+ for (int i = 0; i < recipe.length(); i++) {
+ char c = recipe.charAt(i);
+ if (c == TAG_CONST) cCount++;
+ if (c == TAG_ARG) oCount++;
+ }
+ }
+
+ if (oCount != concatType.parameterCount()) {
+ throw new StringConcatException(
+ "Mismatched number of concat arguments: recipe wants " +
+ oCount +
+ " arguments, but signature provides " +
+ concatType.parameterCount());
+ }
+
+ if (cCount != constants.length) {
+ throw new StringConcatException(
+ "Mismatched number of concat constants: recipe wants " +
+ cCount +
+ " constants, but only " +
+ constants.length +
+ " are passed");
+ }
+
+ if (!concatType.returnType().isAssignableFrom(String.class)) {
+ throw new StringConcatException(
+ "The return type should be compatible with String, but it is " +
+ concatType.returnType());
+ }
+
+ if (concatType.parameterCount() > MAX_INDY_CONCAT_ARG_SLOTS) {
+ throw new StringConcatException("Too many concat argument slots: " +
+ concatType.parameterCount() +
+ ", can only accept " +
+ MAX_INDY_CONCAT_ARG_SLOTS);
+ }
+
+ MethodType mt = adaptType(concatType);
+
+ Recipe rec = new Recipe(recipe, constants);
+
+ MethodHandle mh;
+ if (CACHE_ENABLE) {
+ Key key = new Key(mt, rec);
+ mh = CACHE.get(key);
+ if (mh == null) {
+ mh = generate(lookup, mt, rec);
+ CACHE.put(key, mh);
+ }
+ } else {
+ mh = generate(lookup, mt, rec);
+ }
+ return new ConstantCallSite(mh.asType(concatType));
+ }
+
+ /**
+ * Adapt method type to an API we are going to use.
+ *
+ * This strips the concrete classes from the signatures, thus preventing
+ * class leakage when we cache the concatenation stubs.
+ *
+ * @param args actual argument types
+ * @return argument types the strategy is going to use
+ */
+ private static MethodType adaptType(MethodType args) {
+ Class>[] ptypes = args.parameterArray();
+ boolean changed = false;
+ for (int i = 0; i < ptypes.length; i++) {
+ Class> ptype = ptypes[i];
+ if (!ptype.isPrimitive() &&
+ ptype != String.class &&
+ ptype != Object.class) { // truncate to Object
+ ptypes[i] = Object.class;
+ changed = true;
+ }
+ // else other primitives or String or Object (unchanged)
+ }
+ return changed
+ ? MethodType.methodType(args.returnType(), ptypes)
+ : args;
+ }
+
+ private static MethodHandle generate(Lookup lookup, MethodType mt, Recipe recipe) throws StringConcatException {
+ try {
+ switch (STRATEGY) {
+ case BC_SB:
+ return BytecodeStringBuilderStrategy.generate(lookup, mt, recipe, Mode.DEFAULT);
+ case BC_SB_SIZED:
+ return BytecodeStringBuilderStrategy.generate(lookup, mt, recipe, Mode.SIZED);
+ case BC_SB_SIZED_EXACT:
+ return BytecodeStringBuilderStrategy.generate(lookup, mt, recipe, Mode.SIZED_EXACT);
+ case MH_SB_SIZED:
+ return MethodHandleStringBuilderStrategy.generate(mt, recipe, Mode.SIZED);
+ case MH_SB_SIZED_EXACT:
+ return MethodHandleStringBuilderStrategy.generate(mt, recipe, Mode.SIZED_EXACT);
+ case MH_INLINE_SIZED_EXACT:
+ return MethodHandleInlineCopyStrategy.generate(mt, recipe);
+ default:
+ throw new StringConcatException("Concatenation strategy " + STRATEGY + " is not implemented");
+ }
+ } catch (Throwable t) {
+ throw new StringConcatException("Generator failed", t);
+ }
+ }
+
+ private enum Mode {
+ DEFAULT(false, false),
+ SIZED(true, false),
+ SIZED_EXACT(true, true);
+
+ private final boolean sized;
+ private final boolean exact;
+
+ Mode(boolean sized, boolean exact) {
+ this.sized = sized;
+ this.exact = exact;
+ }
+
+ boolean isSized() {
+ return sized;
+ }
+
+ boolean isExact() {
+ return exact;
+ }
+ }
+
+ /**
+ * Bytecode StringBuilder strategy.
+ *
+ * This strategy operates in three modes, gated by {@link Mode}.
+ *
+ *
{@link Strategy#BC_SB}: "bytecode StringBuilder".
+ *
+ *
This strategy spins up the bytecode that has the same StringBuilder
+ * chain javac would otherwise emit. This strategy uses only the public API,
+ * and comes as the baseline for the current JDK behavior. On other words,
+ * this strategy moves the javac generated bytecode to runtime. The
+ * generated bytecode is loaded via Unsafe.defineAnonymousClass, but with
+ * the caller class coming from the BSM -- in other words, the protection
+ * guarantees are inherited from the method where invokedynamic was
+ * originally called. This means, among other things, that the bytecode is
+ * verified for all non-JDK uses.
+ *
+ *
{@link Strategy#BC_SB_SIZED}: "bytecode StringBuilder, but
+ * sized".
+ *
+ *
This strategy acts similarly to {@link Strategy#BC_SB}, but it also
+ * tries to guess the capacity required for StringBuilder to accept all
+ * arguments without resizing. This strategy only makes an educated guess:
+ * it only guesses the space required for known types (e.g. primitives and
+ * Strings), but does not otherwise convert arguments. Therefore, the
+ * capacity estimate may be wrong, and StringBuilder may have to
+ * transparently resize or trim when doing the actual concatenation. While
+ * this does not constitute a correctness issue (in the end, that what BC_SB
+ * has to do anyway), this does pose a potential performance problem.
+ *
+ *
{@link Strategy#BC_SB_SIZED_EXACT}: "bytecode StringBuilder, but
+ * sized exactly".
+ *
+ *
This strategy improves on @link Strategy#BC_SB_SIZED}, by first
+ * converting all arguments to String in order to get the exact capacity
+ * StringBuilder should have. The conversion is done via the public
+ * String.valueOf and/or Object.toString methods, and does not touch any
+ * private String API.
+ */
+ private static final class BytecodeStringBuilderStrategy {
+ static final Unsafe UNSAFE = Unsafe.getUnsafe();
+ static final int CLASSFILE_VERSION = 52;
+ static final String NAME_FACTORY = "concat";
+ static final String CLASS_NAME = "java/lang/String$Concat";
+
+ private BytecodeStringBuilderStrategy() {
+ // no instantiation
+ }
+
+ private static MethodHandle generate(MethodHandles.Lookup lookup, MethodType args, Recipe recipe, Mode mode) throws Exception {
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
+
+ cw.visit(CLASSFILE_VERSION,
+ ACC_SUPER + ACC_PUBLIC + ACC_FINAL + ACC_SYNTHETIC,
+ CLASS_NAME,
+ null,
+ "java/lang/Object",
+ null
+ );
+
+ MethodVisitor mv = cw.visitMethod(
+ ACC_PUBLIC + ACC_STATIC + ACC_FINAL,
+ NAME_FACTORY,
+ args.toMethodDescriptorString(),
+ null,
+ null);
+
+ mv.visitAnnotation("Ljava/lang/invoke/ForceInline;", true);
+ mv.visitCode();
+
+ Class>[] arr = args.parameterArray();
+ boolean[] guaranteedNonNull = new boolean[arr.length];
+
+ if (mode.isExact()) {
+ /*
+ In exact mode, we need to convert all arguments to their String representations,
+ as this allows to compute their String sizes exactly. We cannot use private
+ methods for primitives in here, therefore we need to convert those as well.
+
+ We also record what arguments are guaranteed to be non-null as the result
+ of the conversion. String.valueOf does the null checks for us. The only
+ corner case to take care of is String.valueOf(Object) returning null itself.
+
+ Also, if any conversion happened, then the slot indices in the incoming
+ arguments are not equal to the final local maps. The only case this may break
+ is when converting 2-slot long/double argument to 1-slot String. Therefore,
+ we get away with tracking modified offset, since no conversion can overwrite
+ the upcoming the argument.
+ */
+
+ int off = 0;
+ int modOff = 0;
+ for (int c = 0; c < arr.length; c++) {
+ Class> cl = arr[c];
+ if (cl == String.class) {
+ if (off != modOff) {
+ mv.visitIntInsn(getLoadOpcode(cl), off);
+ mv.visitIntInsn(ASTORE, modOff);
+ }
+ } else {
+ mv.visitIntInsn(getLoadOpcode(cl), off);
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "java/lang/String",
+ "valueOf",
+ getStringValueOfDesc(cl),
+ false
+ );
+ mv.visitIntInsn(ASTORE, modOff);
+ arr[c] = String.class;
+ guaranteedNonNull[c] = cl.isPrimitive();
+ }
+ off += getParameterSize(cl);
+ modOff += getParameterSize(String.class);
+ }
+ }
+
+ if (mode.isSized()) {
+ /*
+ When operating in sized mode (this includes exact mode), it makes sense to make
+ StringBuilder append chains look familiar to OptimizeStringConcat. For that, we
+ need to do null-checks early, not make the append chain shape simpler.
+ */
+
+ int off = 0;
+ for (RecipeElement el : recipe.getElements()) {
+ switch (el.getTag()) {
+ case CONST: {
+ // Guaranteed non-null, no null check required.
+ break;
+ }
+ case ARG: {
+ // Null-checks are needed only for String arguments, and when a previous stage
+ // did not do implicit null-checks. If a String is null, we eagerly replace it
+ // with "null" constant. Note, we omit Objects here, because we don't call
+ // .length() on them down below.
+ int ac = el.getArgPos();
+ Class> cl = arr[ac];
+ if (cl == String.class && !guaranteedNonNull[ac]) {
+ Label l0 = new Label();
+ mv.visitIntInsn(ALOAD, off);
+ mv.visitJumpInsn(IFNONNULL, l0);
+ mv.visitLdcInsn("null");
+ mv.visitIntInsn(ASTORE, off);
+ mv.visitLabel(l0);
+ }
+ off += getParameterSize(cl);
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ }
+ }
+
+ // Prepare StringBuilder instance
+ mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
+ mv.visitInsn(DUP);
+
+ if (mode.isSized()) {
+ /*
+ Sized mode requires us to walk through the arguments, and estimate the final length.
+ In exact mode, this will operate on Strings only. This code would accumulate the
+ final length on stack.
+ */
+ int len = 0;
+ int off = 0;
+
+ mv.visitInsn(ICONST_0);
+
+ for (RecipeElement el : recipe.getElements()) {
+ switch (el.getTag()) {
+ case CONST: {
+ Object cnst = el.getValue();
+ len += cnst.toString().length();
+ break;
+ }
+ case ARG: {
+ /*
+ If an argument is String, then we can call .length() on it. Sized/Exact modes have
+ converted arguments for us. If an argument is primitive, we can provide a guess
+ for its String representation size.
+ */
+ Class> cl = arr[el.getArgPos()];
+ if (cl == String.class) {
+ mv.visitIntInsn(ALOAD, off);
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/String",
+ "length",
+ "()I",
+ false
+ );
+ mv.visitInsn(IADD);
+ } else if (cl.isPrimitive()) {
+ len += estimateSize(cl);
+ }
+ off += getParameterSize(cl);
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ }
+
+ // Constants have non-zero length, mix in
+ if (len > 0) {
+ iconst(mv, len);
+ mv.visitInsn(IADD);
+ }
+
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ "java/lang/StringBuilder",
+ "",
+ "(I)V",
+ false
+ );
+ } else {
+ mv.visitMethodInsn(
+ INVOKESPECIAL,
+ "java/lang/StringBuilder",
+ "",
+ "()V",
+ false
+ );
+ }
+
+ // At this point, we have a blank StringBuilder on stack, fill it in with .append calls.
+ {
+ int off = 0;
+ for (RecipeElement el : recipe.getElements()) {
+ String desc;
+ switch (el.getTag()) {
+ case CONST: {
+ Object cnst = el.getValue();
+ mv.visitLdcInsn(cnst);
+ desc = getSBAppendDesc(cnst.getClass());
+ break;
+ }
+ case ARG: {
+ Class> cl = arr[el.getArgPos()];
+ mv.visitVarInsn(getLoadOpcode(cl), off);
+ off += getParameterSize(cl);
+ desc = getSBAppendDesc(cl);
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/StringBuilder",
+ "append",
+ desc,
+ false
+ );
+ }
+ }
+
+ if (DEBUG && mode.isExact()) {
+ /*
+ Exactness checks compare the final StringBuilder.capacity() with a resulting
+ String.length(). If these values disagree, that means StringBuilder had to perform
+ storage trimming, which defeats the purpose of exact strategies.
+ */
+
+ mv.visitInsn(DUP);
+
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/StringBuilder",
+ "capacity",
+ "()I",
+ false
+ );
+
+ mv.visitIntInsn(ISTORE, 0);
+
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/StringBuilder",
+ "toString",
+ "()Ljava/lang/String;",
+ false
+ );
+
+ mv.visitInsn(DUP);
+
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/String",
+ "length",
+ "()I",
+ false
+ );
+
+ mv.visitIntInsn(ILOAD, 0);
+
+ Label l0 = new Label();
+ mv.visitJumpInsn(IF_ICMPEQ, l0);
+
+ mv.visitTypeInsn(NEW, "java/lang/AssertionError");
+ mv.visitInsn(DUP);
+ mv.visitLdcInsn("Failed exactness check");
+ mv.visitMethodInsn(INVOKESPECIAL,
+ "java/lang/AssertionError",
+ "",
+ "(Ljava/lang/Object;)V",
+ false);
+ mv.visitInsn(ATHROW);
+
+ mv.visitLabel(l0);
+ } else {
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "java/lang/StringBuilder",
+ "toString",
+ "()Ljava/lang/String;",
+ false
+ );
+ }
+
+ mv.visitInsn(ARETURN);
+
+ mv.visitMaxs(-1, -1);
+ mv.visitEnd();
+ cw.visitEnd();
+
+ Class> targetClass = lookup.lookupClass();
+ final byte[] classBytes = cw.toByteArray();
+ final Class> innerClass = UNSAFE.defineAnonymousClass(targetClass, classBytes, null);
+
+ try {
+ UNSAFE.ensureClassInitialized(innerClass);
+ return lookup.findStatic(innerClass, NAME_FACTORY, args);
+ } catch (ReflectiveOperationException e) {
+ throw new StringConcatException("Exception finding constructor", e);
+ }
+ }
+
+ private static String getSBAppendDesc(Class> cl) {
+ if (cl.isPrimitive()) {
+ if (cl == Integer.TYPE || cl == Byte.TYPE || cl == Short.TYPE) {
+ return "(I)Ljava/lang/StringBuilder;";
+ } else if (cl == Boolean.TYPE) {
+ return "(Z)Ljava/lang/StringBuilder;";
+ } else if (cl == Character.TYPE) {
+ return "(C)Ljava/lang/StringBuilder;";
+ } else if (cl == Double.TYPE) {
+ return "(D)Ljava/lang/StringBuilder;";
+ } else if (cl == Float.TYPE) {
+ return "(F)Ljava/lang/StringBuilder;";
+ } else if (cl == Long.TYPE) {
+ return "(J)Ljava/lang/StringBuilder;";
+ } else {
+ throw new IllegalStateException("Unhandled primitive StringBuilder.append: " + cl);
+ }
+ } else if (cl == String.class) {
+ return "(Ljava/lang/String;)Ljava/lang/StringBuilder;";
+ } else {
+ return "(Ljava/lang/Object;)Ljava/lang/StringBuilder;";
+ }
+ }
+
+ private static String getStringValueOfDesc(Class> cl) {
+ if (cl.isPrimitive()) {
+ if (cl == Integer.TYPE || cl == Byte.TYPE || cl == Short.TYPE) {
+ return "(I)Ljava/lang/String;";
+ } else if (cl == Boolean.TYPE) {
+ return "(Z)Ljava/lang/String;";
+ } else if (cl == Character.TYPE) {
+ return "(C)Ljava/lang/String;";
+ } else if (cl == Double.TYPE) {
+ return "(D)Ljava/lang/String;";
+ } else if (cl == Float.TYPE) {
+ return "(F)Ljava/lang/String;";
+ } else if (cl == Long.TYPE) {
+ return "(J)Ljava/lang/String;";
+ } else {
+ throw new IllegalStateException("Unhandled String.valueOf: " + cl);
+ }
+ } else if (cl == String.class) {
+ return "(Ljava/lang/String;)Ljava/lang/String;";
+ } else {
+ return "(Ljava/lang/Object;)Ljava/lang/String;";
+ }
+ }
+
+ /**
+ * The following method is copied from
+ * org.objectweb.asm.commons.InstructionAdapter. Part of ASM: a very small
+ * and fast Java bytecode manipulation framework.
+ * Copyright (c) 2000-2005 INRIA, France Telecom All rights reserved.
+ */
+ private static void iconst(MethodVisitor mv, final int cst) {
+ if (cst >= -1 && cst <= 5) {
+ mv.visitInsn(Opcodes.ICONST_0 + cst);
+ } else if (cst >= Byte.MIN_VALUE && cst <= Byte.MAX_VALUE) {
+ mv.visitIntInsn(Opcodes.BIPUSH, cst);
+ } else if (cst >= Short.MIN_VALUE && cst <= Short.MAX_VALUE) {
+ mv.visitIntInsn(Opcodes.SIPUSH, cst);
+ } else {
+ mv.visitLdcInsn(cst);
+ }
+ }
+
+ private static int getLoadOpcode(Class> c) {
+ if (c == Void.TYPE) {
+ throw new InternalError("Unexpected void type of load opcode");
+ }
+ return ILOAD + getOpcodeOffset(c);
+ }
+
+ private static int getOpcodeOffset(Class> c) {
+ if (c.isPrimitive()) {
+ if (c == Long.TYPE) {
+ return 1;
+ } else if (c == Float.TYPE) {
+ return 2;
+ } else if (c == Double.TYPE) {
+ return 3;
+ }
+ return 0;
+ } else {
+ return 4;
+ }
+ }
+
+ private static int getParameterSize(Class> c) {
+ if (c == Void.TYPE) {
+ return 0;
+ } else if (c == Long.TYPE || c == Double.TYPE) {
+ return 2;
+ }
+ return 1;
+ }
+ }
+
+ /**
+ * MethodHandle StringBuilder strategy.
+ *
+ * This strategy operates in two modes, gated by {@link Mode}.
+ *
+ *
{@link Strategy#MH_SB_SIZED}: "MethodHandles StringBuilder,
+ * sized".
+ *
+ *
This strategy avoids spinning up the bytecode by building the
+ * computation on MethodHandle combinators. The computation is built with
+ * public MethodHandle APIs, resolved from a public Lookup sequence, and
+ * ends up calling the public StringBuilder API. Therefore, this strategy
+ * does not use any private API at all, even the Unsafe.defineAnonymousClass,
+ * since everything is handled under cover by java.lang.invoke APIs.
+ *
+ *
{@link Strategy#MH_SB_SIZED_EXACT}: "MethodHandles StringBuilder,
+ * sized exactly".
+ *
+ *
This strategy improves on @link Strategy#MH_SB_SIZED}, by first
+ * converting all arguments to String in order to get the exact capacity
+ * StringBuilder should have. The conversion is done via the public
+ * String.valueOf and/or Object.toString methods, and does not touch any
+ * private String API.
+ */
+ private static final class MethodHandleStringBuilderStrategy {
+
+ private MethodHandleStringBuilderStrategy() {
+ // no instantiation
+ }
+
+ private static MethodHandle generate(MethodType mt, Recipe recipe, Mode mode) throws Exception {
+ int pc = mt.parameterCount();
+
+ Class>[] ptypes = mt.parameterArray();
+ MethodHandle[] filters = new MethodHandle[ptypes.length];
+ for (int i = 0; i < ptypes.length; i++) {
+ MethodHandle filter;
+ switch (mode) {
+ case SIZED:
+ // In sized mode, we convert all references and floats/doubles
+ // to String: there is no specialization for different
+ // classes in StringBuilder API, and it will convert to
+ // String internally anyhow.
+ filter = Stringifiers.forMost(ptypes[i]);
+ break;
+ case SIZED_EXACT:
+ // In exact mode, we convert everything to String:
+ // this helps to compute the storage exactly.
+ filter = Stringifiers.forAny(ptypes[i]);
+ break;
+ default:
+ throw new StringConcatException("Not supported");
+ }
+ if (filter != null) {
+ filters[i] = filter;
+ ptypes[i] = filter.type().returnType();
+ }
+ }
+
+ List> ptypesList = Arrays.asList(ptypes);
+ MethodHandle[] lengthers = new MethodHandle[pc];
+
+ // Figure out lengths: constants' lengths can be deduced on the spot.
+ // All reference arguments were filtered to String in the combinators below, so we can
+ // call the usual String.length(). Primitive values string sizes can be estimated.
+ int initial = 0;
+ for (RecipeElement el : recipe.getElements()) {
+ switch (el.getTag()) {
+ case CONST: {
+ Object cnst = el.getValue();
+ initial += cnst.toString().length();
+ break;
+ }
+ case ARG: {
+ final int i = el.getArgPos();
+ Class> type = ptypesList.get(i);
+ if (type.isPrimitive()) {
+ MethodHandle est = MethodHandles.constant(int.class, estimateSize(type));
+ est = MethodHandles.dropArguments(est, 0, type);
+ lengthers[i] = est;
+ } else {
+ lengthers[i] = STRING_LENGTH;
+ }
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ }
+
+ // Create (StringBuilder, ) shape for appending:
+ MethodHandle builder = MethodHandles.dropArguments(MethodHandles.identity(StringBuilder.class), 1, ptypesList);
+
+ // Compose append calls. This is done in reverse because the application order is
+ // reverse as well.
+ for (RecipeElement el : recipe.getElementsReversed()) {
+ MethodHandle appender;
+ switch (el.getTag()) {
+ case CONST: {
+ Object constant = el.getValue();
+ MethodHandle mh = appender(adaptToStringBuilder(constant.getClass()));
+ appender = MethodHandles.insertArguments(mh, 1, constant);
+ break;
+ }
+ case ARG: {
+ int ac = el.getArgPos();
+ appender = appender(ptypesList.get(ac));
+
+ // Insert dummy arguments to match the prefix in the signature.
+ // The actual appender argument will be the ac-ith argument.
+ if (ac != 0) {
+ appender = MethodHandles.dropArguments(appender, 1, ptypesList.subList(0, ac));
+ }
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ builder = MethodHandles.foldArguments(builder, appender);
+ }
+
+ // Build the sub-tree that adds the sizes and produces a StringBuilder:
+
+ // a) Start with the reducer that accepts all arguments, plus one
+ // slot for the initial value. Inject the initial value right away.
+ // This produces ()int shape:
+ MethodHandle sum = getReducerFor(pc + 1);
+ MethodHandle adder = MethodHandles.insertArguments(sum, 0, initial);
+
+ // b) Apply lengthers to transform arguments to lengths, producing ()int
+ adder = MethodHandles.filterArguments(adder, 0, lengthers);
+
+ // c) Instantiate StringBuilder ()int -> ()StringBuilder
+ MethodHandle newBuilder = MethodHandles.filterReturnValue(adder, NEW_STRING_BUILDER);
+
+ // d) Fold in StringBuilder constructor, this produces ()StringBuilder
+ MethodHandle mh = MethodHandles.foldArguments(builder, newBuilder);
+
+ // Convert non-primitive arguments to Strings
+ mh = MethodHandles.filterArguments(mh, 0, filters);
+
+ // Convert ()StringBuilder to ()String
+ if (DEBUG && mode.isExact()) {
+ mh = MethodHandles.filterReturnValue(mh, BUILDER_TO_STRING_CHECKED);
+ } else {
+ mh = MethodHandles.filterReturnValue(mh, BUILDER_TO_STRING);
+ }
+
+ return mh;
+ }
+
+ private static MethodHandle getReducerFor(int cnt) {
+ return SUMMERS.computeIfAbsent(cnt, SUMMER);
+ }
+
+ private static MethodHandle appender(Class> appendType) {
+ MethodHandle appender = lookupVirtual(MethodHandles.publicLookup(), StringBuilder.class, "append",
+ StringBuilder.class, adaptToStringBuilder(appendType));
+
+ // appenders should return void, this would not modify the target signature during folding
+ MethodType nt = MethodType.methodType(void.class, StringBuilder.class, appendType);
+ return appender.asType(nt);
+ }
+
+ private static String toStringChecked(StringBuilder sb) {
+ String s = sb.toString();
+ if (s.length() != sb.capacity()) {
+ throw new AssertionError("Exactness check failed: result length = " + s.length() + ", buffer capacity = " + sb.capacity());
+ }
+ return s;
+ }
+
+ private static int sum(int v1, int v2) {
+ return v1 + v2;
+ }
+
+ private static int sum(int v1, int v2, int v3) {
+ return v1 + v2 + v3;
+ }
+
+ private static int sum(int v1, int v2, int v3, int v4) {
+ return v1 + v2 + v3 + v4;
+ }
+
+ private static int sum(int v1, int v2, int v3, int v4, int v5) {
+ return v1 + v2 + v3 + v4 + v5;
+ }
+
+ private static int sum(int v1, int v2, int v3, int v4, int v5, int v6) {
+ return v1 + v2 + v3 + v4 + v5 + v6;
+ }
+
+ private static int sum(int v1, int v2, int v3, int v4, int v5, int v6, int v7) {
+ return v1 + v2 + v3 + v4 + v5 + v6 + v7;
+ }
+
+ private static int sum(int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8) {
+ return v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ private static int sum(int initial, int[] vs) {
+ int sum = initial;
+ for (int v : vs) {
+ sum += v;
+ }
+ return sum;
+ }
+
+ private static final ConcurrentMap SUMMERS;
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function SUMMER = new Function() {
+ @Override
+ public MethodHandle apply(Integer cnt) {
+ if (cnt == 1) {
+ return MethodHandles.identity(int.class);
+ } else if (cnt <= 8) {
+ // Variable-arity collectors are not as efficient as small-count methods,
+ // unroll some initial sizes.
+ Class>[] cls = new Class>[cnt];
+ Arrays.fill(cls, int.class);
+ return lookupStatic(Lookup.IMPL_LOOKUP, MethodHandleStringBuilderStrategy.class, "sum", int.class, cls);
+ } else {
+ return lookupStatic(Lookup.IMPL_LOOKUP, MethodHandleStringBuilderStrategy.class, "sum", int.class, int.class, int[].class)
+ .asCollector(int[].class, cnt - 1);
+ }
+ }
+ };
+
+ private static final MethodHandle NEW_STRING_BUILDER, STRING_LENGTH, BUILDER_TO_STRING, BUILDER_TO_STRING_CHECKED;
+
+ static {
+ SUMMERS = new ConcurrentHashMap<>();
+ Lookup publicLookup = MethodHandles.publicLookup();
+ NEW_STRING_BUILDER = lookupConstructor(publicLookup, StringBuilder.class, int.class);
+ STRING_LENGTH = lookupVirtual(publicLookup, String.class, "length", int.class);
+ BUILDER_TO_STRING = lookupVirtual(publicLookup, StringBuilder.class, "toString", String.class);
+ if (DEBUG) {
+ BUILDER_TO_STRING_CHECKED = lookupStatic(MethodHandles.Lookup.IMPL_LOOKUP,
+ MethodHandleStringBuilderStrategy.class, "toStringChecked", String.class, StringBuilder.class);
+ } else {
+ BUILDER_TO_STRING_CHECKED = null;
+ }
+ }
+
+ }
+
+
+ /**
+ * {@link Strategy#MH_INLINE_SIZED_EXACT}: "MethodHandles inline,
+ * sized exactly".
+ *
+ *
This strategy replicates what StringBuilders are doing: it builds the
+ * byte[] array on its own and passes that byte[] array to String
+ * constructor. This strategy requires access to some private APIs in JDK,
+ * most notably, the read-only Integer/Long.stringSize methods that measure
+ * the character length of the integers, and the private String constructor
+ * that accepts byte[] arrays without copying. While this strategy assumes a
+ * particular implementation details for String, this opens the door for
+ * building a very optimal concatenation sequence. This is the only strategy
+ * that requires porting if there are private JDK changes occur.
+ */
+ private static final class MethodHandleInlineCopyStrategy {
+
+ private MethodHandleInlineCopyStrategy() {
+ // no instantiation
+ }
+
+ static MethodHandle generate(MethodType mt, Recipe recipe) throws Throwable {
+
+ // Create filters and obtain filtered parameter types. Filters would be used in the beginning
+ // to convert the incoming arguments into the arguments we can process (e.g. Objects -> Strings).
+ // The filtered argument type list is used all over in the combinators below.
+ Class>[] ptypes = mt.parameterArray();
+ MethodHandle[] filters = null;
+ for (int i = 0; i < ptypes.length; i++) {
+ MethodHandle filter = Stringifiers.forMost(ptypes[i]);
+ if (filter != null) {
+ if (filters == null) {
+ filters = new MethodHandle[ptypes.length];
+ }
+ filters[i] = filter;
+ ptypes[i] = filter.type().returnType();
+ }
+ }
+ List> ptypesList = Arrays.asList(ptypes);
+
+ // Start building the combinator tree. The tree "starts" with ()String, and "finishes"
+ // with the (int, byte[], byte)String in String helper. The combinators are assembled bottom-up,
+ // which makes the code arguably hard to read.
+
+ // Drop all remaining parameter types, leave only helper arguments:
+ MethodHandle mh;
+
+ mh = MethodHandles.dropArguments(NEW_STRING, 2, ptypes);
+ mh = MethodHandles.dropArguments(mh, 0, int.class);
+
+ // In debug mode, check that remaining index is zero.
+ if (DEBUG) {
+ mh = MethodHandles.filterArgument(mh, 0, CHECK_INDEX);
+ }
+
+ // Mix in prependers. This happens when (int, byte[], byte) = (index, storage, coder) is already
+ // known from the combinators below. We are assembling the string backwards, so "index" is the
+ // *ending* index.
+ for (RecipeElement el : recipe.getElements()) {
+ MethodHandle prepender;
+ switch (el.getTag()) {
+ case CONST: {
+ Object cnst = el.getValue();
+ prepender = MethodHandles.insertArguments(prepender(cnst.getClass()), 3, cnst);
+ break;
+ }
+ case ARG: {
+ int pos = el.getArgPos();
+ prepender = selectArgument(prepender(ptypesList.get(pos)), 3, ptypesList, pos);
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+
+ // Remove "old" index from arguments
+ mh = MethodHandles.dropArguments(mh, 1, int.class);
+
+ // Do the prepend, and put "new" index at index 0
+ mh = MethodHandles.foldArguments(mh, prepender);
+ }
+
+ // Prepare the argument list for prepending. The tree below would instantiate
+ // the storage byte[] into argument 0, so we need to swap "storage" and "index".
+ // The index at this point equals to "size", and resides at argument 1.
+ {
+ MethodType nmt = mh.type()
+ .changeParameterType(0, byte[].class)
+ .changeParameterType(1, int.class);
+ mh = MethodHandles.permuteArguments(mh, nmt, swap10(nmt.parameterCount()));
+ }
+
+ // Fold in byte[] instantiation at argument 0.
+ MethodHandle combiner = MethodHandles.dropArguments(NEW_ARRAY, 2, ptypesList);
+ mh = MethodHandles.foldArguments(mh, combiner);
+
+ // Start combining length and coder mixers.
+ //
+ // Length is easy: constant lengths can be computed on the spot, and all non-constant
+ // shapes have been either converted to Strings, or explicit methods for getting the
+ // string length out of primitives are provided.
+ //
+ // Coders are more interesting. Only Object, String and char arguments (and constants)
+ // can have non-Latin1 encoding. It is easier to blindly convert constants to String,
+ // and deduce the coder from there. Arguments would be either converted to Strings
+ // during the initial filtering, or handled by primitive specializations in CODER_MIXERS.
+ //
+ // The method handle shape after all length and coder mixers is:
+ // (int, byte, )String = ("index", "coder", )
+ byte initialCoder = 0; // initial coder
+ int initialLen = 0; // initial length, in characters
+ for (RecipeElement el : recipe.getElements()) {
+ switch (el.getTag()) {
+ case CONST: {
+ Object constant = el.getValue();
+ String s = constant.toString();
+ initialCoder = (byte) coderMixer(String.class).invoke(initialCoder, s);
+ initialLen += s.length();
+ break;
+ }
+ case ARG: {
+ int ac = el.getArgPos();
+
+ Class> argClass = ptypesList.get(ac);
+ MethodHandle lm = selectArgument(lengthMixer(argClass), 1, ptypesList, ac);
+ lm = MethodHandles.dropArguments(lm, 0, byte.class); // (*)
+ lm = MethodHandles.dropArguments(lm, 2, byte.class);
+
+ MethodHandle cm = selectArgument(coderMixer(argClass), 1, ptypesList, ac);
+ cm = MethodHandles.dropArguments(cm, 0, int.class); // (**)
+
+ // Read this bottom up:
+
+ // 4. Drop old index and coder, producing ("new-index", "new-coder", )
+ mh = MethodHandles.dropArguments(mh, 2, int.class, byte.class);
+
+ // 3. Compute "new-index", producing ("new-index", "new-coder", "old-index", "old-coder", )
+ // Length mixer ignores both "new-coder" and "old-coder" due to dropArguments above (*)
+ mh = MethodHandles.foldArguments(mh, lm);
+
+ // 2. Compute "new-coder", producing ("new-coder", "old-index", "old-coder", )
+ // Coder mixer ignores the "old-index" arg due to dropArguments above (**)
+ mh = MethodHandles.foldArguments(mh, cm);
+
+ // 1. The mh shape here is ("old-index", "old-coder", )
+ break;
+ }
+ default:
+ throw new StringConcatException("Unhandled tag: " + el.getTag());
+ }
+ }
+
+ // Insert initial lengths and coders here.
+ // The method handle shape here is ().
+ mh = MethodHandles.insertArguments(mh, 0, initialLen, initialCoder);
+
+ // Apply filters, converting the arguments:
+ if (filters != null) {
+ mh = MethodHandles.filterArguments(mh, 0, filters);
+ }
+
+ return mh;
+ }
+
+ private static int[] swap10(int count) {
+ int[] perm = new int[count];
+ perm[0] = 1;
+ perm[1] = 0;
+ for (int i = 2; i < count; i++) {
+ perm[i] = i;
+ }
+ return perm;
+ }
+
+ // Adapts: (...prefix..., parameter[pos])R -> (...prefix..., ...parameters...)R
+ private static MethodHandle selectArgument(MethodHandle mh, int prefix, List> ptypes, int pos) {
+ if (pos == 0) {
+ return MethodHandles.dropArguments(mh, prefix + 1, ptypes.subList(1, ptypes.size()));
+ } else if (pos == ptypes.size() - 1) {
+ return MethodHandles.dropArguments(mh, prefix, ptypes.subList(0, ptypes.size() - 1));
+ } else { // 0 < pos < ptypes.size() - 1
+ MethodHandle t = MethodHandles.dropArguments(mh, prefix, ptypes.subList(0, pos));
+ return MethodHandles.dropArguments(t, prefix + 1 + pos, ptypes.subList(pos + 1, ptypes.size()));
+ }
+ }
+
+ @ForceInline
+ private static byte[] newArray(int length, byte coder) {
+ return new byte[length << coder];
+ }
+
+ @ForceInline
+ private static int checkIndex(int index) {
+ if (index != 0) {
+ throw new AssertionError("Exactness check failed: " + index + " characters left in the buffer.");
+ }
+ return index;
+ }
+
+ private static MethodHandle prepender(Class> cl) {
+ return PREPENDERS.computeIfAbsent(cl, PREPEND);
+ }
+
+ private static MethodHandle coderMixer(Class> cl) {
+ return CODER_MIXERS.computeIfAbsent(cl, CODER_MIX);
+ }
+
+ private static MethodHandle lengthMixer(Class> cl) {
+ return LENGTH_MIXERS.computeIfAbsent(cl, LENGTH_MIX);
+ }
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function, MethodHandle> PREPEND = new Function, MethodHandle>() {
+ @Override
+ public MethodHandle apply(Class> c) {
+ return lookupStatic(Lookup.IMPL_LOOKUP, STRING_HELPER, "prepend", int.class, int.class, byte[].class, byte.class, c);
+ }
+ };
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function, MethodHandle> CODER_MIX = new Function, MethodHandle>() {
+ @Override
+ public MethodHandle apply(Class> c) {
+ return lookupStatic(Lookup.IMPL_LOOKUP, STRING_HELPER, "mixCoder", byte.class, byte.class, c);
+ }
+ };
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function, MethodHandle> LENGTH_MIX = new Function, MethodHandle>() {
+ @Override
+ public MethodHandle apply(Class> c) {
+ return lookupStatic(Lookup.IMPL_LOOKUP, STRING_HELPER, "mixLen", int.class, int.class, c);
+ }
+ };
+
+ private static final MethodHandle NEW_STRING;
+ private static final MethodHandle CHECK_INDEX;
+ private static final MethodHandle NEW_ARRAY;
+ private static final ConcurrentMap, MethodHandle> PREPENDERS;
+ private static final ConcurrentMap, MethodHandle> LENGTH_MIXERS;
+ private static final ConcurrentMap, MethodHandle> CODER_MIXERS;
+ private static final Class> STRING_HELPER;
+
+ static {
+ try {
+ STRING_HELPER = Class.forName("java.lang.StringConcatHelper");
+ } catch (ClassNotFoundException e) {
+ throw new AssertionError(e);
+ }
+
+ PREPENDERS = new ConcurrentHashMap<>();
+ LENGTH_MIXERS = new ConcurrentHashMap<>();
+ CODER_MIXERS = new ConcurrentHashMap<>();
+
+ NEW_STRING = lookupStatic(Lookup.IMPL_LOOKUP, STRING_HELPER, "newString", String.class, byte[].class, byte.class);
+ NEW_ARRAY = lookupStatic(Lookup.IMPL_LOOKUP, MethodHandleInlineCopyStrategy.class, "newArray", byte[].class, int.class, byte.class);
+
+ if (DEBUG) {
+ CHECK_INDEX = lookupStatic(Lookup.IMPL_LOOKUP, MethodHandleInlineCopyStrategy.class, "checkIndex", int.class, int.class);
+ } else {
+ CHECK_INDEX = null;
+ }
+ }
+ }
+
+ /**
+ * Public gateways to public "stringify" methods. These methods have the form String apply(T obj), and normally
+ * delegate to {@code String.valueOf}, depending on argument's type.
+ */
+ private static final class Stringifiers {
+ private Stringifiers() {
+ // no instantiation
+ }
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function, MethodHandle> MOST = new Function, MethodHandle>() {
+ @Override
+ public MethodHandle apply(Class> cl) {
+ MethodHandle mhObject = lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, Object.class);
+
+ // We need the additional conversion here, because String.valueOf(Object) may return null.
+ // String conversion rules in Java state we need to produce "null" String in this case.
+ // It can be easily done with applying valueOf the second time.
+ MethodHandle mhObjectNoNulls = MethodHandles.filterReturnValue(mhObject,
+ mhObject.asType(MethodType.methodType(String.class, String.class)));
+
+ if (cl == String.class) {
+ return mhObject;
+ } else if (cl == float.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, float.class);
+ } else if (cl == double.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, double.class);
+ } else if (!cl.isPrimitive()) {
+ return mhObjectNoNulls;
+ }
+
+ return null;
+ }
+ };
+
+ // This one is deliberately non-lambdified to optimize startup time:
+ private static final Function, MethodHandle> ANY = new Function, MethodHandle>() {
+ @Override
+ public MethodHandle apply(Class> cl) {
+ MethodHandle mh = MOST.apply(cl);
+ if (mh != null) {
+ return mh;
+ }
+
+ if (cl == byte.class || cl == short.class || cl == int.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, int.class);
+ } else if (cl == boolean.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, boolean.class);
+ } else if (cl == char.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, char.class);
+ } else if (cl == long.class) {
+ return lookupStatic(Lookup.PUBLIC_LOOKUP, String.class, "valueOf", String.class, long.class);
+ } else {
+ throw new IllegalStateException("Unknown class: " + cl);
+ }
+ }
+ };
+
+ private static final ConcurrentMap, MethodHandle> STRINGIFIERS_MOST = new ConcurrentHashMap<>();
+ private static final ConcurrentMap, MethodHandle> STRINGIFIERS_ANY = new ConcurrentHashMap<>();
+
+ /**
+ * Returns a stringifier for references and floats/doubles only.
+ * Always returns null for other primitives.
+ *
+ * @param t class to stringify
+ * @return stringifier; null, if not available
+ */
+ static MethodHandle forMost(Class> t) {
+ return STRINGIFIERS_MOST.computeIfAbsent(t, MOST);
+ }
+
+ /**
+ * Returns a stringifier for any type. Never returns null.
+ *
+ * @param t class to stringify
+ * @return stringifier
+ */
+ static MethodHandle forAny(Class> t) {
+ return STRINGIFIERS_ANY.computeIfAbsent(t, ANY);
+ }
+ }
+
+ /* ------------------------------- Common utilities ------------------------------------ */
+
+ private static MethodHandle lookupStatic(Lookup lookup, Class> refc, String name, Class> rtype, Class>... ptypes) {
+ try {
+ return lookup.findStatic(refc, name, MethodType.methodType(rtype, ptypes));
+ } catch (NoSuchMethodException | IllegalAccessException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ private static MethodHandle lookupVirtual(Lookup lookup, Class> refc, String name, Class> rtype, Class>... ptypes) {
+ try {
+ return lookup.findVirtual(refc, name, MethodType.methodType(rtype, ptypes));
+ } catch (NoSuchMethodException | IllegalAccessException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ private static MethodHandle lookupConstructor(Lookup lookup, Class> refc, Class> ptypes) {
+ try {
+ return lookup.findConstructor(refc, MethodType.methodType(void.class, ptypes));
+ } catch (NoSuchMethodException | IllegalAccessException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ private static int estimateSize(Class> cl) {
+ if (cl == Integer.TYPE) {
+ return 11; // "-2147483648"
+ } else if (cl == Boolean.TYPE) {
+ return 5; // "false"
+ } else if (cl == Byte.TYPE) {
+ return 4; // "-128"
+ } else if (cl == Character.TYPE) {
+ return 1; // duh
+ } else if (cl == Short.TYPE) {
+ return 6; // "-32768"
+ } else if (cl == Double.TYPE) {
+ return 26; // apparently, no larger than this, see FloatingDecimal.BinaryToASCIIBuffer.buffer
+ } else if (cl == Float.TYPE) {
+ return 26; // apparently, no larger than this, see FloatingDecimal.BinaryToASCIIBuffer.buffer
+ } else if (cl == Long.TYPE) {
+ return 20; // "-9223372036854775808"
+ } else {
+ throw new IllegalArgumentException("Cannot estimate the size for " + cl);
+ }
+ }
+
+ private static Class> adaptToStringBuilder(Class> c) {
+ if (c.isPrimitive()) {
+ if (c == Byte.TYPE || c == Short.TYPE) {
+ return int.class;
+ }
+ } else {
+ if (c != String.class) {
+ return Object.class;
+ }
+ }
+ return c;
+ }
+
+ private StringConcatFactory() {
+ // no instantiation
+ }
+
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcat.java 2016-01-15 13:31:19.827236977 +0300
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary test implicit String concatenations
+ *
+ * @compile ImplicitStringConcat.java
+ * @run main/othervm ImplicitStringConcat
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcat.java
+ * @run main/othervm ImplicitStringConcat
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcat.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcat
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcat.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcat
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcat
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcat
+*/
+import java.lang.StringBuilder;
+
+public class ImplicitStringConcat {
+
+ static boolean b = true;
+ static byte by = 42;
+ static short sh = 42;
+ static char ch = 'a';
+ static int i = 42;
+ static float fl = 42.0f;
+ static long l = 42;
+ static double d = 42.0d;
+ static String s = "foo";
+ static String sNull = null;
+ static Object o = "bar";
+ static Object oNull = null;
+ static CharSequence cs = "bar";
+ static char[] chars = new char[] {'a'};
+
+ static MyClass myCl = new MyClass();
+ static MyClassNull myClNull = new MyClassNull();
+ static Object myCl2 = new MyClass();
+ static Object[] myArr = new Object[] { myCl };
+ static final Object[] s_myArr = new Object[] { myCl };
+
+ static StringBuffer sb = new StringBuffer("a");
+
+ public static void main(String[] args) throws Exception {
+
+ test("footrue", s + b);
+ test("foo42", s + by);
+ test("foo42", s + sh);
+ test("fooa", s + ch);
+ test("foo42", s + i);
+ test("foo42", s + l);
+ test("foo42.0", s + fl);
+ test("foo42.0", s + d);
+ test("foofoo", s + s);
+ test("foonull", s + sNull);
+ test("foobar", s + o);
+ test("foonull", s + oNull);
+ test("foobar", s + cs);
+
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("foo");
+ sb.append(myArr.toString());
+ test(sb.toString(), s + myArr);
+ }
+
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("foo");
+ sb.append(s_myArr.toString());
+ test(sb.toString(), s + s_myArr);
+ }
+
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("foo[C@");
+ sb.append(Integer.toHexString(System.identityHashCode(chars)));
+ test(sb.toString(), s + chars);
+ }
+
+ test("fooa", s + ImplicitStringConcat.sb);
+ test("foonull", s + null);
+ test("fooMyClass", s + myCl);
+ test("foonull", s + myClNull);
+ test("fooMyClass", s + myCl2);
+
+ s = "foo"; s += b; test("footrue", s);
+ s = "foo"; s += by; test("foo42", s);
+ s = "foo"; s += sh; test("foo42", s);
+ s = "foo"; s += ch; test("fooa", s);
+ s = "foo"; s += i; test("foo42", s);
+ s = "foo"; s += l; test("foo42", s);
+ s = "foo"; s += fl; test("foo42.0", s);
+ s = "foo"; s += d; test("foo42.0", s);
+ s = "foo"; s += s; test("foofoo", s);
+ s = "foo"; s += sNull; test("foonull", s);
+ s = "foo"; s += o; test("foobar", s);
+ s = "foo"; s += oNull; test("foonull", s);
+ s = "foo"; s += cs; test("foobar", s);
+
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append("foo[C@");
+ sb.append(Integer.toHexString(System.identityHashCode(chars)));
+ s = "foo";
+ s += chars;
+ test(sb.toString(), s);
+ }
+
+ s = "foo"; s += ImplicitStringConcat.sb; test("fooa", s);
+ s = "foo"; s += null; test("foonull", s);
+ s = "foo"; s += myCl; test("fooMyClass", s);
+ s = "foo"; s += myCl2; test("fooMyClass", s);
+ }
+
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+
+ static class MyClass {
+ public String toString() {
+ return "MyClass";
+ }
+ }
+
+ static class MyClassNull {
+ public String toString() {
+ return null;
+ }
+ }
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatArgCount.java 2016-01-15 13:31:20.471233723 +0300
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test multiple number of arguments to concatenate.
+ *
+ * @compile ImplicitStringConcatArgCount.java
+ * @run main/othervm ImplicitStringConcatArgCount
+ *
+ * @compile -XDallowStringFolding=false -XDstringConcat=inline ImplicitStringConcatArgCount.java
+ * @run main/othervm ImplicitStringConcatArgCount
+ *
+ * @compile -XDallowStringFolding=false -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatArgCount.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatArgCount
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ *
+ * @compile -XDallowStringFolding=false -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatArgCount.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatArgCount
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatArgCount
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatArgCount
+*/
+public class ImplicitStringConcatArgCount {
+ static final String s = "f";
+ static final String s1 = "o";
+ static String s2 = "o";
+ static int i = 7;
+
+ public static void main(String[] args) throws Exception {
+ test("fo", s + s1);
+ test("foo", s + s1 + s2);
+ test("foo7", s + s1 + s2 + i);
+ test("foo77", s + s1 + s2 + i + i);
+ test("foo777", s + s1 + s2 + i + i + i);
+ test("foo7777", s + s1 + s2 + i + i + i + i);
+ test("foo77777", s + s1 + s2 + i + i + i + i + i);
+ test("foo777777", s + s1 + s2 + i + i + i + i + i + i);
+ test("foo7777777", s + s1 + s2 + i + i + i + i + i + i + i);
+ test("foo77777777", s + s1 + s2 + i + i + i + i + i + i + i + i);
+ }
+
+ public static void test(String expected, String actual) {
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatBoundaries.java 2016-01-15 13:31:21.047230814 +0300
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test the boundary values for concatenation arguments.
+ *
+ * @compile ImplicitStringConcatBoundaries.java
+ * @run main/othervm ImplicitStringConcatBoundaries
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcatBoundaries.java
+ * @run main/othervm ImplicitStringConcatBoundaries
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatBoundaries.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatBoundaries
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatBoundaries.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatBoundaries
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatBoundaries
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatBoundaries
+
+*/
+
+public class ImplicitStringConcatBoundaries {
+
+ public static final boolean BOOL_TRUE_1 = true;
+ public static boolean BOOL_TRUE_2 = true;
+ public static final boolean BOOL_FALSE_1 = false;
+ public static boolean BOOL_FALSE_2 = false;
+
+ public static final byte BYTE_MIN_1 = Byte.MIN_VALUE;
+ public static byte BYTE_MIN_2 = Byte.MIN_VALUE;
+ public static final byte BYTE_MAX_1 = Byte.MAX_VALUE;
+ public static byte BYTE_MAX_2 = Byte.MAX_VALUE;
+
+ public static final short SHORT_MIN_1 = Short.MIN_VALUE;
+ public static short SHORT_MIN_2 = Short.MIN_VALUE;
+ public static final short SHORT_MAX_1 = Short.MAX_VALUE;
+ public static short SHORT_MAX_2 = Short.MAX_VALUE;
+
+ public static final char CHAR_MIN_1 = Character.MIN_VALUE;
+ public static char CHAR_MIN_2 = Character.MIN_VALUE;
+ public static final char CHAR_MAX_1 = Character.MAX_VALUE;
+ public static char CHAR_MAX_2 = Character.MAX_VALUE;
+
+ public static final int INT_MIN_1 = Integer.MIN_VALUE;
+ public static int INT_MIN_2 = Integer.MIN_VALUE;
+ public static final int INT_MAX_1 = Integer.MAX_VALUE;
+ public static int INT_MAX_2 = Integer.MAX_VALUE;
+
+ public static final float FLOAT_MIN_EXP_1 = Float.MIN_EXPONENT;
+ public static float FLOAT_MIN_EXP_2 = Float.MIN_EXPONENT;
+ public static final float FLOAT_MIN_NORM_1 = Float.MIN_NORMAL;
+ public static float FLOAT_MIN_NORM_2 = Float.MIN_NORMAL;
+ public static final float FLOAT_MIN_1 = Float.MIN_VALUE;
+ public static float FLOAT_MIN_2 = Float.MIN_VALUE;
+ public static final float FLOAT_MAX_1 = Float.MAX_VALUE;
+ public static float FLOAT_MAX_2 = Float.MAX_VALUE;
+
+ public static final long LONG_MIN_1 = Long.MIN_VALUE;
+ public static long LONG_MIN_2 = Long.MIN_VALUE;
+ public static final long LONG_MAX_1 = Long.MAX_VALUE;
+ public static long LONG_MAX_2 = Long.MAX_VALUE;
+
+ public static final double DOUBLE_MIN_EXP_1 = Double.MIN_EXPONENT;
+ public static double DOUBLE_MIN_EXP_2 = Double.MIN_EXPONENT;
+ public static final double DOUBLE_MIN_NORM_1 = Double.MIN_NORMAL;
+ public static double DOUBLE_MIN_NORM_2 = Double.MIN_NORMAL;
+ public static final double DOUBLE_MIN_1 = Double.MIN_VALUE;
+ public static double DOUBLE_MIN_2 = Double.MIN_VALUE;
+ public static final double DOUBLE_MAX_1 = Double.MAX_VALUE;
+ public static double DOUBLE_MAX_2 = Double.MAX_VALUE;
+
+ public static void main(String[] args) throws Exception {
+ test("foofalse", "foo" + BOOL_FALSE_1);
+ test("foofalse", "foo" + BOOL_FALSE_2);
+ test("footrue", "foo" + BOOL_TRUE_1);
+ test("footrue", "foo" + BOOL_TRUE_2);
+
+ test("foo127", "foo" + BYTE_MAX_1);
+ test("foo127", "foo" + BYTE_MAX_2);
+ test("foo-128", "foo" + BYTE_MIN_1);
+ test("foo-128", "foo" + BYTE_MIN_2);
+
+ test("foo32767", "foo" + SHORT_MAX_1);
+ test("foo32767", "foo" + SHORT_MAX_2);
+ test("foo-32768", "foo" + SHORT_MIN_1);
+ test("foo-32768", "foo" + SHORT_MIN_2);
+
+ test("foo\u0000", "foo" + CHAR_MIN_1);
+ test("foo\u0000", "foo" + CHAR_MIN_2);
+ test("foo\uFFFF", "foo" + CHAR_MAX_1);
+ test("foo\uFFFF", "foo" + CHAR_MAX_2);
+
+ test("foo2147483647", "foo" + INT_MAX_1);
+ test("foo2147483647", "foo" + INT_MAX_2);
+ test("foo-2147483648", "foo" + INT_MIN_1);
+ test("foo-2147483648", "foo" + INT_MIN_2);
+
+ test("foo1.17549435E-38", "foo" + FLOAT_MIN_NORM_1);
+ test("foo1.17549435E-38", "foo" + FLOAT_MIN_NORM_2);
+ test("foo-126.0", "foo" + FLOAT_MIN_EXP_1);
+ test("foo-126.0", "foo" + FLOAT_MIN_EXP_2);
+ test("foo1.4E-45", "foo" + FLOAT_MIN_1);
+ test("foo1.4E-45", "foo" + FLOAT_MIN_2);
+ test("foo3.4028235E38", "foo" + FLOAT_MAX_1);
+ test("foo3.4028235E38", "foo" + FLOAT_MAX_2);
+
+ test("foo-9223372036854775808", "foo" + LONG_MIN_1);
+ test("foo-9223372036854775808", "foo" + LONG_MIN_2);
+ test("foo9223372036854775807", "foo" + LONG_MAX_1);
+ test("foo9223372036854775807", "foo" + LONG_MAX_2);
+
+ test("foo2.2250738585072014E-308", "foo" + DOUBLE_MIN_NORM_1);
+ test("foo2.2250738585072014E-308", "foo" + DOUBLE_MIN_NORM_2);
+ test("foo-1022.0", "foo" + DOUBLE_MIN_EXP_1);
+ test("foo-1022.0", "foo" + DOUBLE_MIN_EXP_2);
+ test("foo4.9E-324", "foo" + DOUBLE_MIN_1);
+ test("foo4.9E-324", "foo" + DOUBLE_MIN_2);
+ test("foo1.7976931348623157E308", "foo" + DOUBLE_MAX_1);
+ test("foo1.7976931348623157E308", "foo" + DOUBLE_MAX_2);
+ }
+
+ public static void test(String expected, String actual) {
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatMany.java 2016-01-15 13:31:21.671227665 +0300
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test implicit String concatenations with lots of arguments.
+ *
+ * @compile ImplicitStringConcatMany.java
+ * @run main/othervm ImplicitStringConcatMany
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcatMany.java
+ * @run main/othervm ImplicitStringConcatMany
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatMany.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatMany
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatMany.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatMany
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatMany
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatMany
+*/
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class ImplicitStringConcatMany {
+
+ static String s000, s001, s002, s003, s004, s005, s006, s007, s008, s009;
+ static String s010, s011, s012, s013, s014, s015, s016, s017, s018, s019;
+ static String s020, s021, s022, s023, s024, s025, s026, s027, s028, s029;
+ static String s030, s031, s032, s033, s034, s035, s036, s037, s038, s039;
+ static String s040, s041, s042, s043, s044, s045, s046, s047, s048, s049;
+ static String s050, s051, s052, s053, s054, s055, s056, s057, s058, s059;
+ static String s060, s061, s062, s063, s064, s065, s066, s067, s068, s069;
+ static String s070, s071, s072, s073, s074, s075, s076, s077, s078, s079;
+ static String s080, s081, s082, s083, s084, s085, s086, s087, s088, s089;
+ static String s090, s091, s092, s093, s094, s095, s096, s097, s098, s099;
+
+ static String s100, s101, s102, s103, s104, s105, s106, s107, s108, s109;
+ static String s110, s111, s112, s113, s114, s115, s116, s117, s118, s119;
+ static String s120, s121, s122, s123, s124, s125, s126, s127, s128, s129;
+ static String s130, s131, s132, s133, s134, s135, s136, s137, s138, s139;
+ static String s140, s141, s142, s143, s144, s145, s146, s147, s148, s149;
+ static String s150, s151, s152, s153, s154, s155, s156, s157, s158, s159;
+ static String s160, s161, s162, s163, s164, s165, s166, s167, s168, s169;
+ static String s170, s171, s172, s173, s174, s175, s176, s177, s178, s179;
+ static String s180, s181, s182, s183, s184, s185, s186, s187, s188, s189;
+ static String s190, s191, s192, s193, s194, s195, s196, s197, s198, s199;
+
+ static String s200, s201, s202, s203, s204, s205, s206, s207, s208, s209;
+ static String s210, s211, s212, s213, s214, s215, s216, s217, s218, s219;
+ static String s220, s221, s222, s223, s224, s225, s226, s227, s228, s229;
+ static String s230, s231, s232, s233, s234, s235, s236, s237, s238, s239;
+ static String s240, s241, s242, s243, s244, s245, s246, s247, s248, s249;
+ static String s250, s251, s252, s253, s254, s255, s256, s257, s258, s259;
+ static String s260, s261, s262, s263, s264, s265, s266, s267, s268, s269;
+ static String s270, s271, s272, s273, s274, s275, s276, s277, s278, s279;
+ static String s280, s281, s282, s283, s284, s285, s286, s287, s288, s289;
+ static String s290, s291, s292, s293, s294, s295, s296, s297, s298, s299;
+
+ static {
+ for (Field f : ImplicitStringConcatMany.class.getDeclaredFields()) {
+ if (Modifier.isStatic(f.getModifiers())) {
+ String name = f.getName();
+ try {
+ f.set(null, name);
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ String res =
+ s000 + s001 + s002 + s003 + s004 + s005 + s006 + s007 + s008 + s009 +
+ s010 + s011 + s012 + s013 + s014 + s015 + s016 + s017 + s018 + s019 +
+ s020 + s021 + s022 + s023 + s024 + s025 + s026 + s027 + s028 + s029 +
+ s030 + s031 + s032 + s033 + s034 + s035 + s036 + s037 + s038 + s039 +
+ s040 + s041 + s042 + s043 + s044 + s045 + s046 + s047 + s048 + s049 +
+ s050 + s051 + s052 + s053 + s054 + s055 + s056 + s057 + s058 + s059 +
+ s060 + s061 + s062 + s063 + s064 + s065 + s066 + s067 + s068 + s069 +
+ s070 + s071 + s072 + s073 + s074 + s075 + s076 + s077 + s078 + s079 +
+ s080 + s081 + s082 + s083 + s084 + s085 + s086 + s087 + s088 + s089 +
+ s090 + s091 + s092 + s093 + s094 + s095 + s096 + s097 + s098 + s099 +
+
+ s100 + s101 + s102 + s103 + s104 + s105 + s106 + s107 + s108 + s109 +
+ s110 + s111 + s112 + s113 + s114 + s115 + s116 + s117 + s118 + s119 +
+ s120 + s121 + s122 + s123 + s124 + s125 + s126 + s127 + s128 + s129 +
+ s130 + s131 + s132 + s133 + s134 + s135 + s136 + s137 + s138 + s139 +
+ s140 + s141 + s142 + s143 + s144 + s145 + s146 + s147 + s148 + s149 +
+ s150 + s151 + s152 + s153 + s154 + s155 + s156 + s157 + s158 + s159 +
+ s160 + s161 + s162 + s163 + s164 + s165 + s166 + s167 + s168 + s169 +
+ s170 + s171 + s172 + s173 + s174 + s175 + s176 + s177 + s178 + s179 +
+ s180 + s181 + s182 + s183 + s184 + s185 + s186 + s187 + s188 + s189 +
+ s190 + s191 + s192 + s193 + s194 + s195 + s196 + s197 + s198 + s199 +
+
+ s200 + s201 + s202 + s203 + s204 + s205 + s206 + s207 + s208 + s209 +
+ s210 + s211 + s212 + s213 + s214 + s215 + s216 + s217 + s218 + s219 +
+ s220 + s221 + s222 + s223 + s224 + s225 + s226 + s227 + s228 + s229 +
+ s230 + s231 + s232 + s233 + s234 + s235 + s236 + s237 + s238 + s239 +
+ s240 + s241 + s242 + s243 + s244 + s245 + s246 + s247 + s248 + s249 +
+ s250 + s251 + s252 + s253 + s254 + s255 + s256 + s257 + s258 + s259 +
+ s260 + s261 + s262 + s263 + s264 + s265 + s266 + s267 + s268 + s269 +
+ s270 + s271 + s272 + s273 + s274 + s275 + s276 + s277 + s278 + s279 +
+ s280 + s281 + s282 + s283 + s284 + s285 + s286 + s287 + s288 + s289 +
+ s290 + s291 + s292 + s293 + s294 + s295 + s296 + s297 + s298 + s299;
+
+ StringBuilder sb = new StringBuilder();
+ for (int c = 0; c < 300; c++) {
+ sb.append(String.format("s%03d", c));
+ }
+ test(sb.toString(), res);
+ }
+
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ throw new IllegalStateException("Expected = " + expected + ", actual = " + actual);
+ }
+ }
+}
+
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatManyLongs.java 2016-01-15 13:31:22.403223969 +0300
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test implicit String concatenations with lots of arguments (two-slot version)
+ *
+ * @compile ImplicitStringConcatManyLongs.java
+ * @run main/othervm ImplicitStringConcatManyLongs
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcatManyLongs.java
+ * @run main/othervm ImplicitStringConcatManyLongs
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatManyLongs.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatManyLongs
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatManyLongs.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatManyLongs
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatManyLongs
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatManyLongs
+*/
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class ImplicitStringConcatManyLongs {
+
+ static long s000, s001, s002, s003, s004, s005, s006, s007, s008, s009;
+ static long s010, s011, s012, s013, s014, s015, s016, s017, s018, s019;
+ static long s020, s021, s022, s023, s024, s025, s026, s027, s028, s029;
+ static long s030, s031, s032, s033, s034, s035, s036, s037, s038, s039;
+ static long s040, s041, s042, s043, s044, s045, s046, s047, s048, s049;
+ static long s050, s051, s052, s053, s054, s055, s056, s057, s058, s059;
+ static long s060, s061, s062, s063, s064, s065, s066, s067, s068, s069;
+ static long s070, s071, s072, s073, s074, s075, s076, s077, s078, s079;
+ static long s080, s081, s082, s083, s084, s085, s086, s087, s088, s089;
+ static long s090, s091, s092, s093, s094, s095, s096, s097, s098, s099;
+
+ static long s100, s101, s102, s103, s104, s105, s106, s107, s108, s109;
+ static long s110, s111, s112, s113, s114, s115, s116, s117, s118, s119;
+ static long s120, s121, s122, s123, s124, s125, s126, s127, s128, s129;
+ static long s130, s131, s132, s133, s134, s135, s136, s137, s138, s139;
+ static long s140, s141, s142, s143, s144, s145, s146, s147, s148, s149;
+ static long s150, s151, s152, s153, s154, s155, s156, s157, s158, s159;
+ static long s160, s161, s162, s163, s164, s165, s166, s167, s168, s169;
+ static long s170, s171, s172, s173, s174, s175, s176, s177, s178, s179;
+ static long s180, s181, s182, s183, s184, s185, s186, s187, s188, s189;
+ static long s190, s191, s192, s193, s194, s195, s196, s197, s198, s199;
+
+ static long s200, s201, s202, s203, s204, s205, s206, s207, s208, s209;
+ static long s210, s211, s212, s213, s214, s215, s216, s217, s218, s219;
+ static long s220, s221, s222, s223, s224, s225, s226, s227, s228, s229;
+ static long s230, s231, s232, s233, s234, s235, s236, s237, s238, s239;
+ static long s240, s241, s242, s243, s244, s245, s246, s247, s248, s249;
+ static long s250, s251, s252, s253, s254, s255, s256, s257, s258, s259;
+ static long s260, s261, s262, s263, s264, s265, s266, s267, s268, s269;
+ static long s270, s271, s272, s273, s274, s275, s276, s277, s278, s279;
+ static long s280, s281, s282, s283, s284, s285, s286, s287, s288, s289;
+ static long s290, s291, s292, s293, s294, s295, s296, s297, s298, s299;
+
+ static {
+ for (Field f : ImplicitStringConcatManyLongs.class.getDeclaredFields()) {
+ if (Modifier.isStatic(f.getModifiers())) {
+ String name = f.getName();
+ try {
+ f.set(null, Long.valueOf(name.substring(1)));
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ String res = "" +
+ s000 + s001 + s002 + s003 + s004 + s005 + s006 + s007 + s008 + s009 +
+ s010 + s011 + s012 + s013 + s014 + s015 + s016 + s017 + s018 + s019 +
+ s020 + s021 + s022 + s023 + s024 + s025 + s026 + s027 + s028 + s029 +
+ s030 + s031 + s032 + s033 + s034 + s035 + s036 + s037 + s038 + s039 +
+ s040 + s041 + s042 + s043 + s044 + s045 + s046 + s047 + s048 + s049 +
+ s050 + s051 + s052 + s053 + s054 + s055 + s056 + s057 + s058 + s059 +
+ s060 + s061 + s062 + s063 + s064 + s065 + s066 + s067 + s068 + s069 +
+ s070 + s071 + s072 + s073 + s074 + s075 + s076 + s077 + s078 + s079 +
+ s080 + s081 + s082 + s083 + s084 + s085 + s086 + s087 + s088 + s089 +
+ s090 + s091 + s092 + s093 + s094 + s095 + s096 + s097 + s098 + s099 +
+
+ s100 + s101 + s102 + s103 + s104 + s105 + s106 + s107 + s108 + s109 +
+ s110 + s111 + s112 + s113 + s114 + s115 + s116 + s117 + s118 + s119 +
+ s120 + s121 + s122 + s123 + s124 + s125 + s126 + s127 + s128 + s129 +
+ s130 + s131 + s132 + s133 + s134 + s135 + s136 + s137 + s138 + s139 +
+ s140 + s141 + s142 + s143 + s144 + s145 + s146 + s147 + s148 + s149 +
+ s150 + s151 + s152 + s153 + s154 + s155 + s156 + s157 + s158 + s159 +
+ s160 + s161 + s162 + s163 + s164 + s165 + s166 + s167 + s168 + s169 +
+ s170 + s171 + s172 + s173 + s174 + s175 + s176 + s177 + s178 + s179 +
+ s180 + s181 + s182 + s183 + s184 + s185 + s186 + s187 + s188 + s189 +
+ s190 + s191 + s192 + s193 + s194 + s195 + s196 + s197 + s198 + s199 +
+
+ s200 + s201 + s202 + s203 + s204 + s205 + s206 + s207 + s208 + s209 +
+ s210 + s211 + s212 + s213 + s214 + s215 + s216 + s217 + s218 + s219 +
+ s220 + s221 + s222 + s223 + s224 + s225 + s226 + s227 + s228 + s229 +
+ s230 + s231 + s232 + s233 + s234 + s235 + s236 + s237 + s238 + s239 +
+ s240 + s241 + s242 + s243 + s244 + s245 + s246 + s247 + s248 + s249 +
+ s250 + s251 + s252 + s253 + s254 + s255 + s256 + s257 + s258 + s259 +
+ s260 + s261 + s262 + s263 + s264 + s265 + s266 + s267 + s268 + s269 +
+ s270 + s271 + s272 + s273 + s274 + s275 + s276 + s277 + s278 + s279 +
+ s280 + s281 + s282 + s283 + s284 + s285 + s286 + s287 + s288 + s289 +
+ s290 + s291 + s292 + s293 + s294 + s295 + s296 + s297 + s298 + s299;
+
+ StringBuilder sb = new StringBuilder();
+ for (int c = 0; c < 300; c++) {
+ sb.append(c);
+ }
+ test(sb.toString(), res);
+ }
+
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ throw new IllegalStateException("Expected = " + expected + ", actual = " + actual);
+ }
+ }
+}
+
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatShapes-head.template 2016-01-15 13:31:22.955221181 +0300
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test implicit String concatenations, multiple shapes.
+ *
+ * @compile ImplicitStringConcatShapes.java
+ * @run main/othervm ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcatShapes.java
+ * @run main/othervm ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatShapes.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatShapes.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+*/
+public class ImplicitStringConcatShapes {
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+
+ static class MyClass {
+ private final int i;
+
+ public MyClass(int i) {
+ this.i = i;
+ }
+
+ public String toString() {
+ return new StringBuilder("C(").append(i).append(")").toString();
+ }
+ }
+
+ static class MyClassNullToString {
+ public String toString() {
+ return null;
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ new ImplicitStringConcatShapes().run();
+ }
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatShapes.java 2016-01-15 13:31:23.559218132 +0300
@@ -0,0 +1,5931 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @summary Test implicit String concatenations, multiple shapes.
+ *
+ * @compile ImplicitStringConcatShapes.java
+ * @run main/othervm ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=inline ImplicitStringConcatShapes.java
+ * @run main/othervm ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=indy -source 1.9 -target 1.9 ImplicitStringConcatShapes.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ *
+ * @compile -XDstringConcat=indyWithConstants -source 1.9 -target 1.9 ImplicitStringConcatShapes.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true ImplicitStringConcatShapes
+*/
+public class ImplicitStringConcatShapes {
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+
+ static class MyClass {
+ private final int i;
+
+ public MyClass(int i) {
+ this.i = i;
+ }
+
+ public String toString() {
+ return new StringBuilder("C(").append(i).append(")").toString();
+ }
+ }
+
+ static class MyClassNullToString {
+ public String toString() {
+ return null;
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ new ImplicitStringConcatShapes().run();
+ }
+ static final boolean sf_bl = true;
+ static final byte sf_b = 80;
+ static final byte sf_bM = -41;
+ static final char sf_c = 'C';
+ static final short sf_s = 5500;
+ static final short sf_sM = -8400;
+ static final int sf_i = 75000000;
+ static final int sf_iM = -2000000;
+ static final Integer sf_I = 1000000;
+ static final Integer sf_IN = null;
+ static final float sf_f = 17.0f;
+ static final float sf_fM = -42.0f;
+ static final long sf_l = -194313216L;
+ static final long sf_lM = -1705032704L;
+ static final double sf_d = 12.0d;
+ static final double sf_dM = -84.0d;
+ static final Object sf_o = new MyClass(87);
+ static final Object sf_oN = null;
+ static final Object sf_oNtS = new MyClassNullToString();
+ static final String sf_str = "75";
+ static final String sf_strU = "\u04511";
+ static final String sf_strU1 = "\u000151";
+ static final String sf_strU2 = "\u000292";
+ static final int[] sf_iAN = null;
+ static final Object[] sf_oAN = null;
+ static boolean s_bl = true;
+ static byte s_b = 25;
+ static byte s_bM = -43;
+ static char s_c = 'T';
+ static short s_s = 3900;
+ static short s_sM = -2900;
+ static int s_i = 97000000;
+ static int s_iM = -1000000;
+ static Integer s_I = 25000000;
+ static Integer s_IN = null;
+ static float s_f = 55.0f;
+ static float s_fM = -52.0f;
+ static long s_l = 935228928L;
+ static long s_lM = -1410065408L;
+ static double s_d = 8.0d;
+ static double s_dM = -96.0d;
+ static Object s_o = new MyClass(82);
+ static Object s_oN = null;
+ static Object s_oNtS = new MyClassNullToString();
+ static String s_str = "18";
+ static String s_strU = "\u045180";
+ static String s_strU1 = "\u000112";
+ static String s_strU2 = "\u000291";
+ static int[] s_iAN = null;
+ static Object[] s_oAN = null;
+ final boolean f_bl = false;
+ final byte f_b = 44;
+ final byte f_bM = -54;
+ final char f_c = 'I';
+ final short f_s = 8000;
+ final short f_sM = -9900;
+ final int f_i = 58000000;
+ final int f_iM = -55000000;
+ final Integer f_I = 94000000;
+ final Integer f_IN = null;
+ final float f_f = 94.0f;
+ final float f_fM = -87.0f;
+ final long f_l = 1460392448L;
+ final long f_lM = -820130816L;
+ final double f_d = 83.0d;
+ final double f_dM = -99.0d;
+ final Object f_o = new MyClass(70);
+ final Object f_oN = null;
+ final Object f_oNtS = new MyClassNullToString();
+ final String f_str = "19";
+ final String f_strU = "\u045176";
+ final String f_strU1 = "\u000121";
+ final String f_strU2 = "\u000218";
+ final int[] f_iAN = null;
+ final Object[] f_oAN = null;
+
+ public void run() {
+ run0();
+ run1();
+ run2();
+ run3();
+ run4();
+ run5();
+ }
+
+ public void run0() {
+ test("-96.0", "" + s_dM);
+ test("null", "" + s_oNtS);
+ test("\u045176", "" + f_strU);
+ test("92", "" + sf_strU2);
+ test("51", "" + sf_strU1);
+ test("null", "" + s_iAN);
+ test("-54", "" + f_bM);
+ test("-87.0", "" + f_fM);
+ test("null", "" + s_oAN);
+ test("19", "" + f_str);
+ test("-41", "" + sf_bM);
+ test("null", "" + sf_IN);
+ test("T", "" + s_c);
+ test("-42.0", "" + sf_fM);
+ test("25", "" + s_b);
+ test("null", "" + f_oN);
+ test("-1410065408", "" + s_lM);
+ test("8.0", "" + s_d);
+ test("55.0", "" + s_f);
+ test("97000000", "" + s_i);
+ test("-9900", "" + f_sM);
+ test("935228928", "" + s_l);
+ test("-8400", "" + sf_sM);
+ test("C(82)", "" + s_o);
+ test("null", "" + sf_oNtS);
+ test("true", "" + s_bl);
+ test("3900", "" + s_s);
+ test("null", "" + sf_oN);
+ test("94000000", "" + f_I);
+ test("null", "" + f_IN);
+ test("true", "" + sf_bl);
+ test("5500", "" + sf_s);
+ test("-2900", "" + s_sM);
+ test("-194313216", "" + sf_l);
+ test("12", "" + s_strU1);
+ test("C(87)", "" + sf_o);
+ test("91", "" + s_strU2);
+ test("21", "" + f_strU1);
+ test("18", "" + f_strU2);
+ test("null", "" + f_iAN);
+ test("null", "" + s_oN);
+ test("\u045180", "" + s_strU);
+ test("C", "" + sf_c);
+ test("75", "" + sf_str);
+ test("-43", "" + s_bM);
+ test("80", "" + sf_b);
+ test("null", "" + s_IN);
+ test("-52.0", "" + s_fM);
+ test("75000000", "" + sf_i);
+ test("44", "" + f_b);
+ test("-1705032704", "" + sf_lM);
+ test("null", "" + f_oAN);
+ test("83.0", "" + f_d);
+ test("I", "" + f_c);
+ test("94.0", "" + f_f);
+ test("12.0", "" + sf_d);
+ test("-99.0", "" + f_dM);
+ test("17.0", "" + sf_f);
+ test("-84.0", "" + sf_dM);
+ test("58000000", "" + f_i);
+ test("-55000000", "" + f_iM);
+ test("1460392448", "" + f_l);
+ test("C(70)", "" + f_o);
+ test("\u04511", "" + sf_strU);
+ test("8000", "" + f_s);
+ test("18", "" + s_str);
+ test("-1000000", "" + s_iM);
+ test("1000000", "" + sf_I);
+ test("null", "" + f_oNtS);
+ test("false", "" + f_bl);
+ test("null", "" + sf_iAN);
+ test("-2000000", "" + sf_iM);
+ test("-820130816", "" + f_lM);
+ test("null", "" + sf_oAN);
+ test("25000000", "" + s_I);
+ test("-96.0-96.0", "" + s_dM + s_dM);
+ test("-96.0null", "" + s_dM + s_oNtS);
+ test("-96.0\u045176", "" + s_dM + f_strU);
+ test("-96.092", "" + s_dM + sf_strU2);
+ test("-96.051", "" + s_dM + sf_strU1);
+ test("-96.0null", "" + s_dM + s_iAN);
+ test("-96.0-54", "" + s_dM + f_bM);
+ test("-96.0-87.0", "" + s_dM + f_fM);
+ test("-96.0null", "" + s_dM + s_oAN);
+ test("-96.019", "" + s_dM + f_str);
+ test("-96.0-41", "" + s_dM + sf_bM);
+ test("-96.0null", "" + s_dM + sf_IN);
+ test("-96.0T", "" + s_dM + s_c);
+ test("-96.0-42.0", "" + s_dM + sf_fM);
+ test("-96.025", "" + s_dM + s_b);
+ test("-96.0null", "" + s_dM + f_oN);
+ test("-96.0-1410065408", "" + s_dM + s_lM);
+ test("-96.08.0", "" + s_dM + s_d);
+ test("-96.055.0", "" + s_dM + s_f);
+ test("-96.097000000", "" + s_dM + s_i);
+ test("-96.0-9900", "" + s_dM + f_sM);
+ test("-96.0935228928", "" + s_dM + s_l);
+ test("-96.0-8400", "" + s_dM + sf_sM);
+ test("-96.0C(82)", "" + s_dM + s_o);
+ test("-96.0null", "" + s_dM + sf_oNtS);
+ test("-96.0true", "" + s_dM + s_bl);
+ test("-96.03900", "" + s_dM + s_s);
+ test("-96.0null", "" + s_dM + sf_oN);
+ test("-96.094000000", "" + s_dM + f_I);
+ test("-96.0null", "" + s_dM + f_IN);
+ test("-96.0true", "" + s_dM + sf_bl);
+ test("-96.05500", "" + s_dM + sf_s);
+ test("-96.0-2900", "" + s_dM + s_sM);
+ test("-96.0-194313216", "" + s_dM + sf_l);
+ test("-96.012", "" + s_dM + s_strU1);
+ test("-96.0C(87)", "" + s_dM + sf_o);
+ test("-96.091", "" + s_dM + s_strU2);
+ test("-96.021", "" + s_dM + f_strU1);
+ test("-96.018", "" + s_dM + f_strU2);
+ test("-96.0null", "" + s_dM + f_iAN);
+ test("-96.0null", "" + s_dM + s_oN);
+ test("-96.0\u045180", "" + s_dM + s_strU);
+ test("-96.0C", "" + s_dM + sf_c);
+ test("-96.075", "" + s_dM + sf_str);
+ test("-96.0-43", "" + s_dM + s_bM);
+ test("-96.080", "" + s_dM + sf_b);
+ test("-96.0null", "" + s_dM + s_IN);
+ test("-96.0-52.0", "" + s_dM + s_fM);
+ test("-96.075000000", "" + s_dM + sf_i);
+ test("-96.044", "" + s_dM + f_b);
+ test("-96.0-1705032704", "" + s_dM + sf_lM);
+ test("-96.0null", "" + s_dM + f_oAN);
+ test("-96.083.0", "" + s_dM + f_d);
+ test("-96.0I", "" + s_dM + f_c);
+ test("-96.094.0", "" + s_dM + f_f);
+ test("-96.012.0", "" + s_dM + sf_d);
+ test("-96.0-99.0", "" + s_dM + f_dM);
+ test("-96.017.0", "" + s_dM + sf_f);
+ test("-96.0-84.0", "" + s_dM + sf_dM);
+ test("-96.058000000", "" + s_dM + f_i);
+ test("-96.0-55000000", "" + s_dM + f_iM);
+ test("-96.01460392448", "" + s_dM + f_l);
+ test("-96.0C(70)", "" + s_dM + f_o);
+ test("-96.0\u04511", "" + s_dM + sf_strU);
+ test("-96.08000", "" + s_dM + f_s);
+ test("-96.018", "" + s_dM + s_str);
+ test("-96.0-1000000", "" + s_dM + s_iM);
+ test("-96.01000000", "" + s_dM + sf_I);
+ test("-96.0null", "" + s_dM + f_oNtS);
+ test("-96.0false", "" + s_dM + f_bl);
+ test("-96.0null", "" + s_dM + sf_iAN);
+ test("-96.0-2000000", "" + s_dM + sf_iM);
+ test("-96.0-820130816", "" + s_dM + f_lM);
+ test("-96.0null", "" + s_dM + sf_oAN);
+ test("-96.025000000", "" + s_dM + s_I);
+ test("null-96.0", "" + s_oNtS + s_dM);
+ test("nullnull", "" + s_oNtS + s_oNtS);
+ test("null\u045176", "" + s_oNtS + f_strU);
+ test("null92", "" + s_oNtS + sf_strU2);
+ test("null51", "" + s_oNtS + sf_strU1);
+ test("nullnull", "" + s_oNtS + s_iAN);
+ test("null-54", "" + s_oNtS + f_bM);
+ test("null-87.0", "" + s_oNtS + f_fM);
+ test("nullnull", "" + s_oNtS + s_oAN);
+ test("null19", "" + s_oNtS + f_str);
+ test("null-41", "" + s_oNtS + sf_bM);
+ test("nullnull", "" + s_oNtS + sf_IN);
+ test("nullT", "" + s_oNtS + s_c);
+ test("null-42.0", "" + s_oNtS + sf_fM);
+ test("null25", "" + s_oNtS + s_b);
+ test("nullnull", "" + s_oNtS + f_oN);
+ test("null-1410065408", "" + s_oNtS + s_lM);
+ test("null8.0", "" + s_oNtS + s_d);
+ test("null55.0", "" + s_oNtS + s_f);
+ test("null97000000", "" + s_oNtS + s_i);
+ test("null-9900", "" + s_oNtS + f_sM);
+ test("null935228928", "" + s_oNtS + s_l);
+ test("null-8400", "" + s_oNtS + sf_sM);
+ test("nullC(82)", "" + s_oNtS + s_o);
+ test("nullnull", "" + s_oNtS + sf_oNtS);
+ test("nulltrue", "" + s_oNtS + s_bl);
+ test("null3900", "" + s_oNtS + s_s);
+ test("nullnull", "" + s_oNtS + sf_oN);
+ test("null94000000", "" + s_oNtS + f_I);
+ test("nullnull", "" + s_oNtS + f_IN);
+ test("nulltrue", "" + s_oNtS + sf_bl);
+ test("null5500", "" + s_oNtS + sf_s);
+ test("null-2900", "" + s_oNtS + s_sM);
+ test("null-194313216", "" + s_oNtS + sf_l);
+ test("null12", "" + s_oNtS + s_strU1);
+ test("nullC(87)", "" + s_oNtS + sf_o);
+ test("null91", "" + s_oNtS + s_strU2);
+ test("null21", "" + s_oNtS + f_strU1);
+ test("null18", "" + s_oNtS + f_strU2);
+ test("nullnull", "" + s_oNtS + f_iAN);
+ test("nullnull", "" + s_oNtS + s_oN);
+ test("null\u045180", "" + s_oNtS + s_strU);
+ test("nullC", "" + s_oNtS + sf_c);
+ test("null75", "" + s_oNtS + sf_str);
+ test("null-43", "" + s_oNtS + s_bM);
+ test("null80", "" + s_oNtS + sf_b);
+ test("nullnull", "" + s_oNtS + s_IN);
+ test("null-52.0", "" + s_oNtS + s_fM);
+ test("null75000000", "" + s_oNtS + sf_i);
+ test("null44", "" + s_oNtS + f_b);
+ test("null-1705032704", "" + s_oNtS + sf_lM);
+ test("nullnull", "" + s_oNtS + f_oAN);
+ test("null83.0", "" + s_oNtS + f_d);
+ test("nullI", "" + s_oNtS + f_c);
+ test("null94.0", "" + s_oNtS + f_f);
+ test("null12.0", "" + s_oNtS + sf_d);
+ test("null-99.0", "" + s_oNtS + f_dM);
+ test("null17.0", "" + s_oNtS + sf_f);
+ test("null-84.0", "" + s_oNtS + sf_dM);
+ test("null58000000", "" + s_oNtS + f_i);
+ test("null-55000000", "" + s_oNtS + f_iM);
+ test("null1460392448", "" + s_oNtS + f_l);
+ test("nullC(70)", "" + s_oNtS + f_o);
+ test("null\u04511", "" + s_oNtS + sf_strU);
+ test("null8000", "" + s_oNtS + f_s);
+ test("null18", "" + s_oNtS + s_str);
+ test("null-1000000", "" + s_oNtS + s_iM);
+ test("null1000000", "" + s_oNtS + sf_I);
+ test("nullnull", "" + s_oNtS + f_oNtS);
+ test("nullfalse", "" + s_oNtS + f_bl);
+ test("nullnull", "" + s_oNtS + sf_iAN);
+ test("null-2000000", "" + s_oNtS + sf_iM);
+ test("null-820130816", "" + s_oNtS + f_lM);
+ test("nullnull", "" + s_oNtS + sf_oAN);
+ test("null25000000", "" + s_oNtS + s_I);
+ test("\u045176-96.0", "" + f_strU + s_dM);
+ test("\u045176null", "" + f_strU + s_oNtS);
+ test("\u045176\u045176", "" + f_strU + f_strU);
+ test("\u04517692", "" + f_strU + sf_strU2);
+ test("\u04517651", "" + f_strU + sf_strU1);
+ test("\u045176null", "" + f_strU + s_iAN);
+ test("\u045176-54", "" + f_strU + f_bM);
+ test("\u045176-87.0", "" + f_strU + f_fM);
+ test("\u045176null", "" + f_strU + s_oAN);
+ test("\u04517619", "" + f_strU + f_str);
+ test("\u045176-41", "" + f_strU + sf_bM);
+ test("\u045176null", "" + f_strU + sf_IN);
+ test("\u045176T", "" + f_strU + s_c);
+ test("\u045176-42.0", "" + f_strU + sf_fM);
+ test("\u04517625", "" + f_strU + s_b);
+ test("\u045176null", "" + f_strU + f_oN);
+ test("\u045176-1410065408", "" + f_strU + s_lM);
+ test("\u0451768.0", "" + f_strU + s_d);
+ test("\u04517655.0", "" + f_strU + s_f);
+ test("\u04517697000000", "" + f_strU + s_i);
+ test("\u045176-9900", "" + f_strU + f_sM);
+ test("\u045176935228928", "" + f_strU + s_l);
+ test("\u045176-8400", "" + f_strU + sf_sM);
+ test("\u045176C(82)", "" + f_strU + s_o);
+ test("\u045176null", "" + f_strU + sf_oNtS);
+ test("\u045176true", "" + f_strU + s_bl);
+ test("\u0451763900", "" + f_strU + s_s);
+ test("\u045176null", "" + f_strU + sf_oN);
+ test("\u04517694000000", "" + f_strU + f_I);
+ test("\u045176null", "" + f_strU + f_IN);
+ test("\u045176true", "" + f_strU + sf_bl);
+ test("\u0451765500", "" + f_strU + sf_s);
+ test("\u045176-2900", "" + f_strU + s_sM);
+ test("\u045176-194313216", "" + f_strU + sf_l);
+ test("\u04517612", "" + f_strU + s_strU1);
+ test("\u045176C(87)", "" + f_strU + sf_o);
+ test("\u04517691", "" + f_strU + s_strU2);
+ test("\u04517621", "" + f_strU + f_strU1);
+ test("\u04517618", "" + f_strU + f_strU2);
+ test("\u045176null", "" + f_strU + f_iAN);
+ test("\u045176null", "" + f_strU + s_oN);
+ test("\u045176\u045180", "" + f_strU + s_strU);
+ test("\u045176C", "" + f_strU + sf_c);
+ test("\u04517675", "" + f_strU + sf_str);
+ test("\u045176-43", "" + f_strU + s_bM);
+ test("\u04517680", "" + f_strU + sf_b);
+ test("\u045176null", "" + f_strU + s_IN);
+ test("\u045176-52.0", "" + f_strU + s_fM);
+ test("\u04517675000000", "" + f_strU + sf_i);
+ test("\u04517644", "" + f_strU + f_b);
+ test("\u045176-1705032704", "" + f_strU + sf_lM);
+ test("\u045176null", "" + f_strU + f_oAN);
+ test("\u04517683.0", "" + f_strU + f_d);
+ test("\u045176I", "" + f_strU + f_c);
+ test("\u04517694.0", "" + f_strU + f_f);
+ test("\u04517612.0", "" + f_strU + sf_d);
+ test("\u045176-99.0", "" + f_strU + f_dM);
+ test("\u04517617.0", "" + f_strU + sf_f);
+ test("\u045176-84.0", "" + f_strU + sf_dM);
+ test("\u04517658000000", "" + f_strU + f_i);
+ test("\u045176-55000000", "" + f_strU + f_iM);
+ test("\u0451761460392448", "" + f_strU + f_l);
+ test("\u045176C(70)", "" + f_strU + f_o);
+ test("\u045176\u04511", "" + f_strU + sf_strU);
+ test("\u0451768000", "" + f_strU + f_s);
+ test("\u04517618", "" + f_strU + s_str);
+ test("\u045176-1000000", "" + f_strU + s_iM);
+ test("\u0451761000000", "" + f_strU + sf_I);
+ test("\u045176null", "" + f_strU + f_oNtS);
+ test("\u045176false", "" + f_strU + f_bl);
+ test("\u045176null", "" + f_strU + sf_iAN);
+ test("\u045176-2000000", "" + f_strU + sf_iM);
+ test("\u045176-820130816", "" + f_strU + f_lM);
+ test("\u045176null", "" + f_strU + sf_oAN);
+ test("\u04517625000000", "" + f_strU + s_I);
+ test("92-96.0", "" + sf_strU2 + s_dM);
+ test("92null", "" + sf_strU2 + s_oNtS);
+ test("92\u045176", "" + sf_strU2 + f_strU);
+ test("9292", "" + sf_strU2 + sf_strU2);
+ test("9251", "" + sf_strU2 + sf_strU1);
+ test("92null", "" + sf_strU2 + s_iAN);
+ test("92-54", "" + sf_strU2 + f_bM);
+ test("92-87.0", "" + sf_strU2 + f_fM);
+ test("92null", "" + sf_strU2 + s_oAN);
+ test("9219", "" + sf_strU2 + f_str);
+ test("92-41", "" + sf_strU2 + sf_bM);
+ test("92null", "" + sf_strU2 + sf_IN);
+ test("92T", "" + sf_strU2 + s_c);
+ test("92-42.0", "" + sf_strU2 + sf_fM);
+ test("9225", "" + sf_strU2 + s_b);
+ test("92null", "" + sf_strU2 + f_oN);
+ test("92-1410065408", "" + sf_strU2 + s_lM);
+ test("928.0", "" + sf_strU2 + s_d);
+ test("9255.0", "" + sf_strU2 + s_f);
+ test("9297000000", "" + sf_strU2 + s_i);
+ test("92-9900", "" + sf_strU2 + f_sM);
+ test("92935228928", "" + sf_strU2 + s_l);
+ test("92-8400", "" + sf_strU2 + sf_sM);
+ test("92C(82)", "" + sf_strU2 + s_o);
+ test("92null", "" + sf_strU2 + sf_oNtS);
+ test("92true", "" + sf_strU2 + s_bl);
+ test("923900", "" + sf_strU2 + s_s);
+ test("92null", "" + sf_strU2 + sf_oN);
+ test("9294000000", "" + sf_strU2 + f_I);
+ test("92null", "" + sf_strU2 + f_IN);
+ test("92true", "" + sf_strU2 + sf_bl);
+ test("925500", "" + sf_strU2 + sf_s);
+ test("92-2900", "" + sf_strU2 + s_sM);
+ test("92-194313216", "" + sf_strU2 + sf_l);
+ test("9212", "" + sf_strU2 + s_strU1);
+ test("92C(87)", "" + sf_strU2 + sf_o);
+ test("9291", "" + sf_strU2 + s_strU2);
+ test("9221", "" + sf_strU2 + f_strU1);
+ test("9218", "" + sf_strU2 + f_strU2);
+ test("92null", "" + sf_strU2 + f_iAN);
+ test("92null", "" + sf_strU2 + s_oN);
+ test("92\u045180", "" + sf_strU2 + s_strU);
+ test("92C", "" + sf_strU2 + sf_c);
+ test("9275", "" + sf_strU2 + sf_str);
+ test("92-43", "" + sf_strU2 + s_bM);
+ test("9280", "" + sf_strU2 + sf_b);
+ test("92null", "" + sf_strU2 + s_IN);
+ test("92-52.0", "" + sf_strU2 + s_fM);
+ test("9275000000", "" + sf_strU2 + sf_i);
+ test("9244", "" + sf_strU2 + f_b);
+ test("92-1705032704", "" + sf_strU2 + sf_lM);
+ test("92null", "" + sf_strU2 + f_oAN);
+ test("9283.0", "" + sf_strU2 + f_d);
+ test("92I", "" + sf_strU2 + f_c);
+ test("9294.0", "" + sf_strU2 + f_f);
+ test("9212.0", "" + sf_strU2 + sf_d);
+ test("92-99.0", "" + sf_strU2 + f_dM);
+ test("9217.0", "" + sf_strU2 + sf_f);
+ test("92-84.0", "" + sf_strU2 + sf_dM);
+ test("9258000000", "" + sf_strU2 + f_i);
+ test("92-55000000", "" + sf_strU2 + f_iM);
+ test("921460392448", "" + sf_strU2 + f_l);
+ test("92C(70)", "" + sf_strU2 + f_o);
+ test("92\u04511", "" + sf_strU2 + sf_strU);
+ test("928000", "" + sf_strU2 + f_s);
+ test("9218", "" + sf_strU2 + s_str);
+ test("92-1000000", "" + sf_strU2 + s_iM);
+ test("921000000", "" + sf_strU2 + sf_I);
+ test("92null", "" + sf_strU2 + f_oNtS);
+ test("92false", "" + sf_strU2 + f_bl);
+ test("92null", "" + sf_strU2 + sf_iAN);
+ test("92-2000000", "" + sf_strU2 + sf_iM);
+ test("92-820130816", "" + sf_strU2 + f_lM);
+ test("92null", "" + sf_strU2 + sf_oAN);
+ test("9225000000", "" + sf_strU2 + s_I);
+ test("51-96.0", "" + sf_strU1 + s_dM);
+ test("51null", "" + sf_strU1 + s_oNtS);
+ test("51\u045176", "" + sf_strU1 + f_strU);
+ test("5192", "" + sf_strU1 + sf_strU2);
+ test("5151", "" + sf_strU1 + sf_strU1);
+ test("51null", "" + sf_strU1 + s_iAN);
+ test("51-54", "" + sf_strU1 + f_bM);
+ test("51-87.0", "" + sf_strU1 + f_fM);
+ test("51null", "" + sf_strU1 + s_oAN);
+ test("5119", "" + sf_strU1 + f_str);
+ test("51-41", "" + sf_strU1 + sf_bM);
+ test("51null", "" + sf_strU1 + sf_IN);
+ test("51T", "" + sf_strU1 + s_c);
+ test("51-42.0", "" + sf_strU1 + sf_fM);
+ test("5125", "" + sf_strU1 + s_b);
+ test("51null", "" + sf_strU1 + f_oN);
+ test("51-1410065408", "" + sf_strU1 + s_lM);
+ test("518.0", "" + sf_strU1 + s_d);
+ test("5155.0", "" + sf_strU1 + s_f);
+ test("5197000000", "" + sf_strU1 + s_i);
+ test("51-9900", "" + sf_strU1 + f_sM);
+ test("51935228928", "" + sf_strU1 + s_l);
+ test("51-8400", "" + sf_strU1 + sf_sM);
+ test("51C(82)", "" + sf_strU1 + s_o);
+ test("51null", "" + sf_strU1 + sf_oNtS);
+ test("51true", "" + sf_strU1 + s_bl);
+ test("513900", "" + sf_strU1 + s_s);
+ test("51null", "" + sf_strU1 + sf_oN);
+ test("5194000000", "" + sf_strU1 + f_I);
+ test("51null", "" + sf_strU1 + f_IN);
+ test("51true", "" + sf_strU1 + sf_bl);
+ test("515500", "" + sf_strU1 + sf_s);
+ test("51-2900", "" + sf_strU1 + s_sM);
+ test("51-194313216", "" + sf_strU1 + sf_l);
+ test("5112", "" + sf_strU1 + s_strU1);
+ test("51C(87)", "" + sf_strU1 + sf_o);
+ test("5191", "" + sf_strU1 + s_strU2);
+ test("5121", "" + sf_strU1 + f_strU1);
+ test("5118", "" + sf_strU1 + f_strU2);
+ test("51null", "" + sf_strU1 + f_iAN);
+ test("51null", "" + sf_strU1 + s_oN);
+ test("51\u045180", "" + sf_strU1 + s_strU);
+ test("51C", "" + sf_strU1 + sf_c);
+ test("5175", "" + sf_strU1 + sf_str);
+ test("51-43", "" + sf_strU1 + s_bM);
+ test("5180", "" + sf_strU1 + sf_b);
+ test("51null", "" + sf_strU1 + s_IN);
+ test("51-52.0", "" + sf_strU1 + s_fM);
+ test("5175000000", "" + sf_strU1 + sf_i);
+ test("5144", "" + sf_strU1 + f_b);
+ test("51-1705032704", "" + sf_strU1 + sf_lM);
+ test("51null", "" + sf_strU1 + f_oAN);
+ test("5183.0", "" + sf_strU1 + f_d);
+ test("51I", "" + sf_strU1 + f_c);
+ test("5194.0", "" + sf_strU1 + f_f);
+ test("5112.0", "" + sf_strU1 + sf_d);
+ test("51-99.0", "" + sf_strU1 + f_dM);
+ test("5117.0", "" + sf_strU1 + sf_f);
+ test("51-84.0", "" + sf_strU1 + sf_dM);
+ test("5158000000", "" + sf_strU1 + f_i);
+ test("51-55000000", "" + sf_strU1 + f_iM);
+ test("511460392448", "" + sf_strU1 + f_l);
+ test("51C(70)", "" + sf_strU1 + f_o);
+ test("51\u04511", "" + sf_strU1 + sf_strU);
+ test("518000", "" + sf_strU1 + f_s);
+ test("5118", "" + sf_strU1 + s_str);
+ test("51-1000000", "" + sf_strU1 + s_iM);
+ test("511000000", "" + sf_strU1 + sf_I);
+ test("51null", "" + sf_strU1 + f_oNtS);
+ test("51false", "" + sf_strU1 + f_bl);
+ test("51null", "" + sf_strU1 + sf_iAN);
+ test("51-2000000", "" + sf_strU1 + sf_iM);
+ test("51-820130816", "" + sf_strU1 + f_lM);
+ test("51null", "" + sf_strU1 + sf_oAN);
+ test("5125000000", "" + sf_strU1 + s_I);
+ test("null-96.0", "" + s_iAN + s_dM);
+ test("nullnull", "" + s_iAN + s_oNtS);
+ test("null\u045176", "" + s_iAN + f_strU);
+ test("null92", "" + s_iAN + sf_strU2);
+ test("null51", "" + s_iAN + sf_strU1);
+ test("nullnull", "" + s_iAN + s_iAN);
+ test("null-54", "" + s_iAN + f_bM);
+ test("null-87.0", "" + s_iAN + f_fM);
+ test("nullnull", "" + s_iAN + s_oAN);
+ test("null19", "" + s_iAN + f_str);
+ test("null-41", "" + s_iAN + sf_bM);
+ test("nullnull", "" + s_iAN + sf_IN);
+ test("nullT", "" + s_iAN + s_c);
+ test("null-42.0", "" + s_iAN + sf_fM);
+ test("null25", "" + s_iAN + s_b);
+ test("nullnull", "" + s_iAN + f_oN);
+ test("null-1410065408", "" + s_iAN + s_lM);
+ test("null8.0", "" + s_iAN + s_d);
+ test("null55.0", "" + s_iAN + s_f);
+ test("null97000000", "" + s_iAN + s_i);
+ test("null-9900", "" + s_iAN + f_sM);
+ test("null935228928", "" + s_iAN + s_l);
+ test("null-8400", "" + s_iAN + sf_sM);
+ test("nullC(82)", "" + s_iAN + s_o);
+ test("nullnull", "" + s_iAN + sf_oNtS);
+ test("nulltrue", "" + s_iAN + s_bl);
+ test("null3900", "" + s_iAN + s_s);
+ test("nullnull", "" + s_iAN + sf_oN);
+ test("null94000000", "" + s_iAN + f_I);
+ test("nullnull", "" + s_iAN + f_IN);
+ test("nulltrue", "" + s_iAN + sf_bl);
+ test("null5500", "" + s_iAN + sf_s);
+ test("null-2900", "" + s_iAN + s_sM);
+ test("null-194313216", "" + s_iAN + sf_l);
+ test("null12", "" + s_iAN + s_strU1);
+ test("nullC(87)", "" + s_iAN + sf_o);
+ test("null91", "" + s_iAN + s_strU2);
+ test("null21", "" + s_iAN + f_strU1);
+ test("null18", "" + s_iAN + f_strU2);
+ test("nullnull", "" + s_iAN + f_iAN);
+ test("nullnull", "" + s_iAN + s_oN);
+ test("null\u045180", "" + s_iAN + s_strU);
+ test("nullC", "" + s_iAN + sf_c);
+ test("null75", "" + s_iAN + sf_str);
+ test("null-43", "" + s_iAN + s_bM);
+ test("null80", "" + s_iAN + sf_b);
+ test("nullnull", "" + s_iAN + s_IN);
+ test("null-52.0", "" + s_iAN + s_fM);
+ test("null75000000", "" + s_iAN + sf_i);
+ test("null44", "" + s_iAN + f_b);
+ test("null-1705032704", "" + s_iAN + sf_lM);
+ test("nullnull", "" + s_iAN + f_oAN);
+ test("null83.0", "" + s_iAN + f_d);
+ test("nullI", "" + s_iAN + f_c);
+ test("null94.0", "" + s_iAN + f_f);
+ test("null12.0", "" + s_iAN + sf_d);
+ test("null-99.0", "" + s_iAN + f_dM);
+ test("null17.0", "" + s_iAN + sf_f);
+ test("null-84.0", "" + s_iAN + sf_dM);
+ test("null58000000", "" + s_iAN + f_i);
+ test("null-55000000", "" + s_iAN + f_iM);
+ test("null1460392448", "" + s_iAN + f_l);
+ test("nullC(70)", "" + s_iAN + f_o);
+ test("null\u04511", "" + s_iAN + sf_strU);
+ test("null8000", "" + s_iAN + f_s);
+ test("null18", "" + s_iAN + s_str);
+ test("null-1000000", "" + s_iAN + s_iM);
+ test("null1000000", "" + s_iAN + sf_I);
+ test("nullnull", "" + s_iAN + f_oNtS);
+ test("nullfalse", "" + s_iAN + f_bl);
+ test("nullnull", "" + s_iAN + sf_iAN);
+ test("null-2000000", "" + s_iAN + sf_iM);
+ test("null-820130816", "" + s_iAN + f_lM);
+ test("nullnull", "" + s_iAN + sf_oAN);
+ test("null25000000", "" + s_iAN + s_I);
+ test("-54-96.0", "" + f_bM + s_dM);
+ test("-54null", "" + f_bM + s_oNtS);
+ test("-54\u045176", "" + f_bM + f_strU);
+ test("-5492", "" + f_bM + sf_strU2);
+ test("-5451", "" + f_bM + sf_strU1);
+ test("-54null", "" + f_bM + s_iAN);
+ test("-54-54", "" + f_bM + f_bM);
+ test("-54-87.0", "" + f_bM + f_fM);
+ test("-54null", "" + f_bM + s_oAN);
+ test("-5419", "" + f_bM + f_str);
+ test("-54-41", "" + f_bM + sf_bM);
+ test("-54null", "" + f_bM + sf_IN);
+ test("-54T", "" + f_bM + s_c);
+ test("-54-42.0", "" + f_bM + sf_fM);
+ test("-5425", "" + f_bM + s_b);
+ test("-54null", "" + f_bM + f_oN);
+ test("-54-1410065408", "" + f_bM + s_lM);
+ test("-548.0", "" + f_bM + s_d);
+ test("-5455.0", "" + f_bM + s_f);
+ test("-5497000000", "" + f_bM + s_i);
+ test("-54-9900", "" + f_bM + f_sM);
+ test("-54935228928", "" + f_bM + s_l);
+ test("-54-8400", "" + f_bM + sf_sM);
+ test("-54C(82)", "" + f_bM + s_o);
+ test("-54null", "" + f_bM + sf_oNtS);
+ test("-54true", "" + f_bM + s_bl);
+ test("-543900", "" + f_bM + s_s);
+ test("-54null", "" + f_bM + sf_oN);
+ test("-5494000000", "" + f_bM + f_I);
+ test("-54null", "" + f_bM + f_IN);
+ test("-54true", "" + f_bM + sf_bl);
+ test("-545500", "" + f_bM + sf_s);
+ test("-54-2900", "" + f_bM + s_sM);
+ test("-54-194313216", "" + f_bM + sf_l);
+ test("-5412", "" + f_bM + s_strU1);
+ test("-54C(87)", "" + f_bM + sf_o);
+ test("-5491", "" + f_bM + s_strU2);
+ test("-5421", "" + f_bM + f_strU1);
+ test("-5418", "" + f_bM + f_strU2);
+ test("-54null", "" + f_bM + f_iAN);
+ test("-54null", "" + f_bM + s_oN);
+ test("-54\u045180", "" + f_bM + s_strU);
+ test("-54C", "" + f_bM + sf_c);
+ test("-5475", "" + f_bM + sf_str);
+ test("-54-43", "" + f_bM + s_bM);
+ test("-5480", "" + f_bM + sf_b);
+ test("-54null", "" + f_bM + s_IN);
+ test("-54-52.0", "" + f_bM + s_fM);
+ test("-5475000000", "" + f_bM + sf_i);
+ test("-5444", "" + f_bM + f_b);
+ test("-54-1705032704", "" + f_bM + sf_lM);
+ test("-54null", "" + f_bM + f_oAN);
+ test("-5483.0", "" + f_bM + f_d);
+ test("-54I", "" + f_bM + f_c);
+ test("-5494.0", "" + f_bM + f_f);
+ test("-5412.0", "" + f_bM + sf_d);
+ test("-54-99.0", "" + f_bM + f_dM);
+ test("-5417.0", "" + f_bM + sf_f);
+ test("-54-84.0", "" + f_bM + sf_dM);
+ test("-5458000000", "" + f_bM + f_i);
+ test("-54-55000000", "" + f_bM + f_iM);
+ test("-541460392448", "" + f_bM + f_l);
+ test("-54C(70)", "" + f_bM + f_o);
+ test("-54\u04511", "" + f_bM + sf_strU);
+ test("-548000", "" + f_bM + f_s);
+ test("-5418", "" + f_bM + s_str);
+ test("-54-1000000", "" + f_bM + s_iM);
+ test("-541000000", "" + f_bM + sf_I);
+ test("-54null", "" + f_bM + f_oNtS);
+ test("-54false", "" + f_bM + f_bl);
+ test("-54null", "" + f_bM + sf_iAN);
+ test("-54-2000000", "" + f_bM + sf_iM);
+ test("-54-820130816", "" + f_bM + f_lM);
+ test("-54null", "" + f_bM + sf_oAN);
+ test("-5425000000", "" + f_bM + s_I);
+ test("-87.0-96.0", "" + f_fM + s_dM);
+ test("-87.0null", "" + f_fM + s_oNtS);
+ test("-87.0\u045176", "" + f_fM + f_strU);
+ test("-87.092", "" + f_fM + sf_strU2);
+ test("-87.051", "" + f_fM + sf_strU1);
+ test("-87.0null", "" + f_fM + s_iAN);
+ test("-87.0-54", "" + f_fM + f_bM);
+ test("-87.0-87.0", "" + f_fM + f_fM);
+ test("-87.0null", "" + f_fM + s_oAN);
+ test("-87.019", "" + f_fM + f_str);
+ test("-87.0-41", "" + f_fM + sf_bM);
+ test("-87.0null", "" + f_fM + sf_IN);
+ test("-87.0T", "" + f_fM + s_c);
+ test("-87.0-42.0", "" + f_fM + sf_fM);
+ test("-87.025", "" + f_fM + s_b);
+ test("-87.0null", "" + f_fM + f_oN);
+ test("-87.0-1410065408", "" + f_fM + s_lM);
+ test("-87.08.0", "" + f_fM + s_d);
+ test("-87.055.0", "" + f_fM + s_f);
+ test("-87.097000000", "" + f_fM + s_i);
+ test("-87.0-9900", "" + f_fM + f_sM);
+ test("-87.0935228928", "" + f_fM + s_l);
+ test("-87.0-8400", "" + f_fM + sf_sM);
+ test("-87.0C(82)", "" + f_fM + s_o);
+ test("-87.0null", "" + f_fM + sf_oNtS);
+ test("-87.0true", "" + f_fM + s_bl);
+ test("-87.03900", "" + f_fM + s_s);
+ test("-87.0null", "" + f_fM + sf_oN);
+ test("-87.094000000", "" + f_fM + f_I);
+ test("-87.0null", "" + f_fM + f_IN);
+ test("-87.0true", "" + f_fM + sf_bl);
+ test("-87.05500", "" + f_fM + sf_s);
+ test("-87.0-2900", "" + f_fM + s_sM);
+ test("-87.0-194313216", "" + f_fM + sf_l);
+ test("-87.012", "" + f_fM + s_strU1);
+ test("-87.0C(87)", "" + f_fM + sf_o);
+ test("-87.091", "" + f_fM + s_strU2);
+ test("-87.021", "" + f_fM + f_strU1);
+ test("-87.018", "" + f_fM + f_strU2);
+ test("-87.0null", "" + f_fM + f_iAN);
+ test("-87.0null", "" + f_fM + s_oN);
+ test("-87.0\u045180", "" + f_fM + s_strU);
+ test("-87.0C", "" + f_fM + sf_c);
+ test("-87.075", "" + f_fM + sf_str);
+ test("-87.0-43", "" + f_fM + s_bM);
+ test("-87.080", "" + f_fM + sf_b);
+ test("-87.0null", "" + f_fM + s_IN);
+ test("-87.0-52.0", "" + f_fM + s_fM);
+ test("-87.075000000", "" + f_fM + sf_i);
+ test("-87.044", "" + f_fM + f_b);
+ test("-87.0-1705032704", "" + f_fM + sf_lM);
+ test("-87.0null", "" + f_fM + f_oAN);
+ test("-87.083.0", "" + f_fM + f_d);
+ test("-87.0I", "" + f_fM + f_c);
+ test("-87.094.0", "" + f_fM + f_f);
+ test("-87.012.0", "" + f_fM + sf_d);
+ test("-87.0-99.0", "" + f_fM + f_dM);
+ test("-87.017.0", "" + f_fM + sf_f);
+ test("-87.0-84.0", "" + f_fM + sf_dM);
+ test("-87.058000000", "" + f_fM + f_i);
+ test("-87.0-55000000", "" + f_fM + f_iM);
+ test("-87.01460392448", "" + f_fM + f_l);
+ test("-87.0C(70)", "" + f_fM + f_o);
+ test("-87.0\u04511", "" + f_fM + sf_strU);
+ test("-87.08000", "" + f_fM + f_s);
+ test("-87.018", "" + f_fM + s_str);
+ test("-87.0-1000000", "" + f_fM + s_iM);
+ test("-87.01000000", "" + f_fM + sf_I);
+ test("-87.0null", "" + f_fM + f_oNtS);
+ test("-87.0false", "" + f_fM + f_bl);
+ test("-87.0null", "" + f_fM + sf_iAN);
+ test("-87.0-2000000", "" + f_fM + sf_iM);
+ test("-87.0-820130816", "" + f_fM + f_lM);
+ test("-87.0null", "" + f_fM + sf_oAN);
+ test("-87.025000000", "" + f_fM + s_I);
+ test("null-96.0", "" + s_oAN + s_dM);
+ test("nullnull", "" + s_oAN + s_oNtS);
+ test("null\u045176", "" + s_oAN + f_strU);
+ test("null92", "" + s_oAN + sf_strU2);
+ test("null51", "" + s_oAN + sf_strU1);
+ test("nullnull", "" + s_oAN + s_iAN);
+ test("null-54", "" + s_oAN + f_bM);
+ test("null-87.0", "" + s_oAN + f_fM);
+ test("nullnull", "" + s_oAN + s_oAN);
+ test("null19", "" + s_oAN + f_str);
+ test("null-41", "" + s_oAN + sf_bM);
+ test("nullnull", "" + s_oAN + sf_IN);
+ test("nullT", "" + s_oAN + s_c);
+ test("null-42.0", "" + s_oAN + sf_fM);
+ test("null25", "" + s_oAN + s_b);
+ test("nullnull", "" + s_oAN + f_oN);
+ test("null-1410065408", "" + s_oAN + s_lM);
+ test("null8.0", "" + s_oAN + s_d);
+ test("null55.0", "" + s_oAN + s_f);
+ test("null97000000", "" + s_oAN + s_i);
+ test("null-9900", "" + s_oAN + f_sM);
+ test("null935228928", "" + s_oAN + s_l);
+ test("null-8400", "" + s_oAN + sf_sM);
+ test("nullC(82)", "" + s_oAN + s_o);
+ test("nullnull", "" + s_oAN + sf_oNtS);
+ test("nulltrue", "" + s_oAN + s_bl);
+ test("null3900", "" + s_oAN + s_s);
+ test("nullnull", "" + s_oAN + sf_oN);
+ test("null94000000", "" + s_oAN + f_I);
+ test("nullnull", "" + s_oAN + f_IN);
+ test("nulltrue", "" + s_oAN + sf_bl);
+ test("null5500", "" + s_oAN + sf_s);
+ test("null-2900", "" + s_oAN + s_sM);
+ test("null-194313216", "" + s_oAN + sf_l);
+ test("null12", "" + s_oAN + s_strU1);
+ test("nullC(87)", "" + s_oAN + sf_o);
+ test("null91", "" + s_oAN + s_strU2);
+ test("null21", "" + s_oAN + f_strU1);
+ test("null18", "" + s_oAN + f_strU2);
+ test("nullnull", "" + s_oAN + f_iAN);
+ test("nullnull", "" + s_oAN + s_oN);
+ test("null\u045180", "" + s_oAN + s_strU);
+ test("nullC", "" + s_oAN + sf_c);
+ test("null75", "" + s_oAN + sf_str);
+ test("null-43", "" + s_oAN + s_bM);
+ test("null80", "" + s_oAN + sf_b);
+ test("nullnull", "" + s_oAN + s_IN);
+ test("null-52.0", "" + s_oAN + s_fM);
+ test("null75000000", "" + s_oAN + sf_i);
+ test("null44", "" + s_oAN + f_b);
+ test("null-1705032704", "" + s_oAN + sf_lM);
+ test("nullnull", "" + s_oAN + f_oAN);
+ test("null83.0", "" + s_oAN + f_d);
+ test("nullI", "" + s_oAN + f_c);
+ test("null94.0", "" + s_oAN + f_f);
+ test("null12.0", "" + s_oAN + sf_d);
+ test("null-99.0", "" + s_oAN + f_dM);
+ test("null17.0", "" + s_oAN + sf_f);
+ test("null-84.0", "" + s_oAN + sf_dM);
+ test("null58000000", "" + s_oAN + f_i);
+ test("null-55000000", "" + s_oAN + f_iM);
+ test("null1460392448", "" + s_oAN + f_l);
+ test("nullC(70)", "" + s_oAN + f_o);
+ test("null\u04511", "" + s_oAN + sf_strU);
+ test("null8000", "" + s_oAN + f_s);
+ test("null18", "" + s_oAN + s_str);
+ test("null-1000000", "" + s_oAN + s_iM);
+ test("null1000000", "" + s_oAN + sf_I);
+ test("nullnull", "" + s_oAN + f_oNtS);
+ test("nullfalse", "" + s_oAN + f_bl);
+ test("nullnull", "" + s_oAN + sf_iAN);
+ test("null-2000000", "" + s_oAN + sf_iM);
+ test("null-820130816", "" + s_oAN + f_lM);
+ test("nullnull", "" + s_oAN + sf_oAN);
+ test("null25000000", "" + s_oAN + s_I);
+ test("19-96.0", "" + f_str + s_dM);
+ test("19null", "" + f_str + s_oNtS);
+ test("19\u045176", "" + f_str + f_strU);
+ test("1992", "" + f_str + sf_strU2);
+ test("1951", "" + f_str + sf_strU1);
+ test("19null", "" + f_str + s_iAN);
+ test("19-54", "" + f_str + f_bM);
+ test("19-87.0", "" + f_str + f_fM);
+ test("19null", "" + f_str + s_oAN);
+ test("1919", "" + f_str + f_str);
+ test("19-41", "" + f_str + sf_bM);
+ test("19null", "" + f_str + sf_IN);
+ test("19T", "" + f_str + s_c);
+ test("19-42.0", "" + f_str + sf_fM);
+ test("1925", "" + f_str + s_b);
+ test("19null", "" + f_str + f_oN);
+ test("19-1410065408", "" + f_str + s_lM);
+ test("198.0", "" + f_str + s_d);
+ test("1955.0", "" + f_str + s_f);
+ test("1997000000", "" + f_str + s_i);
+ test("19-9900", "" + f_str + f_sM);
+ test("19935228928", "" + f_str + s_l);
+ test("19-8400", "" + f_str + sf_sM);
+ test("19C(82)", "" + f_str + s_o);
+ test("19null", "" + f_str + sf_oNtS);
+ test("19true", "" + f_str + s_bl);
+ test("193900", "" + f_str + s_s);
+ test("19null", "" + f_str + sf_oN);
+ test("1994000000", "" + f_str + f_I);
+ test("19null", "" + f_str + f_IN);
+ test("19true", "" + f_str + sf_bl);
+ test("195500", "" + f_str + sf_s);
+ test("19-2900", "" + f_str + s_sM);
+ test("19-194313216", "" + f_str + sf_l);
+ test("1912", "" + f_str + s_strU1);
+ test("19C(87)", "" + f_str + sf_o);
+ test("1991", "" + f_str + s_strU2);
+ test("1921", "" + f_str + f_strU1);
+ test("1918", "" + f_str + f_strU2);
+ test("19null", "" + f_str + f_iAN);
+ test("19null", "" + f_str + s_oN);
+ test("19\u045180", "" + f_str + s_strU);
+ test("19C", "" + f_str + sf_c);
+ test("1975", "" + f_str + sf_str);
+ test("19-43", "" + f_str + s_bM);
+ test("1980", "" + f_str + sf_b);
+ test("19null", "" + f_str + s_IN);
+ test("19-52.0", "" + f_str + s_fM);
+ test("1975000000", "" + f_str + sf_i);
+ test("1944", "" + f_str + f_b);
+ test("19-1705032704", "" + f_str + sf_lM);
+ test("19null", "" + f_str + f_oAN);
+ test("1983.0", "" + f_str + f_d);
+ test("19I", "" + f_str + f_c);
+ test("1994.0", "" + f_str + f_f);
+ test("1912.0", "" + f_str + sf_d);
+ test("19-99.0", "" + f_str + f_dM);
+ test("1917.0", "" + f_str + sf_f);
+ test("19-84.0", "" + f_str + sf_dM);
+ test("1958000000", "" + f_str + f_i);
+ test("19-55000000", "" + f_str + f_iM);
+ test("191460392448", "" + f_str + f_l);
+ test("19C(70)", "" + f_str + f_o);
+ test("19\u04511", "" + f_str + sf_strU);
+ test("198000", "" + f_str + f_s);
+ test("1918", "" + f_str + s_str);
+ test("19-1000000", "" + f_str + s_iM);
+ test("191000000", "" + f_str + sf_I);
+ test("19null", "" + f_str + f_oNtS);
+ test("19false", "" + f_str + f_bl);
+ test("19null", "" + f_str + sf_iAN);
+ test("19-2000000", "" + f_str + sf_iM);
+ test("19-820130816", "" + f_str + f_lM);
+ test("19null", "" + f_str + sf_oAN);
+ test("1925000000", "" + f_str + s_I);
+ test("-41-96.0", "" + sf_bM + s_dM);
+ test("-41null", "" + sf_bM + s_oNtS);
+ test("-41\u045176", "" + sf_bM + f_strU);
+ test("-4192", "" + sf_bM + sf_strU2);
+ test("-4151", "" + sf_bM + sf_strU1);
+ test("-41null", "" + sf_bM + s_iAN);
+ test("-41-54", "" + sf_bM + f_bM);
+ test("-41-87.0", "" + sf_bM + f_fM);
+ test("-41null", "" + sf_bM + s_oAN);
+ test("-4119", "" + sf_bM + f_str);
+ test("-41-41", "" + sf_bM + sf_bM);
+ test("-41null", "" + sf_bM + sf_IN);
+ test("-41T", "" + sf_bM + s_c);
+ test("-41-42.0", "" + sf_bM + sf_fM);
+ test("-4125", "" + sf_bM + s_b);
+ test("-41null", "" + sf_bM + f_oN);
+ test("-41-1410065408", "" + sf_bM + s_lM);
+ test("-418.0", "" + sf_bM + s_d);
+ test("-4155.0", "" + sf_bM + s_f);
+ test("-4197000000", "" + sf_bM + s_i);
+ test("-41-9900", "" + sf_bM + f_sM);
+ test("-41935228928", "" + sf_bM + s_l);
+ test("-41-8400", "" + sf_bM + sf_sM);
+ test("-41C(82)", "" + sf_bM + s_o);
+ test("-41null", "" + sf_bM + sf_oNtS);
+ test("-41true", "" + sf_bM + s_bl);
+ test("-413900", "" + sf_bM + s_s);
+ test("-41null", "" + sf_bM + sf_oN);
+ test("-4194000000", "" + sf_bM + f_I);
+ test("-41null", "" + sf_bM + f_IN);
+ test("-41true", "" + sf_bM + sf_bl);
+ test("-415500", "" + sf_bM + sf_s);
+ test("-41-2900", "" + sf_bM + s_sM);
+ test("-41-194313216", "" + sf_bM + sf_l);
+ test("-4112", "" + sf_bM + s_strU1);
+ test("-41C(87)", "" + sf_bM + sf_o);
+ test("-4191", "" + sf_bM + s_strU2);
+ test("-4121", "" + sf_bM + f_strU1);
+ test("-4118", "" + sf_bM + f_strU2);
+ test("-41null", "" + sf_bM + f_iAN);
+ test("-41null", "" + sf_bM + s_oN);
+ test("-41\u045180", "" + sf_bM + s_strU);
+ test("-41C", "" + sf_bM + sf_c);
+ test("-4175", "" + sf_bM + sf_str);
+ test("-41-43", "" + sf_bM + s_bM);
+ test("-4180", "" + sf_bM + sf_b);
+ test("-41null", "" + sf_bM + s_IN);
+ test("-41-52.0", "" + sf_bM + s_fM);
+ test("-4175000000", "" + sf_bM + sf_i);
+ test("-4144", "" + sf_bM + f_b);
+ test("-41-1705032704", "" + sf_bM + sf_lM);
+ test("-41null", "" + sf_bM + f_oAN);
+ test("-4183.0", "" + sf_bM + f_d);
+ test("-41I", "" + sf_bM + f_c);
+ test("-4194.0", "" + sf_bM + f_f);
+ test("-4112.0", "" + sf_bM + sf_d);
+ test("-41-99.0", "" + sf_bM + f_dM);
+ test("-4117.0", "" + sf_bM + sf_f);
+ test("-41-84.0", "" + sf_bM + sf_dM);
+ test("-4158000000", "" + sf_bM + f_i);
+ test("-41-55000000", "" + sf_bM + f_iM);
+ test("-411460392448", "" + sf_bM + f_l);
+ test("-41C(70)", "" + sf_bM + f_o);
+ test("-41\u04511", "" + sf_bM + sf_strU);
+ test("-418000", "" + sf_bM + f_s);
+ test("-4118", "" + sf_bM + s_str);
+ test("-41-1000000", "" + sf_bM + s_iM);
+ test("-411000000", "" + sf_bM + sf_I);
+ test("-41null", "" + sf_bM + f_oNtS);
+ test("-41false", "" + sf_bM + f_bl);
+ test("-41null", "" + sf_bM + sf_iAN);
+ test("-41-2000000", "" + sf_bM + sf_iM);
+ test("-41-820130816", "" + sf_bM + f_lM);
+ test("-41null", "" + sf_bM + sf_oAN);
+ test("-4125000000", "" + sf_bM + s_I);
+ test("null-96.0", "" + sf_IN + s_dM);
+ test("nullnull", "" + sf_IN + s_oNtS);
+ test("null\u045176", "" + sf_IN + f_strU);
+ test("null92", "" + sf_IN + sf_strU2);
+ test("null51", "" + sf_IN + sf_strU1);
+ test("nullnull", "" + sf_IN + s_iAN);
+ test("null-54", "" + sf_IN + f_bM);
+ test("null-87.0", "" + sf_IN + f_fM);
+ test("nullnull", "" + sf_IN + s_oAN);
+ test("null19", "" + sf_IN + f_str);
+ test("null-41", "" + sf_IN + sf_bM);
+ test("nullnull", "" + sf_IN + sf_IN);
+ test("nullT", "" + sf_IN + s_c);
+ test("null-42.0", "" + sf_IN + sf_fM);
+ test("null25", "" + sf_IN + s_b);
+ test("nullnull", "" + sf_IN + f_oN);
+ test("null-1410065408", "" + sf_IN + s_lM);
+ test("null8.0", "" + sf_IN + s_d);
+ test("null55.0", "" + sf_IN + s_f);
+ test("null97000000", "" + sf_IN + s_i);
+ test("null-9900", "" + sf_IN + f_sM);
+ test("null935228928", "" + sf_IN + s_l);
+ test("null-8400", "" + sf_IN + sf_sM);
+ test("nullC(82)", "" + sf_IN + s_o);
+ test("nullnull", "" + sf_IN + sf_oNtS);
+ test("nulltrue", "" + sf_IN + s_bl);
+ test("null3900", "" + sf_IN + s_s);
+ test("nullnull", "" + sf_IN + sf_oN);
+ test("null94000000", "" + sf_IN + f_I);
+ test("nullnull", "" + sf_IN + f_IN);
+ test("nulltrue", "" + sf_IN + sf_bl);
+ test("null5500", "" + sf_IN + sf_s);
+ test("null-2900", "" + sf_IN + s_sM);
+ test("null-194313216", "" + sf_IN + sf_l);
+ test("null12", "" + sf_IN + s_strU1);
+ test("nullC(87)", "" + sf_IN + sf_o);
+ test("null91", "" + sf_IN + s_strU2);
+ test("null21", "" + sf_IN + f_strU1);
+ test("null18", "" + sf_IN + f_strU2);
+ test("nullnull", "" + sf_IN + f_iAN);
+ test("nullnull", "" + sf_IN + s_oN);
+ test("null\u045180", "" + sf_IN + s_strU);
+ test("nullC", "" + sf_IN + sf_c);
+ test("null75", "" + sf_IN + sf_str);
+ test("null-43", "" + sf_IN + s_bM);
+ test("null80", "" + sf_IN + sf_b);
+ test("nullnull", "" + sf_IN + s_IN);
+ test("null-52.0", "" + sf_IN + s_fM);
+ test("null75000000", "" + sf_IN + sf_i);
+ test("null44", "" + sf_IN + f_b);
+ test("null-1705032704", "" + sf_IN + sf_lM);
+ test("nullnull", "" + sf_IN + f_oAN);
+ test("null83.0", "" + sf_IN + f_d);
+ test("nullI", "" + sf_IN + f_c);
+ test("null94.0", "" + sf_IN + f_f);
+ test("null12.0", "" + sf_IN + sf_d);
+ test("null-99.0", "" + sf_IN + f_dM);
+ test("null17.0", "" + sf_IN + sf_f);
+ test("null-84.0", "" + sf_IN + sf_dM);
+ test("null58000000", "" + sf_IN + f_i);
+ test("null-55000000", "" + sf_IN + f_iM);
+ test("null1460392448", "" + sf_IN + f_l);
+ test("nullC(70)", "" + sf_IN + f_o);
+ test("null\u04511", "" + sf_IN + sf_strU);
+ test("null8000", "" + sf_IN + f_s);
+ test("null18", "" + sf_IN + s_str);
+ test("null-1000000", "" + sf_IN + s_iM);
+ test("null1000000", "" + sf_IN + sf_I);
+ test("nullnull", "" + sf_IN + f_oNtS);
+ test("nullfalse", "" + sf_IN + f_bl);
+ test("nullnull", "" + sf_IN + sf_iAN);
+ test("null-2000000", "" + sf_IN + sf_iM);
+ test("null-820130816", "" + sf_IN + f_lM);
+ test("nullnull", "" + sf_IN + sf_oAN);
+ test("null25000000", "" + sf_IN + s_I);
+ test("T-96.0", "" + s_c + s_dM);
+ test("Tnull", "" + s_c + s_oNtS);
+ test("T\u045176", "" + s_c + f_strU);
+ test("T92", "" + s_c + sf_strU2);
+ test("T51", "" + s_c + sf_strU1);
+ test("Tnull", "" + s_c + s_iAN);
+ test("T-54", "" + s_c + f_bM);
+ test("T-87.0", "" + s_c + f_fM);
+ test("Tnull", "" + s_c + s_oAN);
+ test("T19", "" + s_c + f_str);
+ test("T-41", "" + s_c + sf_bM);
+ test("Tnull", "" + s_c + sf_IN);
+ test("TT", "" + s_c + s_c);
+ test("T-42.0", "" + s_c + sf_fM);
+ test("T25", "" + s_c + s_b);
+ test("Tnull", "" + s_c + f_oN);
+ test("T-1410065408", "" + s_c + s_lM);
+ test("T8.0", "" + s_c + s_d);
+ test("T55.0", "" + s_c + s_f);
+ test("T97000000", "" + s_c + s_i);
+ test("T-9900", "" + s_c + f_sM);
+ test("T935228928", "" + s_c + s_l);
+ test("T-8400", "" + s_c + sf_sM);
+ test("TC(82)", "" + s_c + s_o);
+ test("Tnull", "" + s_c + sf_oNtS);
+ }
+
+ public void run1() {
+ test("Ttrue", "" + s_c + s_bl);
+ test("T3900", "" + s_c + s_s);
+ test("Tnull", "" + s_c + sf_oN);
+ test("T94000000", "" + s_c + f_I);
+ test("Tnull", "" + s_c + f_IN);
+ test("Ttrue", "" + s_c + sf_bl);
+ test("T5500", "" + s_c + sf_s);
+ test("T-2900", "" + s_c + s_sM);
+ test("T-194313216", "" + s_c + sf_l);
+ test("T12", "" + s_c + s_strU1);
+ test("TC(87)", "" + s_c + sf_o);
+ test("T91", "" + s_c + s_strU2);
+ test("T21", "" + s_c + f_strU1);
+ test("T18", "" + s_c + f_strU2);
+ test("Tnull", "" + s_c + f_iAN);
+ test("Tnull", "" + s_c + s_oN);
+ test("T\u045180", "" + s_c + s_strU);
+ test("TC", "" + s_c + sf_c);
+ test("T75", "" + s_c + sf_str);
+ test("T-43", "" + s_c + s_bM);
+ test("T80", "" + s_c + sf_b);
+ test("Tnull", "" + s_c + s_IN);
+ test("T-52.0", "" + s_c + s_fM);
+ test("T75000000", "" + s_c + sf_i);
+ test("T44", "" + s_c + f_b);
+ test("T-1705032704", "" + s_c + sf_lM);
+ test("Tnull", "" + s_c + f_oAN);
+ test("T83.0", "" + s_c + f_d);
+ test("TI", "" + s_c + f_c);
+ test("T94.0", "" + s_c + f_f);
+ test("T12.0", "" + s_c + sf_d);
+ test("T-99.0", "" + s_c + f_dM);
+ test("T17.0", "" + s_c + sf_f);
+ test("T-84.0", "" + s_c + sf_dM);
+ test("T58000000", "" + s_c + f_i);
+ test("T-55000000", "" + s_c + f_iM);
+ test("T1460392448", "" + s_c + f_l);
+ test("TC(70)", "" + s_c + f_o);
+ test("T\u04511", "" + s_c + sf_strU);
+ test("T8000", "" + s_c + f_s);
+ test("T18", "" + s_c + s_str);
+ test("T-1000000", "" + s_c + s_iM);
+ test("T1000000", "" + s_c + sf_I);
+ test("Tnull", "" + s_c + f_oNtS);
+ test("Tfalse", "" + s_c + f_bl);
+ test("Tnull", "" + s_c + sf_iAN);
+ test("T-2000000", "" + s_c + sf_iM);
+ test("T-820130816", "" + s_c + f_lM);
+ test("Tnull", "" + s_c + sf_oAN);
+ test("T25000000", "" + s_c + s_I);
+ test("-42.0-96.0", "" + sf_fM + s_dM);
+ test("-42.0null", "" + sf_fM + s_oNtS);
+ test("-42.0\u045176", "" + sf_fM + f_strU);
+ test("-42.092", "" + sf_fM + sf_strU2);
+ test("-42.051", "" + sf_fM + sf_strU1);
+ test("-42.0null", "" + sf_fM + s_iAN);
+ test("-42.0-54", "" + sf_fM + f_bM);
+ test("-42.0-87.0", "" + sf_fM + f_fM);
+ test("-42.0null", "" + sf_fM + s_oAN);
+ test("-42.019", "" + sf_fM + f_str);
+ test("-42.0-41", "" + sf_fM + sf_bM);
+ test("-42.0null", "" + sf_fM + sf_IN);
+ test("-42.0T", "" + sf_fM + s_c);
+ test("-42.0-42.0", "" + sf_fM + sf_fM);
+ test("-42.025", "" + sf_fM + s_b);
+ test("-42.0null", "" + sf_fM + f_oN);
+ test("-42.0-1410065408", "" + sf_fM + s_lM);
+ test("-42.08.0", "" + sf_fM + s_d);
+ test("-42.055.0", "" + sf_fM + s_f);
+ test("-42.097000000", "" + sf_fM + s_i);
+ test("-42.0-9900", "" + sf_fM + f_sM);
+ test("-42.0935228928", "" + sf_fM + s_l);
+ test("-42.0-8400", "" + sf_fM + sf_sM);
+ test("-42.0C(82)", "" + sf_fM + s_o);
+ test("-42.0null", "" + sf_fM + sf_oNtS);
+ test("-42.0true", "" + sf_fM + s_bl);
+ test("-42.03900", "" + sf_fM + s_s);
+ test("-42.0null", "" + sf_fM + sf_oN);
+ test("-42.094000000", "" + sf_fM + f_I);
+ test("-42.0null", "" + sf_fM + f_IN);
+ test("-42.0true", "" + sf_fM + sf_bl);
+ test("-42.05500", "" + sf_fM + sf_s);
+ test("-42.0-2900", "" + sf_fM + s_sM);
+ test("-42.0-194313216", "" + sf_fM + sf_l);
+ test("-42.012", "" + sf_fM + s_strU1);
+ test("-42.0C(87)", "" + sf_fM + sf_o);
+ test("-42.091", "" + sf_fM + s_strU2);
+ test("-42.021", "" + sf_fM + f_strU1);
+ test("-42.018", "" + sf_fM + f_strU2);
+ test("-42.0null", "" + sf_fM + f_iAN);
+ test("-42.0null", "" + sf_fM + s_oN);
+ test("-42.0\u045180", "" + sf_fM + s_strU);
+ test("-42.0C", "" + sf_fM + sf_c);
+ test("-42.075", "" + sf_fM + sf_str);
+ test("-42.0-43", "" + sf_fM + s_bM);
+ test("-42.080", "" + sf_fM + sf_b);
+ test("-42.0null", "" + sf_fM + s_IN);
+ test("-42.0-52.0", "" + sf_fM + s_fM);
+ test("-42.075000000", "" + sf_fM + sf_i);
+ test("-42.044", "" + sf_fM + f_b);
+ test("-42.0-1705032704", "" + sf_fM + sf_lM);
+ test("-42.0null", "" + sf_fM + f_oAN);
+ test("-42.083.0", "" + sf_fM + f_d);
+ test("-42.0I", "" + sf_fM + f_c);
+ test("-42.094.0", "" + sf_fM + f_f);
+ test("-42.012.0", "" + sf_fM + sf_d);
+ test("-42.0-99.0", "" + sf_fM + f_dM);
+ test("-42.017.0", "" + sf_fM + sf_f);
+ test("-42.0-84.0", "" + sf_fM + sf_dM);
+ test("-42.058000000", "" + sf_fM + f_i);
+ test("-42.0-55000000", "" + sf_fM + f_iM);
+ test("-42.01460392448", "" + sf_fM + f_l);
+ test("-42.0C(70)", "" + sf_fM + f_o);
+ test("-42.0\u04511", "" + sf_fM + sf_strU);
+ test("-42.08000", "" + sf_fM + f_s);
+ test("-42.018", "" + sf_fM + s_str);
+ test("-42.0-1000000", "" + sf_fM + s_iM);
+ test("-42.01000000", "" + sf_fM + sf_I);
+ test("-42.0null", "" + sf_fM + f_oNtS);
+ test("-42.0false", "" + sf_fM + f_bl);
+ test("-42.0null", "" + sf_fM + sf_iAN);
+ test("-42.0-2000000", "" + sf_fM + sf_iM);
+ test("-42.0-820130816", "" + sf_fM + f_lM);
+ test("-42.0null", "" + sf_fM + sf_oAN);
+ test("-42.025000000", "" + sf_fM + s_I);
+ test("25-96.0", "" + s_b + s_dM);
+ test("25null", "" + s_b + s_oNtS);
+ test("25\u045176", "" + s_b + f_strU);
+ test("2592", "" + s_b + sf_strU2);
+ test("2551", "" + s_b + sf_strU1);
+ test("25null", "" + s_b + s_iAN);
+ test("25-54", "" + s_b + f_bM);
+ test("25-87.0", "" + s_b + f_fM);
+ test("25null", "" + s_b + s_oAN);
+ test("2519", "" + s_b + f_str);
+ test("25-41", "" + s_b + sf_bM);
+ test("25null", "" + s_b + sf_IN);
+ test("25T", "" + s_b + s_c);
+ test("25-42.0", "" + s_b + sf_fM);
+ test("2525", "" + s_b + s_b);
+ test("25null", "" + s_b + f_oN);
+ test("25-1410065408", "" + s_b + s_lM);
+ test("258.0", "" + s_b + s_d);
+ test("2555.0", "" + s_b + s_f);
+ test("2597000000", "" + s_b + s_i);
+ test("25-9900", "" + s_b + f_sM);
+ test("25935228928", "" + s_b + s_l);
+ test("25-8400", "" + s_b + sf_sM);
+ test("25C(82)", "" + s_b + s_o);
+ test("25null", "" + s_b + sf_oNtS);
+ test("25true", "" + s_b + s_bl);
+ test("253900", "" + s_b + s_s);
+ test("25null", "" + s_b + sf_oN);
+ test("2594000000", "" + s_b + f_I);
+ test("25null", "" + s_b + f_IN);
+ test("25true", "" + s_b + sf_bl);
+ test("255500", "" + s_b + sf_s);
+ test("25-2900", "" + s_b + s_sM);
+ test("25-194313216", "" + s_b + sf_l);
+ test("2512", "" + s_b + s_strU1);
+ test("25C(87)", "" + s_b + sf_o);
+ test("2591", "" + s_b + s_strU2);
+ test("2521", "" + s_b + f_strU1);
+ test("2518", "" + s_b + f_strU2);
+ test("25null", "" + s_b + f_iAN);
+ test("25null", "" + s_b + s_oN);
+ test("25\u045180", "" + s_b + s_strU);
+ test("25C", "" + s_b + sf_c);
+ test("2575", "" + s_b + sf_str);
+ test("25-43", "" + s_b + s_bM);
+ test("2580", "" + s_b + sf_b);
+ test("25null", "" + s_b + s_IN);
+ test("25-52.0", "" + s_b + s_fM);
+ test("2575000000", "" + s_b + sf_i);
+ test("2544", "" + s_b + f_b);
+ test("25-1705032704", "" + s_b + sf_lM);
+ test("25null", "" + s_b + f_oAN);
+ test("2583.0", "" + s_b + f_d);
+ test("25I", "" + s_b + f_c);
+ test("2594.0", "" + s_b + f_f);
+ test("2512.0", "" + s_b + sf_d);
+ test("25-99.0", "" + s_b + f_dM);
+ test("2517.0", "" + s_b + sf_f);
+ test("25-84.0", "" + s_b + sf_dM);
+ test("2558000000", "" + s_b + f_i);
+ test("25-55000000", "" + s_b + f_iM);
+ test("251460392448", "" + s_b + f_l);
+ test("25C(70)", "" + s_b + f_o);
+ test("25\u04511", "" + s_b + sf_strU);
+ test("258000", "" + s_b + f_s);
+ test("2518", "" + s_b + s_str);
+ test("25-1000000", "" + s_b + s_iM);
+ test("251000000", "" + s_b + sf_I);
+ test("25null", "" + s_b + f_oNtS);
+ test("25false", "" + s_b + f_bl);
+ test("25null", "" + s_b + sf_iAN);
+ test("25-2000000", "" + s_b + sf_iM);
+ test("25-820130816", "" + s_b + f_lM);
+ test("25null", "" + s_b + sf_oAN);
+ test("2525000000", "" + s_b + s_I);
+ test("null-96.0", "" + f_oN + s_dM);
+ test("nullnull", "" + f_oN + s_oNtS);
+ test("null\u045176", "" + f_oN + f_strU);
+ test("null92", "" + f_oN + sf_strU2);
+ test("null51", "" + f_oN + sf_strU1);
+ test("nullnull", "" + f_oN + s_iAN);
+ test("null-54", "" + f_oN + f_bM);
+ test("null-87.0", "" + f_oN + f_fM);
+ test("nullnull", "" + f_oN + s_oAN);
+ test("null19", "" + f_oN + f_str);
+ test("null-41", "" + f_oN + sf_bM);
+ test("nullnull", "" + f_oN + sf_IN);
+ test("nullT", "" + f_oN + s_c);
+ test("null-42.0", "" + f_oN + sf_fM);
+ test("null25", "" + f_oN + s_b);
+ test("nullnull", "" + f_oN + f_oN);
+ test("null-1410065408", "" + f_oN + s_lM);
+ test("null8.0", "" + f_oN + s_d);
+ test("null55.0", "" + f_oN + s_f);
+ test("null97000000", "" + f_oN + s_i);
+ test("null-9900", "" + f_oN + f_sM);
+ test("null935228928", "" + f_oN + s_l);
+ test("null-8400", "" + f_oN + sf_sM);
+ test("nullC(82)", "" + f_oN + s_o);
+ test("nullnull", "" + f_oN + sf_oNtS);
+ test("nulltrue", "" + f_oN + s_bl);
+ test("null3900", "" + f_oN + s_s);
+ test("nullnull", "" + f_oN + sf_oN);
+ test("null94000000", "" + f_oN + f_I);
+ test("nullnull", "" + f_oN + f_IN);
+ test("nulltrue", "" + f_oN + sf_bl);
+ test("null5500", "" + f_oN + sf_s);
+ test("null-2900", "" + f_oN + s_sM);
+ test("null-194313216", "" + f_oN + sf_l);
+ test("null12", "" + f_oN + s_strU1);
+ test("nullC(87)", "" + f_oN + sf_o);
+ test("null91", "" + f_oN + s_strU2);
+ test("null21", "" + f_oN + f_strU1);
+ test("null18", "" + f_oN + f_strU2);
+ test("nullnull", "" + f_oN + f_iAN);
+ test("nullnull", "" + f_oN + s_oN);
+ test("null\u045180", "" + f_oN + s_strU);
+ test("nullC", "" + f_oN + sf_c);
+ test("null75", "" + f_oN + sf_str);
+ test("null-43", "" + f_oN + s_bM);
+ test("null80", "" + f_oN + sf_b);
+ test("nullnull", "" + f_oN + s_IN);
+ test("null-52.0", "" + f_oN + s_fM);
+ test("null75000000", "" + f_oN + sf_i);
+ test("null44", "" + f_oN + f_b);
+ test("null-1705032704", "" + f_oN + sf_lM);
+ test("nullnull", "" + f_oN + f_oAN);
+ test("null83.0", "" + f_oN + f_d);
+ test("nullI", "" + f_oN + f_c);
+ test("null94.0", "" + f_oN + f_f);
+ test("null12.0", "" + f_oN + sf_d);
+ test("null-99.0", "" + f_oN + f_dM);
+ test("null17.0", "" + f_oN + sf_f);
+ test("null-84.0", "" + f_oN + sf_dM);
+ test("null58000000", "" + f_oN + f_i);
+ test("null-55000000", "" + f_oN + f_iM);
+ test("null1460392448", "" + f_oN + f_l);
+ test("nullC(70)", "" + f_oN + f_o);
+ test("null\u04511", "" + f_oN + sf_strU);
+ test("null8000", "" + f_oN + f_s);
+ test("null18", "" + f_oN + s_str);
+ test("null-1000000", "" + f_oN + s_iM);
+ test("null1000000", "" + f_oN + sf_I);
+ test("nullnull", "" + f_oN + f_oNtS);
+ test("nullfalse", "" + f_oN + f_bl);
+ test("nullnull", "" + f_oN + sf_iAN);
+ test("null-2000000", "" + f_oN + sf_iM);
+ test("null-820130816", "" + f_oN + f_lM);
+ test("nullnull", "" + f_oN + sf_oAN);
+ test("null25000000", "" + f_oN + s_I);
+ test("-1410065408-96.0", "" + s_lM + s_dM);
+ test("-1410065408null", "" + s_lM + s_oNtS);
+ test("-1410065408\u045176", "" + s_lM + f_strU);
+ test("-141006540892", "" + s_lM + sf_strU2);
+ test("-141006540851", "" + s_lM + sf_strU1);
+ test("-1410065408null", "" + s_lM + s_iAN);
+ test("-1410065408-54", "" + s_lM + f_bM);
+ test("-1410065408-87.0", "" + s_lM + f_fM);
+ test("-1410065408null", "" + s_lM + s_oAN);
+ test("-141006540819", "" + s_lM + f_str);
+ test("-1410065408-41", "" + s_lM + sf_bM);
+ test("-1410065408null", "" + s_lM + sf_IN);
+ test("-1410065408T", "" + s_lM + s_c);
+ test("-1410065408-42.0", "" + s_lM + sf_fM);
+ test("-141006540825", "" + s_lM + s_b);
+ test("-1410065408null", "" + s_lM + f_oN);
+ test("-1410065408-1410065408", "" + s_lM + s_lM);
+ test("-14100654088.0", "" + s_lM + s_d);
+ test("-141006540855.0", "" + s_lM + s_f);
+ test("-141006540897000000", "" + s_lM + s_i);
+ test("-1410065408-9900", "" + s_lM + f_sM);
+ test("-1410065408935228928", "" + s_lM + s_l);
+ test("-1410065408-8400", "" + s_lM + sf_sM);
+ test("-1410065408C(82)", "" + s_lM + s_o);
+ test("-1410065408null", "" + s_lM + sf_oNtS);
+ test("-1410065408true", "" + s_lM + s_bl);
+ test("-14100654083900", "" + s_lM + s_s);
+ test("-1410065408null", "" + s_lM + sf_oN);
+ test("-141006540894000000", "" + s_lM + f_I);
+ test("-1410065408null", "" + s_lM + f_IN);
+ test("-1410065408true", "" + s_lM + sf_bl);
+ test("-14100654085500", "" + s_lM + sf_s);
+ test("-1410065408-2900", "" + s_lM + s_sM);
+ test("-1410065408-194313216", "" + s_lM + sf_l);
+ test("-141006540812", "" + s_lM + s_strU1);
+ test("-1410065408C(87)", "" + s_lM + sf_o);
+ test("-141006540891", "" + s_lM + s_strU2);
+ test("-141006540821", "" + s_lM + f_strU1);
+ test("-141006540818", "" + s_lM + f_strU2);
+ test("-1410065408null", "" + s_lM + f_iAN);
+ test("-1410065408null", "" + s_lM + s_oN);
+ test("-1410065408\u045180", "" + s_lM + s_strU);
+ test("-1410065408C", "" + s_lM + sf_c);
+ test("-141006540875", "" + s_lM + sf_str);
+ test("-1410065408-43", "" + s_lM + s_bM);
+ test("-141006540880", "" + s_lM + sf_b);
+ test("-1410065408null", "" + s_lM + s_IN);
+ test("-1410065408-52.0", "" + s_lM + s_fM);
+ test("-141006540875000000", "" + s_lM + sf_i);
+ test("-141006540844", "" + s_lM + f_b);
+ test("-1410065408-1705032704", "" + s_lM + sf_lM);
+ test("-1410065408null", "" + s_lM + f_oAN);
+ test("-141006540883.0", "" + s_lM + f_d);
+ test("-1410065408I", "" + s_lM + f_c);
+ test("-141006540894.0", "" + s_lM + f_f);
+ test("-141006540812.0", "" + s_lM + sf_d);
+ test("-1410065408-99.0", "" + s_lM + f_dM);
+ test("-141006540817.0", "" + s_lM + sf_f);
+ test("-1410065408-84.0", "" + s_lM + sf_dM);
+ test("-141006540858000000", "" + s_lM + f_i);
+ test("-1410065408-55000000", "" + s_lM + f_iM);
+ test("-14100654081460392448", "" + s_lM + f_l);
+ test("-1410065408C(70)", "" + s_lM + f_o);
+ test("-1410065408\u04511", "" + s_lM + sf_strU);
+ test("-14100654088000", "" + s_lM + f_s);
+ test("-141006540818", "" + s_lM + s_str);
+ test("-1410065408-1000000", "" + s_lM + s_iM);
+ test("-14100654081000000", "" + s_lM + sf_I);
+ test("-1410065408null", "" + s_lM + f_oNtS);
+ test("-1410065408false", "" + s_lM + f_bl);
+ test("-1410065408null", "" + s_lM + sf_iAN);
+ test("-1410065408-2000000", "" + s_lM + sf_iM);
+ test("-1410065408-820130816", "" + s_lM + f_lM);
+ test("-1410065408null", "" + s_lM + sf_oAN);
+ test("-141006540825000000", "" + s_lM + s_I);
+ test("8.0-96.0", "" + s_d + s_dM);
+ test("8.0null", "" + s_d + s_oNtS);
+ test("8.0\u045176", "" + s_d + f_strU);
+ test("8.092", "" + s_d + sf_strU2);
+ test("8.051", "" + s_d + sf_strU1);
+ test("8.0null", "" + s_d + s_iAN);
+ test("8.0-54", "" + s_d + f_bM);
+ test("8.0-87.0", "" + s_d + f_fM);
+ test("8.0null", "" + s_d + s_oAN);
+ test("8.019", "" + s_d + f_str);
+ test("8.0-41", "" + s_d + sf_bM);
+ test("8.0null", "" + s_d + sf_IN);
+ test("8.0T", "" + s_d + s_c);
+ test("8.0-42.0", "" + s_d + sf_fM);
+ test("8.025", "" + s_d + s_b);
+ test("8.0null", "" + s_d + f_oN);
+ test("8.0-1410065408", "" + s_d + s_lM);
+ test("8.08.0", "" + s_d + s_d);
+ test("8.055.0", "" + s_d + s_f);
+ test("8.097000000", "" + s_d + s_i);
+ test("8.0-9900", "" + s_d + f_sM);
+ test("8.0935228928", "" + s_d + s_l);
+ test("8.0-8400", "" + s_d + sf_sM);
+ test("8.0C(82)", "" + s_d + s_o);
+ test("8.0null", "" + s_d + sf_oNtS);
+ test("8.0true", "" + s_d + s_bl);
+ test("8.03900", "" + s_d + s_s);
+ test("8.0null", "" + s_d + sf_oN);
+ test("8.094000000", "" + s_d + f_I);
+ test("8.0null", "" + s_d + f_IN);
+ test("8.0true", "" + s_d + sf_bl);
+ test("8.05500", "" + s_d + sf_s);
+ test("8.0-2900", "" + s_d + s_sM);
+ test("8.0-194313216", "" + s_d + sf_l);
+ test("8.012", "" + s_d + s_strU1);
+ test("8.0C(87)", "" + s_d + sf_o);
+ test("8.091", "" + s_d + s_strU2);
+ test("8.021", "" + s_d + f_strU1);
+ test("8.018", "" + s_d + f_strU2);
+ test("8.0null", "" + s_d + f_iAN);
+ test("8.0null", "" + s_d + s_oN);
+ test("8.0\u045180", "" + s_d + s_strU);
+ test("8.0C", "" + s_d + sf_c);
+ test("8.075", "" + s_d + sf_str);
+ test("8.0-43", "" + s_d + s_bM);
+ test("8.080", "" + s_d + sf_b);
+ test("8.0null", "" + s_d + s_IN);
+ test("8.0-52.0", "" + s_d + s_fM);
+ test("8.075000000", "" + s_d + sf_i);
+ test("8.044", "" + s_d + f_b);
+ test("8.0-1705032704", "" + s_d + sf_lM);
+ test("8.0null", "" + s_d + f_oAN);
+ test("8.083.0", "" + s_d + f_d);
+ test("8.0I", "" + s_d + f_c);
+ test("8.094.0", "" + s_d + f_f);
+ test("8.012.0", "" + s_d + sf_d);
+ test("8.0-99.0", "" + s_d + f_dM);
+ test("8.017.0", "" + s_d + sf_f);
+ test("8.0-84.0", "" + s_d + sf_dM);
+ test("8.058000000", "" + s_d + f_i);
+ test("8.0-55000000", "" + s_d + f_iM);
+ test("8.01460392448", "" + s_d + f_l);
+ test("8.0C(70)", "" + s_d + f_o);
+ test("8.0\u04511", "" + s_d + sf_strU);
+ test("8.08000", "" + s_d + f_s);
+ test("8.018", "" + s_d + s_str);
+ test("8.0-1000000", "" + s_d + s_iM);
+ test("8.01000000", "" + s_d + sf_I);
+ test("8.0null", "" + s_d + f_oNtS);
+ test("8.0false", "" + s_d + f_bl);
+ test("8.0null", "" + s_d + sf_iAN);
+ test("8.0-2000000", "" + s_d + sf_iM);
+ test("8.0-820130816", "" + s_d + f_lM);
+ test("8.0null", "" + s_d + sf_oAN);
+ test("8.025000000", "" + s_d + s_I);
+ test("55.0-96.0", "" + s_f + s_dM);
+ test("55.0null", "" + s_f + s_oNtS);
+ test("55.0\u045176", "" + s_f + f_strU);
+ test("55.092", "" + s_f + sf_strU2);
+ test("55.051", "" + s_f + sf_strU1);
+ test("55.0null", "" + s_f + s_iAN);
+ test("55.0-54", "" + s_f + f_bM);
+ test("55.0-87.0", "" + s_f + f_fM);
+ test("55.0null", "" + s_f + s_oAN);
+ test("55.019", "" + s_f + f_str);
+ test("55.0-41", "" + s_f + sf_bM);
+ test("55.0null", "" + s_f + sf_IN);
+ test("55.0T", "" + s_f + s_c);
+ test("55.0-42.0", "" + s_f + sf_fM);
+ test("55.025", "" + s_f + s_b);
+ test("55.0null", "" + s_f + f_oN);
+ test("55.0-1410065408", "" + s_f + s_lM);
+ test("55.08.0", "" + s_f + s_d);
+ test("55.055.0", "" + s_f + s_f);
+ test("55.097000000", "" + s_f + s_i);
+ test("55.0-9900", "" + s_f + f_sM);
+ test("55.0935228928", "" + s_f + s_l);
+ test("55.0-8400", "" + s_f + sf_sM);
+ test("55.0C(82)", "" + s_f + s_o);
+ test("55.0null", "" + s_f + sf_oNtS);
+ test("55.0true", "" + s_f + s_bl);
+ test("55.03900", "" + s_f + s_s);
+ test("55.0null", "" + s_f + sf_oN);
+ test("55.094000000", "" + s_f + f_I);
+ test("55.0null", "" + s_f + f_IN);
+ test("55.0true", "" + s_f + sf_bl);
+ test("55.05500", "" + s_f + sf_s);
+ test("55.0-2900", "" + s_f + s_sM);
+ test("55.0-194313216", "" + s_f + sf_l);
+ test("55.012", "" + s_f + s_strU1);
+ test("55.0C(87)", "" + s_f + sf_o);
+ test("55.091", "" + s_f + s_strU2);
+ test("55.021", "" + s_f + f_strU1);
+ test("55.018", "" + s_f + f_strU2);
+ test("55.0null", "" + s_f + f_iAN);
+ test("55.0null", "" + s_f + s_oN);
+ test("55.0\u045180", "" + s_f + s_strU);
+ test("55.0C", "" + s_f + sf_c);
+ test("55.075", "" + s_f + sf_str);
+ test("55.0-43", "" + s_f + s_bM);
+ test("55.080", "" + s_f + sf_b);
+ test("55.0null", "" + s_f + s_IN);
+ test("55.0-52.0", "" + s_f + s_fM);
+ test("55.075000000", "" + s_f + sf_i);
+ test("55.044", "" + s_f + f_b);
+ test("55.0-1705032704", "" + s_f + sf_lM);
+ test("55.0null", "" + s_f + f_oAN);
+ test("55.083.0", "" + s_f + f_d);
+ test("55.0I", "" + s_f + f_c);
+ test("55.094.0", "" + s_f + f_f);
+ test("55.012.0", "" + s_f + sf_d);
+ test("55.0-99.0", "" + s_f + f_dM);
+ test("55.017.0", "" + s_f + sf_f);
+ test("55.0-84.0", "" + s_f + sf_dM);
+ test("55.058000000", "" + s_f + f_i);
+ test("55.0-55000000", "" + s_f + f_iM);
+ test("55.01460392448", "" + s_f + f_l);
+ test("55.0C(70)", "" + s_f + f_o);
+ test("55.0\u04511", "" + s_f + sf_strU);
+ test("55.08000", "" + s_f + f_s);
+ test("55.018", "" + s_f + s_str);
+ test("55.0-1000000", "" + s_f + s_iM);
+ test("55.01000000", "" + s_f + sf_I);
+ test("55.0null", "" + s_f + f_oNtS);
+ test("55.0false", "" + s_f + f_bl);
+ test("55.0null", "" + s_f + sf_iAN);
+ test("55.0-2000000", "" + s_f + sf_iM);
+ test("55.0-820130816", "" + s_f + f_lM);
+ test("55.0null", "" + s_f + sf_oAN);
+ test("55.025000000", "" + s_f + s_I);
+ test("97000000-96.0", "" + s_i + s_dM);
+ test("97000000null", "" + s_i + s_oNtS);
+ test("97000000\u045176", "" + s_i + f_strU);
+ test("9700000092", "" + s_i + sf_strU2);
+ test("9700000051", "" + s_i + sf_strU1);
+ test("97000000null", "" + s_i + s_iAN);
+ test("97000000-54", "" + s_i + f_bM);
+ test("97000000-87.0", "" + s_i + f_fM);
+ test("97000000null", "" + s_i + s_oAN);
+ test("9700000019", "" + s_i + f_str);
+ test("97000000-41", "" + s_i + sf_bM);
+ test("97000000null", "" + s_i + sf_IN);
+ test("97000000T", "" + s_i + s_c);
+ test("97000000-42.0", "" + s_i + sf_fM);
+ test("9700000025", "" + s_i + s_b);
+ test("97000000null", "" + s_i + f_oN);
+ test("97000000-1410065408", "" + s_i + s_lM);
+ test("970000008.0", "" + s_i + s_d);
+ test("9700000055.0", "" + s_i + s_f);
+ test("9700000097000000", "" + s_i + s_i);
+ test("97000000-9900", "" + s_i + f_sM);
+ test("97000000935228928", "" + s_i + s_l);
+ test("97000000-8400", "" + s_i + sf_sM);
+ test("97000000C(82)", "" + s_i + s_o);
+ test("97000000null", "" + s_i + sf_oNtS);
+ test("97000000true", "" + s_i + s_bl);
+ test("970000003900", "" + s_i + s_s);
+ test("97000000null", "" + s_i + sf_oN);
+ test("9700000094000000", "" + s_i + f_I);
+ test("97000000null", "" + s_i + f_IN);
+ test("97000000true", "" + s_i + sf_bl);
+ test("970000005500", "" + s_i + sf_s);
+ test("97000000-2900", "" + s_i + s_sM);
+ test("97000000-194313216", "" + s_i + sf_l);
+ test("9700000012", "" + s_i + s_strU1);
+ test("97000000C(87)", "" + s_i + sf_o);
+ test("9700000091", "" + s_i + s_strU2);
+ test("9700000021", "" + s_i + f_strU1);
+ test("9700000018", "" + s_i + f_strU2);
+ test("97000000null", "" + s_i + f_iAN);
+ test("97000000null", "" + s_i + s_oN);
+ test("97000000\u045180", "" + s_i + s_strU);
+ test("97000000C", "" + s_i + sf_c);
+ test("9700000075", "" + s_i + sf_str);
+ test("97000000-43", "" + s_i + s_bM);
+ test("9700000080", "" + s_i + sf_b);
+ test("97000000null", "" + s_i + s_IN);
+ test("97000000-52.0", "" + s_i + s_fM);
+ test("9700000075000000", "" + s_i + sf_i);
+ test("9700000044", "" + s_i + f_b);
+ test("97000000-1705032704", "" + s_i + sf_lM);
+ test("97000000null", "" + s_i + f_oAN);
+ test("9700000083.0", "" + s_i + f_d);
+ test("97000000I", "" + s_i + f_c);
+ test("9700000094.0", "" + s_i + f_f);
+ test("9700000012.0", "" + s_i + sf_d);
+ test("97000000-99.0", "" + s_i + f_dM);
+ test("9700000017.0", "" + s_i + sf_f);
+ test("97000000-84.0", "" + s_i + sf_dM);
+ test("9700000058000000", "" + s_i + f_i);
+ test("97000000-55000000", "" + s_i + f_iM);
+ test("970000001460392448", "" + s_i + f_l);
+ test("97000000C(70)", "" + s_i + f_o);
+ test("97000000\u04511", "" + s_i + sf_strU);
+ test("970000008000", "" + s_i + f_s);
+ test("9700000018", "" + s_i + s_str);
+ test("97000000-1000000", "" + s_i + s_iM);
+ test("970000001000000", "" + s_i + sf_I);
+ test("97000000null", "" + s_i + f_oNtS);
+ test("97000000false", "" + s_i + f_bl);
+ test("97000000null", "" + s_i + sf_iAN);
+ test("97000000-2000000", "" + s_i + sf_iM);
+ test("97000000-820130816", "" + s_i + f_lM);
+ test("97000000null", "" + s_i + sf_oAN);
+ test("9700000025000000", "" + s_i + s_I);
+ test("-9900-96.0", "" + f_sM + s_dM);
+ test("-9900null", "" + f_sM + s_oNtS);
+ test("-9900\u045176", "" + f_sM + f_strU);
+ test("-990092", "" + f_sM + sf_strU2);
+ test("-990051", "" + f_sM + sf_strU1);
+ test("-9900null", "" + f_sM + s_iAN);
+ test("-9900-54", "" + f_sM + f_bM);
+ test("-9900-87.0", "" + f_sM + f_fM);
+ test("-9900null", "" + f_sM + s_oAN);
+ test("-990019", "" + f_sM + f_str);
+ test("-9900-41", "" + f_sM + sf_bM);
+ test("-9900null", "" + f_sM + sf_IN);
+ test("-9900T", "" + f_sM + s_c);
+ test("-9900-42.0", "" + f_sM + sf_fM);
+ test("-990025", "" + f_sM + s_b);
+ test("-9900null", "" + f_sM + f_oN);
+ test("-9900-1410065408", "" + f_sM + s_lM);
+ test("-99008.0", "" + f_sM + s_d);
+ test("-990055.0", "" + f_sM + s_f);
+ test("-990097000000", "" + f_sM + s_i);
+ test("-9900-9900", "" + f_sM + f_sM);
+ test("-9900935228928", "" + f_sM + s_l);
+ test("-9900-8400", "" + f_sM + sf_sM);
+ test("-9900C(82)", "" + f_sM + s_o);
+ test("-9900null", "" + f_sM + sf_oNtS);
+ test("-9900true", "" + f_sM + s_bl);
+ test("-99003900", "" + f_sM + s_s);
+ test("-9900null", "" + f_sM + sf_oN);
+ test("-990094000000", "" + f_sM + f_I);
+ test("-9900null", "" + f_sM + f_IN);
+ test("-9900true", "" + f_sM + sf_bl);
+ test("-99005500", "" + f_sM + sf_s);
+ test("-9900-2900", "" + f_sM + s_sM);
+ test("-9900-194313216", "" + f_sM + sf_l);
+ test("-990012", "" + f_sM + s_strU1);
+ test("-9900C(87)", "" + f_sM + sf_o);
+ test("-990091", "" + f_sM + s_strU2);
+ test("-990021", "" + f_sM + f_strU1);
+ test("-990018", "" + f_sM + f_strU2);
+ test("-9900null", "" + f_sM + f_iAN);
+ test("-9900null", "" + f_sM + s_oN);
+ test("-9900\u045180", "" + f_sM + s_strU);
+ test("-9900C", "" + f_sM + sf_c);
+ test("-990075", "" + f_sM + sf_str);
+ test("-9900-43", "" + f_sM + s_bM);
+ test("-990080", "" + f_sM + sf_b);
+ test("-9900null", "" + f_sM + s_IN);
+ test("-9900-52.0", "" + f_sM + s_fM);
+ test("-990075000000", "" + f_sM + sf_i);
+ test("-990044", "" + f_sM + f_b);
+ test("-9900-1705032704", "" + f_sM + sf_lM);
+ test("-9900null", "" + f_sM + f_oAN);
+ test("-990083.0", "" + f_sM + f_d);
+ test("-9900I", "" + f_sM + f_c);
+ test("-990094.0", "" + f_sM + f_f);
+ test("-990012.0", "" + f_sM + sf_d);
+ test("-9900-99.0", "" + f_sM + f_dM);
+ test("-990017.0", "" + f_sM + sf_f);
+ test("-9900-84.0", "" + f_sM + sf_dM);
+ test("-990058000000", "" + f_sM + f_i);
+ test("-9900-55000000", "" + f_sM + f_iM);
+ test("-99001460392448", "" + f_sM + f_l);
+ test("-9900C(70)", "" + f_sM + f_o);
+ test("-9900\u04511", "" + f_sM + sf_strU);
+ test("-99008000", "" + f_sM + f_s);
+ test("-990018", "" + f_sM + s_str);
+ test("-9900-1000000", "" + f_sM + s_iM);
+ test("-99001000000", "" + f_sM + sf_I);
+ test("-9900null", "" + f_sM + f_oNtS);
+ test("-9900false", "" + f_sM + f_bl);
+ test("-9900null", "" + f_sM + sf_iAN);
+ test("-9900-2000000", "" + f_sM + sf_iM);
+ test("-9900-820130816", "" + f_sM + f_lM);
+ test("-9900null", "" + f_sM + sf_oAN);
+ test("-990025000000", "" + f_sM + s_I);
+ test("935228928-96.0", "" + s_l + s_dM);
+ test("935228928null", "" + s_l + s_oNtS);
+ test("935228928\u045176", "" + s_l + f_strU);
+ test("93522892892", "" + s_l + sf_strU2);
+ test("93522892851", "" + s_l + sf_strU1);
+ test("935228928null", "" + s_l + s_iAN);
+ test("935228928-54", "" + s_l + f_bM);
+ test("935228928-87.0", "" + s_l + f_fM);
+ test("935228928null", "" + s_l + s_oAN);
+ test("93522892819", "" + s_l + f_str);
+ test("935228928-41", "" + s_l + sf_bM);
+ test("935228928null", "" + s_l + sf_IN);
+ test("935228928T", "" + s_l + s_c);
+ test("935228928-42.0", "" + s_l + sf_fM);
+ test("93522892825", "" + s_l + s_b);
+ test("935228928null", "" + s_l + f_oN);
+ test("935228928-1410065408", "" + s_l + s_lM);
+ test("9352289288.0", "" + s_l + s_d);
+ test("93522892855.0", "" + s_l + s_f);
+ test("93522892897000000", "" + s_l + s_i);
+ test("935228928-9900", "" + s_l + f_sM);
+ test("935228928935228928", "" + s_l + s_l);
+ test("935228928-8400", "" + s_l + sf_sM);
+ test("935228928C(82)", "" + s_l + s_o);
+ test("935228928null", "" + s_l + sf_oNtS);
+ test("935228928true", "" + s_l + s_bl);
+ test("9352289283900", "" + s_l + s_s);
+ test("935228928null", "" + s_l + sf_oN);
+ test("93522892894000000", "" + s_l + f_I);
+ test("935228928null", "" + s_l + f_IN);
+ test("935228928true", "" + s_l + sf_bl);
+ test("9352289285500", "" + s_l + sf_s);
+ test("935228928-2900", "" + s_l + s_sM);
+ test("935228928-194313216", "" + s_l + sf_l);
+ test("93522892812", "" + s_l + s_strU1);
+ test("935228928C(87)", "" + s_l + sf_o);
+ test("93522892891", "" + s_l + s_strU2);
+ test("93522892821", "" + s_l + f_strU1);
+ test("93522892818", "" + s_l + f_strU2);
+ test("935228928null", "" + s_l + f_iAN);
+ test("935228928null", "" + s_l + s_oN);
+ test("935228928\u045180", "" + s_l + s_strU);
+ test("935228928C", "" + s_l + sf_c);
+ test("93522892875", "" + s_l + sf_str);
+ test("935228928-43", "" + s_l + s_bM);
+ test("93522892880", "" + s_l + sf_b);
+ test("935228928null", "" + s_l + s_IN);
+ test("935228928-52.0", "" + s_l + s_fM);
+ test("93522892875000000", "" + s_l + sf_i);
+ test("93522892844", "" + s_l + f_b);
+ test("935228928-1705032704", "" + s_l + sf_lM);
+ test("935228928null", "" + s_l + f_oAN);
+ test("93522892883.0", "" + s_l + f_d);
+ test("935228928I", "" + s_l + f_c);
+ test("93522892894.0", "" + s_l + f_f);
+ test("93522892812.0", "" + s_l + sf_d);
+ test("935228928-99.0", "" + s_l + f_dM);
+ test("93522892817.0", "" + s_l + sf_f);
+ test("935228928-84.0", "" + s_l + sf_dM);
+ test("93522892858000000", "" + s_l + f_i);
+ test("935228928-55000000", "" + s_l + f_iM);
+ test("9352289281460392448", "" + s_l + f_l);
+ test("935228928C(70)", "" + s_l + f_o);
+ test("935228928\u04511", "" + s_l + sf_strU);
+ test("9352289288000", "" + s_l + f_s);
+ test("93522892818", "" + s_l + s_str);
+ test("935228928-1000000", "" + s_l + s_iM);
+ test("9352289281000000", "" + s_l + sf_I);
+ test("935228928null", "" + s_l + f_oNtS);
+ test("935228928false", "" + s_l + f_bl);
+ test("935228928null", "" + s_l + sf_iAN);
+ test("935228928-2000000", "" + s_l + sf_iM);
+ test("935228928-820130816", "" + s_l + f_lM);
+ test("935228928null", "" + s_l + sf_oAN);
+ test("93522892825000000", "" + s_l + s_I);
+ test("-8400-96.0", "" + sf_sM + s_dM);
+ test("-8400null", "" + sf_sM + s_oNtS);
+ test("-8400\u045176", "" + sf_sM + f_strU);
+ test("-840092", "" + sf_sM + sf_strU2);
+ test("-840051", "" + sf_sM + sf_strU1);
+ test("-8400null", "" + sf_sM + s_iAN);
+ test("-8400-54", "" + sf_sM + f_bM);
+ test("-8400-87.0", "" + sf_sM + f_fM);
+ test("-8400null", "" + sf_sM + s_oAN);
+ test("-840019", "" + sf_sM + f_str);
+ test("-8400-41", "" + sf_sM + sf_bM);
+ test("-8400null", "" + sf_sM + sf_IN);
+ test("-8400T", "" + sf_sM + s_c);
+ test("-8400-42.0", "" + sf_sM + sf_fM);
+ test("-840025", "" + sf_sM + s_b);
+ test("-8400null", "" + sf_sM + f_oN);
+ test("-8400-1410065408", "" + sf_sM + s_lM);
+ test("-84008.0", "" + sf_sM + s_d);
+ test("-840055.0", "" + sf_sM + s_f);
+ test("-840097000000", "" + sf_sM + s_i);
+ test("-8400-9900", "" + sf_sM + f_sM);
+ test("-8400935228928", "" + sf_sM + s_l);
+ test("-8400-8400", "" + sf_sM + sf_sM);
+ test("-8400C(82)", "" + sf_sM + s_o);
+ test("-8400null", "" + sf_sM + sf_oNtS);
+ test("-8400true", "" + sf_sM + s_bl);
+ test("-84003900", "" + sf_sM + s_s);
+ test("-8400null", "" + sf_sM + sf_oN);
+ test("-840094000000", "" + sf_sM + f_I);
+ test("-8400null", "" + sf_sM + f_IN);
+ test("-8400true", "" + sf_sM + sf_bl);
+ test("-84005500", "" + sf_sM + sf_s);
+ test("-8400-2900", "" + sf_sM + s_sM);
+ test("-8400-194313216", "" + sf_sM + sf_l);
+ test("-840012", "" + sf_sM + s_strU1);
+ test("-8400C(87)", "" + sf_sM + sf_o);
+ test("-840091", "" + sf_sM + s_strU2);
+ test("-840021", "" + sf_sM + f_strU1);
+ test("-840018", "" + sf_sM + f_strU2);
+ test("-8400null", "" + sf_sM + f_iAN);
+ test("-8400null", "" + sf_sM + s_oN);
+ test("-8400\u045180", "" + sf_sM + s_strU);
+ test("-8400C", "" + sf_sM + sf_c);
+ test("-840075", "" + sf_sM + sf_str);
+ test("-8400-43", "" + sf_sM + s_bM);
+ test("-840080", "" + sf_sM + sf_b);
+ test("-8400null", "" + sf_sM + s_IN);
+ test("-8400-52.0", "" + sf_sM + s_fM);
+ test("-840075000000", "" + sf_sM + sf_i);
+ test("-840044", "" + sf_sM + f_b);
+ test("-8400-1705032704", "" + sf_sM + sf_lM);
+ test("-8400null", "" + sf_sM + f_oAN);
+ test("-840083.0", "" + sf_sM + f_d);
+ test("-8400I", "" + sf_sM + f_c);
+ test("-840094.0", "" + sf_sM + f_f);
+ test("-840012.0", "" + sf_sM + sf_d);
+ test("-8400-99.0", "" + sf_sM + f_dM);
+ test("-840017.0", "" + sf_sM + sf_f);
+ test("-8400-84.0", "" + sf_sM + sf_dM);
+ test("-840058000000", "" + sf_sM + f_i);
+ test("-8400-55000000", "" + sf_sM + f_iM);
+ test("-84001460392448", "" + sf_sM + f_l);
+ test("-8400C(70)", "" + sf_sM + f_o);
+ test("-8400\u04511", "" + sf_sM + sf_strU);
+ test("-84008000", "" + sf_sM + f_s);
+ test("-840018", "" + sf_sM + s_str);
+ test("-8400-1000000", "" + sf_sM + s_iM);
+ test("-84001000000", "" + sf_sM + sf_I);
+ test("-8400null", "" + sf_sM + f_oNtS);
+ test("-8400false", "" + sf_sM + f_bl);
+ test("-8400null", "" + sf_sM + sf_iAN);
+ test("-8400-2000000", "" + sf_sM + sf_iM);
+ test("-8400-820130816", "" + sf_sM + f_lM);
+ test("-8400null", "" + sf_sM + sf_oAN);
+ test("-840025000000", "" + sf_sM + s_I);
+ test("C(82)-96.0", "" + s_o + s_dM);
+ test("C(82)null", "" + s_o + s_oNtS);
+ test("C(82)\u045176", "" + s_o + f_strU);
+ test("C(82)92", "" + s_o + sf_strU2);
+ test("C(82)51", "" + s_o + sf_strU1);
+ test("C(82)null", "" + s_o + s_iAN);
+ test("C(82)-54", "" + s_o + f_bM);
+ test("C(82)-87.0", "" + s_o + f_fM);
+ test("C(82)null", "" + s_o + s_oAN);
+ test("C(82)19", "" + s_o + f_str);
+ test("C(82)-41", "" + s_o + sf_bM);
+ test("C(82)null", "" + s_o + sf_IN);
+ test("C(82)T", "" + s_o + s_c);
+ test("C(82)-42.0", "" + s_o + sf_fM);
+ test("C(82)25", "" + s_o + s_b);
+ test("C(82)null", "" + s_o + f_oN);
+ test("C(82)-1410065408", "" + s_o + s_lM);
+ test("C(82)8.0", "" + s_o + s_d);
+ test("C(82)55.0", "" + s_o + s_f);
+ test("C(82)97000000", "" + s_o + s_i);
+ test("C(82)-9900", "" + s_o + f_sM);
+ test("C(82)935228928", "" + s_o + s_l);
+ test("C(82)-8400", "" + s_o + sf_sM);
+ test("C(82)C(82)", "" + s_o + s_o);
+ test("C(82)null", "" + s_o + sf_oNtS);
+ test("C(82)true", "" + s_o + s_bl);
+ test("C(82)3900", "" + s_o + s_s);
+ test("C(82)null", "" + s_o + sf_oN);
+ test("C(82)94000000", "" + s_o + f_I);
+ test("C(82)null", "" + s_o + f_IN);
+ test("C(82)true", "" + s_o + sf_bl);
+ test("C(82)5500", "" + s_o + sf_s);
+ test("C(82)-2900", "" + s_o + s_sM);
+ test("C(82)-194313216", "" + s_o + sf_l);
+ test("C(82)12", "" + s_o + s_strU1);
+ test("C(82)C(87)", "" + s_o + sf_o);
+ test("C(82)91", "" + s_o + s_strU2);
+ test("C(82)21", "" + s_o + f_strU1);
+ test("C(82)18", "" + s_o + f_strU2);
+ test("C(82)null", "" + s_o + f_iAN);
+ test("C(82)null", "" + s_o + s_oN);
+ test("C(82)\u045180", "" + s_o + s_strU);
+ test("C(82)C", "" + s_o + sf_c);
+ test("C(82)75", "" + s_o + sf_str);
+ test("C(82)-43", "" + s_o + s_bM);
+ test("C(82)80", "" + s_o + sf_b);
+ test("C(82)null", "" + s_o + s_IN);
+ test("C(82)-52.0", "" + s_o + s_fM);
+ test("C(82)75000000", "" + s_o + sf_i);
+ test("C(82)44", "" + s_o + f_b);
+ test("C(82)-1705032704", "" + s_o + sf_lM);
+ test("C(82)null", "" + s_o + f_oAN);
+ test("C(82)83.0", "" + s_o + f_d);
+ test("C(82)I", "" + s_o + f_c);
+ test("C(82)94.0", "" + s_o + f_f);
+ test("C(82)12.0", "" + s_o + sf_d);
+ test("C(82)-99.0", "" + s_o + f_dM);
+ test("C(82)17.0", "" + s_o + sf_f);
+ test("C(82)-84.0", "" + s_o + sf_dM);
+ test("C(82)58000000", "" + s_o + f_i);
+ test("C(82)-55000000", "" + s_o + f_iM);
+ test("C(82)1460392448", "" + s_o + f_l);
+ test("C(82)C(70)", "" + s_o + f_o);
+ test("C(82)\u04511", "" + s_o + sf_strU);
+ test("C(82)8000", "" + s_o + f_s);
+ test("C(82)18", "" + s_o + s_str);
+ test("C(82)-1000000", "" + s_o + s_iM);
+ test("C(82)1000000", "" + s_o + sf_I);
+ test("C(82)null", "" + s_o + f_oNtS);
+ test("C(82)false", "" + s_o + f_bl);
+ test("C(82)null", "" + s_o + sf_iAN);
+ test("C(82)-2000000", "" + s_o + sf_iM);
+ test("C(82)-820130816", "" + s_o + f_lM);
+ test("C(82)null", "" + s_o + sf_oAN);
+ test("C(82)25000000", "" + s_o + s_I);
+ test("null-96.0", "" + sf_oNtS + s_dM);
+ test("nullnull", "" + sf_oNtS + s_oNtS);
+ test("null\u045176", "" + sf_oNtS + f_strU);
+ test("null92", "" + sf_oNtS + sf_strU2);
+ test("null51", "" + sf_oNtS + sf_strU1);
+ test("nullnull", "" + sf_oNtS + s_iAN);
+ test("null-54", "" + sf_oNtS + f_bM);
+ test("null-87.0", "" + sf_oNtS + f_fM);
+ test("nullnull", "" + sf_oNtS + s_oAN);
+ test("null19", "" + sf_oNtS + f_str);
+ test("null-41", "" + sf_oNtS + sf_bM);
+ test("nullnull", "" + sf_oNtS + sf_IN);
+ test("nullT", "" + sf_oNtS + s_c);
+ test("null-42.0", "" + sf_oNtS + sf_fM);
+ test("null25", "" + sf_oNtS + s_b);
+ test("nullnull", "" + sf_oNtS + f_oN);
+ test("null-1410065408", "" + sf_oNtS + s_lM);
+ test("null8.0", "" + sf_oNtS + s_d);
+ test("null55.0", "" + sf_oNtS + s_f);
+ test("null97000000", "" + sf_oNtS + s_i);
+ test("null-9900", "" + sf_oNtS + f_sM);
+ test("null935228928", "" + sf_oNtS + s_l);
+ test("null-8400", "" + sf_oNtS + sf_sM);
+ test("nullC(82)", "" + sf_oNtS + s_o);
+ test("nullnull", "" + sf_oNtS + sf_oNtS);
+ test("nulltrue", "" + sf_oNtS + s_bl);
+ test("null3900", "" + sf_oNtS + s_s);
+ test("nullnull", "" + sf_oNtS + sf_oN);
+ test("null94000000", "" + sf_oNtS + f_I);
+ test("nullnull", "" + sf_oNtS + f_IN);
+ test("nulltrue", "" + sf_oNtS + sf_bl);
+ test("null5500", "" + sf_oNtS + sf_s);
+ test("null-2900", "" + sf_oNtS + s_sM);
+ test("null-194313216", "" + sf_oNtS + sf_l);
+ test("null12", "" + sf_oNtS + s_strU1);
+ test("nullC(87)", "" + sf_oNtS + sf_o);
+ test("null91", "" + sf_oNtS + s_strU2);
+ test("null21", "" + sf_oNtS + f_strU1);
+ test("null18", "" + sf_oNtS + f_strU2);
+ test("nullnull", "" + sf_oNtS + f_iAN);
+ test("nullnull", "" + sf_oNtS + s_oN);
+ test("null\u045180", "" + sf_oNtS + s_strU);
+ test("nullC", "" + sf_oNtS + sf_c);
+ test("null75", "" + sf_oNtS + sf_str);
+ test("null-43", "" + sf_oNtS + s_bM);
+ test("null80", "" + sf_oNtS + sf_b);
+ test("nullnull", "" + sf_oNtS + s_IN);
+ test("null-52.0", "" + sf_oNtS + s_fM);
+ test("null75000000", "" + sf_oNtS + sf_i);
+ test("null44", "" + sf_oNtS + f_b);
+ test("null-1705032704", "" + sf_oNtS + sf_lM);
+ test("nullnull", "" + sf_oNtS + f_oAN);
+ test("null83.0", "" + sf_oNtS + f_d);
+ test("nullI", "" + sf_oNtS + f_c);
+ test("null94.0", "" + sf_oNtS + f_f);
+ test("null12.0", "" + sf_oNtS + sf_d);
+ test("null-99.0", "" + sf_oNtS + f_dM);
+ test("null17.0", "" + sf_oNtS + sf_f);
+ test("null-84.0", "" + sf_oNtS + sf_dM);
+ test("null58000000", "" + sf_oNtS + f_i);
+ test("null-55000000", "" + sf_oNtS + f_iM);
+ test("null1460392448", "" + sf_oNtS + f_l);
+ test("nullC(70)", "" + sf_oNtS + f_o);
+ test("null\u04511", "" + sf_oNtS + sf_strU);
+ test("null8000", "" + sf_oNtS + f_s);
+ test("null18", "" + sf_oNtS + s_str);
+ test("null-1000000", "" + sf_oNtS + s_iM);
+ test("null1000000", "" + sf_oNtS + sf_I);
+ test("nullnull", "" + sf_oNtS + f_oNtS);
+ test("nullfalse", "" + sf_oNtS + f_bl);
+ test("nullnull", "" + sf_oNtS + sf_iAN);
+ test("null-2000000", "" + sf_oNtS + sf_iM);
+ test("null-820130816", "" + sf_oNtS + f_lM);
+ test("nullnull", "" + sf_oNtS + sf_oAN);
+ test("null25000000", "" + sf_oNtS + s_I);
+ test("true-96.0", "" + s_bl + s_dM);
+ test("truenull", "" + s_bl + s_oNtS);
+ test("true\u045176", "" + s_bl + f_strU);
+ test("true92", "" + s_bl + sf_strU2);
+ test("true51", "" + s_bl + sf_strU1);
+ test("truenull", "" + s_bl + s_iAN);
+ test("true-54", "" + s_bl + f_bM);
+ test("true-87.0", "" + s_bl + f_fM);
+ test("truenull", "" + s_bl + s_oAN);
+ test("true19", "" + s_bl + f_str);
+ test("true-41", "" + s_bl + sf_bM);
+ test("truenull", "" + s_bl + sf_IN);
+ test("trueT", "" + s_bl + s_c);
+ test("true-42.0", "" + s_bl + sf_fM);
+ test("true25", "" + s_bl + s_b);
+ test("truenull", "" + s_bl + f_oN);
+ test("true-1410065408", "" + s_bl + s_lM);
+ test("true8.0", "" + s_bl + s_d);
+ test("true55.0", "" + s_bl + s_f);
+ test("true97000000", "" + s_bl + s_i);
+ test("true-9900", "" + s_bl + f_sM);
+ test("true935228928", "" + s_bl + s_l);
+ test("true-8400", "" + s_bl + sf_sM);
+ test("trueC(82)", "" + s_bl + s_o);
+ test("truenull", "" + s_bl + sf_oNtS);
+ test("truetrue", "" + s_bl + s_bl);
+ test("true3900", "" + s_bl + s_s);
+ test("truenull", "" + s_bl + sf_oN);
+ test("true94000000", "" + s_bl + f_I);
+ test("truenull", "" + s_bl + f_IN);
+ test("truetrue", "" + s_bl + sf_bl);
+ test("true5500", "" + s_bl + sf_s);
+ test("true-2900", "" + s_bl + s_sM);
+ test("true-194313216", "" + s_bl + sf_l);
+ test("true12", "" + s_bl + s_strU1);
+ test("trueC(87)", "" + s_bl + sf_o);
+ test("true91", "" + s_bl + s_strU2);
+ test("true21", "" + s_bl + f_strU1);
+ test("true18", "" + s_bl + f_strU2);
+ test("truenull", "" + s_bl + f_iAN);
+ test("truenull", "" + s_bl + s_oN);
+ test("true\u045180", "" + s_bl + s_strU);
+ test("trueC", "" + s_bl + sf_c);
+ test("true75", "" + s_bl + sf_str);
+ test("true-43", "" + s_bl + s_bM);
+ test("true80", "" + s_bl + sf_b);
+ test("truenull", "" + s_bl + s_IN);
+ test("true-52.0", "" + s_bl + s_fM);
+ test("true75000000", "" + s_bl + sf_i);
+ test("true44", "" + s_bl + f_b);
+ }
+
+ public void run2() {
+ test("true-1705032704", "" + s_bl + sf_lM);
+ test("truenull", "" + s_bl + f_oAN);
+ test("true83.0", "" + s_bl + f_d);
+ test("trueI", "" + s_bl + f_c);
+ test("true94.0", "" + s_bl + f_f);
+ test("true12.0", "" + s_bl + sf_d);
+ test("true-99.0", "" + s_bl + f_dM);
+ test("true17.0", "" + s_bl + sf_f);
+ test("true-84.0", "" + s_bl + sf_dM);
+ test("true58000000", "" + s_bl + f_i);
+ test("true-55000000", "" + s_bl + f_iM);
+ test("true1460392448", "" + s_bl + f_l);
+ test("trueC(70)", "" + s_bl + f_o);
+ test("true\u04511", "" + s_bl + sf_strU);
+ test("true8000", "" + s_bl + f_s);
+ test("true18", "" + s_bl + s_str);
+ test("true-1000000", "" + s_bl + s_iM);
+ test("true1000000", "" + s_bl + sf_I);
+ test("truenull", "" + s_bl + f_oNtS);
+ test("truefalse", "" + s_bl + f_bl);
+ test("truenull", "" + s_bl + sf_iAN);
+ test("true-2000000", "" + s_bl + sf_iM);
+ test("true-820130816", "" + s_bl + f_lM);
+ test("truenull", "" + s_bl + sf_oAN);
+ test("true25000000", "" + s_bl + s_I);
+ test("3900-96.0", "" + s_s + s_dM);
+ test("3900null", "" + s_s + s_oNtS);
+ test("3900\u045176", "" + s_s + f_strU);
+ test("390092", "" + s_s + sf_strU2);
+ test("390051", "" + s_s + sf_strU1);
+ test("3900null", "" + s_s + s_iAN);
+ test("3900-54", "" + s_s + f_bM);
+ test("3900-87.0", "" + s_s + f_fM);
+ test("3900null", "" + s_s + s_oAN);
+ test("390019", "" + s_s + f_str);
+ test("3900-41", "" + s_s + sf_bM);
+ test("3900null", "" + s_s + sf_IN);
+ test("3900T", "" + s_s + s_c);
+ test("3900-42.0", "" + s_s + sf_fM);
+ test("390025", "" + s_s + s_b);
+ test("3900null", "" + s_s + f_oN);
+ test("3900-1410065408", "" + s_s + s_lM);
+ test("39008.0", "" + s_s + s_d);
+ test("390055.0", "" + s_s + s_f);
+ test("390097000000", "" + s_s + s_i);
+ test("3900-9900", "" + s_s + f_sM);
+ test("3900935228928", "" + s_s + s_l);
+ test("3900-8400", "" + s_s + sf_sM);
+ test("3900C(82)", "" + s_s + s_o);
+ test("3900null", "" + s_s + sf_oNtS);
+ test("3900true", "" + s_s + s_bl);
+ test("39003900", "" + s_s + s_s);
+ test("3900null", "" + s_s + sf_oN);
+ test("390094000000", "" + s_s + f_I);
+ test("3900null", "" + s_s + f_IN);
+ test("3900true", "" + s_s + sf_bl);
+ test("39005500", "" + s_s + sf_s);
+ test("3900-2900", "" + s_s + s_sM);
+ test("3900-194313216", "" + s_s + sf_l);
+ test("390012", "" + s_s + s_strU1);
+ test("3900C(87)", "" + s_s + sf_o);
+ test("390091", "" + s_s + s_strU2);
+ test("390021", "" + s_s + f_strU1);
+ test("390018", "" + s_s + f_strU2);
+ test("3900null", "" + s_s + f_iAN);
+ test("3900null", "" + s_s + s_oN);
+ test("3900\u045180", "" + s_s + s_strU);
+ test("3900C", "" + s_s + sf_c);
+ test("390075", "" + s_s + sf_str);
+ test("3900-43", "" + s_s + s_bM);
+ test("390080", "" + s_s + sf_b);
+ test("3900null", "" + s_s + s_IN);
+ test("3900-52.0", "" + s_s + s_fM);
+ test("390075000000", "" + s_s + sf_i);
+ test("390044", "" + s_s + f_b);
+ test("3900-1705032704", "" + s_s + sf_lM);
+ test("3900null", "" + s_s + f_oAN);
+ test("390083.0", "" + s_s + f_d);
+ test("3900I", "" + s_s + f_c);
+ test("390094.0", "" + s_s + f_f);
+ test("390012.0", "" + s_s + sf_d);
+ test("3900-99.0", "" + s_s + f_dM);
+ test("390017.0", "" + s_s + sf_f);
+ test("3900-84.0", "" + s_s + sf_dM);
+ test("390058000000", "" + s_s + f_i);
+ test("3900-55000000", "" + s_s + f_iM);
+ test("39001460392448", "" + s_s + f_l);
+ test("3900C(70)", "" + s_s + f_o);
+ test("3900\u04511", "" + s_s + sf_strU);
+ test("39008000", "" + s_s + f_s);
+ test("390018", "" + s_s + s_str);
+ test("3900-1000000", "" + s_s + s_iM);
+ test("39001000000", "" + s_s + sf_I);
+ test("3900null", "" + s_s + f_oNtS);
+ test("3900false", "" + s_s + f_bl);
+ test("3900null", "" + s_s + sf_iAN);
+ test("3900-2000000", "" + s_s + sf_iM);
+ test("3900-820130816", "" + s_s + f_lM);
+ test("3900null", "" + s_s + sf_oAN);
+ test("390025000000", "" + s_s + s_I);
+ test("null-96.0", "" + sf_oN + s_dM);
+ test("nullnull", "" + sf_oN + s_oNtS);
+ test("null\u045176", "" + sf_oN + f_strU);
+ test("null92", "" + sf_oN + sf_strU2);
+ test("null51", "" + sf_oN + sf_strU1);
+ test("nullnull", "" + sf_oN + s_iAN);
+ test("null-54", "" + sf_oN + f_bM);
+ test("null-87.0", "" + sf_oN + f_fM);
+ test("nullnull", "" + sf_oN + s_oAN);
+ test("null19", "" + sf_oN + f_str);
+ test("null-41", "" + sf_oN + sf_bM);
+ test("nullnull", "" + sf_oN + sf_IN);
+ test("nullT", "" + sf_oN + s_c);
+ test("null-42.0", "" + sf_oN + sf_fM);
+ test("null25", "" + sf_oN + s_b);
+ test("nullnull", "" + sf_oN + f_oN);
+ test("null-1410065408", "" + sf_oN + s_lM);
+ test("null8.0", "" + sf_oN + s_d);
+ test("null55.0", "" + sf_oN + s_f);
+ test("null97000000", "" + sf_oN + s_i);
+ test("null-9900", "" + sf_oN + f_sM);
+ test("null935228928", "" + sf_oN + s_l);
+ test("null-8400", "" + sf_oN + sf_sM);
+ test("nullC(82)", "" + sf_oN + s_o);
+ test("nullnull", "" + sf_oN + sf_oNtS);
+ test("nulltrue", "" + sf_oN + s_bl);
+ test("null3900", "" + sf_oN + s_s);
+ test("nullnull", "" + sf_oN + sf_oN);
+ test("null94000000", "" + sf_oN + f_I);
+ test("nullnull", "" + sf_oN + f_IN);
+ test("nulltrue", "" + sf_oN + sf_bl);
+ test("null5500", "" + sf_oN + sf_s);
+ test("null-2900", "" + sf_oN + s_sM);
+ test("null-194313216", "" + sf_oN + sf_l);
+ test("null12", "" + sf_oN + s_strU1);
+ test("nullC(87)", "" + sf_oN + sf_o);
+ test("null91", "" + sf_oN + s_strU2);
+ test("null21", "" + sf_oN + f_strU1);
+ test("null18", "" + sf_oN + f_strU2);
+ test("nullnull", "" + sf_oN + f_iAN);
+ test("nullnull", "" + sf_oN + s_oN);
+ test("null\u045180", "" + sf_oN + s_strU);
+ test("nullC", "" + sf_oN + sf_c);
+ test("null75", "" + sf_oN + sf_str);
+ test("null-43", "" + sf_oN + s_bM);
+ test("null80", "" + sf_oN + sf_b);
+ test("nullnull", "" + sf_oN + s_IN);
+ test("null-52.0", "" + sf_oN + s_fM);
+ test("null75000000", "" + sf_oN + sf_i);
+ test("null44", "" + sf_oN + f_b);
+ test("null-1705032704", "" + sf_oN + sf_lM);
+ test("nullnull", "" + sf_oN + f_oAN);
+ test("null83.0", "" + sf_oN + f_d);
+ test("nullI", "" + sf_oN + f_c);
+ test("null94.0", "" + sf_oN + f_f);
+ test("null12.0", "" + sf_oN + sf_d);
+ test("null-99.0", "" + sf_oN + f_dM);
+ test("null17.0", "" + sf_oN + sf_f);
+ test("null-84.0", "" + sf_oN + sf_dM);
+ test("null58000000", "" + sf_oN + f_i);
+ test("null-55000000", "" + sf_oN + f_iM);
+ test("null1460392448", "" + sf_oN + f_l);
+ test("nullC(70)", "" + sf_oN + f_o);
+ test("null\u04511", "" + sf_oN + sf_strU);
+ test("null8000", "" + sf_oN + f_s);
+ test("null18", "" + sf_oN + s_str);
+ test("null-1000000", "" + sf_oN + s_iM);
+ test("null1000000", "" + sf_oN + sf_I);
+ test("nullnull", "" + sf_oN + f_oNtS);
+ test("nullfalse", "" + sf_oN + f_bl);
+ test("nullnull", "" + sf_oN + sf_iAN);
+ test("null-2000000", "" + sf_oN + sf_iM);
+ test("null-820130816", "" + sf_oN + f_lM);
+ test("nullnull", "" + sf_oN + sf_oAN);
+ test("null25000000", "" + sf_oN + s_I);
+ test("94000000-96.0", "" + f_I + s_dM);
+ test("94000000null", "" + f_I + s_oNtS);
+ test("94000000\u045176", "" + f_I + f_strU);
+ test("9400000092", "" + f_I + sf_strU2);
+ test("9400000051", "" + f_I + sf_strU1);
+ test("94000000null", "" + f_I + s_iAN);
+ test("94000000-54", "" + f_I + f_bM);
+ test("94000000-87.0", "" + f_I + f_fM);
+ test("94000000null", "" + f_I + s_oAN);
+ test("9400000019", "" + f_I + f_str);
+ test("94000000-41", "" + f_I + sf_bM);
+ test("94000000null", "" + f_I + sf_IN);
+ test("94000000T", "" + f_I + s_c);
+ test("94000000-42.0", "" + f_I + sf_fM);
+ test("9400000025", "" + f_I + s_b);
+ test("94000000null", "" + f_I + f_oN);
+ test("94000000-1410065408", "" + f_I + s_lM);
+ test("940000008.0", "" + f_I + s_d);
+ test("9400000055.0", "" + f_I + s_f);
+ test("9400000097000000", "" + f_I + s_i);
+ test("94000000-9900", "" + f_I + f_sM);
+ test("94000000935228928", "" + f_I + s_l);
+ test("94000000-8400", "" + f_I + sf_sM);
+ test("94000000C(82)", "" + f_I + s_o);
+ test("94000000null", "" + f_I + sf_oNtS);
+ test("94000000true", "" + f_I + s_bl);
+ test("940000003900", "" + f_I + s_s);
+ test("94000000null", "" + f_I + sf_oN);
+ test("9400000094000000", "" + f_I + f_I);
+ test("94000000null", "" + f_I + f_IN);
+ test("94000000true", "" + f_I + sf_bl);
+ test("940000005500", "" + f_I + sf_s);
+ test("94000000-2900", "" + f_I + s_sM);
+ test("94000000-194313216", "" + f_I + sf_l);
+ test("9400000012", "" + f_I + s_strU1);
+ test("94000000C(87)", "" + f_I + sf_o);
+ test("9400000091", "" + f_I + s_strU2);
+ test("9400000021", "" + f_I + f_strU1);
+ test("9400000018", "" + f_I + f_strU2);
+ test("94000000null", "" + f_I + f_iAN);
+ test("94000000null", "" + f_I + s_oN);
+ test("94000000\u045180", "" + f_I + s_strU);
+ test("94000000C", "" + f_I + sf_c);
+ test("9400000075", "" + f_I + sf_str);
+ test("94000000-43", "" + f_I + s_bM);
+ test("9400000080", "" + f_I + sf_b);
+ test("94000000null", "" + f_I + s_IN);
+ test("94000000-52.0", "" + f_I + s_fM);
+ test("9400000075000000", "" + f_I + sf_i);
+ test("9400000044", "" + f_I + f_b);
+ test("94000000-1705032704", "" + f_I + sf_lM);
+ test("94000000null", "" + f_I + f_oAN);
+ test("9400000083.0", "" + f_I + f_d);
+ test("94000000I", "" + f_I + f_c);
+ test("9400000094.0", "" + f_I + f_f);
+ test("9400000012.0", "" + f_I + sf_d);
+ test("94000000-99.0", "" + f_I + f_dM);
+ test("9400000017.0", "" + f_I + sf_f);
+ test("94000000-84.0", "" + f_I + sf_dM);
+ test("9400000058000000", "" + f_I + f_i);
+ test("94000000-55000000", "" + f_I + f_iM);
+ test("940000001460392448", "" + f_I + f_l);
+ test("94000000C(70)", "" + f_I + f_o);
+ test("94000000\u04511", "" + f_I + sf_strU);
+ test("940000008000", "" + f_I + f_s);
+ test("9400000018", "" + f_I + s_str);
+ test("94000000-1000000", "" + f_I + s_iM);
+ test("940000001000000", "" + f_I + sf_I);
+ test("94000000null", "" + f_I + f_oNtS);
+ test("94000000false", "" + f_I + f_bl);
+ test("94000000null", "" + f_I + sf_iAN);
+ test("94000000-2000000", "" + f_I + sf_iM);
+ test("94000000-820130816", "" + f_I + f_lM);
+ test("94000000null", "" + f_I + sf_oAN);
+ test("9400000025000000", "" + f_I + s_I);
+ test("null-96.0", "" + f_IN + s_dM);
+ test("nullnull", "" + f_IN + s_oNtS);
+ test("null\u045176", "" + f_IN + f_strU);
+ test("null92", "" + f_IN + sf_strU2);
+ test("null51", "" + f_IN + sf_strU1);
+ test("nullnull", "" + f_IN + s_iAN);
+ test("null-54", "" + f_IN + f_bM);
+ test("null-87.0", "" + f_IN + f_fM);
+ test("nullnull", "" + f_IN + s_oAN);
+ test("null19", "" + f_IN + f_str);
+ test("null-41", "" + f_IN + sf_bM);
+ test("nullnull", "" + f_IN + sf_IN);
+ test("nullT", "" + f_IN + s_c);
+ test("null-42.0", "" + f_IN + sf_fM);
+ test("null25", "" + f_IN + s_b);
+ test("nullnull", "" + f_IN + f_oN);
+ test("null-1410065408", "" + f_IN + s_lM);
+ test("null8.0", "" + f_IN + s_d);
+ test("null55.0", "" + f_IN + s_f);
+ test("null97000000", "" + f_IN + s_i);
+ test("null-9900", "" + f_IN + f_sM);
+ test("null935228928", "" + f_IN + s_l);
+ test("null-8400", "" + f_IN + sf_sM);
+ test("nullC(82)", "" + f_IN + s_o);
+ test("nullnull", "" + f_IN + sf_oNtS);
+ test("nulltrue", "" + f_IN + s_bl);
+ test("null3900", "" + f_IN + s_s);
+ test("nullnull", "" + f_IN + sf_oN);
+ test("null94000000", "" + f_IN + f_I);
+ test("nullnull", "" + f_IN + f_IN);
+ test("nulltrue", "" + f_IN + sf_bl);
+ test("null5500", "" + f_IN + sf_s);
+ test("null-2900", "" + f_IN + s_sM);
+ test("null-194313216", "" + f_IN + sf_l);
+ test("null12", "" + f_IN + s_strU1);
+ test("nullC(87)", "" + f_IN + sf_o);
+ test("null91", "" + f_IN + s_strU2);
+ test("null21", "" + f_IN + f_strU1);
+ test("null18", "" + f_IN + f_strU2);
+ test("nullnull", "" + f_IN + f_iAN);
+ test("nullnull", "" + f_IN + s_oN);
+ test("null\u045180", "" + f_IN + s_strU);
+ test("nullC", "" + f_IN + sf_c);
+ test("null75", "" + f_IN + sf_str);
+ test("null-43", "" + f_IN + s_bM);
+ test("null80", "" + f_IN + sf_b);
+ test("nullnull", "" + f_IN + s_IN);
+ test("null-52.0", "" + f_IN + s_fM);
+ test("null75000000", "" + f_IN + sf_i);
+ test("null44", "" + f_IN + f_b);
+ test("null-1705032704", "" + f_IN + sf_lM);
+ test("nullnull", "" + f_IN + f_oAN);
+ test("null83.0", "" + f_IN + f_d);
+ test("nullI", "" + f_IN + f_c);
+ test("null94.0", "" + f_IN + f_f);
+ test("null12.0", "" + f_IN + sf_d);
+ test("null-99.0", "" + f_IN + f_dM);
+ test("null17.0", "" + f_IN + sf_f);
+ test("null-84.0", "" + f_IN + sf_dM);
+ test("null58000000", "" + f_IN + f_i);
+ test("null-55000000", "" + f_IN + f_iM);
+ test("null1460392448", "" + f_IN + f_l);
+ test("nullC(70)", "" + f_IN + f_o);
+ test("null\u04511", "" + f_IN + sf_strU);
+ test("null8000", "" + f_IN + f_s);
+ test("null18", "" + f_IN + s_str);
+ test("null-1000000", "" + f_IN + s_iM);
+ test("null1000000", "" + f_IN + sf_I);
+ test("nullnull", "" + f_IN + f_oNtS);
+ test("nullfalse", "" + f_IN + f_bl);
+ test("nullnull", "" + f_IN + sf_iAN);
+ test("null-2000000", "" + f_IN + sf_iM);
+ test("null-820130816", "" + f_IN + f_lM);
+ test("nullnull", "" + f_IN + sf_oAN);
+ test("null25000000", "" + f_IN + s_I);
+ test("true-96.0", "" + sf_bl + s_dM);
+ test("truenull", "" + sf_bl + s_oNtS);
+ test("true\u045176", "" + sf_bl + f_strU);
+ test("true92", "" + sf_bl + sf_strU2);
+ test("true51", "" + sf_bl + sf_strU1);
+ test("truenull", "" + sf_bl + s_iAN);
+ test("true-54", "" + sf_bl + f_bM);
+ test("true-87.0", "" + sf_bl + f_fM);
+ test("truenull", "" + sf_bl + s_oAN);
+ test("true19", "" + sf_bl + f_str);
+ test("true-41", "" + sf_bl + sf_bM);
+ test("truenull", "" + sf_bl + sf_IN);
+ test("trueT", "" + sf_bl + s_c);
+ test("true-42.0", "" + sf_bl + sf_fM);
+ test("true25", "" + sf_bl + s_b);
+ test("truenull", "" + sf_bl + f_oN);
+ test("true-1410065408", "" + sf_bl + s_lM);
+ test("true8.0", "" + sf_bl + s_d);
+ test("true55.0", "" + sf_bl + s_f);
+ test("true97000000", "" + sf_bl + s_i);
+ test("true-9900", "" + sf_bl + f_sM);
+ test("true935228928", "" + sf_bl + s_l);
+ test("true-8400", "" + sf_bl + sf_sM);
+ test("trueC(82)", "" + sf_bl + s_o);
+ test("truenull", "" + sf_bl + sf_oNtS);
+ test("truetrue", "" + sf_bl + s_bl);
+ test("true3900", "" + sf_bl + s_s);
+ test("truenull", "" + sf_bl + sf_oN);
+ test("true94000000", "" + sf_bl + f_I);
+ test("truenull", "" + sf_bl + f_IN);
+ test("truetrue", "" + sf_bl + sf_bl);
+ test("true5500", "" + sf_bl + sf_s);
+ test("true-2900", "" + sf_bl + s_sM);
+ test("true-194313216", "" + sf_bl + sf_l);
+ test("true12", "" + sf_bl + s_strU1);
+ test("trueC(87)", "" + sf_bl + sf_o);
+ test("true91", "" + sf_bl + s_strU2);
+ test("true21", "" + sf_bl + f_strU1);
+ test("true18", "" + sf_bl + f_strU2);
+ test("truenull", "" + sf_bl + f_iAN);
+ test("truenull", "" + sf_bl + s_oN);
+ test("true\u045180", "" + sf_bl + s_strU);
+ test("trueC", "" + sf_bl + sf_c);
+ test("true75", "" + sf_bl + sf_str);
+ test("true-43", "" + sf_bl + s_bM);
+ test("true80", "" + sf_bl + sf_b);
+ test("truenull", "" + sf_bl + s_IN);
+ test("true-52.0", "" + sf_bl + s_fM);
+ test("true75000000", "" + sf_bl + sf_i);
+ test("true44", "" + sf_bl + f_b);
+ test("true-1705032704", "" + sf_bl + sf_lM);
+ test("truenull", "" + sf_bl + f_oAN);
+ test("true83.0", "" + sf_bl + f_d);
+ test("trueI", "" + sf_bl + f_c);
+ test("true94.0", "" + sf_bl + f_f);
+ test("true12.0", "" + sf_bl + sf_d);
+ test("true-99.0", "" + sf_bl + f_dM);
+ test("true17.0", "" + sf_bl + sf_f);
+ test("true-84.0", "" + sf_bl + sf_dM);
+ test("true58000000", "" + sf_bl + f_i);
+ test("true-55000000", "" + sf_bl + f_iM);
+ test("true1460392448", "" + sf_bl + f_l);
+ test("trueC(70)", "" + sf_bl + f_o);
+ test("true\u04511", "" + sf_bl + sf_strU);
+ test("true8000", "" + sf_bl + f_s);
+ test("true18", "" + sf_bl + s_str);
+ test("true-1000000", "" + sf_bl + s_iM);
+ test("true1000000", "" + sf_bl + sf_I);
+ test("truenull", "" + sf_bl + f_oNtS);
+ test("truefalse", "" + sf_bl + f_bl);
+ test("truenull", "" + sf_bl + sf_iAN);
+ test("true-2000000", "" + sf_bl + sf_iM);
+ test("true-820130816", "" + sf_bl + f_lM);
+ test("truenull", "" + sf_bl + sf_oAN);
+ test("true25000000", "" + sf_bl + s_I);
+ test("5500-96.0", "" + sf_s + s_dM);
+ test("5500null", "" + sf_s + s_oNtS);
+ test("5500\u045176", "" + sf_s + f_strU);
+ test("550092", "" + sf_s + sf_strU2);
+ test("550051", "" + sf_s + sf_strU1);
+ test("5500null", "" + sf_s + s_iAN);
+ test("5500-54", "" + sf_s + f_bM);
+ test("5500-87.0", "" + sf_s + f_fM);
+ test("5500null", "" + sf_s + s_oAN);
+ test("550019", "" + sf_s + f_str);
+ test("5500-41", "" + sf_s + sf_bM);
+ test("5500null", "" + sf_s + sf_IN);
+ test("5500T", "" + sf_s + s_c);
+ test("5500-42.0", "" + sf_s + sf_fM);
+ test("550025", "" + sf_s + s_b);
+ test("5500null", "" + sf_s + f_oN);
+ test("5500-1410065408", "" + sf_s + s_lM);
+ test("55008.0", "" + sf_s + s_d);
+ test("550055.0", "" + sf_s + s_f);
+ test("550097000000", "" + sf_s + s_i);
+ test("5500-9900", "" + sf_s + f_sM);
+ test("5500935228928", "" + sf_s + s_l);
+ test("5500-8400", "" + sf_s + sf_sM);
+ test("5500C(82)", "" + sf_s + s_o);
+ test("5500null", "" + sf_s + sf_oNtS);
+ test("5500true", "" + sf_s + s_bl);
+ test("55003900", "" + sf_s + s_s);
+ test("5500null", "" + sf_s + sf_oN);
+ test("550094000000", "" + sf_s + f_I);
+ test("5500null", "" + sf_s + f_IN);
+ test("5500true", "" + sf_s + sf_bl);
+ test("55005500", "" + sf_s + sf_s);
+ test("5500-2900", "" + sf_s + s_sM);
+ test("5500-194313216", "" + sf_s + sf_l);
+ test("550012", "" + sf_s + s_strU1);
+ test("5500C(87)", "" + sf_s + sf_o);
+ test("550091", "" + sf_s + s_strU2);
+ test("550021", "" + sf_s + f_strU1);
+ test("550018", "" + sf_s + f_strU2);
+ test("5500null", "" + sf_s + f_iAN);
+ test("5500null", "" + sf_s + s_oN);
+ test("5500\u045180", "" + sf_s + s_strU);
+ test("5500C", "" + sf_s + sf_c);
+ test("550075", "" + sf_s + sf_str);
+ test("5500-43", "" + sf_s + s_bM);
+ test("550080", "" + sf_s + sf_b);
+ test("5500null", "" + sf_s + s_IN);
+ test("5500-52.0", "" + sf_s + s_fM);
+ test("550075000000", "" + sf_s + sf_i);
+ test("550044", "" + sf_s + f_b);
+ test("5500-1705032704", "" + sf_s + sf_lM);
+ test("5500null", "" + sf_s + f_oAN);
+ test("550083.0", "" + sf_s + f_d);
+ test("5500I", "" + sf_s + f_c);
+ test("550094.0", "" + sf_s + f_f);
+ test("550012.0", "" + sf_s + sf_d);
+ test("5500-99.0", "" + sf_s + f_dM);
+ test("550017.0", "" + sf_s + sf_f);
+ test("5500-84.0", "" + sf_s + sf_dM);
+ test("550058000000", "" + sf_s + f_i);
+ test("5500-55000000", "" + sf_s + f_iM);
+ test("55001460392448", "" + sf_s + f_l);
+ test("5500C(70)", "" + sf_s + f_o);
+ test("5500\u04511", "" + sf_s + sf_strU);
+ test("55008000", "" + sf_s + f_s);
+ test("550018", "" + sf_s + s_str);
+ test("5500-1000000", "" + sf_s + s_iM);
+ test("55001000000", "" + sf_s + sf_I);
+ test("5500null", "" + sf_s + f_oNtS);
+ test("5500false", "" + sf_s + f_bl);
+ test("5500null", "" + sf_s + sf_iAN);
+ test("5500-2000000", "" + sf_s + sf_iM);
+ test("5500-820130816", "" + sf_s + f_lM);
+ test("5500null", "" + sf_s + sf_oAN);
+ test("550025000000", "" + sf_s + s_I);
+ test("-2900-96.0", "" + s_sM + s_dM);
+ test("-2900null", "" + s_sM + s_oNtS);
+ test("-2900\u045176", "" + s_sM + f_strU);
+ test("-290092", "" + s_sM + sf_strU2);
+ test("-290051", "" + s_sM + sf_strU1);
+ test("-2900null", "" + s_sM + s_iAN);
+ test("-2900-54", "" + s_sM + f_bM);
+ test("-2900-87.0", "" + s_sM + f_fM);
+ test("-2900null", "" + s_sM + s_oAN);
+ test("-290019", "" + s_sM + f_str);
+ test("-2900-41", "" + s_sM + sf_bM);
+ test("-2900null", "" + s_sM + sf_IN);
+ test("-2900T", "" + s_sM + s_c);
+ test("-2900-42.0", "" + s_sM + sf_fM);
+ test("-290025", "" + s_sM + s_b);
+ test("-2900null", "" + s_sM + f_oN);
+ test("-2900-1410065408", "" + s_sM + s_lM);
+ test("-29008.0", "" + s_sM + s_d);
+ test("-290055.0", "" + s_sM + s_f);
+ test("-290097000000", "" + s_sM + s_i);
+ test("-2900-9900", "" + s_sM + f_sM);
+ test("-2900935228928", "" + s_sM + s_l);
+ test("-2900-8400", "" + s_sM + sf_sM);
+ test("-2900C(82)", "" + s_sM + s_o);
+ test("-2900null", "" + s_sM + sf_oNtS);
+ test("-2900true", "" + s_sM + s_bl);
+ test("-29003900", "" + s_sM + s_s);
+ test("-2900null", "" + s_sM + sf_oN);
+ test("-290094000000", "" + s_sM + f_I);
+ test("-2900null", "" + s_sM + f_IN);
+ test("-2900true", "" + s_sM + sf_bl);
+ test("-29005500", "" + s_sM + sf_s);
+ test("-2900-2900", "" + s_sM + s_sM);
+ test("-2900-194313216", "" + s_sM + sf_l);
+ test("-290012", "" + s_sM + s_strU1);
+ test("-2900C(87)", "" + s_sM + sf_o);
+ test("-290091", "" + s_sM + s_strU2);
+ test("-290021", "" + s_sM + f_strU1);
+ test("-290018", "" + s_sM + f_strU2);
+ test("-2900null", "" + s_sM + f_iAN);
+ test("-2900null", "" + s_sM + s_oN);
+ test("-2900\u045180", "" + s_sM + s_strU);
+ test("-2900C", "" + s_sM + sf_c);
+ test("-290075", "" + s_sM + sf_str);
+ test("-2900-43", "" + s_sM + s_bM);
+ test("-290080", "" + s_sM + sf_b);
+ test("-2900null", "" + s_sM + s_IN);
+ test("-2900-52.0", "" + s_sM + s_fM);
+ test("-290075000000", "" + s_sM + sf_i);
+ test("-290044", "" + s_sM + f_b);
+ test("-2900-1705032704", "" + s_sM + sf_lM);
+ test("-2900null", "" + s_sM + f_oAN);
+ test("-290083.0", "" + s_sM + f_d);
+ test("-2900I", "" + s_sM + f_c);
+ test("-290094.0", "" + s_sM + f_f);
+ test("-290012.0", "" + s_sM + sf_d);
+ test("-2900-99.0", "" + s_sM + f_dM);
+ test("-290017.0", "" + s_sM + sf_f);
+ test("-2900-84.0", "" + s_sM + sf_dM);
+ test("-290058000000", "" + s_sM + f_i);
+ test("-2900-55000000", "" + s_sM + f_iM);
+ test("-29001460392448", "" + s_sM + f_l);
+ test("-2900C(70)", "" + s_sM + f_o);
+ test("-2900\u04511", "" + s_sM + sf_strU);
+ test("-29008000", "" + s_sM + f_s);
+ test("-290018", "" + s_sM + s_str);
+ test("-2900-1000000", "" + s_sM + s_iM);
+ test("-29001000000", "" + s_sM + sf_I);
+ test("-2900null", "" + s_sM + f_oNtS);
+ test("-2900false", "" + s_sM + f_bl);
+ test("-2900null", "" + s_sM + sf_iAN);
+ test("-2900-2000000", "" + s_sM + sf_iM);
+ test("-2900-820130816", "" + s_sM + f_lM);
+ test("-2900null", "" + s_sM + sf_oAN);
+ test("-290025000000", "" + s_sM + s_I);
+ test("-194313216-96.0", "" + sf_l + s_dM);
+ test("-194313216null", "" + sf_l + s_oNtS);
+ test("-194313216\u045176", "" + sf_l + f_strU);
+ test("-19431321692", "" + sf_l + sf_strU2);
+ test("-19431321651", "" + sf_l + sf_strU1);
+ test("-194313216null", "" + sf_l + s_iAN);
+ test("-194313216-54", "" + sf_l + f_bM);
+ test("-194313216-87.0", "" + sf_l + f_fM);
+ test("-194313216null", "" + sf_l + s_oAN);
+ test("-19431321619", "" + sf_l + f_str);
+ test("-194313216-41", "" + sf_l + sf_bM);
+ test("-194313216null", "" + sf_l + sf_IN);
+ test("-194313216T", "" + sf_l + s_c);
+ test("-194313216-42.0", "" + sf_l + sf_fM);
+ test("-19431321625", "" + sf_l + s_b);
+ test("-194313216null", "" + sf_l + f_oN);
+ test("-194313216-1410065408", "" + sf_l + s_lM);
+ test("-1943132168.0", "" + sf_l + s_d);
+ test("-19431321655.0", "" + sf_l + s_f);
+ test("-19431321697000000", "" + sf_l + s_i);
+ test("-194313216-9900", "" + sf_l + f_sM);
+ test("-194313216935228928", "" + sf_l + s_l);
+ test("-194313216-8400", "" + sf_l + sf_sM);
+ test("-194313216C(82)", "" + sf_l + s_o);
+ test("-194313216null", "" + sf_l + sf_oNtS);
+ test("-194313216true", "" + sf_l + s_bl);
+ test("-1943132163900", "" + sf_l + s_s);
+ test("-194313216null", "" + sf_l + sf_oN);
+ test("-19431321694000000", "" + sf_l + f_I);
+ test("-194313216null", "" + sf_l + f_IN);
+ test("-194313216true", "" + sf_l + sf_bl);
+ test("-1943132165500", "" + sf_l + sf_s);
+ test("-194313216-2900", "" + sf_l + s_sM);
+ test("-194313216-194313216", "" + sf_l + sf_l);
+ test("-19431321612", "" + sf_l + s_strU1);
+ test("-194313216C(87)", "" + sf_l + sf_o);
+ test("-19431321691", "" + sf_l + s_strU2);
+ test("-19431321621", "" + sf_l + f_strU1);
+ test("-19431321618", "" + sf_l + f_strU2);
+ test("-194313216null", "" + sf_l + f_iAN);
+ test("-194313216null", "" + sf_l + s_oN);
+ test("-194313216\u045180", "" + sf_l + s_strU);
+ test("-194313216C", "" + sf_l + sf_c);
+ test("-19431321675", "" + sf_l + sf_str);
+ test("-194313216-43", "" + sf_l + s_bM);
+ test("-19431321680", "" + sf_l + sf_b);
+ test("-194313216null", "" + sf_l + s_IN);
+ test("-194313216-52.0", "" + sf_l + s_fM);
+ test("-19431321675000000", "" + sf_l + sf_i);
+ test("-19431321644", "" + sf_l + f_b);
+ test("-194313216-1705032704", "" + sf_l + sf_lM);
+ test("-194313216null", "" + sf_l + f_oAN);
+ test("-19431321683.0", "" + sf_l + f_d);
+ test("-194313216I", "" + sf_l + f_c);
+ test("-19431321694.0", "" + sf_l + f_f);
+ test("-19431321612.0", "" + sf_l + sf_d);
+ test("-194313216-99.0", "" + sf_l + f_dM);
+ test("-19431321617.0", "" + sf_l + sf_f);
+ test("-194313216-84.0", "" + sf_l + sf_dM);
+ test("-19431321658000000", "" + sf_l + f_i);
+ test("-194313216-55000000", "" + sf_l + f_iM);
+ test("-1943132161460392448", "" + sf_l + f_l);
+ test("-194313216C(70)", "" + sf_l + f_o);
+ test("-194313216\u04511", "" + sf_l + sf_strU);
+ test("-1943132168000", "" + sf_l + f_s);
+ test("-19431321618", "" + sf_l + s_str);
+ test("-194313216-1000000", "" + sf_l + s_iM);
+ test("-1943132161000000", "" + sf_l + sf_I);
+ test("-194313216null", "" + sf_l + f_oNtS);
+ test("-194313216false", "" + sf_l + f_bl);
+ test("-194313216null", "" + sf_l + sf_iAN);
+ test("-194313216-2000000", "" + sf_l + sf_iM);
+ test("-194313216-820130816", "" + sf_l + f_lM);
+ test("-194313216null", "" + sf_l + sf_oAN);
+ test("-19431321625000000", "" + sf_l + s_I);
+ test("12-96.0", "" + s_strU1 + s_dM);
+ test("12null", "" + s_strU1 + s_oNtS);
+ test("12\u045176", "" + s_strU1 + f_strU);
+ test("1292", "" + s_strU1 + sf_strU2);
+ test("1251", "" + s_strU1 + sf_strU1);
+ test("12null", "" + s_strU1 + s_iAN);
+ test("12-54", "" + s_strU1 + f_bM);
+ test("12-87.0", "" + s_strU1 + f_fM);
+ test("12null", "" + s_strU1 + s_oAN);
+ test("1219", "" + s_strU1 + f_str);
+ test("12-41", "" + s_strU1 + sf_bM);
+ test("12null", "" + s_strU1 + sf_IN);
+ test("12T", "" + s_strU1 + s_c);
+ test("12-42.0", "" + s_strU1 + sf_fM);
+ test("1225", "" + s_strU1 + s_b);
+ test("12null", "" + s_strU1 + f_oN);
+ test("12-1410065408", "" + s_strU1 + s_lM);
+ test("128.0", "" + s_strU1 + s_d);
+ test("1255.0", "" + s_strU1 + s_f);
+ test("1297000000", "" + s_strU1 + s_i);
+ test("12-9900", "" + s_strU1 + f_sM);
+ test("12935228928", "" + s_strU1 + s_l);
+ test("12-8400", "" + s_strU1 + sf_sM);
+ test("12C(82)", "" + s_strU1 + s_o);
+ test("12null", "" + s_strU1 + sf_oNtS);
+ test("12true", "" + s_strU1 + s_bl);
+ test("123900", "" + s_strU1 + s_s);
+ test("12null", "" + s_strU1 + sf_oN);
+ test("1294000000", "" + s_strU1 + f_I);
+ test("12null", "" + s_strU1 + f_IN);
+ test("12true", "" + s_strU1 + sf_bl);
+ test("125500", "" + s_strU1 + sf_s);
+ test("12-2900", "" + s_strU1 + s_sM);
+ test("12-194313216", "" + s_strU1 + sf_l);
+ test("1212", "" + s_strU1 + s_strU1);
+ test("12C(87)", "" + s_strU1 + sf_o);
+ test("1291", "" + s_strU1 + s_strU2);
+ test("1221", "" + s_strU1 + f_strU1);
+ test("1218", "" + s_strU1 + f_strU2);
+ test("12null", "" + s_strU1 + f_iAN);
+ test("12null", "" + s_strU1 + s_oN);
+ test("12\u045180", "" + s_strU1 + s_strU);
+ test("12C", "" + s_strU1 + sf_c);
+ test("1275", "" + s_strU1 + sf_str);
+ test("12-43", "" + s_strU1 + s_bM);
+ test("1280", "" + s_strU1 + sf_b);
+ test("12null", "" + s_strU1 + s_IN);
+ test("12-52.0", "" + s_strU1 + s_fM);
+ test("1275000000", "" + s_strU1 + sf_i);
+ test("1244", "" + s_strU1 + f_b);
+ test("12-1705032704", "" + s_strU1 + sf_lM);
+ test("12null", "" + s_strU1 + f_oAN);
+ test("1283.0", "" + s_strU1 + f_d);
+ test("12I", "" + s_strU1 + f_c);
+ test("1294.0", "" + s_strU1 + f_f);
+ test("1212.0", "" + s_strU1 + sf_d);
+ test("12-99.0", "" + s_strU1 + f_dM);
+ test("1217.0", "" + s_strU1 + sf_f);
+ test("12-84.0", "" + s_strU1 + sf_dM);
+ test("1258000000", "" + s_strU1 + f_i);
+ test("12-55000000", "" + s_strU1 + f_iM);
+ test("121460392448", "" + s_strU1 + f_l);
+ test("12C(70)", "" + s_strU1 + f_o);
+ test("12\u04511", "" + s_strU1 + sf_strU);
+ test("128000", "" + s_strU1 + f_s);
+ test("1218", "" + s_strU1 + s_str);
+ test("12-1000000", "" + s_strU1 + s_iM);
+ test("121000000", "" + s_strU1 + sf_I);
+ test("12null", "" + s_strU1 + f_oNtS);
+ test("12false", "" + s_strU1 + f_bl);
+ test("12null", "" + s_strU1 + sf_iAN);
+ test("12-2000000", "" + s_strU1 + sf_iM);
+ test("12-820130816", "" + s_strU1 + f_lM);
+ test("12null", "" + s_strU1 + sf_oAN);
+ test("1225000000", "" + s_strU1 + s_I);
+ test("C(87)-96.0", "" + sf_o + s_dM);
+ test("C(87)null", "" + sf_o + s_oNtS);
+ test("C(87)\u045176", "" + sf_o + f_strU);
+ test("C(87)92", "" + sf_o + sf_strU2);
+ test("C(87)51", "" + sf_o + sf_strU1);
+ test("C(87)null", "" + sf_o + s_iAN);
+ test("C(87)-54", "" + sf_o + f_bM);
+ test("C(87)-87.0", "" + sf_o + f_fM);
+ test("C(87)null", "" + sf_o + s_oAN);
+ test("C(87)19", "" + sf_o + f_str);
+ test("C(87)-41", "" + sf_o + sf_bM);
+ test("C(87)null", "" + sf_o + sf_IN);
+ test("C(87)T", "" + sf_o + s_c);
+ test("C(87)-42.0", "" + sf_o + sf_fM);
+ test("C(87)25", "" + sf_o + s_b);
+ test("C(87)null", "" + sf_o + f_oN);
+ test("C(87)-1410065408", "" + sf_o + s_lM);
+ test("C(87)8.0", "" + sf_o + s_d);
+ test("C(87)55.0", "" + sf_o + s_f);
+ test("C(87)97000000", "" + sf_o + s_i);
+ test("C(87)-9900", "" + sf_o + f_sM);
+ test("C(87)935228928", "" + sf_o + s_l);
+ test("C(87)-8400", "" + sf_o + sf_sM);
+ test("C(87)C(82)", "" + sf_o + s_o);
+ test("C(87)null", "" + sf_o + sf_oNtS);
+ test("C(87)true", "" + sf_o + s_bl);
+ test("C(87)3900", "" + sf_o + s_s);
+ test("C(87)null", "" + sf_o + sf_oN);
+ test("C(87)94000000", "" + sf_o + f_I);
+ test("C(87)null", "" + sf_o + f_IN);
+ test("C(87)true", "" + sf_o + sf_bl);
+ test("C(87)5500", "" + sf_o + sf_s);
+ test("C(87)-2900", "" + sf_o + s_sM);
+ test("C(87)-194313216", "" + sf_o + sf_l);
+ test("C(87)12", "" + sf_o + s_strU1);
+ test("C(87)C(87)", "" + sf_o + sf_o);
+ test("C(87)91", "" + sf_o + s_strU2);
+ test("C(87)21", "" + sf_o + f_strU1);
+ test("C(87)18", "" + sf_o + f_strU2);
+ test("C(87)null", "" + sf_o + f_iAN);
+ test("C(87)null", "" + sf_o + s_oN);
+ test("C(87)\u045180", "" + sf_o + s_strU);
+ test("C(87)C", "" + sf_o + sf_c);
+ test("C(87)75", "" + sf_o + sf_str);
+ test("C(87)-43", "" + sf_o + s_bM);
+ test("C(87)80", "" + sf_o + sf_b);
+ test("C(87)null", "" + sf_o + s_IN);
+ test("C(87)-52.0", "" + sf_o + s_fM);
+ test("C(87)75000000", "" + sf_o + sf_i);
+ test("C(87)44", "" + sf_o + f_b);
+ test("C(87)-1705032704", "" + sf_o + sf_lM);
+ test("C(87)null", "" + sf_o + f_oAN);
+ test("C(87)83.0", "" + sf_o + f_d);
+ test("C(87)I", "" + sf_o + f_c);
+ test("C(87)94.0", "" + sf_o + f_f);
+ test("C(87)12.0", "" + sf_o + sf_d);
+ test("C(87)-99.0", "" + sf_o + f_dM);
+ test("C(87)17.0", "" + sf_o + sf_f);
+ test("C(87)-84.0", "" + sf_o + sf_dM);
+ test("C(87)58000000", "" + sf_o + f_i);
+ test("C(87)-55000000", "" + sf_o + f_iM);
+ test("C(87)1460392448", "" + sf_o + f_l);
+ test("C(87)C(70)", "" + sf_o + f_o);
+ test("C(87)\u04511", "" + sf_o + sf_strU);
+ test("C(87)8000", "" + sf_o + f_s);
+ test("C(87)18", "" + sf_o + s_str);
+ test("C(87)-1000000", "" + sf_o + s_iM);
+ test("C(87)1000000", "" + sf_o + sf_I);
+ test("C(87)null", "" + sf_o + f_oNtS);
+ test("C(87)false", "" + sf_o + f_bl);
+ test("C(87)null", "" + sf_o + sf_iAN);
+ test("C(87)-2000000", "" + sf_o + sf_iM);
+ test("C(87)-820130816", "" + sf_o + f_lM);
+ test("C(87)null", "" + sf_o + sf_oAN);
+ test("C(87)25000000", "" + sf_o + s_I);
+ test("91-96.0", "" + s_strU2 + s_dM);
+ test("91null", "" + s_strU2 + s_oNtS);
+ test("91\u045176", "" + s_strU2 + f_strU);
+ test("9192", "" + s_strU2 + sf_strU2);
+ test("9151", "" + s_strU2 + sf_strU1);
+ test("91null", "" + s_strU2 + s_iAN);
+ test("91-54", "" + s_strU2 + f_bM);
+ test("91-87.0", "" + s_strU2 + f_fM);
+ test("91null", "" + s_strU2 + s_oAN);
+ test("9119", "" + s_strU2 + f_str);
+ test("91-41", "" + s_strU2 + sf_bM);
+ test("91null", "" + s_strU2 + sf_IN);
+ test("91T", "" + s_strU2 + s_c);
+ test("91-42.0", "" + s_strU2 + sf_fM);
+ test("9125", "" + s_strU2 + s_b);
+ test("91null", "" + s_strU2 + f_oN);
+ test("91-1410065408", "" + s_strU2 + s_lM);
+ test("918.0", "" + s_strU2 + s_d);
+ test("9155.0", "" + s_strU2 + s_f);
+ test("9197000000", "" + s_strU2 + s_i);
+ test("91-9900", "" + s_strU2 + f_sM);
+ test("91935228928", "" + s_strU2 + s_l);
+ test("91-8400", "" + s_strU2 + sf_sM);
+ test("91C(82)", "" + s_strU2 + s_o);
+ test("91null", "" + s_strU2 + sf_oNtS);
+ test("91true", "" + s_strU2 + s_bl);
+ test("913900", "" + s_strU2 + s_s);
+ test("91null", "" + s_strU2 + sf_oN);
+ test("9194000000", "" + s_strU2 + f_I);
+ test("91null", "" + s_strU2 + f_IN);
+ test("91true", "" + s_strU2 + sf_bl);
+ test("915500", "" + s_strU2 + sf_s);
+ test("91-2900", "" + s_strU2 + s_sM);
+ test("91-194313216", "" + s_strU2 + sf_l);
+ test("9112", "" + s_strU2 + s_strU1);
+ test("91C(87)", "" + s_strU2 + sf_o);
+ test("9191", "" + s_strU2 + s_strU2);
+ test("9121", "" + s_strU2 + f_strU1);
+ test("9118", "" + s_strU2 + f_strU2);
+ test("91null", "" + s_strU2 + f_iAN);
+ test("91null", "" + s_strU2 + s_oN);
+ test("91\u045180", "" + s_strU2 + s_strU);
+ test("91C", "" + s_strU2 + sf_c);
+ test("9175", "" + s_strU2 + sf_str);
+ test("91-43", "" + s_strU2 + s_bM);
+ test("9180", "" + s_strU2 + sf_b);
+ test("91null", "" + s_strU2 + s_IN);
+ test("91-52.0", "" + s_strU2 + s_fM);
+ test("9175000000", "" + s_strU2 + sf_i);
+ test("9144", "" + s_strU2 + f_b);
+ test("91-1705032704", "" + s_strU2 + sf_lM);
+ test("91null", "" + s_strU2 + f_oAN);
+ test("9183.0", "" + s_strU2 + f_d);
+ test("91I", "" + s_strU2 + f_c);
+ test("9194.0", "" + s_strU2 + f_f);
+ test("9112.0", "" + s_strU2 + sf_d);
+ test("91-99.0", "" + s_strU2 + f_dM);
+ test("9117.0", "" + s_strU2 + sf_f);
+ test("91-84.0", "" + s_strU2 + sf_dM);
+ test("9158000000", "" + s_strU2 + f_i);
+ test("91-55000000", "" + s_strU2 + f_iM);
+ test("911460392448", "" + s_strU2 + f_l);
+ test("91C(70)", "" + s_strU2 + f_o);
+ test("91\u04511", "" + s_strU2 + sf_strU);
+ test("918000", "" + s_strU2 + f_s);
+ test("9118", "" + s_strU2 + s_str);
+ test("91-1000000", "" + s_strU2 + s_iM);
+ test("911000000", "" + s_strU2 + sf_I);
+ test("91null", "" + s_strU2 + f_oNtS);
+ test("91false", "" + s_strU2 + f_bl);
+ test("91null", "" + s_strU2 + sf_iAN);
+ test("91-2000000", "" + s_strU2 + sf_iM);
+ test("91-820130816", "" + s_strU2 + f_lM);
+ test("91null", "" + s_strU2 + sf_oAN);
+ test("9125000000", "" + s_strU2 + s_I);
+ test("21-96.0", "" + f_strU1 + s_dM);
+ test("21null", "" + f_strU1 + s_oNtS);
+ test("21\u045176", "" + f_strU1 + f_strU);
+ test("2192", "" + f_strU1 + sf_strU2);
+ test("2151", "" + f_strU1 + sf_strU1);
+ test("21null", "" + f_strU1 + s_iAN);
+ test("21-54", "" + f_strU1 + f_bM);
+ test("21-87.0", "" + f_strU1 + f_fM);
+ test("21null", "" + f_strU1 + s_oAN);
+ test("2119", "" + f_strU1 + f_str);
+ test("21-41", "" + f_strU1 + sf_bM);
+ test("21null", "" + f_strU1 + sf_IN);
+ test("21T", "" + f_strU1 + s_c);
+ test("21-42.0", "" + f_strU1 + sf_fM);
+ test("2125", "" + f_strU1 + s_b);
+ test("21null", "" + f_strU1 + f_oN);
+ test("21-1410065408", "" + f_strU1 + s_lM);
+ test("218.0", "" + f_strU1 + s_d);
+ test("2155.0", "" + f_strU1 + s_f);
+ test("2197000000", "" + f_strU1 + s_i);
+ test("21-9900", "" + f_strU1 + f_sM);
+ test("21935228928", "" + f_strU1 + s_l);
+ test("21-8400", "" + f_strU1 + sf_sM);
+ test("21C(82)", "" + f_strU1 + s_o);
+ test("21null", "" + f_strU1 + sf_oNtS);
+ test("21true", "" + f_strU1 + s_bl);
+ test("213900", "" + f_strU1 + s_s);
+ test("21null", "" + f_strU1 + sf_oN);
+ test("2194000000", "" + f_strU1 + f_I);
+ test("21null", "" + f_strU1 + f_IN);
+ test("21true", "" + f_strU1 + sf_bl);
+ test("215500", "" + f_strU1 + sf_s);
+ test("21-2900", "" + f_strU1 + s_sM);
+ test("21-194313216", "" + f_strU1 + sf_l);
+ test("2112", "" + f_strU1 + s_strU1);
+ test("21C(87)", "" + f_strU1 + sf_o);
+ test("2191", "" + f_strU1 + s_strU2);
+ test("2121", "" + f_strU1 + f_strU1);
+ test("2118", "" + f_strU1 + f_strU2);
+ test("21null", "" + f_strU1 + f_iAN);
+ test("21null", "" + f_strU1 + s_oN);
+ test("21\u045180", "" + f_strU1 + s_strU);
+ test("21C", "" + f_strU1 + sf_c);
+ test("2175", "" + f_strU1 + sf_str);
+ test("21-43", "" + f_strU1 + s_bM);
+ test("2180", "" + f_strU1 + sf_b);
+ test("21null", "" + f_strU1 + s_IN);
+ test("21-52.0", "" + f_strU1 + s_fM);
+ test("2175000000", "" + f_strU1 + sf_i);
+ test("2144", "" + f_strU1 + f_b);
+ test("21-1705032704", "" + f_strU1 + sf_lM);
+ test("21null", "" + f_strU1 + f_oAN);
+ test("2183.0", "" + f_strU1 + f_d);
+ test("21I", "" + f_strU1 + f_c);
+ test("2194.0", "" + f_strU1 + f_f);
+ test("2112.0", "" + f_strU1 + sf_d);
+ test("21-99.0", "" + f_strU1 + f_dM);
+ test("2117.0", "" + f_strU1 + sf_f);
+ test("21-84.0", "" + f_strU1 + sf_dM);
+ test("2158000000", "" + f_strU1 + f_i);
+ test("21-55000000", "" + f_strU1 + f_iM);
+ test("211460392448", "" + f_strU1 + f_l);
+ test("21C(70)", "" + f_strU1 + f_o);
+ test("21\u04511", "" + f_strU1 + sf_strU);
+ test("218000", "" + f_strU1 + f_s);
+ test("2118", "" + f_strU1 + s_str);
+ test("21-1000000", "" + f_strU1 + s_iM);
+ test("211000000", "" + f_strU1 + sf_I);
+ test("21null", "" + f_strU1 + f_oNtS);
+ test("21false", "" + f_strU1 + f_bl);
+ test("21null", "" + f_strU1 + sf_iAN);
+ test("21-2000000", "" + f_strU1 + sf_iM);
+ test("21-820130816", "" + f_strU1 + f_lM);
+ test("21null", "" + f_strU1 + sf_oAN);
+ test("2125000000", "" + f_strU1 + s_I);
+ test("18-96.0", "" + f_strU2 + s_dM);
+ test("18null", "" + f_strU2 + s_oNtS);
+ test("18\u045176", "" + f_strU2 + f_strU);
+ test("1892", "" + f_strU2 + sf_strU2);
+ test("1851", "" + f_strU2 + sf_strU1);
+ test("18null", "" + f_strU2 + s_iAN);
+ test("18-54", "" + f_strU2 + f_bM);
+ test("18-87.0", "" + f_strU2 + f_fM);
+ test("18null", "" + f_strU2 + s_oAN);
+ test("1819", "" + f_strU2 + f_str);
+ test("18-41", "" + f_strU2 + sf_bM);
+ test("18null", "" + f_strU2 + sf_IN);
+ test("18T", "" + f_strU2 + s_c);
+ test("18-42.0", "" + f_strU2 + sf_fM);
+ test("1825", "" + f_strU2 + s_b);
+ test("18null", "" + f_strU2 + f_oN);
+ test("18-1410065408", "" + f_strU2 + s_lM);
+ test("188.0", "" + f_strU2 + s_d);
+ test("1855.0", "" + f_strU2 + s_f);
+ test("1897000000", "" + f_strU2 + s_i);
+ test("18-9900", "" + f_strU2 + f_sM);
+ test("18935228928", "" + f_strU2 + s_l);
+ test("18-8400", "" + f_strU2 + sf_sM);
+ test("18C(82)", "" + f_strU2 + s_o);
+ test("18null", "" + f_strU2 + sf_oNtS);
+ test("18true", "" + f_strU2 + s_bl);
+ test("183900", "" + f_strU2 + s_s);
+ test("18null", "" + f_strU2 + sf_oN);
+ test("1894000000", "" + f_strU2 + f_I);
+ test("18null", "" + f_strU2 + f_IN);
+ test("18true", "" + f_strU2 + sf_bl);
+ test("185500", "" + f_strU2 + sf_s);
+ test("18-2900", "" + f_strU2 + s_sM);
+ test("18-194313216", "" + f_strU2 + sf_l);
+ test("1812", "" + f_strU2 + s_strU1);
+ test("18C(87)", "" + f_strU2 + sf_o);
+ test("1891", "" + f_strU2 + s_strU2);
+ test("1821", "" + f_strU2 + f_strU1);
+ test("1818", "" + f_strU2 + f_strU2);
+ test("18null", "" + f_strU2 + f_iAN);
+ test("18null", "" + f_strU2 + s_oN);
+ test("18\u045180", "" + f_strU2 + s_strU);
+ test("18C", "" + f_strU2 + sf_c);
+ test("1875", "" + f_strU2 + sf_str);
+ test("18-43", "" + f_strU2 + s_bM);
+ test("1880", "" + f_strU2 + sf_b);
+ test("18null", "" + f_strU2 + s_IN);
+ test("18-52.0", "" + f_strU2 + s_fM);
+ test("1875000000", "" + f_strU2 + sf_i);
+ test("1844", "" + f_strU2 + f_b);
+ test("18-1705032704", "" + f_strU2 + sf_lM);
+ test("18null", "" + f_strU2 + f_oAN);
+ test("1883.0", "" + f_strU2 + f_d);
+ test("18I", "" + f_strU2 + f_c);
+ test("1894.0", "" + f_strU2 + f_f);
+ test("1812.0", "" + f_strU2 + sf_d);
+ test("18-99.0", "" + f_strU2 + f_dM);
+ test("1817.0", "" + f_strU2 + sf_f);
+ test("18-84.0", "" + f_strU2 + sf_dM);
+ test("1858000000", "" + f_strU2 + f_i);
+ test("18-55000000", "" + f_strU2 + f_iM);
+ test("181460392448", "" + f_strU2 + f_l);
+ test("18C(70)", "" + f_strU2 + f_o);
+ test("18\u04511", "" + f_strU2 + sf_strU);
+ test("188000", "" + f_strU2 + f_s);
+ test("1818", "" + f_strU2 + s_str);
+ test("18-1000000", "" + f_strU2 + s_iM);
+ test("181000000", "" + f_strU2 + sf_I);
+ test("18null", "" + f_strU2 + f_oNtS);
+ test("18false", "" + f_strU2 + f_bl);
+ test("18null", "" + f_strU2 + sf_iAN);
+ test("18-2000000", "" + f_strU2 + sf_iM);
+ test("18-820130816", "" + f_strU2 + f_lM);
+ test("18null", "" + f_strU2 + sf_oAN);
+ test("1825000000", "" + f_strU2 + s_I);
+ }
+
+ public void run3() {
+ test("null-96.0", "" + f_iAN + s_dM);
+ test("nullnull", "" + f_iAN + s_oNtS);
+ test("null\u045176", "" + f_iAN + f_strU);
+ test("null92", "" + f_iAN + sf_strU2);
+ test("null51", "" + f_iAN + sf_strU1);
+ test("nullnull", "" + f_iAN + s_iAN);
+ test("null-54", "" + f_iAN + f_bM);
+ test("null-87.0", "" + f_iAN + f_fM);
+ test("nullnull", "" + f_iAN + s_oAN);
+ test("null19", "" + f_iAN + f_str);
+ test("null-41", "" + f_iAN + sf_bM);
+ test("nullnull", "" + f_iAN + sf_IN);
+ test("nullT", "" + f_iAN + s_c);
+ test("null-42.0", "" + f_iAN + sf_fM);
+ test("null25", "" + f_iAN + s_b);
+ test("nullnull", "" + f_iAN + f_oN);
+ test("null-1410065408", "" + f_iAN + s_lM);
+ test("null8.0", "" + f_iAN + s_d);
+ test("null55.0", "" + f_iAN + s_f);
+ test("null97000000", "" + f_iAN + s_i);
+ test("null-9900", "" + f_iAN + f_sM);
+ test("null935228928", "" + f_iAN + s_l);
+ test("null-8400", "" + f_iAN + sf_sM);
+ test("nullC(82)", "" + f_iAN + s_o);
+ test("nullnull", "" + f_iAN + sf_oNtS);
+ test("nulltrue", "" + f_iAN + s_bl);
+ test("null3900", "" + f_iAN + s_s);
+ test("nullnull", "" + f_iAN + sf_oN);
+ test("null94000000", "" + f_iAN + f_I);
+ test("nullnull", "" + f_iAN + f_IN);
+ test("nulltrue", "" + f_iAN + sf_bl);
+ test("null5500", "" + f_iAN + sf_s);
+ test("null-2900", "" + f_iAN + s_sM);
+ test("null-194313216", "" + f_iAN + sf_l);
+ test("null12", "" + f_iAN + s_strU1);
+ test("nullC(87)", "" + f_iAN + sf_o);
+ test("null91", "" + f_iAN + s_strU2);
+ test("null21", "" + f_iAN + f_strU1);
+ test("null18", "" + f_iAN + f_strU2);
+ test("nullnull", "" + f_iAN + f_iAN);
+ test("nullnull", "" + f_iAN + s_oN);
+ test("null\u045180", "" + f_iAN + s_strU);
+ test("nullC", "" + f_iAN + sf_c);
+ test("null75", "" + f_iAN + sf_str);
+ test("null-43", "" + f_iAN + s_bM);
+ test("null80", "" + f_iAN + sf_b);
+ test("nullnull", "" + f_iAN + s_IN);
+ test("null-52.0", "" + f_iAN + s_fM);
+ test("null75000000", "" + f_iAN + sf_i);
+ test("null44", "" + f_iAN + f_b);
+ test("null-1705032704", "" + f_iAN + sf_lM);
+ test("nullnull", "" + f_iAN + f_oAN);
+ test("null83.0", "" + f_iAN + f_d);
+ test("nullI", "" + f_iAN + f_c);
+ test("null94.0", "" + f_iAN + f_f);
+ test("null12.0", "" + f_iAN + sf_d);
+ test("null-99.0", "" + f_iAN + f_dM);
+ test("null17.0", "" + f_iAN + sf_f);
+ test("null-84.0", "" + f_iAN + sf_dM);
+ test("null58000000", "" + f_iAN + f_i);
+ test("null-55000000", "" + f_iAN + f_iM);
+ test("null1460392448", "" + f_iAN + f_l);
+ test("nullC(70)", "" + f_iAN + f_o);
+ test("null\u04511", "" + f_iAN + sf_strU);
+ test("null8000", "" + f_iAN + f_s);
+ test("null18", "" + f_iAN + s_str);
+ test("null-1000000", "" + f_iAN + s_iM);
+ test("null1000000", "" + f_iAN + sf_I);
+ test("nullnull", "" + f_iAN + f_oNtS);
+ test("nullfalse", "" + f_iAN + f_bl);
+ test("nullnull", "" + f_iAN + sf_iAN);
+ test("null-2000000", "" + f_iAN + sf_iM);
+ test("null-820130816", "" + f_iAN + f_lM);
+ test("nullnull", "" + f_iAN + sf_oAN);
+ test("null25000000", "" + f_iAN + s_I);
+ test("null-96.0", "" + s_oN + s_dM);
+ test("nullnull", "" + s_oN + s_oNtS);
+ test("null\u045176", "" + s_oN + f_strU);
+ test("null92", "" + s_oN + sf_strU2);
+ test("null51", "" + s_oN + sf_strU1);
+ test("nullnull", "" + s_oN + s_iAN);
+ test("null-54", "" + s_oN + f_bM);
+ test("null-87.0", "" + s_oN + f_fM);
+ test("nullnull", "" + s_oN + s_oAN);
+ test("null19", "" + s_oN + f_str);
+ test("null-41", "" + s_oN + sf_bM);
+ test("nullnull", "" + s_oN + sf_IN);
+ test("nullT", "" + s_oN + s_c);
+ test("null-42.0", "" + s_oN + sf_fM);
+ test("null25", "" + s_oN + s_b);
+ test("nullnull", "" + s_oN + f_oN);
+ test("null-1410065408", "" + s_oN + s_lM);
+ test("null8.0", "" + s_oN + s_d);
+ test("null55.0", "" + s_oN + s_f);
+ test("null97000000", "" + s_oN + s_i);
+ test("null-9900", "" + s_oN + f_sM);
+ test("null935228928", "" + s_oN + s_l);
+ test("null-8400", "" + s_oN + sf_sM);
+ test("nullC(82)", "" + s_oN + s_o);
+ test("nullnull", "" + s_oN + sf_oNtS);
+ test("nulltrue", "" + s_oN + s_bl);
+ test("null3900", "" + s_oN + s_s);
+ test("nullnull", "" + s_oN + sf_oN);
+ test("null94000000", "" + s_oN + f_I);
+ test("nullnull", "" + s_oN + f_IN);
+ test("nulltrue", "" + s_oN + sf_bl);
+ test("null5500", "" + s_oN + sf_s);
+ test("null-2900", "" + s_oN + s_sM);
+ test("null-194313216", "" + s_oN + sf_l);
+ test("null12", "" + s_oN + s_strU1);
+ test("nullC(87)", "" + s_oN + sf_o);
+ test("null91", "" + s_oN + s_strU2);
+ test("null21", "" + s_oN + f_strU1);
+ test("null18", "" + s_oN + f_strU2);
+ test("nullnull", "" + s_oN + f_iAN);
+ test("nullnull", "" + s_oN + s_oN);
+ test("null\u045180", "" + s_oN + s_strU);
+ test("nullC", "" + s_oN + sf_c);
+ test("null75", "" + s_oN + sf_str);
+ test("null-43", "" + s_oN + s_bM);
+ test("null80", "" + s_oN + sf_b);
+ test("nullnull", "" + s_oN + s_IN);
+ test("null-52.0", "" + s_oN + s_fM);
+ test("null75000000", "" + s_oN + sf_i);
+ test("null44", "" + s_oN + f_b);
+ test("null-1705032704", "" + s_oN + sf_lM);
+ test("nullnull", "" + s_oN + f_oAN);
+ test("null83.0", "" + s_oN + f_d);
+ test("nullI", "" + s_oN + f_c);
+ test("null94.0", "" + s_oN + f_f);
+ test("null12.0", "" + s_oN + sf_d);
+ test("null-99.0", "" + s_oN + f_dM);
+ test("null17.0", "" + s_oN + sf_f);
+ test("null-84.0", "" + s_oN + sf_dM);
+ test("null58000000", "" + s_oN + f_i);
+ test("null-55000000", "" + s_oN + f_iM);
+ test("null1460392448", "" + s_oN + f_l);
+ test("nullC(70)", "" + s_oN + f_o);
+ test("null\u04511", "" + s_oN + sf_strU);
+ test("null8000", "" + s_oN + f_s);
+ test("null18", "" + s_oN + s_str);
+ test("null-1000000", "" + s_oN + s_iM);
+ test("null1000000", "" + s_oN + sf_I);
+ test("nullnull", "" + s_oN + f_oNtS);
+ test("nullfalse", "" + s_oN + f_bl);
+ test("nullnull", "" + s_oN + sf_iAN);
+ test("null-2000000", "" + s_oN + sf_iM);
+ test("null-820130816", "" + s_oN + f_lM);
+ test("nullnull", "" + s_oN + sf_oAN);
+ test("null25000000", "" + s_oN + s_I);
+ test("\u045180-96.0", "" + s_strU + s_dM);
+ test("\u045180null", "" + s_strU + s_oNtS);
+ test("\u045180\u045176", "" + s_strU + f_strU);
+ test("\u04518092", "" + s_strU + sf_strU2);
+ test("\u04518051", "" + s_strU + sf_strU1);
+ test("\u045180null", "" + s_strU + s_iAN);
+ test("\u045180-54", "" + s_strU + f_bM);
+ test("\u045180-87.0", "" + s_strU + f_fM);
+ test("\u045180null", "" + s_strU + s_oAN);
+ test("\u04518019", "" + s_strU + f_str);
+ test("\u045180-41", "" + s_strU + sf_bM);
+ test("\u045180null", "" + s_strU + sf_IN);
+ test("\u045180T", "" + s_strU + s_c);
+ test("\u045180-42.0", "" + s_strU + sf_fM);
+ test("\u04518025", "" + s_strU + s_b);
+ test("\u045180null", "" + s_strU + f_oN);
+ test("\u045180-1410065408", "" + s_strU + s_lM);
+ test("\u0451808.0", "" + s_strU + s_d);
+ test("\u04518055.0", "" + s_strU + s_f);
+ test("\u04518097000000", "" + s_strU + s_i);
+ test("\u045180-9900", "" + s_strU + f_sM);
+ test("\u045180935228928", "" + s_strU + s_l);
+ test("\u045180-8400", "" + s_strU + sf_sM);
+ test("\u045180C(82)", "" + s_strU + s_o);
+ test("\u045180null", "" + s_strU + sf_oNtS);
+ test("\u045180true", "" + s_strU + s_bl);
+ test("\u0451803900", "" + s_strU + s_s);
+ test("\u045180null", "" + s_strU + sf_oN);
+ test("\u04518094000000", "" + s_strU + f_I);
+ test("\u045180null", "" + s_strU + f_IN);
+ test("\u045180true", "" + s_strU + sf_bl);
+ test("\u0451805500", "" + s_strU + sf_s);
+ test("\u045180-2900", "" + s_strU + s_sM);
+ test("\u045180-194313216", "" + s_strU + sf_l);
+ test("\u04518012", "" + s_strU + s_strU1);
+ test("\u045180C(87)", "" + s_strU + sf_o);
+ test("\u04518091", "" + s_strU + s_strU2);
+ test("\u04518021", "" + s_strU + f_strU1);
+ test("\u04518018", "" + s_strU + f_strU2);
+ test("\u045180null", "" + s_strU + f_iAN);
+ test("\u045180null", "" + s_strU + s_oN);
+ test("\u045180\u045180", "" + s_strU + s_strU);
+ test("\u045180C", "" + s_strU + sf_c);
+ test("\u04518075", "" + s_strU + sf_str);
+ test("\u045180-43", "" + s_strU + s_bM);
+ test("\u04518080", "" + s_strU + sf_b);
+ test("\u045180null", "" + s_strU + s_IN);
+ test("\u045180-52.0", "" + s_strU + s_fM);
+ test("\u04518075000000", "" + s_strU + sf_i);
+ test("\u04518044", "" + s_strU + f_b);
+ test("\u045180-1705032704", "" + s_strU + sf_lM);
+ test("\u045180null", "" + s_strU + f_oAN);
+ test("\u04518083.0", "" + s_strU + f_d);
+ test("\u045180I", "" + s_strU + f_c);
+ test("\u04518094.0", "" + s_strU + f_f);
+ test("\u04518012.0", "" + s_strU + sf_d);
+ test("\u045180-99.0", "" + s_strU + f_dM);
+ test("\u04518017.0", "" + s_strU + sf_f);
+ test("\u045180-84.0", "" + s_strU + sf_dM);
+ test("\u04518058000000", "" + s_strU + f_i);
+ test("\u045180-55000000", "" + s_strU + f_iM);
+ test("\u0451801460392448", "" + s_strU + f_l);
+ test("\u045180C(70)", "" + s_strU + f_o);
+ test("\u045180\u04511", "" + s_strU + sf_strU);
+ test("\u0451808000", "" + s_strU + f_s);
+ test("\u04518018", "" + s_strU + s_str);
+ test("\u045180-1000000", "" + s_strU + s_iM);
+ test("\u0451801000000", "" + s_strU + sf_I);
+ test("\u045180null", "" + s_strU + f_oNtS);
+ test("\u045180false", "" + s_strU + f_bl);
+ test("\u045180null", "" + s_strU + sf_iAN);
+ test("\u045180-2000000", "" + s_strU + sf_iM);
+ test("\u045180-820130816", "" + s_strU + f_lM);
+ test("\u045180null", "" + s_strU + sf_oAN);
+ test("\u04518025000000", "" + s_strU + s_I);
+ test("C-96.0", "" + sf_c + s_dM);
+ test("Cnull", "" + sf_c + s_oNtS);
+ test("C\u045176", "" + sf_c + f_strU);
+ test("C92", "" + sf_c + sf_strU2);
+ test("C51", "" + sf_c + sf_strU1);
+ test("Cnull", "" + sf_c + s_iAN);
+ test("C-54", "" + sf_c + f_bM);
+ test("C-87.0", "" + sf_c + f_fM);
+ test("Cnull", "" + sf_c + s_oAN);
+ test("C19", "" + sf_c + f_str);
+ test("C-41", "" + sf_c + sf_bM);
+ test("Cnull", "" + sf_c + sf_IN);
+ test("CT", "" + sf_c + s_c);
+ test("C-42.0", "" + sf_c + sf_fM);
+ test("C25", "" + sf_c + s_b);
+ test("Cnull", "" + sf_c + f_oN);
+ test("C-1410065408", "" + sf_c + s_lM);
+ test("C8.0", "" + sf_c + s_d);
+ test("C55.0", "" + sf_c + s_f);
+ test("C97000000", "" + sf_c + s_i);
+ test("C-9900", "" + sf_c + f_sM);
+ test("C935228928", "" + sf_c + s_l);
+ test("C-8400", "" + sf_c + sf_sM);
+ test("CC(82)", "" + sf_c + s_o);
+ test("Cnull", "" + sf_c + sf_oNtS);
+ test("Ctrue", "" + sf_c + s_bl);
+ test("C3900", "" + sf_c + s_s);
+ test("Cnull", "" + sf_c + sf_oN);
+ test("C94000000", "" + sf_c + f_I);
+ test("Cnull", "" + sf_c + f_IN);
+ test("Ctrue", "" + sf_c + sf_bl);
+ test("C5500", "" + sf_c + sf_s);
+ test("C-2900", "" + sf_c + s_sM);
+ test("C-194313216", "" + sf_c + sf_l);
+ test("C12", "" + sf_c + s_strU1);
+ test("CC(87)", "" + sf_c + sf_o);
+ test("C91", "" + sf_c + s_strU2);
+ test("C21", "" + sf_c + f_strU1);
+ test("C18", "" + sf_c + f_strU2);
+ test("Cnull", "" + sf_c + f_iAN);
+ test("Cnull", "" + sf_c + s_oN);
+ test("C\u045180", "" + sf_c + s_strU);
+ test("CC", "" + sf_c + sf_c);
+ test("C75", "" + sf_c + sf_str);
+ test("C-43", "" + sf_c + s_bM);
+ test("C80", "" + sf_c + sf_b);
+ test("Cnull", "" + sf_c + s_IN);
+ test("C-52.0", "" + sf_c + s_fM);
+ test("C75000000", "" + sf_c + sf_i);
+ test("C44", "" + sf_c + f_b);
+ test("C-1705032704", "" + sf_c + sf_lM);
+ test("Cnull", "" + sf_c + f_oAN);
+ test("C83.0", "" + sf_c + f_d);
+ test("CI", "" + sf_c + f_c);
+ test("C94.0", "" + sf_c + f_f);
+ test("C12.0", "" + sf_c + sf_d);
+ test("C-99.0", "" + sf_c + f_dM);
+ test("C17.0", "" + sf_c + sf_f);
+ test("C-84.0", "" + sf_c + sf_dM);
+ test("C58000000", "" + sf_c + f_i);
+ test("C-55000000", "" + sf_c + f_iM);
+ test("C1460392448", "" + sf_c + f_l);
+ test("CC(70)", "" + sf_c + f_o);
+ test("C\u04511", "" + sf_c + sf_strU);
+ test("C8000", "" + sf_c + f_s);
+ test("C18", "" + sf_c + s_str);
+ test("C-1000000", "" + sf_c + s_iM);
+ test("C1000000", "" + sf_c + sf_I);
+ test("Cnull", "" + sf_c + f_oNtS);
+ test("Cfalse", "" + sf_c + f_bl);
+ test("Cnull", "" + sf_c + sf_iAN);
+ test("C-2000000", "" + sf_c + sf_iM);
+ test("C-820130816", "" + sf_c + f_lM);
+ test("Cnull", "" + sf_c + sf_oAN);
+ test("C25000000", "" + sf_c + s_I);
+ test("75-96.0", "" + sf_str + s_dM);
+ test("75null", "" + sf_str + s_oNtS);
+ test("75\u045176", "" + sf_str + f_strU);
+ test("7592", "" + sf_str + sf_strU2);
+ test("7551", "" + sf_str + sf_strU1);
+ test("75null", "" + sf_str + s_iAN);
+ test("75-54", "" + sf_str + f_bM);
+ test("75-87.0", "" + sf_str + f_fM);
+ test("75null", "" + sf_str + s_oAN);
+ test("7519", "" + sf_str + f_str);
+ test("75-41", "" + sf_str + sf_bM);
+ test("75null", "" + sf_str + sf_IN);
+ test("75T", "" + sf_str + s_c);
+ test("75-42.0", "" + sf_str + sf_fM);
+ test("7525", "" + sf_str + s_b);
+ test("75null", "" + sf_str + f_oN);
+ test("75-1410065408", "" + sf_str + s_lM);
+ test("758.0", "" + sf_str + s_d);
+ test("7555.0", "" + sf_str + s_f);
+ test("7597000000", "" + sf_str + s_i);
+ test("75-9900", "" + sf_str + f_sM);
+ test("75935228928", "" + sf_str + s_l);
+ test("75-8400", "" + sf_str + sf_sM);
+ test("75C(82)", "" + sf_str + s_o);
+ test("75null", "" + sf_str + sf_oNtS);
+ test("75true", "" + sf_str + s_bl);
+ test("753900", "" + sf_str + s_s);
+ test("75null", "" + sf_str + sf_oN);
+ test("7594000000", "" + sf_str + f_I);
+ test("75null", "" + sf_str + f_IN);
+ test("75true", "" + sf_str + sf_bl);
+ test("755500", "" + sf_str + sf_s);
+ test("75-2900", "" + sf_str + s_sM);
+ test("75-194313216", "" + sf_str + sf_l);
+ test("7512", "" + sf_str + s_strU1);
+ test("75C(87)", "" + sf_str + sf_o);
+ test("7591", "" + sf_str + s_strU2);
+ test("7521", "" + sf_str + f_strU1);
+ test("7518", "" + sf_str + f_strU2);
+ test("75null", "" + sf_str + f_iAN);
+ test("75null", "" + sf_str + s_oN);
+ test("75\u045180", "" + sf_str + s_strU);
+ test("75C", "" + sf_str + sf_c);
+ test("7575", "" + sf_str + sf_str);
+ test("75-43", "" + sf_str + s_bM);
+ test("7580", "" + sf_str + sf_b);
+ test("75null", "" + sf_str + s_IN);
+ test("75-52.0", "" + sf_str + s_fM);
+ test("7575000000", "" + sf_str + sf_i);
+ test("7544", "" + sf_str + f_b);
+ test("75-1705032704", "" + sf_str + sf_lM);
+ test("75null", "" + sf_str + f_oAN);
+ test("7583.0", "" + sf_str + f_d);
+ test("75I", "" + sf_str + f_c);
+ test("7594.0", "" + sf_str + f_f);
+ test("7512.0", "" + sf_str + sf_d);
+ test("75-99.0", "" + sf_str + f_dM);
+ test("7517.0", "" + sf_str + sf_f);
+ test("75-84.0", "" + sf_str + sf_dM);
+ test("7558000000", "" + sf_str + f_i);
+ test("75-55000000", "" + sf_str + f_iM);
+ test("751460392448", "" + sf_str + f_l);
+ test("75C(70)", "" + sf_str + f_o);
+ test("75\u04511", "" + sf_str + sf_strU);
+ test("758000", "" + sf_str + f_s);
+ test("7518", "" + sf_str + s_str);
+ test("75-1000000", "" + sf_str + s_iM);
+ test("751000000", "" + sf_str + sf_I);
+ test("75null", "" + sf_str + f_oNtS);
+ test("75false", "" + sf_str + f_bl);
+ test("75null", "" + sf_str + sf_iAN);
+ test("75-2000000", "" + sf_str + sf_iM);
+ test("75-820130816", "" + sf_str + f_lM);
+ test("75null", "" + sf_str + sf_oAN);
+ test("7525000000", "" + sf_str + s_I);
+ test("-43-96.0", "" + s_bM + s_dM);
+ test("-43null", "" + s_bM + s_oNtS);
+ test("-43\u045176", "" + s_bM + f_strU);
+ test("-4392", "" + s_bM + sf_strU2);
+ test("-4351", "" + s_bM + sf_strU1);
+ test("-43null", "" + s_bM + s_iAN);
+ test("-43-54", "" + s_bM + f_bM);
+ test("-43-87.0", "" + s_bM + f_fM);
+ test("-43null", "" + s_bM + s_oAN);
+ test("-4319", "" + s_bM + f_str);
+ test("-43-41", "" + s_bM + sf_bM);
+ test("-43null", "" + s_bM + sf_IN);
+ test("-43T", "" + s_bM + s_c);
+ test("-43-42.0", "" + s_bM + sf_fM);
+ test("-4325", "" + s_bM + s_b);
+ test("-43null", "" + s_bM + f_oN);
+ test("-43-1410065408", "" + s_bM + s_lM);
+ test("-438.0", "" + s_bM + s_d);
+ test("-4355.0", "" + s_bM + s_f);
+ test("-4397000000", "" + s_bM + s_i);
+ test("-43-9900", "" + s_bM + f_sM);
+ test("-43935228928", "" + s_bM + s_l);
+ test("-43-8400", "" + s_bM + sf_sM);
+ test("-43C(82)", "" + s_bM + s_o);
+ test("-43null", "" + s_bM + sf_oNtS);
+ test("-43true", "" + s_bM + s_bl);
+ test("-433900", "" + s_bM + s_s);
+ test("-43null", "" + s_bM + sf_oN);
+ test("-4394000000", "" + s_bM + f_I);
+ test("-43null", "" + s_bM + f_IN);
+ test("-43true", "" + s_bM + sf_bl);
+ test("-435500", "" + s_bM + sf_s);
+ test("-43-2900", "" + s_bM + s_sM);
+ test("-43-194313216", "" + s_bM + sf_l);
+ test("-4312", "" + s_bM + s_strU1);
+ test("-43C(87)", "" + s_bM + sf_o);
+ test("-4391", "" + s_bM + s_strU2);
+ test("-4321", "" + s_bM + f_strU1);
+ test("-4318", "" + s_bM + f_strU2);
+ test("-43null", "" + s_bM + f_iAN);
+ test("-43null", "" + s_bM + s_oN);
+ test("-43\u045180", "" + s_bM + s_strU);
+ test("-43C", "" + s_bM + sf_c);
+ test("-4375", "" + s_bM + sf_str);
+ test("-43-43", "" + s_bM + s_bM);
+ test("-4380", "" + s_bM + sf_b);
+ test("-43null", "" + s_bM + s_IN);
+ test("-43-52.0", "" + s_bM + s_fM);
+ test("-4375000000", "" + s_bM + sf_i);
+ test("-4344", "" + s_bM + f_b);
+ test("-43-1705032704", "" + s_bM + sf_lM);
+ test("-43null", "" + s_bM + f_oAN);
+ test("-4383.0", "" + s_bM + f_d);
+ test("-43I", "" + s_bM + f_c);
+ test("-4394.0", "" + s_bM + f_f);
+ test("-4312.0", "" + s_bM + sf_d);
+ test("-43-99.0", "" + s_bM + f_dM);
+ test("-4317.0", "" + s_bM + sf_f);
+ test("-43-84.0", "" + s_bM + sf_dM);
+ test("-4358000000", "" + s_bM + f_i);
+ test("-43-55000000", "" + s_bM + f_iM);
+ test("-431460392448", "" + s_bM + f_l);
+ test("-43C(70)", "" + s_bM + f_o);
+ test("-43\u04511", "" + s_bM + sf_strU);
+ test("-438000", "" + s_bM + f_s);
+ test("-4318", "" + s_bM + s_str);
+ test("-43-1000000", "" + s_bM + s_iM);
+ test("-431000000", "" + s_bM + sf_I);
+ test("-43null", "" + s_bM + f_oNtS);
+ test("-43false", "" + s_bM + f_bl);
+ test("-43null", "" + s_bM + sf_iAN);
+ test("-43-2000000", "" + s_bM + sf_iM);
+ test("-43-820130816", "" + s_bM + f_lM);
+ test("-43null", "" + s_bM + sf_oAN);
+ test("-4325000000", "" + s_bM + s_I);
+ test("80-96.0", "" + sf_b + s_dM);
+ test("80null", "" + sf_b + s_oNtS);
+ test("80\u045176", "" + sf_b + f_strU);
+ test("8092", "" + sf_b + sf_strU2);
+ test("8051", "" + sf_b + sf_strU1);
+ test("80null", "" + sf_b + s_iAN);
+ test("80-54", "" + sf_b + f_bM);
+ test("80-87.0", "" + sf_b + f_fM);
+ test("80null", "" + sf_b + s_oAN);
+ test("8019", "" + sf_b + f_str);
+ test("80-41", "" + sf_b + sf_bM);
+ test("80null", "" + sf_b + sf_IN);
+ test("80T", "" + sf_b + s_c);
+ test("80-42.0", "" + sf_b + sf_fM);
+ test("8025", "" + sf_b + s_b);
+ test("80null", "" + sf_b + f_oN);
+ test("80-1410065408", "" + sf_b + s_lM);
+ test("808.0", "" + sf_b + s_d);
+ test("8055.0", "" + sf_b + s_f);
+ test("8097000000", "" + sf_b + s_i);
+ test("80-9900", "" + sf_b + f_sM);
+ test("80935228928", "" + sf_b + s_l);
+ test("80-8400", "" + sf_b + sf_sM);
+ test("80C(82)", "" + sf_b + s_o);
+ test("80null", "" + sf_b + sf_oNtS);
+ test("80true", "" + sf_b + s_bl);
+ test("803900", "" + sf_b + s_s);
+ test("80null", "" + sf_b + sf_oN);
+ test("8094000000", "" + sf_b + f_I);
+ test("80null", "" + sf_b + f_IN);
+ test("80true", "" + sf_b + sf_bl);
+ test("805500", "" + sf_b + sf_s);
+ test("80-2900", "" + sf_b + s_sM);
+ test("80-194313216", "" + sf_b + sf_l);
+ test("8012", "" + sf_b + s_strU1);
+ test("80C(87)", "" + sf_b + sf_o);
+ test("8091", "" + sf_b + s_strU2);
+ test("8021", "" + sf_b + f_strU1);
+ test("8018", "" + sf_b + f_strU2);
+ test("80null", "" + sf_b + f_iAN);
+ test("80null", "" + sf_b + s_oN);
+ test("80\u045180", "" + sf_b + s_strU);
+ test("80C", "" + sf_b + sf_c);
+ test("8075", "" + sf_b + sf_str);
+ test("80-43", "" + sf_b + s_bM);
+ test("8080", "" + sf_b + sf_b);
+ test("80null", "" + sf_b + s_IN);
+ test("80-52.0", "" + sf_b + s_fM);
+ test("8075000000", "" + sf_b + sf_i);
+ test("8044", "" + sf_b + f_b);
+ test("80-1705032704", "" + sf_b + sf_lM);
+ test("80null", "" + sf_b + f_oAN);
+ test("8083.0", "" + sf_b + f_d);
+ test("80I", "" + sf_b + f_c);
+ test("8094.0", "" + sf_b + f_f);
+ test("8012.0", "" + sf_b + sf_d);
+ test("80-99.0", "" + sf_b + f_dM);
+ test("8017.0", "" + sf_b + sf_f);
+ test("80-84.0", "" + sf_b + sf_dM);
+ test("8058000000", "" + sf_b + f_i);
+ test("80-55000000", "" + sf_b + f_iM);
+ test("801460392448", "" + sf_b + f_l);
+ test("80C(70)", "" + sf_b + f_o);
+ test("80\u04511", "" + sf_b + sf_strU);
+ test("808000", "" + sf_b + f_s);
+ test("8018", "" + sf_b + s_str);
+ test("80-1000000", "" + sf_b + s_iM);
+ test("801000000", "" + sf_b + sf_I);
+ test("80null", "" + sf_b + f_oNtS);
+ test("80false", "" + sf_b + f_bl);
+ test("80null", "" + sf_b + sf_iAN);
+ test("80-2000000", "" + sf_b + sf_iM);
+ test("80-820130816", "" + sf_b + f_lM);
+ test("80null", "" + sf_b + sf_oAN);
+ test("8025000000", "" + sf_b + s_I);
+ test("null-96.0", "" + s_IN + s_dM);
+ test("nullnull", "" + s_IN + s_oNtS);
+ test("null\u045176", "" + s_IN + f_strU);
+ test("null92", "" + s_IN + sf_strU2);
+ test("null51", "" + s_IN + sf_strU1);
+ test("nullnull", "" + s_IN + s_iAN);
+ test("null-54", "" + s_IN + f_bM);
+ test("null-87.0", "" + s_IN + f_fM);
+ test("nullnull", "" + s_IN + s_oAN);
+ test("null19", "" + s_IN + f_str);
+ test("null-41", "" + s_IN + sf_bM);
+ test("nullnull", "" + s_IN + sf_IN);
+ test("nullT", "" + s_IN + s_c);
+ test("null-42.0", "" + s_IN + sf_fM);
+ test("null25", "" + s_IN + s_b);
+ test("nullnull", "" + s_IN + f_oN);
+ test("null-1410065408", "" + s_IN + s_lM);
+ test("null8.0", "" + s_IN + s_d);
+ test("null55.0", "" + s_IN + s_f);
+ test("null97000000", "" + s_IN + s_i);
+ test("null-9900", "" + s_IN + f_sM);
+ test("null935228928", "" + s_IN + s_l);
+ test("null-8400", "" + s_IN + sf_sM);
+ test("nullC(82)", "" + s_IN + s_o);
+ test("nullnull", "" + s_IN + sf_oNtS);
+ test("nulltrue", "" + s_IN + s_bl);
+ test("null3900", "" + s_IN + s_s);
+ test("nullnull", "" + s_IN + sf_oN);
+ test("null94000000", "" + s_IN + f_I);
+ test("nullnull", "" + s_IN + f_IN);
+ test("nulltrue", "" + s_IN + sf_bl);
+ test("null5500", "" + s_IN + sf_s);
+ test("null-2900", "" + s_IN + s_sM);
+ test("null-194313216", "" + s_IN + sf_l);
+ test("null12", "" + s_IN + s_strU1);
+ test("nullC(87)", "" + s_IN + sf_o);
+ test("null91", "" + s_IN + s_strU2);
+ test("null21", "" + s_IN + f_strU1);
+ test("null18", "" + s_IN + f_strU2);
+ test("nullnull", "" + s_IN + f_iAN);
+ test("nullnull", "" + s_IN + s_oN);
+ test("null\u045180", "" + s_IN + s_strU);
+ test("nullC", "" + s_IN + sf_c);
+ test("null75", "" + s_IN + sf_str);
+ test("null-43", "" + s_IN + s_bM);
+ test("null80", "" + s_IN + sf_b);
+ test("nullnull", "" + s_IN + s_IN);
+ test("null-52.0", "" + s_IN + s_fM);
+ test("null75000000", "" + s_IN + sf_i);
+ test("null44", "" + s_IN + f_b);
+ test("null-1705032704", "" + s_IN + sf_lM);
+ test("nullnull", "" + s_IN + f_oAN);
+ test("null83.0", "" + s_IN + f_d);
+ test("nullI", "" + s_IN + f_c);
+ test("null94.0", "" + s_IN + f_f);
+ test("null12.0", "" + s_IN + sf_d);
+ test("null-99.0", "" + s_IN + f_dM);
+ test("null17.0", "" + s_IN + sf_f);
+ test("null-84.0", "" + s_IN + sf_dM);
+ test("null58000000", "" + s_IN + f_i);
+ test("null-55000000", "" + s_IN + f_iM);
+ test("null1460392448", "" + s_IN + f_l);
+ test("nullC(70)", "" + s_IN + f_o);
+ test("null\u04511", "" + s_IN + sf_strU);
+ test("null8000", "" + s_IN + f_s);
+ test("null18", "" + s_IN + s_str);
+ test("null-1000000", "" + s_IN + s_iM);
+ test("null1000000", "" + s_IN + sf_I);
+ test("nullnull", "" + s_IN + f_oNtS);
+ test("nullfalse", "" + s_IN + f_bl);
+ test("nullnull", "" + s_IN + sf_iAN);
+ test("null-2000000", "" + s_IN + sf_iM);
+ test("null-820130816", "" + s_IN + f_lM);
+ test("nullnull", "" + s_IN + sf_oAN);
+ test("null25000000", "" + s_IN + s_I);
+ test("-52.0-96.0", "" + s_fM + s_dM);
+ test("-52.0null", "" + s_fM + s_oNtS);
+ test("-52.0\u045176", "" + s_fM + f_strU);
+ test("-52.092", "" + s_fM + sf_strU2);
+ test("-52.051", "" + s_fM + sf_strU1);
+ test("-52.0null", "" + s_fM + s_iAN);
+ test("-52.0-54", "" + s_fM + f_bM);
+ test("-52.0-87.0", "" + s_fM + f_fM);
+ test("-52.0null", "" + s_fM + s_oAN);
+ test("-52.019", "" + s_fM + f_str);
+ test("-52.0-41", "" + s_fM + sf_bM);
+ test("-52.0null", "" + s_fM + sf_IN);
+ test("-52.0T", "" + s_fM + s_c);
+ test("-52.0-42.0", "" + s_fM + sf_fM);
+ test("-52.025", "" + s_fM + s_b);
+ test("-52.0null", "" + s_fM + f_oN);
+ test("-52.0-1410065408", "" + s_fM + s_lM);
+ test("-52.08.0", "" + s_fM + s_d);
+ test("-52.055.0", "" + s_fM + s_f);
+ test("-52.097000000", "" + s_fM + s_i);
+ test("-52.0-9900", "" + s_fM + f_sM);
+ test("-52.0935228928", "" + s_fM + s_l);
+ test("-52.0-8400", "" + s_fM + sf_sM);
+ test("-52.0C(82)", "" + s_fM + s_o);
+ test("-52.0null", "" + s_fM + sf_oNtS);
+ test("-52.0true", "" + s_fM + s_bl);
+ test("-52.03900", "" + s_fM + s_s);
+ test("-52.0null", "" + s_fM + sf_oN);
+ test("-52.094000000", "" + s_fM + f_I);
+ test("-52.0null", "" + s_fM + f_IN);
+ test("-52.0true", "" + s_fM + sf_bl);
+ test("-52.05500", "" + s_fM + sf_s);
+ test("-52.0-2900", "" + s_fM + s_sM);
+ test("-52.0-194313216", "" + s_fM + sf_l);
+ test("-52.012", "" + s_fM + s_strU1);
+ test("-52.0C(87)", "" + s_fM + sf_o);
+ test("-52.091", "" + s_fM + s_strU2);
+ test("-52.021", "" + s_fM + f_strU1);
+ test("-52.018", "" + s_fM + f_strU2);
+ test("-52.0null", "" + s_fM + f_iAN);
+ test("-52.0null", "" + s_fM + s_oN);
+ test("-52.0\u045180", "" + s_fM + s_strU);
+ test("-52.0C", "" + s_fM + sf_c);
+ test("-52.075", "" + s_fM + sf_str);
+ test("-52.0-43", "" + s_fM + s_bM);
+ test("-52.080", "" + s_fM + sf_b);
+ test("-52.0null", "" + s_fM + s_IN);
+ test("-52.0-52.0", "" + s_fM + s_fM);
+ test("-52.075000000", "" + s_fM + sf_i);
+ test("-52.044", "" + s_fM + f_b);
+ test("-52.0-1705032704", "" + s_fM + sf_lM);
+ test("-52.0null", "" + s_fM + f_oAN);
+ test("-52.083.0", "" + s_fM + f_d);
+ test("-52.0I", "" + s_fM + f_c);
+ test("-52.094.0", "" + s_fM + f_f);
+ test("-52.012.0", "" + s_fM + sf_d);
+ test("-52.0-99.0", "" + s_fM + f_dM);
+ test("-52.017.0", "" + s_fM + sf_f);
+ test("-52.0-84.0", "" + s_fM + sf_dM);
+ test("-52.058000000", "" + s_fM + f_i);
+ test("-52.0-55000000", "" + s_fM + f_iM);
+ test("-52.01460392448", "" + s_fM + f_l);
+ test("-52.0C(70)", "" + s_fM + f_o);
+ test("-52.0\u04511", "" + s_fM + sf_strU);
+ test("-52.08000", "" + s_fM + f_s);
+ test("-52.018", "" + s_fM + s_str);
+ test("-52.0-1000000", "" + s_fM + s_iM);
+ test("-52.01000000", "" + s_fM + sf_I);
+ test("-52.0null", "" + s_fM + f_oNtS);
+ test("-52.0false", "" + s_fM + f_bl);
+ test("-52.0null", "" + s_fM + sf_iAN);
+ test("-52.0-2000000", "" + s_fM + sf_iM);
+ test("-52.0-820130816", "" + s_fM + f_lM);
+ test("-52.0null", "" + s_fM + sf_oAN);
+ test("-52.025000000", "" + s_fM + s_I);
+ test("75000000-96.0", "" + sf_i + s_dM);
+ test("75000000null", "" + sf_i + s_oNtS);
+ test("75000000\u045176", "" + sf_i + f_strU);
+ test("7500000092", "" + sf_i + sf_strU2);
+ test("7500000051", "" + sf_i + sf_strU1);
+ test("75000000null", "" + sf_i + s_iAN);
+ test("75000000-54", "" + sf_i + f_bM);
+ test("75000000-87.0", "" + sf_i + f_fM);
+ test("75000000null", "" + sf_i + s_oAN);
+ test("7500000019", "" + sf_i + f_str);
+ test("75000000-41", "" + sf_i + sf_bM);
+ test("75000000null", "" + sf_i + sf_IN);
+ test("75000000T", "" + sf_i + s_c);
+ test("75000000-42.0", "" + sf_i + sf_fM);
+ test("7500000025", "" + sf_i + s_b);
+ test("75000000null", "" + sf_i + f_oN);
+ test("75000000-1410065408", "" + sf_i + s_lM);
+ test("750000008.0", "" + sf_i + s_d);
+ test("7500000055.0", "" + sf_i + s_f);
+ test("7500000097000000", "" + sf_i + s_i);
+ test("75000000-9900", "" + sf_i + f_sM);
+ test("75000000935228928", "" + sf_i + s_l);
+ test("75000000-8400", "" + sf_i + sf_sM);
+ test("75000000C(82)", "" + sf_i + s_o);
+ test("75000000null", "" + sf_i + sf_oNtS);
+ test("75000000true", "" + sf_i + s_bl);
+ test("750000003900", "" + sf_i + s_s);
+ test("75000000null", "" + sf_i + sf_oN);
+ test("7500000094000000", "" + sf_i + f_I);
+ test("75000000null", "" + sf_i + f_IN);
+ test("75000000true", "" + sf_i + sf_bl);
+ test("750000005500", "" + sf_i + sf_s);
+ test("75000000-2900", "" + sf_i + s_sM);
+ test("75000000-194313216", "" + sf_i + sf_l);
+ test("7500000012", "" + sf_i + s_strU1);
+ test("75000000C(87)", "" + sf_i + sf_o);
+ test("7500000091", "" + sf_i + s_strU2);
+ test("7500000021", "" + sf_i + f_strU1);
+ test("7500000018", "" + sf_i + f_strU2);
+ test("75000000null", "" + sf_i + f_iAN);
+ test("75000000null", "" + sf_i + s_oN);
+ test("75000000\u045180", "" + sf_i + s_strU);
+ test("75000000C", "" + sf_i + sf_c);
+ test("7500000075", "" + sf_i + sf_str);
+ test("75000000-43", "" + sf_i + s_bM);
+ test("7500000080", "" + sf_i + sf_b);
+ test("75000000null", "" + sf_i + s_IN);
+ test("75000000-52.0", "" + sf_i + s_fM);
+ test("7500000075000000", "" + sf_i + sf_i);
+ test("7500000044", "" + sf_i + f_b);
+ test("75000000-1705032704", "" + sf_i + sf_lM);
+ test("75000000null", "" + sf_i + f_oAN);
+ test("7500000083.0", "" + sf_i + f_d);
+ test("75000000I", "" + sf_i + f_c);
+ test("7500000094.0", "" + sf_i + f_f);
+ test("7500000012.0", "" + sf_i + sf_d);
+ test("75000000-99.0", "" + sf_i + f_dM);
+ test("7500000017.0", "" + sf_i + sf_f);
+ test("75000000-84.0", "" + sf_i + sf_dM);
+ test("7500000058000000", "" + sf_i + f_i);
+ test("75000000-55000000", "" + sf_i + f_iM);
+ test("750000001460392448", "" + sf_i + f_l);
+ test("75000000C(70)", "" + sf_i + f_o);
+ test("75000000\u04511", "" + sf_i + sf_strU);
+ test("750000008000", "" + sf_i + f_s);
+ test("7500000018", "" + sf_i + s_str);
+ test("75000000-1000000", "" + sf_i + s_iM);
+ test("750000001000000", "" + sf_i + sf_I);
+ test("75000000null", "" + sf_i + f_oNtS);
+ test("75000000false", "" + sf_i + f_bl);
+ test("75000000null", "" + sf_i + sf_iAN);
+ test("75000000-2000000", "" + sf_i + sf_iM);
+ test("75000000-820130816", "" + sf_i + f_lM);
+ test("75000000null", "" + sf_i + sf_oAN);
+ test("7500000025000000", "" + sf_i + s_I);
+ test("44-96.0", "" + f_b + s_dM);
+ test("44null", "" + f_b + s_oNtS);
+ test("44\u045176", "" + f_b + f_strU);
+ test("4492", "" + f_b + sf_strU2);
+ test("4451", "" + f_b + sf_strU1);
+ test("44null", "" + f_b + s_iAN);
+ test("44-54", "" + f_b + f_bM);
+ test("44-87.0", "" + f_b + f_fM);
+ test("44null", "" + f_b + s_oAN);
+ test("4419", "" + f_b + f_str);
+ test("44-41", "" + f_b + sf_bM);
+ test("44null", "" + f_b + sf_IN);
+ test("44T", "" + f_b + s_c);
+ test("44-42.0", "" + f_b + sf_fM);
+ test("4425", "" + f_b + s_b);
+ test("44null", "" + f_b + f_oN);
+ test("44-1410065408", "" + f_b + s_lM);
+ test("448.0", "" + f_b + s_d);
+ test("4455.0", "" + f_b + s_f);
+ test("4497000000", "" + f_b + s_i);
+ test("44-9900", "" + f_b + f_sM);
+ test("44935228928", "" + f_b + s_l);
+ test("44-8400", "" + f_b + sf_sM);
+ test("44C(82)", "" + f_b + s_o);
+ test("44null", "" + f_b + sf_oNtS);
+ test("44true", "" + f_b + s_bl);
+ test("443900", "" + f_b + s_s);
+ test("44null", "" + f_b + sf_oN);
+ test("4494000000", "" + f_b + f_I);
+ test("44null", "" + f_b + f_IN);
+ test("44true", "" + f_b + sf_bl);
+ test("445500", "" + f_b + sf_s);
+ test("44-2900", "" + f_b + s_sM);
+ test("44-194313216", "" + f_b + sf_l);
+ test("4412", "" + f_b + s_strU1);
+ test("44C(87)", "" + f_b + sf_o);
+ test("4491", "" + f_b + s_strU2);
+ test("4421", "" + f_b + f_strU1);
+ test("4418", "" + f_b + f_strU2);
+ test("44null", "" + f_b + f_iAN);
+ test("44null", "" + f_b + s_oN);
+ test("44\u045180", "" + f_b + s_strU);
+ test("44C", "" + f_b + sf_c);
+ test("4475", "" + f_b + sf_str);
+ test("44-43", "" + f_b + s_bM);
+ test("4480", "" + f_b + sf_b);
+ test("44null", "" + f_b + s_IN);
+ test("44-52.0", "" + f_b + s_fM);
+ test("4475000000", "" + f_b + sf_i);
+ test("4444", "" + f_b + f_b);
+ test("44-1705032704", "" + f_b + sf_lM);
+ test("44null", "" + f_b + f_oAN);
+ test("4483.0", "" + f_b + f_d);
+ test("44I", "" + f_b + f_c);
+ test("4494.0", "" + f_b + f_f);
+ test("4412.0", "" + f_b + sf_d);
+ test("44-99.0", "" + f_b + f_dM);
+ test("4417.0", "" + f_b + sf_f);
+ test("44-84.0", "" + f_b + sf_dM);
+ test("4458000000", "" + f_b + f_i);
+ test("44-55000000", "" + f_b + f_iM);
+ test("441460392448", "" + f_b + f_l);
+ test("44C(70)", "" + f_b + f_o);
+ test("44\u04511", "" + f_b + sf_strU);
+ test("448000", "" + f_b + f_s);
+ test("4418", "" + f_b + s_str);
+ test("44-1000000", "" + f_b + s_iM);
+ test("441000000", "" + f_b + sf_I);
+ test("44null", "" + f_b + f_oNtS);
+ test("44false", "" + f_b + f_bl);
+ test("44null", "" + f_b + sf_iAN);
+ test("44-2000000", "" + f_b + sf_iM);
+ test("44-820130816", "" + f_b + f_lM);
+ test("44null", "" + f_b + sf_oAN);
+ test("4425000000", "" + f_b + s_I);
+ test("-1705032704-96.0", "" + sf_lM + s_dM);
+ test("-1705032704null", "" + sf_lM + s_oNtS);
+ test("-1705032704\u045176", "" + sf_lM + f_strU);
+ test("-170503270492", "" + sf_lM + sf_strU2);
+ test("-170503270451", "" + sf_lM + sf_strU1);
+ test("-1705032704null", "" + sf_lM + s_iAN);
+ test("-1705032704-54", "" + sf_lM + f_bM);
+ test("-1705032704-87.0", "" + sf_lM + f_fM);
+ test("-1705032704null", "" + sf_lM + s_oAN);
+ test("-170503270419", "" + sf_lM + f_str);
+ test("-1705032704-41", "" + sf_lM + sf_bM);
+ test("-1705032704null", "" + sf_lM + sf_IN);
+ test("-1705032704T", "" + sf_lM + s_c);
+ test("-1705032704-42.0", "" + sf_lM + sf_fM);
+ test("-170503270425", "" + sf_lM + s_b);
+ test("-1705032704null", "" + sf_lM + f_oN);
+ test("-1705032704-1410065408", "" + sf_lM + s_lM);
+ test("-17050327048.0", "" + sf_lM + s_d);
+ test("-170503270455.0", "" + sf_lM + s_f);
+ test("-170503270497000000", "" + sf_lM + s_i);
+ test("-1705032704-9900", "" + sf_lM + f_sM);
+ test("-1705032704935228928", "" + sf_lM + s_l);
+ test("-1705032704-8400", "" + sf_lM + sf_sM);
+ test("-1705032704C(82)", "" + sf_lM + s_o);
+ test("-1705032704null", "" + sf_lM + sf_oNtS);
+ test("-1705032704true", "" + sf_lM + s_bl);
+ test("-17050327043900", "" + sf_lM + s_s);
+ test("-1705032704null", "" + sf_lM + sf_oN);
+ test("-170503270494000000", "" + sf_lM + f_I);
+ test("-1705032704null", "" + sf_lM + f_IN);
+ test("-1705032704true", "" + sf_lM + sf_bl);
+ test("-17050327045500", "" + sf_lM + sf_s);
+ test("-1705032704-2900", "" + sf_lM + s_sM);
+ test("-1705032704-194313216", "" + sf_lM + sf_l);
+ test("-170503270412", "" + sf_lM + s_strU1);
+ test("-1705032704C(87)", "" + sf_lM + sf_o);
+ test("-170503270491", "" + sf_lM + s_strU2);
+ test("-170503270421", "" + sf_lM + f_strU1);
+ test("-170503270418", "" + sf_lM + f_strU2);
+ test("-1705032704null", "" + sf_lM + f_iAN);
+ test("-1705032704null", "" + sf_lM + s_oN);
+ test("-1705032704\u045180", "" + sf_lM + s_strU);
+ test("-1705032704C", "" + sf_lM + sf_c);
+ test("-170503270475", "" + sf_lM + sf_str);
+ test("-1705032704-43", "" + sf_lM + s_bM);
+ test("-170503270480", "" + sf_lM + sf_b);
+ test("-1705032704null", "" + sf_lM + s_IN);
+ test("-1705032704-52.0", "" + sf_lM + s_fM);
+ test("-170503270475000000", "" + sf_lM + sf_i);
+ test("-170503270444", "" + sf_lM + f_b);
+ test("-1705032704-1705032704", "" + sf_lM + sf_lM);
+ test("-1705032704null", "" + sf_lM + f_oAN);
+ test("-170503270483.0", "" + sf_lM + f_d);
+ test("-1705032704I", "" + sf_lM + f_c);
+ test("-170503270494.0", "" + sf_lM + f_f);
+ test("-170503270412.0", "" + sf_lM + sf_d);
+ test("-1705032704-99.0", "" + sf_lM + f_dM);
+ test("-170503270417.0", "" + sf_lM + sf_f);
+ test("-1705032704-84.0", "" + sf_lM + sf_dM);
+ test("-170503270458000000", "" + sf_lM + f_i);
+ test("-1705032704-55000000", "" + sf_lM + f_iM);
+ test("-17050327041460392448", "" + sf_lM + f_l);
+ test("-1705032704C(70)", "" + sf_lM + f_o);
+ test("-1705032704\u04511", "" + sf_lM + sf_strU);
+ test("-17050327048000", "" + sf_lM + f_s);
+ test("-170503270418", "" + sf_lM + s_str);
+ test("-1705032704-1000000", "" + sf_lM + s_iM);
+ test("-17050327041000000", "" + sf_lM + sf_I);
+ test("-1705032704null", "" + sf_lM + f_oNtS);
+ test("-1705032704false", "" + sf_lM + f_bl);
+ test("-1705032704null", "" + sf_lM + sf_iAN);
+ test("-1705032704-2000000", "" + sf_lM + sf_iM);
+ test("-1705032704-820130816", "" + sf_lM + f_lM);
+ test("-1705032704null", "" + sf_lM + sf_oAN);
+ test("-170503270425000000", "" + sf_lM + s_I);
+ test("null-96.0", "" + f_oAN + s_dM);
+ test("nullnull", "" + f_oAN + s_oNtS);
+ test("null\u045176", "" + f_oAN + f_strU);
+ test("null92", "" + f_oAN + sf_strU2);
+ test("null51", "" + f_oAN + sf_strU1);
+ test("nullnull", "" + f_oAN + s_iAN);
+ test("null-54", "" + f_oAN + f_bM);
+ test("null-87.0", "" + f_oAN + f_fM);
+ test("nullnull", "" + f_oAN + s_oAN);
+ test("null19", "" + f_oAN + f_str);
+ test("null-41", "" + f_oAN + sf_bM);
+ test("nullnull", "" + f_oAN + sf_IN);
+ test("nullT", "" + f_oAN + s_c);
+ test("null-42.0", "" + f_oAN + sf_fM);
+ test("null25", "" + f_oAN + s_b);
+ test("nullnull", "" + f_oAN + f_oN);
+ test("null-1410065408", "" + f_oAN + s_lM);
+ test("null8.0", "" + f_oAN + s_d);
+ test("null55.0", "" + f_oAN + s_f);
+ test("null97000000", "" + f_oAN + s_i);
+ test("null-9900", "" + f_oAN + f_sM);
+ test("null935228928", "" + f_oAN + s_l);
+ test("null-8400", "" + f_oAN + sf_sM);
+ test("nullC(82)", "" + f_oAN + s_o);
+ test("nullnull", "" + f_oAN + sf_oNtS);
+ test("nulltrue", "" + f_oAN + s_bl);
+ test("null3900", "" + f_oAN + s_s);
+ test("nullnull", "" + f_oAN + sf_oN);
+ test("null94000000", "" + f_oAN + f_I);
+ test("nullnull", "" + f_oAN + f_IN);
+ test("nulltrue", "" + f_oAN + sf_bl);
+ test("null5500", "" + f_oAN + sf_s);
+ test("null-2900", "" + f_oAN + s_sM);
+ test("null-194313216", "" + f_oAN + sf_l);
+ test("null12", "" + f_oAN + s_strU1);
+ test("nullC(87)", "" + f_oAN + sf_o);
+ test("null91", "" + f_oAN + s_strU2);
+ test("null21", "" + f_oAN + f_strU1);
+ test("null18", "" + f_oAN + f_strU2);
+ test("nullnull", "" + f_oAN + f_iAN);
+ test("nullnull", "" + f_oAN + s_oN);
+ test("null\u045180", "" + f_oAN + s_strU);
+ test("nullC", "" + f_oAN + sf_c);
+ test("null75", "" + f_oAN + sf_str);
+ test("null-43", "" + f_oAN + s_bM);
+ test("null80", "" + f_oAN + sf_b);
+ test("nullnull", "" + f_oAN + s_IN);
+ test("null-52.0", "" + f_oAN + s_fM);
+ test("null75000000", "" + f_oAN + sf_i);
+ test("null44", "" + f_oAN + f_b);
+ test("null-1705032704", "" + f_oAN + sf_lM);
+ test("nullnull", "" + f_oAN + f_oAN);
+ test("null83.0", "" + f_oAN + f_d);
+ test("nullI", "" + f_oAN + f_c);
+ test("null94.0", "" + f_oAN + f_f);
+ test("null12.0", "" + f_oAN + sf_d);
+ test("null-99.0", "" + f_oAN + f_dM);
+ test("null17.0", "" + f_oAN + sf_f);
+ test("null-84.0", "" + f_oAN + sf_dM);
+ test("null58000000", "" + f_oAN + f_i);
+ test("null-55000000", "" + f_oAN + f_iM);
+ test("null1460392448", "" + f_oAN + f_l);
+ test("nullC(70)", "" + f_oAN + f_o);
+ test("null\u04511", "" + f_oAN + sf_strU);
+ test("null8000", "" + f_oAN + f_s);
+ test("null18", "" + f_oAN + s_str);
+ test("null-1000000", "" + f_oAN + s_iM);
+ test("null1000000", "" + f_oAN + sf_I);
+ test("nullnull", "" + f_oAN + f_oNtS);
+ test("nullfalse", "" + f_oAN + f_bl);
+ test("nullnull", "" + f_oAN + sf_iAN);
+ test("null-2000000", "" + f_oAN + sf_iM);
+ test("null-820130816", "" + f_oAN + f_lM);
+ test("nullnull", "" + f_oAN + sf_oAN);
+ test("null25000000", "" + f_oAN + s_I);
+ test("83.0-96.0", "" + f_d + s_dM);
+ test("83.0null", "" + f_d + s_oNtS);
+ test("83.0\u045176", "" + f_d + f_strU);
+ test("83.092", "" + f_d + sf_strU2);
+ test("83.051", "" + f_d + sf_strU1);
+ test("83.0null", "" + f_d + s_iAN);
+ test("83.0-54", "" + f_d + f_bM);
+ test("83.0-87.0", "" + f_d + f_fM);
+ test("83.0null", "" + f_d + s_oAN);
+ test("83.019", "" + f_d + f_str);
+ test("83.0-41", "" + f_d + sf_bM);
+ test("83.0null", "" + f_d + sf_IN);
+ test("83.0T", "" + f_d + s_c);
+ test("83.0-42.0", "" + f_d + sf_fM);
+ test("83.025", "" + f_d + s_b);
+ test("83.0null", "" + f_d + f_oN);
+ test("83.0-1410065408", "" + f_d + s_lM);
+ test("83.08.0", "" + f_d + s_d);
+ test("83.055.0", "" + f_d + s_f);
+ test("83.097000000", "" + f_d + s_i);
+ test("83.0-9900", "" + f_d + f_sM);
+ test("83.0935228928", "" + f_d + s_l);
+ test("83.0-8400", "" + f_d + sf_sM);
+ test("83.0C(82)", "" + f_d + s_o);
+ test("83.0null", "" + f_d + sf_oNtS);
+ }
+
+ public void run4() {
+ test("83.0true", "" + f_d + s_bl);
+ test("83.03900", "" + f_d + s_s);
+ test("83.0null", "" + f_d + sf_oN);
+ test("83.094000000", "" + f_d + f_I);
+ test("83.0null", "" + f_d + f_IN);
+ test("83.0true", "" + f_d + sf_bl);
+ test("83.05500", "" + f_d + sf_s);
+ test("83.0-2900", "" + f_d + s_sM);
+ test("83.0-194313216", "" + f_d + sf_l);
+ test("83.012", "" + f_d + s_strU1);
+ test("83.0C(87)", "" + f_d + sf_o);
+ test("83.091", "" + f_d + s_strU2);
+ test("83.021", "" + f_d + f_strU1);
+ test("83.018", "" + f_d + f_strU2);
+ test("83.0null", "" + f_d + f_iAN);
+ test("83.0null", "" + f_d + s_oN);
+ test("83.0\u045180", "" + f_d + s_strU);
+ test("83.0C", "" + f_d + sf_c);
+ test("83.075", "" + f_d + sf_str);
+ test("83.0-43", "" + f_d + s_bM);
+ test("83.080", "" + f_d + sf_b);
+ test("83.0null", "" + f_d + s_IN);
+ test("83.0-52.0", "" + f_d + s_fM);
+ test("83.075000000", "" + f_d + sf_i);
+ test("83.044", "" + f_d + f_b);
+ test("83.0-1705032704", "" + f_d + sf_lM);
+ test("83.0null", "" + f_d + f_oAN);
+ test("83.083.0", "" + f_d + f_d);
+ test("83.0I", "" + f_d + f_c);
+ test("83.094.0", "" + f_d + f_f);
+ test("83.012.0", "" + f_d + sf_d);
+ test("83.0-99.0", "" + f_d + f_dM);
+ test("83.017.0", "" + f_d + sf_f);
+ test("83.0-84.0", "" + f_d + sf_dM);
+ test("83.058000000", "" + f_d + f_i);
+ test("83.0-55000000", "" + f_d + f_iM);
+ test("83.01460392448", "" + f_d + f_l);
+ test("83.0C(70)", "" + f_d + f_o);
+ test("83.0\u04511", "" + f_d + sf_strU);
+ test("83.08000", "" + f_d + f_s);
+ test("83.018", "" + f_d + s_str);
+ test("83.0-1000000", "" + f_d + s_iM);
+ test("83.01000000", "" + f_d + sf_I);
+ test("83.0null", "" + f_d + f_oNtS);
+ test("83.0false", "" + f_d + f_bl);
+ test("83.0null", "" + f_d + sf_iAN);
+ test("83.0-2000000", "" + f_d + sf_iM);
+ test("83.0-820130816", "" + f_d + f_lM);
+ test("83.0null", "" + f_d + sf_oAN);
+ test("83.025000000", "" + f_d + s_I);
+ test("I-96.0", "" + f_c + s_dM);
+ test("Inull", "" + f_c + s_oNtS);
+ test("I\u045176", "" + f_c + f_strU);
+ test("I92", "" + f_c + sf_strU2);
+ test("I51", "" + f_c + sf_strU1);
+ test("Inull", "" + f_c + s_iAN);
+ test("I-54", "" + f_c + f_bM);
+ test("I-87.0", "" + f_c + f_fM);
+ test("Inull", "" + f_c + s_oAN);
+ test("I19", "" + f_c + f_str);
+ test("I-41", "" + f_c + sf_bM);
+ test("Inull", "" + f_c + sf_IN);
+ test("IT", "" + f_c + s_c);
+ test("I-42.0", "" + f_c + sf_fM);
+ test("I25", "" + f_c + s_b);
+ test("Inull", "" + f_c + f_oN);
+ test("I-1410065408", "" + f_c + s_lM);
+ test("I8.0", "" + f_c + s_d);
+ test("I55.0", "" + f_c + s_f);
+ test("I97000000", "" + f_c + s_i);
+ test("I-9900", "" + f_c + f_sM);
+ test("I935228928", "" + f_c + s_l);
+ test("I-8400", "" + f_c + sf_sM);
+ test("IC(82)", "" + f_c + s_o);
+ test("Inull", "" + f_c + sf_oNtS);
+ test("Itrue", "" + f_c + s_bl);
+ test("I3900", "" + f_c + s_s);
+ test("Inull", "" + f_c + sf_oN);
+ test("I94000000", "" + f_c + f_I);
+ test("Inull", "" + f_c + f_IN);
+ test("Itrue", "" + f_c + sf_bl);
+ test("I5500", "" + f_c + sf_s);
+ test("I-2900", "" + f_c + s_sM);
+ test("I-194313216", "" + f_c + sf_l);
+ test("I12", "" + f_c + s_strU1);
+ test("IC(87)", "" + f_c + sf_o);
+ test("I91", "" + f_c + s_strU2);
+ test("I21", "" + f_c + f_strU1);
+ test("I18", "" + f_c + f_strU2);
+ test("Inull", "" + f_c + f_iAN);
+ test("Inull", "" + f_c + s_oN);
+ test("I\u045180", "" + f_c + s_strU);
+ test("IC", "" + f_c + sf_c);
+ test("I75", "" + f_c + sf_str);
+ test("I-43", "" + f_c + s_bM);
+ test("I80", "" + f_c + sf_b);
+ test("Inull", "" + f_c + s_IN);
+ test("I-52.0", "" + f_c + s_fM);
+ test("I75000000", "" + f_c + sf_i);
+ test("I44", "" + f_c + f_b);
+ test("I-1705032704", "" + f_c + sf_lM);
+ test("Inull", "" + f_c + f_oAN);
+ test("I83.0", "" + f_c + f_d);
+ test("II", "" + f_c + f_c);
+ test("I94.0", "" + f_c + f_f);
+ test("I12.0", "" + f_c + sf_d);
+ test("I-99.0", "" + f_c + f_dM);
+ test("I17.0", "" + f_c + sf_f);
+ test("I-84.0", "" + f_c + sf_dM);
+ test("I58000000", "" + f_c + f_i);
+ test("I-55000000", "" + f_c + f_iM);
+ test("I1460392448", "" + f_c + f_l);
+ test("IC(70)", "" + f_c + f_o);
+ test("I\u04511", "" + f_c + sf_strU);
+ test("I8000", "" + f_c + f_s);
+ test("I18", "" + f_c + s_str);
+ test("I-1000000", "" + f_c + s_iM);
+ test("I1000000", "" + f_c + sf_I);
+ test("Inull", "" + f_c + f_oNtS);
+ test("Ifalse", "" + f_c + f_bl);
+ test("Inull", "" + f_c + sf_iAN);
+ test("I-2000000", "" + f_c + sf_iM);
+ test("I-820130816", "" + f_c + f_lM);
+ test("Inull", "" + f_c + sf_oAN);
+ test("I25000000", "" + f_c + s_I);
+ test("94.0-96.0", "" + f_f + s_dM);
+ test("94.0null", "" + f_f + s_oNtS);
+ test("94.0\u045176", "" + f_f + f_strU);
+ test("94.092", "" + f_f + sf_strU2);
+ test("94.051", "" + f_f + sf_strU1);
+ test("94.0null", "" + f_f + s_iAN);
+ test("94.0-54", "" + f_f + f_bM);
+ test("94.0-87.0", "" + f_f + f_fM);
+ test("94.0null", "" + f_f + s_oAN);
+ test("94.019", "" + f_f + f_str);
+ test("94.0-41", "" + f_f + sf_bM);
+ test("94.0null", "" + f_f + sf_IN);
+ test("94.0T", "" + f_f + s_c);
+ test("94.0-42.0", "" + f_f + sf_fM);
+ test("94.025", "" + f_f + s_b);
+ test("94.0null", "" + f_f + f_oN);
+ test("94.0-1410065408", "" + f_f + s_lM);
+ test("94.08.0", "" + f_f + s_d);
+ test("94.055.0", "" + f_f + s_f);
+ test("94.097000000", "" + f_f + s_i);
+ test("94.0-9900", "" + f_f + f_sM);
+ test("94.0935228928", "" + f_f + s_l);
+ test("94.0-8400", "" + f_f + sf_sM);
+ test("94.0C(82)", "" + f_f + s_o);
+ test("94.0null", "" + f_f + sf_oNtS);
+ test("94.0true", "" + f_f + s_bl);
+ test("94.03900", "" + f_f + s_s);
+ test("94.0null", "" + f_f + sf_oN);
+ test("94.094000000", "" + f_f + f_I);
+ test("94.0null", "" + f_f + f_IN);
+ test("94.0true", "" + f_f + sf_bl);
+ test("94.05500", "" + f_f + sf_s);
+ test("94.0-2900", "" + f_f + s_sM);
+ test("94.0-194313216", "" + f_f + sf_l);
+ test("94.012", "" + f_f + s_strU1);
+ test("94.0C(87)", "" + f_f + sf_o);
+ test("94.091", "" + f_f + s_strU2);
+ test("94.021", "" + f_f + f_strU1);
+ test("94.018", "" + f_f + f_strU2);
+ test("94.0null", "" + f_f + f_iAN);
+ test("94.0null", "" + f_f + s_oN);
+ test("94.0\u045180", "" + f_f + s_strU);
+ test("94.0C", "" + f_f + sf_c);
+ test("94.075", "" + f_f + sf_str);
+ test("94.0-43", "" + f_f + s_bM);
+ test("94.080", "" + f_f + sf_b);
+ test("94.0null", "" + f_f + s_IN);
+ test("94.0-52.0", "" + f_f + s_fM);
+ test("94.075000000", "" + f_f + sf_i);
+ test("94.044", "" + f_f + f_b);
+ test("94.0-1705032704", "" + f_f + sf_lM);
+ test("94.0null", "" + f_f + f_oAN);
+ test("94.083.0", "" + f_f + f_d);
+ test("94.0I", "" + f_f + f_c);
+ test("94.094.0", "" + f_f + f_f);
+ test("94.012.0", "" + f_f + sf_d);
+ test("94.0-99.0", "" + f_f + f_dM);
+ test("94.017.0", "" + f_f + sf_f);
+ test("94.0-84.0", "" + f_f + sf_dM);
+ test("94.058000000", "" + f_f + f_i);
+ test("94.0-55000000", "" + f_f + f_iM);
+ test("94.01460392448", "" + f_f + f_l);
+ test("94.0C(70)", "" + f_f + f_o);
+ test("94.0\u04511", "" + f_f + sf_strU);
+ test("94.08000", "" + f_f + f_s);
+ test("94.018", "" + f_f + s_str);
+ test("94.0-1000000", "" + f_f + s_iM);
+ test("94.01000000", "" + f_f + sf_I);
+ test("94.0null", "" + f_f + f_oNtS);
+ test("94.0false", "" + f_f + f_bl);
+ test("94.0null", "" + f_f + sf_iAN);
+ test("94.0-2000000", "" + f_f + sf_iM);
+ test("94.0-820130816", "" + f_f + f_lM);
+ test("94.0null", "" + f_f + sf_oAN);
+ test("94.025000000", "" + f_f + s_I);
+ test("12.0-96.0", "" + sf_d + s_dM);
+ test("12.0null", "" + sf_d + s_oNtS);
+ test("12.0\u045176", "" + sf_d + f_strU);
+ test("12.092", "" + sf_d + sf_strU2);
+ test("12.051", "" + sf_d + sf_strU1);
+ test("12.0null", "" + sf_d + s_iAN);
+ test("12.0-54", "" + sf_d + f_bM);
+ test("12.0-87.0", "" + sf_d + f_fM);
+ test("12.0null", "" + sf_d + s_oAN);
+ test("12.019", "" + sf_d + f_str);
+ test("12.0-41", "" + sf_d + sf_bM);
+ test("12.0null", "" + sf_d + sf_IN);
+ test("12.0T", "" + sf_d + s_c);
+ test("12.0-42.0", "" + sf_d + sf_fM);
+ test("12.025", "" + sf_d + s_b);
+ test("12.0null", "" + sf_d + f_oN);
+ test("12.0-1410065408", "" + sf_d + s_lM);
+ test("12.08.0", "" + sf_d + s_d);
+ test("12.055.0", "" + sf_d + s_f);
+ test("12.097000000", "" + sf_d + s_i);
+ test("12.0-9900", "" + sf_d + f_sM);
+ test("12.0935228928", "" + sf_d + s_l);
+ test("12.0-8400", "" + sf_d + sf_sM);
+ test("12.0C(82)", "" + sf_d + s_o);
+ test("12.0null", "" + sf_d + sf_oNtS);
+ test("12.0true", "" + sf_d + s_bl);
+ test("12.03900", "" + sf_d + s_s);
+ test("12.0null", "" + sf_d + sf_oN);
+ test("12.094000000", "" + sf_d + f_I);
+ test("12.0null", "" + sf_d + f_IN);
+ test("12.0true", "" + sf_d + sf_bl);
+ test("12.05500", "" + sf_d + sf_s);
+ test("12.0-2900", "" + sf_d + s_sM);
+ test("12.0-194313216", "" + sf_d + sf_l);
+ test("12.012", "" + sf_d + s_strU1);
+ test("12.0C(87)", "" + sf_d + sf_o);
+ test("12.091", "" + sf_d + s_strU2);
+ test("12.021", "" + sf_d + f_strU1);
+ test("12.018", "" + sf_d + f_strU2);
+ test("12.0null", "" + sf_d + f_iAN);
+ test("12.0null", "" + sf_d + s_oN);
+ test("12.0\u045180", "" + sf_d + s_strU);
+ test("12.0C", "" + sf_d + sf_c);
+ test("12.075", "" + sf_d + sf_str);
+ test("12.0-43", "" + sf_d + s_bM);
+ test("12.080", "" + sf_d + sf_b);
+ test("12.0null", "" + sf_d + s_IN);
+ test("12.0-52.0", "" + sf_d + s_fM);
+ test("12.075000000", "" + sf_d + sf_i);
+ test("12.044", "" + sf_d + f_b);
+ test("12.0-1705032704", "" + sf_d + sf_lM);
+ test("12.0null", "" + sf_d + f_oAN);
+ test("12.083.0", "" + sf_d + f_d);
+ test("12.0I", "" + sf_d + f_c);
+ test("12.094.0", "" + sf_d + f_f);
+ test("12.012.0", "" + sf_d + sf_d);
+ test("12.0-99.0", "" + sf_d + f_dM);
+ test("12.017.0", "" + sf_d + sf_f);
+ test("12.0-84.0", "" + sf_d + sf_dM);
+ test("12.058000000", "" + sf_d + f_i);
+ test("12.0-55000000", "" + sf_d + f_iM);
+ test("12.01460392448", "" + sf_d + f_l);
+ test("12.0C(70)", "" + sf_d + f_o);
+ test("12.0\u04511", "" + sf_d + sf_strU);
+ test("12.08000", "" + sf_d + f_s);
+ test("12.018", "" + sf_d + s_str);
+ test("12.0-1000000", "" + sf_d + s_iM);
+ test("12.01000000", "" + sf_d + sf_I);
+ test("12.0null", "" + sf_d + f_oNtS);
+ test("12.0false", "" + sf_d + f_bl);
+ test("12.0null", "" + sf_d + sf_iAN);
+ test("12.0-2000000", "" + sf_d + sf_iM);
+ test("12.0-820130816", "" + sf_d + f_lM);
+ test("12.0null", "" + sf_d + sf_oAN);
+ test("12.025000000", "" + sf_d + s_I);
+ test("-99.0-96.0", "" + f_dM + s_dM);
+ test("-99.0null", "" + f_dM + s_oNtS);
+ test("-99.0\u045176", "" + f_dM + f_strU);
+ test("-99.092", "" + f_dM + sf_strU2);
+ test("-99.051", "" + f_dM + sf_strU1);
+ test("-99.0null", "" + f_dM + s_iAN);
+ test("-99.0-54", "" + f_dM + f_bM);
+ test("-99.0-87.0", "" + f_dM + f_fM);
+ test("-99.0null", "" + f_dM + s_oAN);
+ test("-99.019", "" + f_dM + f_str);
+ test("-99.0-41", "" + f_dM + sf_bM);
+ test("-99.0null", "" + f_dM + sf_IN);
+ test("-99.0T", "" + f_dM + s_c);
+ test("-99.0-42.0", "" + f_dM + sf_fM);
+ test("-99.025", "" + f_dM + s_b);
+ test("-99.0null", "" + f_dM + f_oN);
+ test("-99.0-1410065408", "" + f_dM + s_lM);
+ test("-99.08.0", "" + f_dM + s_d);
+ test("-99.055.0", "" + f_dM + s_f);
+ test("-99.097000000", "" + f_dM + s_i);
+ test("-99.0-9900", "" + f_dM + f_sM);
+ test("-99.0935228928", "" + f_dM + s_l);
+ test("-99.0-8400", "" + f_dM + sf_sM);
+ test("-99.0C(82)", "" + f_dM + s_o);
+ test("-99.0null", "" + f_dM + sf_oNtS);
+ test("-99.0true", "" + f_dM + s_bl);
+ test("-99.03900", "" + f_dM + s_s);
+ test("-99.0null", "" + f_dM + sf_oN);
+ test("-99.094000000", "" + f_dM + f_I);
+ test("-99.0null", "" + f_dM + f_IN);
+ test("-99.0true", "" + f_dM + sf_bl);
+ test("-99.05500", "" + f_dM + sf_s);
+ test("-99.0-2900", "" + f_dM + s_sM);
+ test("-99.0-194313216", "" + f_dM + sf_l);
+ test("-99.012", "" + f_dM + s_strU1);
+ test("-99.0C(87)", "" + f_dM + sf_o);
+ test("-99.091", "" + f_dM + s_strU2);
+ test("-99.021", "" + f_dM + f_strU1);
+ test("-99.018", "" + f_dM + f_strU2);
+ test("-99.0null", "" + f_dM + f_iAN);
+ test("-99.0null", "" + f_dM + s_oN);
+ test("-99.0\u045180", "" + f_dM + s_strU);
+ test("-99.0C", "" + f_dM + sf_c);
+ test("-99.075", "" + f_dM + sf_str);
+ test("-99.0-43", "" + f_dM + s_bM);
+ test("-99.080", "" + f_dM + sf_b);
+ test("-99.0null", "" + f_dM + s_IN);
+ test("-99.0-52.0", "" + f_dM + s_fM);
+ test("-99.075000000", "" + f_dM + sf_i);
+ test("-99.044", "" + f_dM + f_b);
+ test("-99.0-1705032704", "" + f_dM + sf_lM);
+ test("-99.0null", "" + f_dM + f_oAN);
+ test("-99.083.0", "" + f_dM + f_d);
+ test("-99.0I", "" + f_dM + f_c);
+ test("-99.094.0", "" + f_dM + f_f);
+ test("-99.012.0", "" + f_dM + sf_d);
+ test("-99.0-99.0", "" + f_dM + f_dM);
+ test("-99.017.0", "" + f_dM + sf_f);
+ test("-99.0-84.0", "" + f_dM + sf_dM);
+ test("-99.058000000", "" + f_dM + f_i);
+ test("-99.0-55000000", "" + f_dM + f_iM);
+ test("-99.01460392448", "" + f_dM + f_l);
+ test("-99.0C(70)", "" + f_dM + f_o);
+ test("-99.0\u04511", "" + f_dM + sf_strU);
+ test("-99.08000", "" + f_dM + f_s);
+ test("-99.018", "" + f_dM + s_str);
+ test("-99.0-1000000", "" + f_dM + s_iM);
+ test("-99.01000000", "" + f_dM + sf_I);
+ test("-99.0null", "" + f_dM + f_oNtS);
+ test("-99.0false", "" + f_dM + f_bl);
+ test("-99.0null", "" + f_dM + sf_iAN);
+ test("-99.0-2000000", "" + f_dM + sf_iM);
+ test("-99.0-820130816", "" + f_dM + f_lM);
+ test("-99.0null", "" + f_dM + sf_oAN);
+ test("-99.025000000", "" + f_dM + s_I);
+ test("17.0-96.0", "" + sf_f + s_dM);
+ test("17.0null", "" + sf_f + s_oNtS);
+ test("17.0\u045176", "" + sf_f + f_strU);
+ test("17.092", "" + sf_f + sf_strU2);
+ test("17.051", "" + sf_f + sf_strU1);
+ test("17.0null", "" + sf_f + s_iAN);
+ test("17.0-54", "" + sf_f + f_bM);
+ test("17.0-87.0", "" + sf_f + f_fM);
+ test("17.0null", "" + sf_f + s_oAN);
+ test("17.019", "" + sf_f + f_str);
+ test("17.0-41", "" + sf_f + sf_bM);
+ test("17.0null", "" + sf_f + sf_IN);
+ test("17.0T", "" + sf_f + s_c);
+ test("17.0-42.0", "" + sf_f + sf_fM);
+ test("17.025", "" + sf_f + s_b);
+ test("17.0null", "" + sf_f + f_oN);
+ test("17.0-1410065408", "" + sf_f + s_lM);
+ test("17.08.0", "" + sf_f + s_d);
+ test("17.055.0", "" + sf_f + s_f);
+ test("17.097000000", "" + sf_f + s_i);
+ test("17.0-9900", "" + sf_f + f_sM);
+ test("17.0935228928", "" + sf_f + s_l);
+ test("17.0-8400", "" + sf_f + sf_sM);
+ test("17.0C(82)", "" + sf_f + s_o);
+ test("17.0null", "" + sf_f + sf_oNtS);
+ test("17.0true", "" + sf_f + s_bl);
+ test("17.03900", "" + sf_f + s_s);
+ test("17.0null", "" + sf_f + sf_oN);
+ test("17.094000000", "" + sf_f + f_I);
+ test("17.0null", "" + sf_f + f_IN);
+ test("17.0true", "" + sf_f + sf_bl);
+ test("17.05500", "" + sf_f + sf_s);
+ test("17.0-2900", "" + sf_f + s_sM);
+ test("17.0-194313216", "" + sf_f + sf_l);
+ test("17.012", "" + sf_f + s_strU1);
+ test("17.0C(87)", "" + sf_f + sf_o);
+ test("17.091", "" + sf_f + s_strU2);
+ test("17.021", "" + sf_f + f_strU1);
+ test("17.018", "" + sf_f + f_strU2);
+ test("17.0null", "" + sf_f + f_iAN);
+ test("17.0null", "" + sf_f + s_oN);
+ test("17.0\u045180", "" + sf_f + s_strU);
+ test("17.0C", "" + sf_f + sf_c);
+ test("17.075", "" + sf_f + sf_str);
+ test("17.0-43", "" + sf_f + s_bM);
+ test("17.080", "" + sf_f + sf_b);
+ test("17.0null", "" + sf_f + s_IN);
+ test("17.0-52.0", "" + sf_f + s_fM);
+ test("17.075000000", "" + sf_f + sf_i);
+ test("17.044", "" + sf_f + f_b);
+ test("17.0-1705032704", "" + sf_f + sf_lM);
+ test("17.0null", "" + sf_f + f_oAN);
+ test("17.083.0", "" + sf_f + f_d);
+ test("17.0I", "" + sf_f + f_c);
+ test("17.094.0", "" + sf_f + f_f);
+ test("17.012.0", "" + sf_f + sf_d);
+ test("17.0-99.0", "" + sf_f + f_dM);
+ test("17.017.0", "" + sf_f + sf_f);
+ test("17.0-84.0", "" + sf_f + sf_dM);
+ test("17.058000000", "" + sf_f + f_i);
+ test("17.0-55000000", "" + sf_f + f_iM);
+ test("17.01460392448", "" + sf_f + f_l);
+ test("17.0C(70)", "" + sf_f + f_o);
+ test("17.0\u04511", "" + sf_f + sf_strU);
+ test("17.08000", "" + sf_f + f_s);
+ test("17.018", "" + sf_f + s_str);
+ test("17.0-1000000", "" + sf_f + s_iM);
+ test("17.01000000", "" + sf_f + sf_I);
+ test("17.0null", "" + sf_f + f_oNtS);
+ test("17.0false", "" + sf_f + f_bl);
+ test("17.0null", "" + sf_f + sf_iAN);
+ test("17.0-2000000", "" + sf_f + sf_iM);
+ test("17.0-820130816", "" + sf_f + f_lM);
+ test("17.0null", "" + sf_f + sf_oAN);
+ test("17.025000000", "" + sf_f + s_I);
+ test("-84.0-96.0", "" + sf_dM + s_dM);
+ test("-84.0null", "" + sf_dM + s_oNtS);
+ test("-84.0\u045176", "" + sf_dM + f_strU);
+ test("-84.092", "" + sf_dM + sf_strU2);
+ test("-84.051", "" + sf_dM + sf_strU1);
+ test("-84.0null", "" + sf_dM + s_iAN);
+ test("-84.0-54", "" + sf_dM + f_bM);
+ test("-84.0-87.0", "" + sf_dM + f_fM);
+ test("-84.0null", "" + sf_dM + s_oAN);
+ test("-84.019", "" + sf_dM + f_str);
+ test("-84.0-41", "" + sf_dM + sf_bM);
+ test("-84.0null", "" + sf_dM + sf_IN);
+ test("-84.0T", "" + sf_dM + s_c);
+ test("-84.0-42.0", "" + sf_dM + sf_fM);
+ test("-84.025", "" + sf_dM + s_b);
+ test("-84.0null", "" + sf_dM + f_oN);
+ test("-84.0-1410065408", "" + sf_dM + s_lM);
+ test("-84.08.0", "" + sf_dM + s_d);
+ test("-84.055.0", "" + sf_dM + s_f);
+ test("-84.097000000", "" + sf_dM + s_i);
+ test("-84.0-9900", "" + sf_dM + f_sM);
+ test("-84.0935228928", "" + sf_dM + s_l);
+ test("-84.0-8400", "" + sf_dM + sf_sM);
+ test("-84.0C(82)", "" + sf_dM + s_o);
+ test("-84.0null", "" + sf_dM + sf_oNtS);
+ test("-84.0true", "" + sf_dM + s_bl);
+ test("-84.03900", "" + sf_dM + s_s);
+ test("-84.0null", "" + sf_dM + sf_oN);
+ test("-84.094000000", "" + sf_dM + f_I);
+ test("-84.0null", "" + sf_dM + f_IN);
+ test("-84.0true", "" + sf_dM + sf_bl);
+ test("-84.05500", "" + sf_dM + sf_s);
+ test("-84.0-2900", "" + sf_dM + s_sM);
+ test("-84.0-194313216", "" + sf_dM + sf_l);
+ test("-84.012", "" + sf_dM + s_strU1);
+ test("-84.0C(87)", "" + sf_dM + sf_o);
+ test("-84.091", "" + sf_dM + s_strU2);
+ test("-84.021", "" + sf_dM + f_strU1);
+ test("-84.018", "" + sf_dM + f_strU2);
+ test("-84.0null", "" + sf_dM + f_iAN);
+ test("-84.0null", "" + sf_dM + s_oN);
+ test("-84.0\u045180", "" + sf_dM + s_strU);
+ test("-84.0C", "" + sf_dM + sf_c);
+ test("-84.075", "" + sf_dM + sf_str);
+ test("-84.0-43", "" + sf_dM + s_bM);
+ test("-84.080", "" + sf_dM + sf_b);
+ test("-84.0null", "" + sf_dM + s_IN);
+ test("-84.0-52.0", "" + sf_dM + s_fM);
+ test("-84.075000000", "" + sf_dM + sf_i);
+ test("-84.044", "" + sf_dM + f_b);
+ test("-84.0-1705032704", "" + sf_dM + sf_lM);
+ test("-84.0null", "" + sf_dM + f_oAN);
+ test("-84.083.0", "" + sf_dM + f_d);
+ test("-84.0I", "" + sf_dM + f_c);
+ test("-84.094.0", "" + sf_dM + f_f);
+ test("-84.012.0", "" + sf_dM + sf_d);
+ test("-84.0-99.0", "" + sf_dM + f_dM);
+ test("-84.017.0", "" + sf_dM + sf_f);
+ test("-84.0-84.0", "" + sf_dM + sf_dM);
+ test("-84.058000000", "" + sf_dM + f_i);
+ test("-84.0-55000000", "" + sf_dM + f_iM);
+ test("-84.01460392448", "" + sf_dM + f_l);
+ test("-84.0C(70)", "" + sf_dM + f_o);
+ test("-84.0\u04511", "" + sf_dM + sf_strU);
+ test("-84.08000", "" + sf_dM + f_s);
+ test("-84.018", "" + sf_dM + s_str);
+ test("-84.0-1000000", "" + sf_dM + s_iM);
+ test("-84.01000000", "" + sf_dM + sf_I);
+ test("-84.0null", "" + sf_dM + f_oNtS);
+ test("-84.0false", "" + sf_dM + f_bl);
+ test("-84.0null", "" + sf_dM + sf_iAN);
+ test("-84.0-2000000", "" + sf_dM + sf_iM);
+ test("-84.0-820130816", "" + sf_dM + f_lM);
+ test("-84.0null", "" + sf_dM + sf_oAN);
+ test("-84.025000000", "" + sf_dM + s_I);
+ test("58000000-96.0", "" + f_i + s_dM);
+ test("58000000null", "" + f_i + s_oNtS);
+ test("58000000\u045176", "" + f_i + f_strU);
+ test("5800000092", "" + f_i + sf_strU2);
+ test("5800000051", "" + f_i + sf_strU1);
+ test("58000000null", "" + f_i + s_iAN);
+ test("58000000-54", "" + f_i + f_bM);
+ test("58000000-87.0", "" + f_i + f_fM);
+ test("58000000null", "" + f_i + s_oAN);
+ test("5800000019", "" + f_i + f_str);
+ test("58000000-41", "" + f_i + sf_bM);
+ test("58000000null", "" + f_i + sf_IN);
+ test("58000000T", "" + f_i + s_c);
+ test("58000000-42.0", "" + f_i + sf_fM);
+ test("5800000025", "" + f_i + s_b);
+ test("58000000null", "" + f_i + f_oN);
+ test("58000000-1410065408", "" + f_i + s_lM);
+ test("580000008.0", "" + f_i + s_d);
+ test("5800000055.0", "" + f_i + s_f);
+ test("5800000097000000", "" + f_i + s_i);
+ test("58000000-9900", "" + f_i + f_sM);
+ test("58000000935228928", "" + f_i + s_l);
+ test("58000000-8400", "" + f_i + sf_sM);
+ test("58000000C(82)", "" + f_i + s_o);
+ test("58000000null", "" + f_i + sf_oNtS);
+ test("58000000true", "" + f_i + s_bl);
+ test("580000003900", "" + f_i + s_s);
+ test("58000000null", "" + f_i + sf_oN);
+ test("5800000094000000", "" + f_i + f_I);
+ test("58000000null", "" + f_i + f_IN);
+ test("58000000true", "" + f_i + sf_bl);
+ test("580000005500", "" + f_i + sf_s);
+ test("58000000-2900", "" + f_i + s_sM);
+ test("58000000-194313216", "" + f_i + sf_l);
+ test("5800000012", "" + f_i + s_strU1);
+ test("58000000C(87)", "" + f_i + sf_o);
+ test("5800000091", "" + f_i + s_strU2);
+ test("5800000021", "" + f_i + f_strU1);
+ test("5800000018", "" + f_i + f_strU2);
+ test("58000000null", "" + f_i + f_iAN);
+ test("58000000null", "" + f_i + s_oN);
+ test("58000000\u045180", "" + f_i + s_strU);
+ test("58000000C", "" + f_i + sf_c);
+ test("5800000075", "" + f_i + sf_str);
+ test("58000000-43", "" + f_i + s_bM);
+ test("5800000080", "" + f_i + sf_b);
+ test("58000000null", "" + f_i + s_IN);
+ test("58000000-52.0", "" + f_i + s_fM);
+ test("5800000075000000", "" + f_i + sf_i);
+ test("5800000044", "" + f_i + f_b);
+ test("58000000-1705032704", "" + f_i + sf_lM);
+ test("58000000null", "" + f_i + f_oAN);
+ test("5800000083.0", "" + f_i + f_d);
+ test("58000000I", "" + f_i + f_c);
+ test("5800000094.0", "" + f_i + f_f);
+ test("5800000012.0", "" + f_i + sf_d);
+ test("58000000-99.0", "" + f_i + f_dM);
+ test("5800000017.0", "" + f_i + sf_f);
+ test("58000000-84.0", "" + f_i + sf_dM);
+ test("5800000058000000", "" + f_i + f_i);
+ test("58000000-55000000", "" + f_i + f_iM);
+ test("580000001460392448", "" + f_i + f_l);
+ test("58000000C(70)", "" + f_i + f_o);
+ test("58000000\u04511", "" + f_i + sf_strU);
+ test("580000008000", "" + f_i + f_s);
+ test("5800000018", "" + f_i + s_str);
+ test("58000000-1000000", "" + f_i + s_iM);
+ test("580000001000000", "" + f_i + sf_I);
+ test("58000000null", "" + f_i + f_oNtS);
+ test("58000000false", "" + f_i + f_bl);
+ test("58000000null", "" + f_i + sf_iAN);
+ test("58000000-2000000", "" + f_i + sf_iM);
+ test("58000000-820130816", "" + f_i + f_lM);
+ test("58000000null", "" + f_i + sf_oAN);
+ test("5800000025000000", "" + f_i + s_I);
+ test("-55000000-96.0", "" + f_iM + s_dM);
+ test("-55000000null", "" + f_iM + s_oNtS);
+ test("-55000000\u045176", "" + f_iM + f_strU);
+ test("-5500000092", "" + f_iM + sf_strU2);
+ test("-5500000051", "" + f_iM + sf_strU1);
+ test("-55000000null", "" + f_iM + s_iAN);
+ test("-55000000-54", "" + f_iM + f_bM);
+ test("-55000000-87.0", "" + f_iM + f_fM);
+ test("-55000000null", "" + f_iM + s_oAN);
+ test("-5500000019", "" + f_iM + f_str);
+ test("-55000000-41", "" + f_iM + sf_bM);
+ test("-55000000null", "" + f_iM + sf_IN);
+ test("-55000000T", "" + f_iM + s_c);
+ test("-55000000-42.0", "" + f_iM + sf_fM);
+ test("-5500000025", "" + f_iM + s_b);
+ test("-55000000null", "" + f_iM + f_oN);
+ test("-55000000-1410065408", "" + f_iM + s_lM);
+ test("-550000008.0", "" + f_iM + s_d);
+ test("-5500000055.0", "" + f_iM + s_f);
+ test("-5500000097000000", "" + f_iM + s_i);
+ test("-55000000-9900", "" + f_iM + f_sM);
+ test("-55000000935228928", "" + f_iM + s_l);
+ test("-55000000-8400", "" + f_iM + sf_sM);
+ test("-55000000C(82)", "" + f_iM + s_o);
+ test("-55000000null", "" + f_iM + sf_oNtS);
+ test("-55000000true", "" + f_iM + s_bl);
+ test("-550000003900", "" + f_iM + s_s);
+ test("-55000000null", "" + f_iM + sf_oN);
+ test("-5500000094000000", "" + f_iM + f_I);
+ test("-55000000null", "" + f_iM + f_IN);
+ test("-55000000true", "" + f_iM + sf_bl);
+ test("-550000005500", "" + f_iM + sf_s);
+ test("-55000000-2900", "" + f_iM + s_sM);
+ test("-55000000-194313216", "" + f_iM + sf_l);
+ test("-5500000012", "" + f_iM + s_strU1);
+ test("-55000000C(87)", "" + f_iM + sf_o);
+ test("-5500000091", "" + f_iM + s_strU2);
+ test("-5500000021", "" + f_iM + f_strU1);
+ test("-5500000018", "" + f_iM + f_strU2);
+ test("-55000000null", "" + f_iM + f_iAN);
+ test("-55000000null", "" + f_iM + s_oN);
+ test("-55000000\u045180", "" + f_iM + s_strU);
+ test("-55000000C", "" + f_iM + sf_c);
+ test("-5500000075", "" + f_iM + sf_str);
+ test("-55000000-43", "" + f_iM + s_bM);
+ test("-5500000080", "" + f_iM + sf_b);
+ test("-55000000null", "" + f_iM + s_IN);
+ test("-55000000-52.0", "" + f_iM + s_fM);
+ test("-5500000075000000", "" + f_iM + sf_i);
+ test("-5500000044", "" + f_iM + f_b);
+ test("-55000000-1705032704", "" + f_iM + sf_lM);
+ test("-55000000null", "" + f_iM + f_oAN);
+ test("-5500000083.0", "" + f_iM + f_d);
+ test("-55000000I", "" + f_iM + f_c);
+ test("-5500000094.0", "" + f_iM + f_f);
+ test("-5500000012.0", "" + f_iM + sf_d);
+ test("-55000000-99.0", "" + f_iM + f_dM);
+ test("-5500000017.0", "" + f_iM + sf_f);
+ test("-55000000-84.0", "" + f_iM + sf_dM);
+ test("-5500000058000000", "" + f_iM + f_i);
+ test("-55000000-55000000", "" + f_iM + f_iM);
+ test("-550000001460392448", "" + f_iM + f_l);
+ test("-55000000C(70)", "" + f_iM + f_o);
+ test("-55000000\u04511", "" + f_iM + sf_strU);
+ test("-550000008000", "" + f_iM + f_s);
+ test("-5500000018", "" + f_iM + s_str);
+ test("-55000000-1000000", "" + f_iM + s_iM);
+ test("-550000001000000", "" + f_iM + sf_I);
+ test("-55000000null", "" + f_iM + f_oNtS);
+ test("-55000000false", "" + f_iM + f_bl);
+ test("-55000000null", "" + f_iM + sf_iAN);
+ test("-55000000-2000000", "" + f_iM + sf_iM);
+ test("-55000000-820130816", "" + f_iM + f_lM);
+ test("-55000000null", "" + f_iM + sf_oAN);
+ test("-5500000025000000", "" + f_iM + s_I);
+ test("1460392448-96.0", "" + f_l + s_dM);
+ test("1460392448null", "" + f_l + s_oNtS);
+ test("1460392448\u045176", "" + f_l + f_strU);
+ test("146039244892", "" + f_l + sf_strU2);
+ test("146039244851", "" + f_l + sf_strU1);
+ test("1460392448null", "" + f_l + s_iAN);
+ test("1460392448-54", "" + f_l + f_bM);
+ test("1460392448-87.0", "" + f_l + f_fM);
+ test("1460392448null", "" + f_l + s_oAN);
+ test("146039244819", "" + f_l + f_str);
+ test("1460392448-41", "" + f_l + sf_bM);
+ test("1460392448null", "" + f_l + sf_IN);
+ test("1460392448T", "" + f_l + s_c);
+ test("1460392448-42.0", "" + f_l + sf_fM);
+ test("146039244825", "" + f_l + s_b);
+ test("1460392448null", "" + f_l + f_oN);
+ test("1460392448-1410065408", "" + f_l + s_lM);
+ test("14603924488.0", "" + f_l + s_d);
+ test("146039244855.0", "" + f_l + s_f);
+ test("146039244897000000", "" + f_l + s_i);
+ test("1460392448-9900", "" + f_l + f_sM);
+ test("1460392448935228928", "" + f_l + s_l);
+ test("1460392448-8400", "" + f_l + sf_sM);
+ test("1460392448C(82)", "" + f_l + s_o);
+ test("1460392448null", "" + f_l + sf_oNtS);
+ test("1460392448true", "" + f_l + s_bl);
+ test("14603924483900", "" + f_l + s_s);
+ test("1460392448null", "" + f_l + sf_oN);
+ test("146039244894000000", "" + f_l + f_I);
+ test("1460392448null", "" + f_l + f_IN);
+ test("1460392448true", "" + f_l + sf_bl);
+ test("14603924485500", "" + f_l + sf_s);
+ test("1460392448-2900", "" + f_l + s_sM);
+ test("1460392448-194313216", "" + f_l + sf_l);
+ test("146039244812", "" + f_l + s_strU1);
+ test("1460392448C(87)", "" + f_l + sf_o);
+ test("146039244891", "" + f_l + s_strU2);
+ test("146039244821", "" + f_l + f_strU1);
+ test("146039244818", "" + f_l + f_strU2);
+ test("1460392448null", "" + f_l + f_iAN);
+ test("1460392448null", "" + f_l + s_oN);
+ test("1460392448\u045180", "" + f_l + s_strU);
+ test("1460392448C", "" + f_l + sf_c);
+ test("146039244875", "" + f_l + sf_str);
+ test("1460392448-43", "" + f_l + s_bM);
+ test("146039244880", "" + f_l + sf_b);
+ test("1460392448null", "" + f_l + s_IN);
+ test("1460392448-52.0", "" + f_l + s_fM);
+ test("146039244875000000", "" + f_l + sf_i);
+ test("146039244844", "" + f_l + f_b);
+ test("1460392448-1705032704", "" + f_l + sf_lM);
+ test("1460392448null", "" + f_l + f_oAN);
+ test("146039244883.0", "" + f_l + f_d);
+ test("1460392448I", "" + f_l + f_c);
+ test("146039244894.0", "" + f_l + f_f);
+ test("146039244812.0", "" + f_l + sf_d);
+ test("1460392448-99.0", "" + f_l + f_dM);
+ test("146039244817.0", "" + f_l + sf_f);
+ test("1460392448-84.0", "" + f_l + sf_dM);
+ test("146039244858000000", "" + f_l + f_i);
+ test("1460392448-55000000", "" + f_l + f_iM);
+ test("14603924481460392448", "" + f_l + f_l);
+ test("1460392448C(70)", "" + f_l + f_o);
+ test("1460392448\u04511", "" + f_l + sf_strU);
+ test("14603924488000", "" + f_l + f_s);
+ test("146039244818", "" + f_l + s_str);
+ test("1460392448-1000000", "" + f_l + s_iM);
+ test("14603924481000000", "" + f_l + sf_I);
+ test("1460392448null", "" + f_l + f_oNtS);
+ test("1460392448false", "" + f_l + f_bl);
+ test("1460392448null", "" + f_l + sf_iAN);
+ test("1460392448-2000000", "" + f_l + sf_iM);
+ test("1460392448-820130816", "" + f_l + f_lM);
+ test("1460392448null", "" + f_l + sf_oAN);
+ test("146039244825000000", "" + f_l + s_I);
+ test("C(70)-96.0", "" + f_o + s_dM);
+ test("C(70)null", "" + f_o + s_oNtS);
+ test("C(70)\u045176", "" + f_o + f_strU);
+ test("C(70)92", "" + f_o + sf_strU2);
+ test("C(70)51", "" + f_o + sf_strU1);
+ test("C(70)null", "" + f_o + s_iAN);
+ test("C(70)-54", "" + f_o + f_bM);
+ test("C(70)-87.0", "" + f_o + f_fM);
+ test("C(70)null", "" + f_o + s_oAN);
+ test("C(70)19", "" + f_o + f_str);
+ test("C(70)-41", "" + f_o + sf_bM);
+ test("C(70)null", "" + f_o + sf_IN);
+ test("C(70)T", "" + f_o + s_c);
+ test("C(70)-42.0", "" + f_o + sf_fM);
+ test("C(70)25", "" + f_o + s_b);
+ test("C(70)null", "" + f_o + f_oN);
+ test("C(70)-1410065408", "" + f_o + s_lM);
+ test("C(70)8.0", "" + f_o + s_d);
+ test("C(70)55.0", "" + f_o + s_f);
+ test("C(70)97000000", "" + f_o + s_i);
+ test("C(70)-9900", "" + f_o + f_sM);
+ test("C(70)935228928", "" + f_o + s_l);
+ test("C(70)-8400", "" + f_o + sf_sM);
+ test("C(70)C(82)", "" + f_o + s_o);
+ test("C(70)null", "" + f_o + sf_oNtS);
+ test("C(70)true", "" + f_o + s_bl);
+ test("C(70)3900", "" + f_o + s_s);
+ test("C(70)null", "" + f_o + sf_oN);
+ test("C(70)94000000", "" + f_o + f_I);
+ test("C(70)null", "" + f_o + f_IN);
+ test("C(70)true", "" + f_o + sf_bl);
+ test("C(70)5500", "" + f_o + sf_s);
+ test("C(70)-2900", "" + f_o + s_sM);
+ test("C(70)-194313216", "" + f_o + sf_l);
+ test("C(70)12", "" + f_o + s_strU1);
+ test("C(70)C(87)", "" + f_o + sf_o);
+ test("C(70)91", "" + f_o + s_strU2);
+ test("C(70)21", "" + f_o + f_strU1);
+ test("C(70)18", "" + f_o + f_strU2);
+ test("C(70)null", "" + f_o + f_iAN);
+ test("C(70)null", "" + f_o + s_oN);
+ test("C(70)\u045180", "" + f_o + s_strU);
+ test("C(70)C", "" + f_o + sf_c);
+ test("C(70)75", "" + f_o + sf_str);
+ test("C(70)-43", "" + f_o + s_bM);
+ test("C(70)80", "" + f_o + sf_b);
+ test("C(70)null", "" + f_o + s_IN);
+ test("C(70)-52.0", "" + f_o + s_fM);
+ test("C(70)75000000", "" + f_o + sf_i);
+ test("C(70)44", "" + f_o + f_b);
+ test("C(70)-1705032704", "" + f_o + sf_lM);
+ test("C(70)null", "" + f_o + f_oAN);
+ test("C(70)83.0", "" + f_o + f_d);
+ test("C(70)I", "" + f_o + f_c);
+ test("C(70)94.0", "" + f_o + f_f);
+ test("C(70)12.0", "" + f_o + sf_d);
+ test("C(70)-99.0", "" + f_o + f_dM);
+ test("C(70)17.0", "" + f_o + sf_f);
+ test("C(70)-84.0", "" + f_o + sf_dM);
+ test("C(70)58000000", "" + f_o + f_i);
+ test("C(70)-55000000", "" + f_o + f_iM);
+ test("C(70)1460392448", "" + f_o + f_l);
+ test("C(70)C(70)", "" + f_o + f_o);
+ test("C(70)\u04511", "" + f_o + sf_strU);
+ test("C(70)8000", "" + f_o + f_s);
+ test("C(70)18", "" + f_o + s_str);
+ test("C(70)-1000000", "" + f_o + s_iM);
+ test("C(70)1000000", "" + f_o + sf_I);
+ test("C(70)null", "" + f_o + f_oNtS);
+ test("C(70)false", "" + f_o + f_bl);
+ test("C(70)null", "" + f_o + sf_iAN);
+ test("C(70)-2000000", "" + f_o + sf_iM);
+ test("C(70)-820130816", "" + f_o + f_lM);
+ test("C(70)null", "" + f_o + sf_oAN);
+ test("C(70)25000000", "" + f_o + s_I);
+ test("\u04511-96.0", "" + sf_strU + s_dM);
+ test("\u04511null", "" + sf_strU + s_oNtS);
+ test("\u04511\u045176", "" + sf_strU + f_strU);
+ test("\u0451192", "" + sf_strU + sf_strU2);
+ test("\u0451151", "" + sf_strU + sf_strU1);
+ test("\u04511null", "" + sf_strU + s_iAN);
+ test("\u04511-54", "" + sf_strU + f_bM);
+ test("\u04511-87.0", "" + sf_strU + f_fM);
+ test("\u04511null", "" + sf_strU + s_oAN);
+ test("\u0451119", "" + sf_strU + f_str);
+ test("\u04511-41", "" + sf_strU + sf_bM);
+ test("\u04511null", "" + sf_strU + sf_IN);
+ test("\u04511T", "" + sf_strU + s_c);
+ test("\u04511-42.0", "" + sf_strU + sf_fM);
+ test("\u0451125", "" + sf_strU + s_b);
+ test("\u04511null", "" + sf_strU + f_oN);
+ test("\u04511-1410065408", "" + sf_strU + s_lM);
+ test("\u045118.0", "" + sf_strU + s_d);
+ test("\u0451155.0", "" + sf_strU + s_f);
+ test("\u0451197000000", "" + sf_strU + s_i);
+ test("\u04511-9900", "" + sf_strU + f_sM);
+ test("\u04511935228928", "" + sf_strU + s_l);
+ test("\u04511-8400", "" + sf_strU + sf_sM);
+ test("\u04511C(82)", "" + sf_strU + s_o);
+ test("\u04511null", "" + sf_strU + sf_oNtS);
+ test("\u04511true", "" + sf_strU + s_bl);
+ test("\u045113900", "" + sf_strU + s_s);
+ test("\u04511null", "" + sf_strU + sf_oN);
+ test("\u0451194000000", "" + sf_strU + f_I);
+ test("\u04511null", "" + sf_strU + f_IN);
+ test("\u04511true", "" + sf_strU + sf_bl);
+ test("\u045115500", "" + sf_strU + sf_s);
+ test("\u04511-2900", "" + sf_strU + s_sM);
+ test("\u04511-194313216", "" + sf_strU + sf_l);
+ test("\u0451112", "" + sf_strU + s_strU1);
+ test("\u04511C(87)", "" + sf_strU + sf_o);
+ test("\u0451191", "" + sf_strU + s_strU2);
+ test("\u0451121", "" + sf_strU + f_strU1);
+ test("\u0451118", "" + sf_strU + f_strU2);
+ test("\u04511null", "" + sf_strU + f_iAN);
+ test("\u04511null", "" + sf_strU + s_oN);
+ test("\u04511\u045180", "" + sf_strU + s_strU);
+ test("\u04511C", "" + sf_strU + sf_c);
+ test("\u0451175", "" + sf_strU + sf_str);
+ test("\u04511-43", "" + sf_strU + s_bM);
+ test("\u0451180", "" + sf_strU + sf_b);
+ test("\u04511null", "" + sf_strU + s_IN);
+ test("\u04511-52.0", "" + sf_strU + s_fM);
+ test("\u0451175000000", "" + sf_strU + sf_i);
+ test("\u0451144", "" + sf_strU + f_b);
+ test("\u04511-1705032704", "" + sf_strU + sf_lM);
+ test("\u04511null", "" + sf_strU + f_oAN);
+ test("\u0451183.0", "" + sf_strU + f_d);
+ test("\u04511I", "" + sf_strU + f_c);
+ test("\u0451194.0", "" + sf_strU + f_f);
+ test("\u0451112.0", "" + sf_strU + sf_d);
+ test("\u04511-99.0", "" + sf_strU + f_dM);
+ test("\u0451117.0", "" + sf_strU + sf_f);
+ test("\u04511-84.0", "" + sf_strU + sf_dM);
+ test("\u0451158000000", "" + sf_strU + f_i);
+ test("\u04511-55000000", "" + sf_strU + f_iM);
+ test("\u045111460392448", "" + sf_strU + f_l);
+ test("\u04511C(70)", "" + sf_strU + f_o);
+ test("\u04511\u04511", "" + sf_strU + sf_strU);
+ test("\u045118000", "" + sf_strU + f_s);
+ test("\u0451118", "" + sf_strU + s_str);
+ test("\u04511-1000000", "" + sf_strU + s_iM);
+ test("\u045111000000", "" + sf_strU + sf_I);
+ test("\u04511null", "" + sf_strU + f_oNtS);
+ test("\u04511false", "" + sf_strU + f_bl);
+ test("\u04511null", "" + sf_strU + sf_iAN);
+ test("\u04511-2000000", "" + sf_strU + sf_iM);
+ test("\u04511-820130816", "" + sf_strU + f_lM);
+ test("\u04511null", "" + sf_strU + sf_oAN);
+ test("\u0451125000000", "" + sf_strU + s_I);
+ test("8000-96.0", "" + f_s + s_dM);
+ test("8000null", "" + f_s + s_oNtS);
+ test("8000\u045176", "" + f_s + f_strU);
+ test("800092", "" + f_s + sf_strU2);
+ test("800051", "" + f_s + sf_strU1);
+ test("8000null", "" + f_s + s_iAN);
+ test("8000-54", "" + f_s + f_bM);
+ test("8000-87.0", "" + f_s + f_fM);
+ test("8000null", "" + f_s + s_oAN);
+ test("800019", "" + f_s + f_str);
+ test("8000-41", "" + f_s + sf_bM);
+ test("8000null", "" + f_s + sf_IN);
+ test("8000T", "" + f_s + s_c);
+ test("8000-42.0", "" + f_s + sf_fM);
+ test("800025", "" + f_s + s_b);
+ test("8000null", "" + f_s + f_oN);
+ test("8000-1410065408", "" + f_s + s_lM);
+ test("80008.0", "" + f_s + s_d);
+ test("800055.0", "" + f_s + s_f);
+ test("800097000000", "" + f_s + s_i);
+ test("8000-9900", "" + f_s + f_sM);
+ test("8000935228928", "" + f_s + s_l);
+ test("8000-8400", "" + f_s + sf_sM);
+ test("8000C(82)", "" + f_s + s_o);
+ test("8000null", "" + f_s + sf_oNtS);
+ test("8000true", "" + f_s + s_bl);
+ test("80003900", "" + f_s + s_s);
+ test("8000null", "" + f_s + sf_oN);
+ test("800094000000", "" + f_s + f_I);
+ test("8000null", "" + f_s + f_IN);
+ test("8000true", "" + f_s + sf_bl);
+ test("80005500", "" + f_s + sf_s);
+ test("8000-2900", "" + f_s + s_sM);
+ test("8000-194313216", "" + f_s + sf_l);
+ test("800012", "" + f_s + s_strU1);
+ test("8000C(87)", "" + f_s + sf_o);
+ test("800091", "" + f_s + s_strU2);
+ test("800021", "" + f_s + f_strU1);
+ test("800018", "" + f_s + f_strU2);
+ test("8000null", "" + f_s + f_iAN);
+ test("8000null", "" + f_s + s_oN);
+ test("8000\u045180", "" + f_s + s_strU);
+ test("8000C", "" + f_s + sf_c);
+ test("800075", "" + f_s + sf_str);
+ test("8000-43", "" + f_s + s_bM);
+ test("800080", "" + f_s + sf_b);
+ test("8000null", "" + f_s + s_IN);
+ test("8000-52.0", "" + f_s + s_fM);
+ test("800075000000", "" + f_s + sf_i);
+ test("800044", "" + f_s + f_b);
+ test("8000-1705032704", "" + f_s + sf_lM);
+ test("8000null", "" + f_s + f_oAN);
+ test("800083.0", "" + f_s + f_d);
+ test("8000I", "" + f_s + f_c);
+ test("800094.0", "" + f_s + f_f);
+ test("800012.0", "" + f_s + sf_d);
+ test("8000-99.0", "" + f_s + f_dM);
+ test("800017.0", "" + f_s + sf_f);
+ test("8000-84.0", "" + f_s + sf_dM);
+ test("800058000000", "" + f_s + f_i);
+ test("8000-55000000", "" + f_s + f_iM);
+ test("80001460392448", "" + f_s + f_l);
+ test("8000C(70)", "" + f_s + f_o);
+ test("8000\u04511", "" + f_s + sf_strU);
+ test("80008000", "" + f_s + f_s);
+ test("800018", "" + f_s + s_str);
+ test("8000-1000000", "" + f_s + s_iM);
+ test("80001000000", "" + f_s + sf_I);
+ test("8000null", "" + f_s + f_oNtS);
+ test("8000false", "" + f_s + f_bl);
+ test("8000null", "" + f_s + sf_iAN);
+ test("8000-2000000", "" + f_s + sf_iM);
+ test("8000-820130816", "" + f_s + f_lM);
+ test("8000null", "" + f_s + sf_oAN);
+ test("800025000000", "" + f_s + s_I);
+ test("18-96.0", "" + s_str + s_dM);
+ test("18null", "" + s_str + s_oNtS);
+ test("18\u045176", "" + s_str + f_strU);
+ test("1892", "" + s_str + sf_strU2);
+ test("1851", "" + s_str + sf_strU1);
+ test("18null", "" + s_str + s_iAN);
+ test("18-54", "" + s_str + f_bM);
+ test("18-87.0", "" + s_str + f_fM);
+ test("18null", "" + s_str + s_oAN);
+ test("1819", "" + s_str + f_str);
+ test("18-41", "" + s_str + sf_bM);
+ test("18null", "" + s_str + sf_IN);
+ test("18T", "" + s_str + s_c);
+ test("18-42.0", "" + s_str + sf_fM);
+ test("1825", "" + s_str + s_b);
+ test("18null", "" + s_str + f_oN);
+ test("18-1410065408", "" + s_str + s_lM);
+ test("188.0", "" + s_str + s_d);
+ test("1855.0", "" + s_str + s_f);
+ test("1897000000", "" + s_str + s_i);
+ test("18-9900", "" + s_str + f_sM);
+ test("18935228928", "" + s_str + s_l);
+ test("18-8400", "" + s_str + sf_sM);
+ test("18C(82)", "" + s_str + s_o);
+ test("18null", "" + s_str + sf_oNtS);
+ test("18true", "" + s_str + s_bl);
+ test("183900", "" + s_str + s_s);
+ test("18null", "" + s_str + sf_oN);
+ test("1894000000", "" + s_str + f_I);
+ test("18null", "" + s_str + f_IN);
+ test("18true", "" + s_str + sf_bl);
+ test("185500", "" + s_str + sf_s);
+ test("18-2900", "" + s_str + s_sM);
+ test("18-194313216", "" + s_str + sf_l);
+ test("1812", "" + s_str + s_strU1);
+ test("18C(87)", "" + s_str + sf_o);
+ test("1891", "" + s_str + s_strU2);
+ test("1821", "" + s_str + f_strU1);
+ test("1818", "" + s_str + f_strU2);
+ test("18null", "" + s_str + f_iAN);
+ test("18null", "" + s_str + s_oN);
+ test("18\u045180", "" + s_str + s_strU);
+ test("18C", "" + s_str + sf_c);
+ test("1875", "" + s_str + sf_str);
+ test("18-43", "" + s_str + s_bM);
+ test("1880", "" + s_str + sf_b);
+ test("18null", "" + s_str + s_IN);
+ test("18-52.0", "" + s_str + s_fM);
+ test("1875000000", "" + s_str + sf_i);
+ test("1844", "" + s_str + f_b);
+ }
+
+ public void run5() {
+ test("18-1705032704", "" + s_str + sf_lM);
+ test("18null", "" + s_str + f_oAN);
+ test("1883.0", "" + s_str + f_d);
+ test("18I", "" + s_str + f_c);
+ test("1894.0", "" + s_str + f_f);
+ test("1812.0", "" + s_str + sf_d);
+ test("18-99.0", "" + s_str + f_dM);
+ test("1817.0", "" + s_str + sf_f);
+ test("18-84.0", "" + s_str + sf_dM);
+ test("1858000000", "" + s_str + f_i);
+ test("18-55000000", "" + s_str + f_iM);
+ test("181460392448", "" + s_str + f_l);
+ test("18C(70)", "" + s_str + f_o);
+ test("18\u04511", "" + s_str + sf_strU);
+ test("188000", "" + s_str + f_s);
+ test("1818", "" + s_str + s_str);
+ test("18-1000000", "" + s_str + s_iM);
+ test("181000000", "" + s_str + sf_I);
+ test("18null", "" + s_str + f_oNtS);
+ test("18false", "" + s_str + f_bl);
+ test("18null", "" + s_str + sf_iAN);
+ test("18-2000000", "" + s_str + sf_iM);
+ test("18-820130816", "" + s_str + f_lM);
+ test("18null", "" + s_str + sf_oAN);
+ test("1825000000", "" + s_str + s_I);
+ test("-1000000-96.0", "" + s_iM + s_dM);
+ test("-1000000null", "" + s_iM + s_oNtS);
+ test("-1000000\u045176", "" + s_iM + f_strU);
+ test("-100000092", "" + s_iM + sf_strU2);
+ test("-100000051", "" + s_iM + sf_strU1);
+ test("-1000000null", "" + s_iM + s_iAN);
+ test("-1000000-54", "" + s_iM + f_bM);
+ test("-1000000-87.0", "" + s_iM + f_fM);
+ test("-1000000null", "" + s_iM + s_oAN);
+ test("-100000019", "" + s_iM + f_str);
+ test("-1000000-41", "" + s_iM + sf_bM);
+ test("-1000000null", "" + s_iM + sf_IN);
+ test("-1000000T", "" + s_iM + s_c);
+ test("-1000000-42.0", "" + s_iM + sf_fM);
+ test("-100000025", "" + s_iM + s_b);
+ test("-1000000null", "" + s_iM + f_oN);
+ test("-1000000-1410065408", "" + s_iM + s_lM);
+ test("-10000008.0", "" + s_iM + s_d);
+ test("-100000055.0", "" + s_iM + s_f);
+ test("-100000097000000", "" + s_iM + s_i);
+ test("-1000000-9900", "" + s_iM + f_sM);
+ test("-1000000935228928", "" + s_iM + s_l);
+ test("-1000000-8400", "" + s_iM + sf_sM);
+ test("-1000000C(82)", "" + s_iM + s_o);
+ test("-1000000null", "" + s_iM + sf_oNtS);
+ test("-1000000true", "" + s_iM + s_bl);
+ test("-10000003900", "" + s_iM + s_s);
+ test("-1000000null", "" + s_iM + sf_oN);
+ test("-100000094000000", "" + s_iM + f_I);
+ test("-1000000null", "" + s_iM + f_IN);
+ test("-1000000true", "" + s_iM + sf_bl);
+ test("-10000005500", "" + s_iM + sf_s);
+ test("-1000000-2900", "" + s_iM + s_sM);
+ test("-1000000-194313216", "" + s_iM + sf_l);
+ test("-100000012", "" + s_iM + s_strU1);
+ test("-1000000C(87)", "" + s_iM + sf_o);
+ test("-100000091", "" + s_iM + s_strU2);
+ test("-100000021", "" + s_iM + f_strU1);
+ test("-100000018", "" + s_iM + f_strU2);
+ test("-1000000null", "" + s_iM + f_iAN);
+ test("-1000000null", "" + s_iM + s_oN);
+ test("-1000000\u045180", "" + s_iM + s_strU);
+ test("-1000000C", "" + s_iM + sf_c);
+ test("-100000075", "" + s_iM + sf_str);
+ test("-1000000-43", "" + s_iM + s_bM);
+ test("-100000080", "" + s_iM + sf_b);
+ test("-1000000null", "" + s_iM + s_IN);
+ test("-1000000-52.0", "" + s_iM + s_fM);
+ test("-100000075000000", "" + s_iM + sf_i);
+ test("-100000044", "" + s_iM + f_b);
+ test("-1000000-1705032704", "" + s_iM + sf_lM);
+ test("-1000000null", "" + s_iM + f_oAN);
+ test("-100000083.0", "" + s_iM + f_d);
+ test("-1000000I", "" + s_iM + f_c);
+ test("-100000094.0", "" + s_iM + f_f);
+ test("-100000012.0", "" + s_iM + sf_d);
+ test("-1000000-99.0", "" + s_iM + f_dM);
+ test("-100000017.0", "" + s_iM + sf_f);
+ test("-1000000-84.0", "" + s_iM + sf_dM);
+ test("-100000058000000", "" + s_iM + f_i);
+ test("-1000000-55000000", "" + s_iM + f_iM);
+ test("-10000001460392448", "" + s_iM + f_l);
+ test("-1000000C(70)", "" + s_iM + f_o);
+ test("-1000000\u04511", "" + s_iM + sf_strU);
+ test("-10000008000", "" + s_iM + f_s);
+ test("-100000018", "" + s_iM + s_str);
+ test("-1000000-1000000", "" + s_iM + s_iM);
+ test("-10000001000000", "" + s_iM + sf_I);
+ test("-1000000null", "" + s_iM + f_oNtS);
+ test("-1000000false", "" + s_iM + f_bl);
+ test("-1000000null", "" + s_iM + sf_iAN);
+ test("-1000000-2000000", "" + s_iM + sf_iM);
+ test("-1000000-820130816", "" + s_iM + f_lM);
+ test("-1000000null", "" + s_iM + sf_oAN);
+ test("-100000025000000", "" + s_iM + s_I);
+ test("1000000-96.0", "" + sf_I + s_dM);
+ test("1000000null", "" + sf_I + s_oNtS);
+ test("1000000\u045176", "" + sf_I + f_strU);
+ test("100000092", "" + sf_I + sf_strU2);
+ test("100000051", "" + sf_I + sf_strU1);
+ test("1000000null", "" + sf_I + s_iAN);
+ test("1000000-54", "" + sf_I + f_bM);
+ test("1000000-87.0", "" + sf_I + f_fM);
+ test("1000000null", "" + sf_I + s_oAN);
+ test("100000019", "" + sf_I + f_str);
+ test("1000000-41", "" + sf_I + sf_bM);
+ test("1000000null", "" + sf_I + sf_IN);
+ test("1000000T", "" + sf_I + s_c);
+ test("1000000-42.0", "" + sf_I + sf_fM);
+ test("100000025", "" + sf_I + s_b);
+ test("1000000null", "" + sf_I + f_oN);
+ test("1000000-1410065408", "" + sf_I + s_lM);
+ test("10000008.0", "" + sf_I + s_d);
+ test("100000055.0", "" + sf_I + s_f);
+ test("100000097000000", "" + sf_I + s_i);
+ test("1000000-9900", "" + sf_I + f_sM);
+ test("1000000935228928", "" + sf_I + s_l);
+ test("1000000-8400", "" + sf_I + sf_sM);
+ test("1000000C(82)", "" + sf_I + s_o);
+ test("1000000null", "" + sf_I + sf_oNtS);
+ test("1000000true", "" + sf_I + s_bl);
+ test("10000003900", "" + sf_I + s_s);
+ test("1000000null", "" + sf_I + sf_oN);
+ test("100000094000000", "" + sf_I + f_I);
+ test("1000000null", "" + sf_I + f_IN);
+ test("1000000true", "" + sf_I + sf_bl);
+ test("10000005500", "" + sf_I + sf_s);
+ test("1000000-2900", "" + sf_I + s_sM);
+ test("1000000-194313216", "" + sf_I + sf_l);
+ test("100000012", "" + sf_I + s_strU1);
+ test("1000000C(87)", "" + sf_I + sf_o);
+ test("100000091", "" + sf_I + s_strU2);
+ test("100000021", "" + sf_I + f_strU1);
+ test("100000018", "" + sf_I + f_strU2);
+ test("1000000null", "" + sf_I + f_iAN);
+ test("1000000null", "" + sf_I + s_oN);
+ test("1000000\u045180", "" + sf_I + s_strU);
+ test("1000000C", "" + sf_I + sf_c);
+ test("100000075", "" + sf_I + sf_str);
+ test("1000000-43", "" + sf_I + s_bM);
+ test("100000080", "" + sf_I + sf_b);
+ test("1000000null", "" + sf_I + s_IN);
+ test("1000000-52.0", "" + sf_I + s_fM);
+ test("100000075000000", "" + sf_I + sf_i);
+ test("100000044", "" + sf_I + f_b);
+ test("1000000-1705032704", "" + sf_I + sf_lM);
+ test("1000000null", "" + sf_I + f_oAN);
+ test("100000083.0", "" + sf_I + f_d);
+ test("1000000I", "" + sf_I + f_c);
+ test("100000094.0", "" + sf_I + f_f);
+ test("100000012.0", "" + sf_I + sf_d);
+ test("1000000-99.0", "" + sf_I + f_dM);
+ test("100000017.0", "" + sf_I + sf_f);
+ test("1000000-84.0", "" + sf_I + sf_dM);
+ test("100000058000000", "" + sf_I + f_i);
+ test("1000000-55000000", "" + sf_I + f_iM);
+ test("10000001460392448", "" + sf_I + f_l);
+ test("1000000C(70)", "" + sf_I + f_o);
+ test("1000000\u04511", "" + sf_I + sf_strU);
+ test("10000008000", "" + sf_I + f_s);
+ test("100000018", "" + sf_I + s_str);
+ test("1000000-1000000", "" + sf_I + s_iM);
+ test("10000001000000", "" + sf_I + sf_I);
+ test("1000000null", "" + sf_I + f_oNtS);
+ test("1000000false", "" + sf_I + f_bl);
+ test("1000000null", "" + sf_I + sf_iAN);
+ test("1000000-2000000", "" + sf_I + sf_iM);
+ test("1000000-820130816", "" + sf_I + f_lM);
+ test("1000000null", "" + sf_I + sf_oAN);
+ test("100000025000000", "" + sf_I + s_I);
+ test("null-96.0", "" + f_oNtS + s_dM);
+ test("nullnull", "" + f_oNtS + s_oNtS);
+ test("null\u045176", "" + f_oNtS + f_strU);
+ test("null92", "" + f_oNtS + sf_strU2);
+ test("null51", "" + f_oNtS + sf_strU1);
+ test("nullnull", "" + f_oNtS + s_iAN);
+ test("null-54", "" + f_oNtS + f_bM);
+ test("null-87.0", "" + f_oNtS + f_fM);
+ test("nullnull", "" + f_oNtS + s_oAN);
+ test("null19", "" + f_oNtS + f_str);
+ test("null-41", "" + f_oNtS + sf_bM);
+ test("nullnull", "" + f_oNtS + sf_IN);
+ test("nullT", "" + f_oNtS + s_c);
+ test("null-42.0", "" + f_oNtS + sf_fM);
+ test("null25", "" + f_oNtS + s_b);
+ test("nullnull", "" + f_oNtS + f_oN);
+ test("null-1410065408", "" + f_oNtS + s_lM);
+ test("null8.0", "" + f_oNtS + s_d);
+ test("null55.0", "" + f_oNtS + s_f);
+ test("null97000000", "" + f_oNtS + s_i);
+ test("null-9900", "" + f_oNtS + f_sM);
+ test("null935228928", "" + f_oNtS + s_l);
+ test("null-8400", "" + f_oNtS + sf_sM);
+ test("nullC(82)", "" + f_oNtS + s_o);
+ test("nullnull", "" + f_oNtS + sf_oNtS);
+ test("nulltrue", "" + f_oNtS + s_bl);
+ test("null3900", "" + f_oNtS + s_s);
+ test("nullnull", "" + f_oNtS + sf_oN);
+ test("null94000000", "" + f_oNtS + f_I);
+ test("nullnull", "" + f_oNtS + f_IN);
+ test("nulltrue", "" + f_oNtS + sf_bl);
+ test("null5500", "" + f_oNtS + sf_s);
+ test("null-2900", "" + f_oNtS + s_sM);
+ test("null-194313216", "" + f_oNtS + sf_l);
+ test("null12", "" + f_oNtS + s_strU1);
+ test("nullC(87)", "" + f_oNtS + sf_o);
+ test("null91", "" + f_oNtS + s_strU2);
+ test("null21", "" + f_oNtS + f_strU1);
+ test("null18", "" + f_oNtS + f_strU2);
+ test("nullnull", "" + f_oNtS + f_iAN);
+ test("nullnull", "" + f_oNtS + s_oN);
+ test("null\u045180", "" + f_oNtS + s_strU);
+ test("nullC", "" + f_oNtS + sf_c);
+ test("null75", "" + f_oNtS + sf_str);
+ test("null-43", "" + f_oNtS + s_bM);
+ test("null80", "" + f_oNtS + sf_b);
+ test("nullnull", "" + f_oNtS + s_IN);
+ test("null-52.0", "" + f_oNtS + s_fM);
+ test("null75000000", "" + f_oNtS + sf_i);
+ test("null44", "" + f_oNtS + f_b);
+ test("null-1705032704", "" + f_oNtS + sf_lM);
+ test("nullnull", "" + f_oNtS + f_oAN);
+ test("null83.0", "" + f_oNtS + f_d);
+ test("nullI", "" + f_oNtS + f_c);
+ test("null94.0", "" + f_oNtS + f_f);
+ test("null12.0", "" + f_oNtS + sf_d);
+ test("null-99.0", "" + f_oNtS + f_dM);
+ test("null17.0", "" + f_oNtS + sf_f);
+ test("null-84.0", "" + f_oNtS + sf_dM);
+ test("null58000000", "" + f_oNtS + f_i);
+ test("null-55000000", "" + f_oNtS + f_iM);
+ test("null1460392448", "" + f_oNtS + f_l);
+ test("nullC(70)", "" + f_oNtS + f_o);
+ test("null\u04511", "" + f_oNtS + sf_strU);
+ test("null8000", "" + f_oNtS + f_s);
+ test("null18", "" + f_oNtS + s_str);
+ test("null-1000000", "" + f_oNtS + s_iM);
+ test("null1000000", "" + f_oNtS + sf_I);
+ test("nullnull", "" + f_oNtS + f_oNtS);
+ test("nullfalse", "" + f_oNtS + f_bl);
+ test("nullnull", "" + f_oNtS + sf_iAN);
+ test("null-2000000", "" + f_oNtS + sf_iM);
+ test("null-820130816", "" + f_oNtS + f_lM);
+ test("nullnull", "" + f_oNtS + sf_oAN);
+ test("null25000000", "" + f_oNtS + s_I);
+ test("false-96.0", "" + f_bl + s_dM);
+ test("falsenull", "" + f_bl + s_oNtS);
+ test("false\u045176", "" + f_bl + f_strU);
+ test("false92", "" + f_bl + sf_strU2);
+ test("false51", "" + f_bl + sf_strU1);
+ test("falsenull", "" + f_bl + s_iAN);
+ test("false-54", "" + f_bl + f_bM);
+ test("false-87.0", "" + f_bl + f_fM);
+ test("falsenull", "" + f_bl + s_oAN);
+ test("false19", "" + f_bl + f_str);
+ test("false-41", "" + f_bl + sf_bM);
+ test("falsenull", "" + f_bl + sf_IN);
+ test("falseT", "" + f_bl + s_c);
+ test("false-42.0", "" + f_bl + sf_fM);
+ test("false25", "" + f_bl + s_b);
+ test("falsenull", "" + f_bl + f_oN);
+ test("false-1410065408", "" + f_bl + s_lM);
+ test("false8.0", "" + f_bl + s_d);
+ test("false55.0", "" + f_bl + s_f);
+ test("false97000000", "" + f_bl + s_i);
+ test("false-9900", "" + f_bl + f_sM);
+ test("false935228928", "" + f_bl + s_l);
+ test("false-8400", "" + f_bl + sf_sM);
+ test("falseC(82)", "" + f_bl + s_o);
+ test("falsenull", "" + f_bl + sf_oNtS);
+ test("falsetrue", "" + f_bl + s_bl);
+ test("false3900", "" + f_bl + s_s);
+ test("falsenull", "" + f_bl + sf_oN);
+ test("false94000000", "" + f_bl + f_I);
+ test("falsenull", "" + f_bl + f_IN);
+ test("falsetrue", "" + f_bl + sf_bl);
+ test("false5500", "" + f_bl + sf_s);
+ test("false-2900", "" + f_bl + s_sM);
+ test("false-194313216", "" + f_bl + sf_l);
+ test("false12", "" + f_bl + s_strU1);
+ test("falseC(87)", "" + f_bl + sf_o);
+ test("false91", "" + f_bl + s_strU2);
+ test("false21", "" + f_bl + f_strU1);
+ test("false18", "" + f_bl + f_strU2);
+ test("falsenull", "" + f_bl + f_iAN);
+ test("falsenull", "" + f_bl + s_oN);
+ test("false\u045180", "" + f_bl + s_strU);
+ test("falseC", "" + f_bl + sf_c);
+ test("false75", "" + f_bl + sf_str);
+ test("false-43", "" + f_bl + s_bM);
+ test("false80", "" + f_bl + sf_b);
+ test("falsenull", "" + f_bl + s_IN);
+ test("false-52.0", "" + f_bl + s_fM);
+ test("false75000000", "" + f_bl + sf_i);
+ test("false44", "" + f_bl + f_b);
+ test("false-1705032704", "" + f_bl + sf_lM);
+ test("falsenull", "" + f_bl + f_oAN);
+ test("false83.0", "" + f_bl + f_d);
+ test("falseI", "" + f_bl + f_c);
+ test("false94.0", "" + f_bl + f_f);
+ test("false12.0", "" + f_bl + sf_d);
+ test("false-99.0", "" + f_bl + f_dM);
+ test("false17.0", "" + f_bl + sf_f);
+ test("false-84.0", "" + f_bl + sf_dM);
+ test("false58000000", "" + f_bl + f_i);
+ test("false-55000000", "" + f_bl + f_iM);
+ test("false1460392448", "" + f_bl + f_l);
+ test("falseC(70)", "" + f_bl + f_o);
+ test("false\u04511", "" + f_bl + sf_strU);
+ test("false8000", "" + f_bl + f_s);
+ test("false18", "" + f_bl + s_str);
+ test("false-1000000", "" + f_bl + s_iM);
+ test("false1000000", "" + f_bl + sf_I);
+ test("falsenull", "" + f_bl + f_oNtS);
+ test("falsefalse", "" + f_bl + f_bl);
+ test("falsenull", "" + f_bl + sf_iAN);
+ test("false-2000000", "" + f_bl + sf_iM);
+ test("false-820130816", "" + f_bl + f_lM);
+ test("falsenull", "" + f_bl + sf_oAN);
+ test("false25000000", "" + f_bl + s_I);
+ test("null-96.0", "" + sf_iAN + s_dM);
+ test("nullnull", "" + sf_iAN + s_oNtS);
+ test("null\u045176", "" + sf_iAN + f_strU);
+ test("null92", "" + sf_iAN + sf_strU2);
+ test("null51", "" + sf_iAN + sf_strU1);
+ test("nullnull", "" + sf_iAN + s_iAN);
+ test("null-54", "" + sf_iAN + f_bM);
+ test("null-87.0", "" + sf_iAN + f_fM);
+ test("nullnull", "" + sf_iAN + s_oAN);
+ test("null19", "" + sf_iAN + f_str);
+ test("null-41", "" + sf_iAN + sf_bM);
+ test("nullnull", "" + sf_iAN + sf_IN);
+ test("nullT", "" + sf_iAN + s_c);
+ test("null-42.0", "" + sf_iAN + sf_fM);
+ test("null25", "" + sf_iAN + s_b);
+ test("nullnull", "" + sf_iAN + f_oN);
+ test("null-1410065408", "" + sf_iAN + s_lM);
+ test("null8.0", "" + sf_iAN + s_d);
+ test("null55.0", "" + sf_iAN + s_f);
+ test("null97000000", "" + sf_iAN + s_i);
+ test("null-9900", "" + sf_iAN + f_sM);
+ test("null935228928", "" + sf_iAN + s_l);
+ test("null-8400", "" + sf_iAN + sf_sM);
+ test("nullC(82)", "" + sf_iAN + s_o);
+ test("nullnull", "" + sf_iAN + sf_oNtS);
+ test("nulltrue", "" + sf_iAN + s_bl);
+ test("null3900", "" + sf_iAN + s_s);
+ test("nullnull", "" + sf_iAN + sf_oN);
+ test("null94000000", "" + sf_iAN + f_I);
+ test("nullnull", "" + sf_iAN + f_IN);
+ test("nulltrue", "" + sf_iAN + sf_bl);
+ test("null5500", "" + sf_iAN + sf_s);
+ test("null-2900", "" + sf_iAN + s_sM);
+ test("null-194313216", "" + sf_iAN + sf_l);
+ test("null12", "" + sf_iAN + s_strU1);
+ test("nullC(87)", "" + sf_iAN + sf_o);
+ test("null91", "" + sf_iAN + s_strU2);
+ test("null21", "" + sf_iAN + f_strU1);
+ test("null18", "" + sf_iAN + f_strU2);
+ test("nullnull", "" + sf_iAN + f_iAN);
+ test("nullnull", "" + sf_iAN + s_oN);
+ test("null\u045180", "" + sf_iAN + s_strU);
+ test("nullC", "" + sf_iAN + sf_c);
+ test("null75", "" + sf_iAN + sf_str);
+ test("null-43", "" + sf_iAN + s_bM);
+ test("null80", "" + sf_iAN + sf_b);
+ test("nullnull", "" + sf_iAN + s_IN);
+ test("null-52.0", "" + sf_iAN + s_fM);
+ test("null75000000", "" + sf_iAN + sf_i);
+ test("null44", "" + sf_iAN + f_b);
+ test("null-1705032704", "" + sf_iAN + sf_lM);
+ test("nullnull", "" + sf_iAN + f_oAN);
+ test("null83.0", "" + sf_iAN + f_d);
+ test("nullI", "" + sf_iAN + f_c);
+ test("null94.0", "" + sf_iAN + f_f);
+ test("null12.0", "" + sf_iAN + sf_d);
+ test("null-99.0", "" + sf_iAN + f_dM);
+ test("null17.0", "" + sf_iAN + sf_f);
+ test("null-84.0", "" + sf_iAN + sf_dM);
+ test("null58000000", "" + sf_iAN + f_i);
+ test("null-55000000", "" + sf_iAN + f_iM);
+ test("null1460392448", "" + sf_iAN + f_l);
+ test("nullC(70)", "" + sf_iAN + f_o);
+ test("null\u04511", "" + sf_iAN + sf_strU);
+ test("null8000", "" + sf_iAN + f_s);
+ test("null18", "" + sf_iAN + s_str);
+ test("null-1000000", "" + sf_iAN + s_iM);
+ test("null1000000", "" + sf_iAN + sf_I);
+ test("nullnull", "" + sf_iAN + f_oNtS);
+ test("nullfalse", "" + sf_iAN + f_bl);
+ test("nullnull", "" + sf_iAN + sf_iAN);
+ test("null-2000000", "" + sf_iAN + sf_iM);
+ test("null-820130816", "" + sf_iAN + f_lM);
+ test("nullnull", "" + sf_iAN + sf_oAN);
+ test("null25000000", "" + sf_iAN + s_I);
+ test("-2000000-96.0", "" + sf_iM + s_dM);
+ test("-2000000null", "" + sf_iM + s_oNtS);
+ test("-2000000\u045176", "" + sf_iM + f_strU);
+ test("-200000092", "" + sf_iM + sf_strU2);
+ test("-200000051", "" + sf_iM + sf_strU1);
+ test("-2000000null", "" + sf_iM + s_iAN);
+ test("-2000000-54", "" + sf_iM + f_bM);
+ test("-2000000-87.0", "" + sf_iM + f_fM);
+ test("-2000000null", "" + sf_iM + s_oAN);
+ test("-200000019", "" + sf_iM + f_str);
+ test("-2000000-41", "" + sf_iM + sf_bM);
+ test("-2000000null", "" + sf_iM + sf_IN);
+ test("-2000000T", "" + sf_iM + s_c);
+ test("-2000000-42.0", "" + sf_iM + sf_fM);
+ test("-200000025", "" + sf_iM + s_b);
+ test("-2000000null", "" + sf_iM + f_oN);
+ test("-2000000-1410065408", "" + sf_iM + s_lM);
+ test("-20000008.0", "" + sf_iM + s_d);
+ test("-200000055.0", "" + sf_iM + s_f);
+ test("-200000097000000", "" + sf_iM + s_i);
+ test("-2000000-9900", "" + sf_iM + f_sM);
+ test("-2000000935228928", "" + sf_iM + s_l);
+ test("-2000000-8400", "" + sf_iM + sf_sM);
+ test("-2000000C(82)", "" + sf_iM + s_o);
+ test("-2000000null", "" + sf_iM + sf_oNtS);
+ test("-2000000true", "" + sf_iM + s_bl);
+ test("-20000003900", "" + sf_iM + s_s);
+ test("-2000000null", "" + sf_iM + sf_oN);
+ test("-200000094000000", "" + sf_iM + f_I);
+ test("-2000000null", "" + sf_iM + f_IN);
+ test("-2000000true", "" + sf_iM + sf_bl);
+ test("-20000005500", "" + sf_iM + sf_s);
+ test("-2000000-2900", "" + sf_iM + s_sM);
+ test("-2000000-194313216", "" + sf_iM + sf_l);
+ test("-200000012", "" + sf_iM + s_strU1);
+ test("-2000000C(87)", "" + sf_iM + sf_o);
+ test("-200000091", "" + sf_iM + s_strU2);
+ test("-200000021", "" + sf_iM + f_strU1);
+ test("-200000018", "" + sf_iM + f_strU2);
+ test("-2000000null", "" + sf_iM + f_iAN);
+ test("-2000000null", "" + sf_iM + s_oN);
+ test("-2000000\u045180", "" + sf_iM + s_strU);
+ test("-2000000C", "" + sf_iM + sf_c);
+ test("-200000075", "" + sf_iM + sf_str);
+ test("-2000000-43", "" + sf_iM + s_bM);
+ test("-200000080", "" + sf_iM + sf_b);
+ test("-2000000null", "" + sf_iM + s_IN);
+ test("-2000000-52.0", "" + sf_iM + s_fM);
+ test("-200000075000000", "" + sf_iM + sf_i);
+ test("-200000044", "" + sf_iM + f_b);
+ test("-2000000-1705032704", "" + sf_iM + sf_lM);
+ test("-2000000null", "" + sf_iM + f_oAN);
+ test("-200000083.0", "" + sf_iM + f_d);
+ test("-2000000I", "" + sf_iM + f_c);
+ test("-200000094.0", "" + sf_iM + f_f);
+ test("-200000012.0", "" + sf_iM + sf_d);
+ test("-2000000-99.0", "" + sf_iM + f_dM);
+ test("-200000017.0", "" + sf_iM + sf_f);
+ test("-2000000-84.0", "" + sf_iM + sf_dM);
+ test("-200000058000000", "" + sf_iM + f_i);
+ test("-2000000-55000000", "" + sf_iM + f_iM);
+ test("-20000001460392448", "" + sf_iM + f_l);
+ test("-2000000C(70)", "" + sf_iM + f_o);
+ test("-2000000\u04511", "" + sf_iM + sf_strU);
+ test("-20000008000", "" + sf_iM + f_s);
+ test("-200000018", "" + sf_iM + s_str);
+ test("-2000000-1000000", "" + sf_iM + s_iM);
+ test("-20000001000000", "" + sf_iM + sf_I);
+ test("-2000000null", "" + sf_iM + f_oNtS);
+ test("-2000000false", "" + sf_iM + f_bl);
+ test("-2000000null", "" + sf_iM + sf_iAN);
+ test("-2000000-2000000", "" + sf_iM + sf_iM);
+ test("-2000000-820130816", "" + sf_iM + f_lM);
+ test("-2000000null", "" + sf_iM + sf_oAN);
+ test("-200000025000000", "" + sf_iM + s_I);
+ test("-820130816-96.0", "" + f_lM + s_dM);
+ test("-820130816null", "" + f_lM + s_oNtS);
+ test("-820130816\u045176", "" + f_lM + f_strU);
+ test("-82013081692", "" + f_lM + sf_strU2);
+ test("-82013081651", "" + f_lM + sf_strU1);
+ test("-820130816null", "" + f_lM + s_iAN);
+ test("-820130816-54", "" + f_lM + f_bM);
+ test("-820130816-87.0", "" + f_lM + f_fM);
+ test("-820130816null", "" + f_lM + s_oAN);
+ test("-82013081619", "" + f_lM + f_str);
+ test("-820130816-41", "" + f_lM + sf_bM);
+ test("-820130816null", "" + f_lM + sf_IN);
+ test("-820130816T", "" + f_lM + s_c);
+ test("-820130816-42.0", "" + f_lM + sf_fM);
+ test("-82013081625", "" + f_lM + s_b);
+ test("-820130816null", "" + f_lM + f_oN);
+ test("-820130816-1410065408", "" + f_lM + s_lM);
+ test("-8201308168.0", "" + f_lM + s_d);
+ test("-82013081655.0", "" + f_lM + s_f);
+ test("-82013081697000000", "" + f_lM + s_i);
+ test("-820130816-9900", "" + f_lM + f_sM);
+ test("-820130816935228928", "" + f_lM + s_l);
+ test("-820130816-8400", "" + f_lM + sf_sM);
+ test("-820130816C(82)", "" + f_lM + s_o);
+ test("-820130816null", "" + f_lM + sf_oNtS);
+ test("-820130816true", "" + f_lM + s_bl);
+ test("-8201308163900", "" + f_lM + s_s);
+ test("-820130816null", "" + f_lM + sf_oN);
+ test("-82013081694000000", "" + f_lM + f_I);
+ test("-820130816null", "" + f_lM + f_IN);
+ test("-820130816true", "" + f_lM + sf_bl);
+ test("-8201308165500", "" + f_lM + sf_s);
+ test("-820130816-2900", "" + f_lM + s_sM);
+ test("-820130816-194313216", "" + f_lM + sf_l);
+ test("-82013081612", "" + f_lM + s_strU1);
+ test("-820130816C(87)", "" + f_lM + sf_o);
+ test("-82013081691", "" + f_lM + s_strU2);
+ test("-82013081621", "" + f_lM + f_strU1);
+ test("-82013081618", "" + f_lM + f_strU2);
+ test("-820130816null", "" + f_lM + f_iAN);
+ test("-820130816null", "" + f_lM + s_oN);
+ test("-820130816\u045180", "" + f_lM + s_strU);
+ test("-820130816C", "" + f_lM + sf_c);
+ test("-82013081675", "" + f_lM + sf_str);
+ test("-820130816-43", "" + f_lM + s_bM);
+ test("-82013081680", "" + f_lM + sf_b);
+ test("-820130816null", "" + f_lM + s_IN);
+ test("-820130816-52.0", "" + f_lM + s_fM);
+ test("-82013081675000000", "" + f_lM + sf_i);
+ test("-82013081644", "" + f_lM + f_b);
+ test("-820130816-1705032704", "" + f_lM + sf_lM);
+ test("-820130816null", "" + f_lM + f_oAN);
+ test("-82013081683.0", "" + f_lM + f_d);
+ test("-820130816I", "" + f_lM + f_c);
+ test("-82013081694.0", "" + f_lM + f_f);
+ test("-82013081612.0", "" + f_lM + sf_d);
+ test("-820130816-99.0", "" + f_lM + f_dM);
+ test("-82013081617.0", "" + f_lM + sf_f);
+ test("-820130816-84.0", "" + f_lM + sf_dM);
+ test("-82013081658000000", "" + f_lM + f_i);
+ test("-820130816-55000000", "" + f_lM + f_iM);
+ test("-8201308161460392448", "" + f_lM + f_l);
+ test("-820130816C(70)", "" + f_lM + f_o);
+ test("-820130816\u04511", "" + f_lM + sf_strU);
+ test("-8201308168000", "" + f_lM + f_s);
+ test("-82013081618", "" + f_lM + s_str);
+ test("-820130816-1000000", "" + f_lM + s_iM);
+ test("-8201308161000000", "" + f_lM + sf_I);
+ test("-820130816null", "" + f_lM + f_oNtS);
+ test("-820130816false", "" + f_lM + f_bl);
+ test("-820130816null", "" + f_lM + sf_iAN);
+ test("-820130816-2000000", "" + f_lM + sf_iM);
+ test("-820130816-820130816", "" + f_lM + f_lM);
+ test("-820130816null", "" + f_lM + sf_oAN);
+ test("-82013081625000000", "" + f_lM + s_I);
+ test("null-96.0", "" + sf_oAN + s_dM);
+ test("nullnull", "" + sf_oAN + s_oNtS);
+ test("null\u045176", "" + sf_oAN + f_strU);
+ test("null92", "" + sf_oAN + sf_strU2);
+ test("null51", "" + sf_oAN + sf_strU1);
+ test("nullnull", "" + sf_oAN + s_iAN);
+ test("null-54", "" + sf_oAN + f_bM);
+ test("null-87.0", "" + sf_oAN + f_fM);
+ test("nullnull", "" + sf_oAN + s_oAN);
+ test("null19", "" + sf_oAN + f_str);
+ test("null-41", "" + sf_oAN + sf_bM);
+ test("nullnull", "" + sf_oAN + sf_IN);
+ test("nullT", "" + sf_oAN + s_c);
+ test("null-42.0", "" + sf_oAN + sf_fM);
+ test("null25", "" + sf_oAN + s_b);
+ test("nullnull", "" + sf_oAN + f_oN);
+ test("null-1410065408", "" + sf_oAN + s_lM);
+ test("null8.0", "" + sf_oAN + s_d);
+ test("null55.0", "" + sf_oAN + s_f);
+ test("null97000000", "" + sf_oAN + s_i);
+ test("null-9900", "" + sf_oAN + f_sM);
+ test("null935228928", "" + sf_oAN + s_l);
+ test("null-8400", "" + sf_oAN + sf_sM);
+ test("nullC(82)", "" + sf_oAN + s_o);
+ test("nullnull", "" + sf_oAN + sf_oNtS);
+ test("nulltrue", "" + sf_oAN + s_bl);
+ test("null3900", "" + sf_oAN + s_s);
+ test("nullnull", "" + sf_oAN + sf_oN);
+ test("null94000000", "" + sf_oAN + f_I);
+ test("nullnull", "" + sf_oAN + f_IN);
+ test("nulltrue", "" + sf_oAN + sf_bl);
+ test("null5500", "" + sf_oAN + sf_s);
+ test("null-2900", "" + sf_oAN + s_sM);
+ test("null-194313216", "" + sf_oAN + sf_l);
+ test("null12", "" + sf_oAN + s_strU1);
+ test("nullC(87)", "" + sf_oAN + sf_o);
+ test("null91", "" + sf_oAN + s_strU2);
+ test("null21", "" + sf_oAN + f_strU1);
+ test("null18", "" + sf_oAN + f_strU2);
+ test("nullnull", "" + sf_oAN + f_iAN);
+ test("nullnull", "" + sf_oAN + s_oN);
+ test("null\u045180", "" + sf_oAN + s_strU);
+ test("nullC", "" + sf_oAN + sf_c);
+ test("null75", "" + sf_oAN + sf_str);
+ test("null-43", "" + sf_oAN + s_bM);
+ test("null80", "" + sf_oAN + sf_b);
+ test("nullnull", "" + sf_oAN + s_IN);
+ test("null-52.0", "" + sf_oAN + s_fM);
+ test("null75000000", "" + sf_oAN + sf_i);
+ test("null44", "" + sf_oAN + f_b);
+ test("null-1705032704", "" + sf_oAN + sf_lM);
+ test("nullnull", "" + sf_oAN + f_oAN);
+ test("null83.0", "" + sf_oAN + f_d);
+ test("nullI", "" + sf_oAN + f_c);
+ test("null94.0", "" + sf_oAN + f_f);
+ test("null12.0", "" + sf_oAN + sf_d);
+ test("null-99.0", "" + sf_oAN + f_dM);
+ test("null17.0", "" + sf_oAN + sf_f);
+ test("null-84.0", "" + sf_oAN + sf_dM);
+ test("null58000000", "" + sf_oAN + f_i);
+ test("null-55000000", "" + sf_oAN + f_iM);
+ test("null1460392448", "" + sf_oAN + f_l);
+ test("nullC(70)", "" + sf_oAN + f_o);
+ test("null\u04511", "" + sf_oAN + sf_strU);
+ test("null8000", "" + sf_oAN + f_s);
+ test("null18", "" + sf_oAN + s_str);
+ test("null-1000000", "" + sf_oAN + s_iM);
+ test("null1000000", "" + sf_oAN + sf_I);
+ test("nullnull", "" + sf_oAN + f_oNtS);
+ test("nullfalse", "" + sf_oAN + f_bl);
+ test("nullnull", "" + sf_oAN + sf_iAN);
+ test("null-2000000", "" + sf_oAN + sf_iM);
+ test("null-820130816", "" + sf_oAN + f_lM);
+ test("nullnull", "" + sf_oAN + sf_oAN);
+ test("null25000000", "" + sf_oAN + s_I);
+ test("25000000-96.0", "" + s_I + s_dM);
+ test("25000000null", "" + s_I + s_oNtS);
+ test("25000000\u045176", "" + s_I + f_strU);
+ test("2500000092", "" + s_I + sf_strU2);
+ test("2500000051", "" + s_I + sf_strU1);
+ test("25000000null", "" + s_I + s_iAN);
+ test("25000000-54", "" + s_I + f_bM);
+ test("25000000-87.0", "" + s_I + f_fM);
+ test("25000000null", "" + s_I + s_oAN);
+ test("2500000019", "" + s_I + f_str);
+ test("25000000-41", "" + s_I + sf_bM);
+ test("25000000null", "" + s_I + sf_IN);
+ test("25000000T", "" + s_I + s_c);
+ test("25000000-42.0", "" + s_I + sf_fM);
+ test("2500000025", "" + s_I + s_b);
+ test("25000000null", "" + s_I + f_oN);
+ test("25000000-1410065408", "" + s_I + s_lM);
+ test("250000008.0", "" + s_I + s_d);
+ test("2500000055.0", "" + s_I + s_f);
+ test("2500000097000000", "" + s_I + s_i);
+ test("25000000-9900", "" + s_I + f_sM);
+ test("25000000935228928", "" + s_I + s_l);
+ test("25000000-8400", "" + s_I + sf_sM);
+ test("25000000C(82)", "" + s_I + s_o);
+ test("25000000null", "" + s_I + sf_oNtS);
+ test("25000000true", "" + s_I + s_bl);
+ test("250000003900", "" + s_I + s_s);
+ test("25000000null", "" + s_I + sf_oN);
+ test("2500000094000000", "" + s_I + f_I);
+ test("25000000null", "" + s_I + f_IN);
+ test("25000000true", "" + s_I + sf_bl);
+ test("250000005500", "" + s_I + sf_s);
+ test("25000000-2900", "" + s_I + s_sM);
+ test("25000000-194313216", "" + s_I + sf_l);
+ test("2500000012", "" + s_I + s_strU1);
+ test("25000000C(87)", "" + s_I + sf_o);
+ test("2500000091", "" + s_I + s_strU2);
+ test("2500000021", "" + s_I + f_strU1);
+ test("2500000018", "" + s_I + f_strU2);
+ test("25000000null", "" + s_I + f_iAN);
+ test("25000000null", "" + s_I + s_oN);
+ test("25000000\u045180", "" + s_I + s_strU);
+ test("25000000C", "" + s_I + sf_c);
+ test("2500000075", "" + s_I + sf_str);
+ test("25000000-43", "" + s_I + s_bM);
+ test("2500000080", "" + s_I + sf_b);
+ test("25000000null", "" + s_I + s_IN);
+ test("25000000-52.0", "" + s_I + s_fM);
+ test("2500000075000000", "" + s_I + sf_i);
+ test("2500000044", "" + s_I + f_b);
+ test("25000000-1705032704", "" + s_I + sf_lM);
+ test("25000000null", "" + s_I + f_oAN);
+ test("2500000083.0", "" + s_I + f_d);
+ test("25000000I", "" + s_I + f_c);
+ test("2500000094.0", "" + s_I + f_f);
+ test("2500000012.0", "" + s_I + sf_d);
+ test("25000000-99.0", "" + s_I + f_dM);
+ test("2500000017.0", "" + s_I + sf_f);
+ test("25000000-84.0", "" + s_I + sf_dM);
+ test("2500000058000000", "" + s_I + f_i);
+ test("25000000-55000000", "" + s_I + f_iM);
+ test("250000001460392448", "" + s_I + f_l);
+ test("25000000C(70)", "" + s_I + f_o);
+ test("25000000\u04511", "" + s_I + sf_strU);
+ test("250000008000", "" + s_I + f_s);
+ test("2500000018", "" + s_I + s_str);
+ test("25000000-1000000", "" + s_I + s_iM);
+ test("250000001000000", "" + s_I + sf_I);
+ test("25000000null", "" + s_I + f_oNtS);
+ test("25000000false", "" + s_I + f_bl);
+ test("25000000null", "" + s_I + sf_iAN);
+ test("25000000-2000000", "" + s_I + sf_iM);
+ test("25000000-820130816", "" + s_I + f_lM);
+ test("25000000null", "" + s_I + sf_oAN);
+ test("2500000025000000", "" + s_I + s_I);
+ }
+
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/ImplicitStringConcatShapesTestGen.java 2016-01-15 13:31:24.039215708 +0300
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+
+public class ImplicitStringConcatShapesTestGen {
+ public static String escapeToUnicode(String str) {
+ StringBuilder b = new StringBuilder();
+ for (char c : str.toCharArray()) {
+ if (c < 128) {
+ b.append(c);
+ } else {
+ b.append("\\u").append(String.format("%04X", (int) c));
+ }
+ }
+ return b.toString();
+ }
+
+ public static void main(String... args) throws IOException {
+ PrintWriter pw = new PrintWriter(System.out);
+
+ String[] types = {
+ "boolean",
+ "byte",
+ "byteMinus",
+ "char",
+ "short",
+ "shortMinus",
+ "int",
+ "intMinus",
+ "integer",
+ "integerNull",
+ "float",
+ "floatMinus",
+ "long",
+ "longMinus",
+ "double",
+ "doubleMinus",
+ "object",
+ "objectNull",
+ "objectNullToString",
+ "String",
+ "StringUTF16",
+ "StringU1",
+ "StringU2",
+ "intArrayNull",
+ "objectArrayNull",
+ };
+
+ for (String t : Files.readAllLines(Paths.get("ImplicitStringConcatShapes-head.template"))) {
+ pw.println(t);
+ }
+
+ Map values = new HashMap<>();
+
+ Random current = new Random(12345);
+ for (int mode = 0; mode <= 2; mode++) {
+ for (String type : types) {
+ int i = current.nextInt(100);
+ boolean isStatic = (mode | 1) == 1;
+ boolean isFinal = (mode | 2) == 2;
+ String fieldName = (isStatic ? "s" : "") + (isFinal ? "f" : "") + "_" + typeSig(type);
+ String value = initValue(type, i);
+ String stringValue = stringValue(type, i);
+ values.put(fieldName, stringValue);
+ pw.printf(" %s %s %s %s = %s;%n", isStatic ? "static" : "", isFinal ? "final" : "", typeValue(type, i), fieldName, value);
+ }
+ }
+
+ pw.println();
+
+ List lines = new ArrayList<>();
+ List l = new ArrayList<>(values.keySet());
+
+ for (String l1 : l) {
+ lines.add(String.format("test(\"%s\", \"\" + %s);",
+ escapeToUnicode(values.get(l1)),
+ l1
+ ));
+ }
+
+ for (String l1 : l) {
+ for (String l2 : l) {
+ lines.add(String.format("test(\"%s\", \"\" + %s + %s);",
+ escapeToUnicode(values.get(l1) + values.get(l2)),
+ l1, l2
+ ));
+ }
+ }
+
+ final int STRIDE = 1000;
+ int strides = lines.size() / STRIDE + 1;
+
+ pw.println(" public void run() {");
+ for (int c = 0; c < strides; c++) {
+ pw.println(" run" + c + "();");
+ }
+ pw.println(" }");
+ pw.println();
+
+ for (int c = 0; c < strides; c++) {
+ pw.println(" public void run" + c + "() {");
+ for (String line : lines.subList(c * STRIDE, Math.min(lines.size(), (c+1) * STRIDE))) {
+ pw.println(" " + line);
+ }
+ pw.println(" }");
+ pw.println();
+ }
+
+ pw.println("}");
+
+ pw.flush();
+ pw.close();
+ }
+
+ private static String typeSig(String type) {
+ switch (type) {
+ case "boolean": return "bl";
+ case "byte": return "b";
+ case "byteMinus": return "bM";
+ case "short": return "s";
+ case "shortMinus": return "sM";
+ case "char": return "c";
+ case "int": return "i";
+ case "intMinus": return "iM";
+ case "integer": return "I";
+ case "integerNull": return "IN";
+ case "float": return "f";
+ case "floatMinus": return "fM";
+ case "long": return "l";
+ case "longMinus": return "lM";
+ case "double": return "d";
+ case "doubleMinus": return "dM";
+ case "String": return "str";
+ case "StringUTF16": return "strU";
+ case "StringU1": return "strU1";
+ case "StringU2": return "strU2";
+ case "object": return "o";
+ case "objectNull": return "oN";
+ case "objectNullToString": return "oNtS";
+ case "intArrayNull": return "iAN";
+ case "objectArrayNull": return "oAN";
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ private static String typeValue(String type, int i) {
+ switch (type) {
+ case "boolean":
+ case "byte":
+ case "byteMinus":
+ case "char":
+ case "short":
+ case "shortMinus":
+ case "int":
+ case "intMinus":
+ case "float":
+ case "floatMinus":
+ case "long":
+ case "longMinus":
+ case "double":
+ case "doubleMinus":
+ return type.replace("Minus", "");
+ case "String":
+ case "StringUTF16":
+ case "StringU1":
+ case "StringU2":
+ return "String";
+ case "object":
+ case "objectNull":
+ case "objectNullToString":
+ return "Object";
+ case "integer":
+ case "integerNull":
+ return "Integer";
+ case "intArrayNull":
+ return "int[]";
+ case "objectArrayNull":
+ return "Object[]";
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ private static String initValue(String type, int i) {
+ switch (type) {
+ case "boolean":
+ return String.valueOf((i & 1) == 1);
+ case "byte":
+ return String.valueOf(i);
+ case "byteMinus":
+ return String.valueOf(-i);
+ case "short":
+ return String.valueOf(i*100);
+ case "shortMinus":
+ return String.valueOf(-i*100);
+ case "intMinus":
+ return String.valueOf(-i*1_000_000);
+ case "int":
+ case "integer":
+ return String.valueOf(i*1_000_000);
+ case "long":
+ return String.valueOf(i*1_000_000_000) + "L";
+ case "longMinus":
+ return String.valueOf(-i*1_000_000_000) + "L";
+ case "char":
+ return "'" + (char)(i % 26 + 65) + "'";
+ case "double":
+ return String.valueOf(i) + ".0d";
+ case "doubleMinus":
+ return "-" + String.valueOf(i) + ".0d";
+ case "float":
+ return String.valueOf(i) + ".0f";
+ case "floatMinus":
+ return "-" + String.valueOf(i) + ".0f";
+ case "object":
+ return "new MyClass(" + i + ")";
+ case "objectNullToString":
+ return "new MyClassNullToString()";
+ case "integerNull":
+ case "objectNull":
+ case "intArrayNull":
+ case "objectArrayNull":
+ return "null";
+ case "String":
+ return "\"" + i + "\"";
+ case "StringUTF16":
+ return "\"\\u0451" + i + "\"";
+ case "StringU1":
+ return "\"\\u0001" + i + "\"";
+ case "StringU2":
+ return "\"\\u0002" + i + "\"";
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ private static String stringValue(String type, int i) {
+ switch (type) {
+ case "boolean":
+ return String.valueOf((i & 1) == 1);
+ case "byte":
+ return String.valueOf(i);
+ case "byteMinus":
+ return String.valueOf(-i);
+ case "short":
+ return String.valueOf(i*100);
+ case "shortMinus":
+ return String.valueOf(-i*100);
+ case "intMinus":
+ return String.valueOf(-i*1_000_000);
+ case "int":
+ case "integer":
+ return String.valueOf(i*1_000_000);
+ case "long":
+ return String.valueOf(i*1_000_000_000);
+ case "longMinus":
+ return String.valueOf(-i*1_000_000_000);
+ case "char":
+ return String.valueOf((char) (i % 26 + 65));
+ case "double":
+ case "float":
+ return String.valueOf(i) + ".0";
+ case "doubleMinus":
+ case "floatMinus":
+ return "-" + String.valueOf(i) + ".0";
+ case "object":
+ return "C(" + i + ")";
+ case "integerNull":
+ case "objectNull":
+ case "objectNullToString":
+ case "intArrayNull":
+ case "objectArrayNull":
+ return "null";
+ case "String":
+ return "" + i;
+ case "StringUTF16":
+ return "\u0451" + i;
+ case "StringU1":
+ return "\u0001" + i;
+ case "StringU2":
+ return "\u0002" + i;
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/StringConcatFactoryInvariants.java 2016-01-15 13:31:24.599212877 +0300
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.Serializable;
+import java.lang.invoke.*;
+import java.util.concurrent.Callable;
+
+/**
+ * @test
+ * @summary Test input invariants for StringConcatFactory
+ *
+ * @compile StringConcatFactoryInvariants.java
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT StringConcatFactoryInvariants
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true StringConcatFactoryInvariants
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ *
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ * @run main/othervm -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT -Djava.lang.invoke.stringConcat.debug=true -Djava.lang.invoke.stringConcat.cache=true StringConcatFactoryInvariants
+ *
+*/
+public class StringConcatFactoryInvariants {
+
+ private static final char TAG_ARG = '\u0001';
+ private static final char TAG_CONST = '\u0002';
+
+ public static void main(String[] args) throws Throwable {
+ MethodHandles.Lookup lookup = MethodHandles.publicLookup();
+ String methodName = "foo";
+ MethodType mt = MethodType.methodType(String.class, String.class, int.class);
+ String recipe = "" + TAG_ARG + TAG_ARG + TAG_CONST;
+ String[] constants = new String[]{"bar"};
+
+ final int LIMIT = 200;
+
+ // Simple factory: check for dynamic arguments overflow
+ Class>[] underThreshold = new Class>[LIMIT - 1];
+ Class>[] threshold = new Class>[LIMIT];
+ Class>[] overThreshold = new Class>[LIMIT + 1];
+
+ StringBuilder sbUnderThreshold = new StringBuilder();
+ sbUnderThreshold.append(TAG_CONST);
+ for (int c = 0; c < LIMIT - 1; c++) {
+ underThreshold[c] = int.class;
+ threshold[c] = int.class;
+ overThreshold[c] = int.class;
+ sbUnderThreshold.append(TAG_ARG);
+ }
+ threshold[LIMIT - 1] = int.class;
+ overThreshold[LIMIT - 1] = int.class;
+ overThreshold[LIMIT] = int.class;
+
+ String recipeEmpty = "";
+ String recipeUnderThreshold = sbUnderThreshold.toString();
+ String recipeThreshold = sbUnderThreshold.append(TAG_ARG).toString();
+ String recipeOverThreshold = sbUnderThreshold.append(TAG_ARG).toString();
+
+ MethodType mtEmpty = MethodType.methodType(String.class);
+ MethodType mtUnderThreshold = MethodType.methodType(String.class, underThreshold);
+ MethodType mtThreshold = MethodType.methodType(String.class, threshold);
+ MethodType mtOverThreshold = MethodType.methodType(String.class, overThreshold);
+
+
+ // Check the basic functionality is working
+ {
+ CallSite cs = StringConcatFactory.makeConcat(lookup, methodName, mt);
+ test("foo42", (String) cs.getTarget().invokeExact("foo", 42));
+ }
+
+ {
+ CallSite cs = StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, constants);
+ test("foo42bar", (String) cs.getTarget().invokeExact("foo", 42));
+ }
+
+ // Simple factory, check for nulls:
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcat(null, methodName, mt));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcat(lookup, null, mt));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, null));
+
+ // Advanced factory, check for nulls:
+ failNPE("Lookup is null",
+ () -> StringConcatFactory.makeConcatWithConstants(null, methodName, mt, recipe, constants));
+
+ failNPE("Method name is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, null, mt, recipe, constants));
+
+ failNPE("MethodType is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, null, recipe, constants));
+
+ failNPE("Recipe is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, null, constants));
+
+ failNPE("Constants vararg is null",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mt, recipe, null));
+
+ // Simple factory, check for return type
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(void.class, String.class, int.class)));
+
+ fail("Return type: int",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(int.class, String.class, int.class)));
+
+ fail("Return type: StringBuilder",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(StringBuilder.class, String.class, int.class)));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class)));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class)));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class)));
+
+ // Advanced factory, check for return types
+ fail("Return type: void",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(void.class, String.class, int.class), recipe, constants));
+
+ fail("Return type: int",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(int.class, String.class, int.class), recipe, constants));
+
+ fail("Return type: StringBuilder",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(StringBuilder.class, String.class, int.class), recipe, constants));
+
+ ok("Return type: Object",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Object.class, String.class, int.class), recipe, constants));
+
+ ok("Return type: CharSequence",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(CharSequence.class, String.class, int.class), recipe, constants));
+
+ ok("Return type: Serializable",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(Serializable.class, String.class, int.class), recipe, constants));
+
+ // Simple factory: check for dynamic arguments overflow
+ ok("Dynamic arguments is under limit",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, mtUnderThreshold));
+
+ ok("Dynamic arguments is at the limit",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, mtThreshold));
+
+ fail("Dynamic arguments is over the limit",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, mtOverThreshold));
+
+ // Advanced factory: check for dynamic arguments overflow
+ ok("Dynamic arguments is under limit",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtUnderThreshold, recipeUnderThreshold, constants));
+
+ ok("Dynamic arguments is at the limit",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeThreshold, constants));
+
+ fail("Dynamic arguments is over the limit",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtOverThreshold, recipeOverThreshold, constants));
+
+ // Advanced factory: check for mismatched recipe and Constants
+ ok("Static arguments and recipe match",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeThreshold, "bar"));
+
+ fail("Static arguments and recipe mismatch",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeThreshold, "bar", "baz"));
+
+ // Advanced factory: check for mismatched recipe and dynamic arguments
+ fail("Dynamic arguments and recipe mismatch",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeUnderThreshold, constants));
+
+ ok("Dynamic arguments and recipe match",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeThreshold, constants));
+
+ fail("Dynamic arguments and recipe mismatch",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtThreshold, recipeOverThreshold, constants));
+
+ // Test passing array as constant
+ {
+ String[] arg = {"boo", "bar"};
+
+ CallSite cs1 = StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST + TAG_CONST, arg);
+ test("42boobar", (String) cs1.getTarget().invokeExact(42));
+ }
+
+ // Test passing null constant
+ ok("Can pass regular constants",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, "foo"));
+
+ failNPE("Cannot pass null constants",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, MethodType.methodType(String.class, int.class), "" + TAG_ARG + TAG_CONST, new String[]{null}));
+
+ // Simple factory: test empty arguments
+ ok("Ok to pass empty arguments",
+ () -> StringConcatFactory.makeConcat(lookup, methodName, mtEmpty));
+
+ // Advanced factory: test empty arguments
+ ok("Ok to pass empty arguments",
+ () -> StringConcatFactory.makeConcatWithConstants(lookup, methodName, mtEmpty, recipeEmpty));
+ }
+
+ public static void ok(String msg, Callable runnable) {
+ try {
+ runnable.call();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ throw new IllegalStateException(msg + ", should have passed", e);
+ }
+ }
+
+ public static void fail(String msg, Callable runnable) {
+ boolean expected = false;
+ try {
+ runnable.call();
+ } catch (StringConcatException e) {
+ expected = true;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ if (!expected) {
+ throw new IllegalStateException(msg + ", should have failed with StringConcatException");
+ }
+ }
+
+
+ public static void failNPE(String msg, Callable runnable) {
+ boolean expected = false;
+ try {
+ runnable.call();
+ } catch (NullPointerException e) {
+ expected = true;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ if (!expected) {
+ throw new IllegalStateException(msg + ", should have failed with NullPointerException");
+ }
+ }
+
+ public static void test(String expected, String actual) {
+ // Fingers crossed: String concat should work.
+ if (!expected.equals(actual)) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Expected = ");
+ sb.append(expected);
+ sb.append(", actual = ");
+ sb.append(actual);
+ throw new IllegalStateException(sb.toString());
+ }
+ }
+
+}
--- /dev/null 2015-12-31 16:52:30.889242021 +0300
+++ new/test/java/lang/String/concat/update-tests.sh 2016-01-15 13:31:25.107210313 +0300
@@ -0,0 +1,26 @@
+# Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+
+#!/bin/bash
+
+javac ImplicitStringConcatShapesTestGen.java
+java ImplicitStringConcatShapesTestGen > ImplicitStringConcatShapes.java
+rm ImplicitStringConcatShapesTestGen.class