diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/Context.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/Context.java index 26626be3bf6..8dcd291bd8a 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/Context.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/Context.java @@ -81,8 +81,6 @@ import java.util.MissingResourceException; */ public class Context { - public static final String languageVersionProperty = "language version"; - public static final String errorReporterProperty = "error reporter"; /** * Create a new Context. @@ -308,26 +306,6 @@ public class Context { this.version = version; } - /** - * Get the implementation version. - * - *

- * The implementation version is of the form - *

-     *    "name langVer release relNum date"
-     * 
- * where name is the name of the product, langVer is - * the language version, relNum is the release number, and - * date is the release date for that specific - * release in the form "yyyy mm dd". - * - * @return a string that encodes the product, language version, release - * number, and date. - */ - public String getImplementationVersion() { - return "Rhino 1.5 release 4.1 2003 04 21"; - } - /** * Get the current error reporter. * @@ -361,49 +339,6 @@ public class Context { return locale; } - /** - * Set the current locale. - * - * @see java.util.Locale - */ - public Locale setLocale(Locale loc) { - Locale result = locale; - locale = loc; - return result; - } - - /** - * Notify any registered listeners that a bounded property has changed - * @see #addPropertyChangeListener(java.beans.PropertyChangeListener) - * @see #removePropertyChangeListener(java.beans.PropertyChangeListener) - * @see java.beans.PropertyChangeListener - * @see java.beans.PropertyChangeEvent - * @param property the bound property - * @param oldValue the old value - * @param newVale the new value - */ - void firePropertyChange(String property, Object oldValue, - Object newValue) - { - Object[] array = listeners; - if (array != null) { - firePropertyChangeImpl(array, property, oldValue, newValue); - } - } - - private void firePropertyChangeImpl(Object[] array, String property, - Object oldValue, Object newValue) - { - for (int i = array.length; i-- != 0;) { - Object obj = array[i]; - if (obj instanceof PropertyChangeListener) { - PropertyChangeListener l = (PropertyChangeListener)obj; - l.propertyChange(new PropertyChangeEvent( - this, property, oldValue, newValue)); - } - } - } - /** * Report a warning using the error reporter for the current thread. * @@ -423,20 +358,6 @@ public class Context { lineSource, lineOffset); } - /** - * Report a warning using the error reporter for the current thread. - * - * @param message the warning message to report - * @see org.mozilla.javascript.ErrorReporter - */ - /* - public static void reportWarning(String message) { - int[] linep = { 0 }; - String filename = getSourcePositionFromStack(linep); - Context.reportWarning(message, filename, linep[0], null, 0); - } - */ - /** * Report an error using the error reporter for the current thread. * @@ -461,155 +382,6 @@ public class Context { } } - /** - * Report an error using the error reporter for the current thread. - * - * @param message the error message to report - * @see org.mozilla.javascript.ErrorReporter - */ - /* - public static void reportError(String message) { - int[] linep = { 0 }; - String filename = getSourcePositionFromStack(linep); - Context.reportError(message, filename, linep[0], null, 0); - } - */ - - /** - * Report a runtime error using the error reporter for the current thread. - * - * @param message the error message to report - * @param sourceName a string describing the source, such as a filename - * @param lineno the starting line number - * @param lineSource the text of the line (may be null) - * @param lineOffset the offset into lineSource where problem was detected - * @return a runtime exception that will be thrown to terminate the - * execution of the script - * @see org.mozilla.javascript.ErrorReporter - */ - /* - public static EvaluatorException reportRuntimeError(String message, - String sourceName, - int lineno, - String lineSource, - int lineOffset) - { - Context cx = getCurrentContext(); - if (cx != null) { - cx.errorCount++; - return cx.getErrorReporter(). - runtimeError(message, sourceName, lineno, - lineSource, lineOffset); - } else { - throw new EvaluatorException(message); - } - } - - static EvaluatorException reportRuntimeError0(String messageId) { - return reportRuntimeError(getMessage0(messageId)); - } - - static EvaluatorException reportRuntimeError1 - (String messageId, Object arg1) - { - return reportRuntimeError(getMessage1(messageId, arg1)); - } - - static EvaluatorException reportRuntimeError2 - (String messageId, Object arg1, Object arg2) - { - return reportRuntimeError(getMessage2(messageId, arg1, arg2)); - } - - static EvaluatorException reportRuntimeError3 - (String messageId, Object arg1, Object arg2, Object arg3) - { - return reportRuntimeError(getMessage3(messageId, arg1, arg2, arg3)); - } - */ - - /** - * Report a runtime error using the error reporter for the current thread. - * - * @param message the error message to report - * @see org.mozilla.javascript.ErrorReporter - */ - /* - public static EvaluatorException reportRuntimeError(String message) { - int[] linep = { 0 }; - String filename = getSourcePositionFromStack(linep); - return Context.reportRuntimeError(message, filename, linep[0], null, 0); - } - */ - - /** - * Get a value corresponding to a key. - *

- * Since the Context is associated with a thread it can be - * used to maintain values that can be later retrieved using - * the current thread. - *

- * Note that the values are maintained with the Context, so - * if the Context is disassociated from the thread the values - * cannot be retreived. Also, if private data is to be maintained - * in this manner the key should be a java.lang.Object - * whose reference is not divulged to untrusted code. - * @param key the key used to lookup the value - * @return a value previously stored using putThreadLocal. - */ - public final Object getThreadLocal(Object key) { - if (hashtable == null) - return null; - return hashtable.get(key); - } - - /** - * Put a value that can later be retrieved using a given key. - *

- * @param key the key used to index the value - * @param value the value to save - */ - public void putThreadLocal(Object key, Object value) { - if (hashtable == null) - hashtable = new Hashtable(); - hashtable.put(key, value); - } - - /** - * Remove values from thread-local storage. - * @param key the key for the entry to remove. - * @since 1.5 release 2 - */ - public void removeThreadLocal(Object key) { - if (hashtable == null) - return; - hashtable.remove(key); - } - - /** - * Return whether functions are compiled by this context using - * dynamic scope. - *

- * If functions are compiled with dynamic scope, then they execute - * in the scope of their caller, rather than in their parent scope. - * This is useful for sharing functions across multiple scopes. - * @since 1.5 Release 1 - */ - public final boolean hasCompileFunctionsWithDynamicScope() { - return compileFunctionsWithDynamicScopeFlag; - } - - /** - * Set whether functions compiled by this context should use - * dynamic scope. - *

- * @param flag if true, compile functions with dynamic scope - * @since 1.5 Release 1 - */ - public void setCompileFunctionsWithDynamicScope(boolean flag) { - compileFunctionsWithDynamicScopeFlag = flag; - } - /** * if hasFeature(FEATURE_NON_ECMA_GET_YEAR) returns true, * Date.prototype.getYear subtructs 1900 only if 1900 <= date < 2000 @@ -690,21 +462,11 @@ public class Context { return getMessage(messageId, null); } - static String getMessage1(String messageId, Object arg1) { - Object[] arguments = {arg1}; - return getMessage(messageId, arguments); - } - static String getMessage2(String messageId, Object arg1, Object arg2) { Object[] arguments = {arg1, arg2}; return getMessage(messageId, arguments); } - static String getMessage3 - (String messageId, Object arg1, Object arg2, Object arg3) { - Object[] arguments = {arg1, arg2, arg3}; - return getMessage(messageId, arguments); - } /** * Internal method that reports an error for missing calls to * enter(). @@ -734,11 +496,6 @@ public class Context { static final boolean printTrees = true; static final boolean printICode = true; - final boolean isVersionECMA1() { - return version == VERSION_DEFAULT || version >= VERSION_1_3; - } - - // Rudimentary support for Design-by-Contract static void codeBug() { throw new RuntimeException("FAILED ASSERTION"); diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/DToA.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/DToA.java deleted file mode 100644 index 43500db51bb..00000000000 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/DToA.java +++ /dev/null @@ -1,1216 +0,0 @@ -/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1997-1999 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * Waldemar Horwat - * Roger Lawrence - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License (the "GPL"), in which case the - * provisions of the GPL are applicable instead of those above. - * If you wish to allow use of your version of this file only - * under the terms of the GPL and not to allow others to use your - * version of this file under the NPL, indicate your decision by - * deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete - * the provisions above, a recipient may use your version of this - * file under either the NPL or the GPL. - */ -// Modified by Google - -/**************************************************************** - * - * The author of this software is David M. Gay. - * - * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose without fee is hereby granted, provided that this entire notice - * is included in all copies of any software which is or includes a copy - * or modification of this software and in all copies of the supporting - * documentation for such software. - * - * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY - * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY - * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. - * - ***************************************************************/ - -package com.google.gwt.dev.js.rhino; - -import java.math.BigInteger; - -class DToA { - - -/* "-0.0000...(1073 zeros after decimal point)...0001\0" is the longest string that we could produce, - * which occurs when printing -5e-324 in binary. We could compute a better estimate of the size of - * the output string and malloc fewer bytes depending on d and base, but why bother? */ - - static final int DTOBASESTR_BUFFER_SIZE = 1078; - - static char BASEDIGIT(int digit) { - return (char)((digit >= 10) ? 'a' - 10 + digit : '0' + digit); - } - - static final int - DTOSTR_STANDARD = 0, /* Either fixed or exponential format; round-trip */ - DTOSTR_STANDARD_EXPONENTIAL = 1, /* Always exponential format; round-trip */ - DTOSTR_FIXED = 2, /* Round to digits after the decimal point; exponential if number is large */ - DTOSTR_EXPONENTIAL = 3, /* Always exponential format; significant digits */ - DTOSTR_PRECISION = 4; /* Either fixed or exponential format; significant digits */ - - - static final int Frac_mask = 0xfffff; - static final int Exp_shift = 20; - static final int Exp_msk1 = 0x100000; - static final int Bias = 1023; - static final int P = 53; - - static final int Exp_shift1 = 20; - static final int Exp_mask = 0x7ff00000; - static final int Bndry_mask = 0xfffff; - static final int Log2P = 1; - - static final int Sign_bit = 0x80000000; - static final int Exp_11 = 0x3ff00000; - static final int Ten_pmax = 22; - static final int Quick_max = 14; - static final int Bletch = 0x10; - static final int Frac_mask1 = 0xfffff; - static final int Int_max = 14; - static final int n_bigtens = 5; - - - static final double tens[] = { - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - 1e20, 1e21, 1e22 - }; - - static final double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; - - static int lo0bits(int y) - { - int k; - int x = y; - - if ((x & 7) != 0) { - if ((x & 1) != 0) - return 0; - if ((x & 2) != 0) { - return 1; - } - return 2; - } - k = 0; - if ((x & 0xffff) == 0) { - k = 16; - x >>>= 16; - } - if ((x & 0xff) == 0) { - k += 8; - x >>>= 8; - } - if ((x & 0xf) == 0) { - k += 4; - x >>>= 4; - } - if ((x & 0x3) == 0) { - k += 2; - x >>>= 2; - } - if ((x & 1) == 0) { - k++; - x >>>= 1; - if ((x & 1) == 0) - return 32; - } - return k; - } - - /* Return the number (0 through 32) of most significant zero bits in x. */ - static int hi0bits(int x) - { - int k = 0; - - if ((x & 0xffff0000) == 0) { - k = 16; - x <<= 16; - } - if ((x & 0xff000000) == 0) { - k += 8; - x <<= 8; - } - if ((x & 0xf0000000) == 0) { - k += 4; - x <<= 4; - } - if ((x & 0xc0000000) == 0) { - k += 2; - x <<= 2; - } - if ((x & 0x80000000) == 0) { - k++; - if ((x & 0x40000000) == 0) - return 32; - } - return k; - } - - static void stuffBits(byte bits[], int offset, int val) - { - bits[offset] = (byte)(val >> 24); - bits[offset + 1] = (byte)(val >> 16); - bits[offset + 2] = (byte)(val >> 8); - bits[offset + 3] = (byte)(val); - } - - /* Convert d into the form b*2^e, where b is an odd integer. b is the returned - * Bigint and e is the returned binary exponent. Return the number of significant - * bits in b in bits. d must be finite and nonzero. */ - static BigInteger d2b(double d, int[] e, int[] bits) - { - byte dbl_bits[]; - int i, k, y, z, de; - long dBits = Double.doubleToLongBits(d); - int d0 = (int)(dBits >>> 32); - int d1 = (int)(dBits); - - z = d0 & Frac_mask; - d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ - - if ((de = (int)(d0 >>> Exp_shift)) != 0) - z |= Exp_msk1; - - if ((y = d1) != 0) { - dbl_bits = new byte[8]; - k = lo0bits(y); - y >>>= k; - if (k != 0) { - stuffBits(dbl_bits, 4, y | z << (32 - k)); - z >>= k; - } - else - stuffBits(dbl_bits, 4, y); - stuffBits(dbl_bits, 0, z); - i = (z != 0) ? 2 : 1; - } - else { - // JS_ASSERT(z); - dbl_bits = new byte[4]; - k = lo0bits(z); - z >>>= k; - stuffBits(dbl_bits, 0, z); - k += 32; - i = 1; - } - if (de != 0) { - e[0] = de - Bias - (P-1) + k; - bits[0] = P - k; - } - else { - e[0] = de - Bias - (P-1) + 1 + k; - bits[0] = 32*i - hi0bits(z); - } - return new BigInteger(dbl_bits); - } - - public static String JS_dtobasestr(int base, double d) - { - char[] buffer; /* The output string */ - int p; /* index to current position in the buffer */ - int pInt; /* index to the beginning of the integer part of the string */ - - int q; - int digit; - double di; /* d truncated to an integer */ - double df; /* The fractional part of d */ - -// JS_ASSERT(base >= 2 && base <= 36); - - buffer = new char[DTOBASESTR_BUFFER_SIZE]; - - p = 0; - if (d < 0.0) { - buffer[p++] = '-'; - d = -d; - } - - /* Check for Infinity and NaN */ - if (Double.isNaN(d)) - return "NaN"; - else - if (Double.isInfinite(d)) - return "Infinity"; - - /* Output the integer part of d with the digits in reverse order. */ - pInt = p; - di = (int)d; - BigInteger b = BigInteger.valueOf((int)di); - String intDigits = b.toString(base); - intDigits.getChars(0, intDigits.length(), buffer, p); - p += intDigits.length(); - - df = d - di; - if (df != 0.0) { - /* We have a fraction. */ - buffer[p++] = '.'; - - long dBits = Double.doubleToLongBits(d); - int word0 = (int)(dBits >> 32); - int word1 = (int)(dBits); - - int[] e = new int[1]; - int[] bbits = new int[1]; - - b = d2b(df, e, bbits); -// JS_ASSERT(e < 0); - /* At this point df = b * 2^e. e must be less than zero because 0 < df < 1. */ - - int s2 = -(word0 >>> Exp_shift1 & Exp_mask >> Exp_shift1); - if (s2 == 0) - s2 = -1; - s2 += Bias + P; - /* 1/2^s2 = (nextDouble(d) - d)/2 */ -// JS_ASSERT(-s2 < e); - BigInteger mlo = BigInteger.valueOf(1); - BigInteger mhi = mlo; - if ((word1 == 0) && ((word0 & Bndry_mask) == 0) - && ((word0 & (Exp_mask & Exp_mask << 1)) != 0)) { - /* The special case. Here we want to be within a quarter of the last input - significant digit instead of one half of it when the output string's value is less than d. */ - s2 += Log2P; - mhi = BigInteger.valueOf(1< df = b/2^s2 > 0; - * (d - prevDouble(d))/2 = mlo/2^s2; - * (nextDouble(d) - d)/2 = mhi/2^s2. */ - BigInteger bigBase = BigInteger.valueOf(base); - - boolean done = false; - do { - b = b.multiply(bigBase); - BigInteger[] divResult = b.divideAndRemainder(s); - b = divResult[1]; - digit = (char)(divResult[0].intValue()); - if (mlo == mhi) - mlo = mhi = mlo.multiply(bigBase); - else { - mlo = mlo.multiply(bigBase); - mhi = mhi.multiply(bigBase); - } - - /* Do we yet have the shortest string that will round to d? */ - int j = b.compareTo(mlo); - /* j is b/2^s2 compared with mlo/2^s2. */ - BigInteger delta = s.subtract(mhi); - int j1 = (delta.signum() <= 0) ? 1 : b.compareTo(delta); - /* j1 is b/2^s2 compared with 1 - mhi/2^s2. */ - if (j1 == 0 && ((word1 & 1) == 0)) { - if (j > 0) - digit++; - done = true; - } else - if (j < 0 || (j == 0 && ((word1 & 1) == 0))) { - if (j1 > 0) { - /* Either dig or dig+1 would work here as the least significant digit. - Use whichever would produce an output value closer to d. */ - b = b.shiftLeft(1); - j1 = b.compareTo(s); - if (j1 > 0) /* The even test (|| (j1 == 0 && (digit & 1))) is not here because it messes up odd base output - * such as 3.5 in base 3. */ - digit++; - } - done = true; - } else if (j1 > 0) { - digit++; - done = true; - } -// JS_ASSERT(digit < (uint32)base); - buffer[p++] = BASEDIGIT(digit); - } while (!done); - } - - return new String(buffer, 0, p); - } - - /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. - * - * Inspired by "How to Print Floating-Point Numbers Accurately" by - * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101]. - * - * Modifications: - * 1. Rather than iterating, we use a simple numeric overestimate - * to determine k = floor(log10(d)). We scale relevant - * quantities using O(log2(k)) rather than O(k) multiplications. - * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't - * try to generate digits strictly left to right. Instead, we - * compute with fewer bits and propagate the carry if necessary - * when rounding the final digit up. This is often faster. - * 3. Under the assumption that input will be rounded nearest, - * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. - * That is, we allow equality in stopping tests when the - * round-nearest rule will give the same floating-point value - * as would satisfaction of the stopping test with strict - * inequality. - * 4. We remove common factors of powers of 2 from relevant - * quantities. - * 5. When converting floating-point integers less than 1e16, - * we use floating-point arithmetic rather than resorting - * to multiple-precision integers. - * 6. When asked to produce fewer than 15 digits, we first try - * to get by with floating-point arithmetic; we resort to - * multiple-precision integer arithmetic only if we cannot - * guarantee that the floating-point calculation has given - * the correctly rounded result. For k requested digits and - * "uniformly" distributed input, the probability is - * something like 10^(k-15) that we must resort to the Long - * calculation. - */ - - static int word0(double d) - { - long dBits = Double.doubleToLongBits(d); - return (int)(dBits >> 32); - } - - static double setWord0(double d, int i) - { - long dBits = Double.doubleToLongBits(d); - dBits = ((long)i << 32) | (dBits & 0x0FFFFFFFFL); - return Double.longBitsToDouble(dBits); - } - - static int word1(double d) - { - long dBits = Double.doubleToLongBits(d); - return (int)(dBits); - } - - /* Return b * 5^k. k must be nonnegative. */ - // XXXX the C version built a cache of these - static BigInteger pow5mult(BigInteger b, int k) - { - return b.multiply(BigInteger.valueOf(5).pow(k)); - } - - static boolean roundOff(StringBuffer buf) - { - char lastCh; - while ((lastCh = buf.charAt(buf.length() - 1)) == '9') { - buf.setLength(buf.length() - 1); - if (buf.length() == 0) { - return true; - } - } - buf.append((char)(lastCh + 1)); - return false; - } - - /* Always emits at least one digit. */ - /* If biasUp is set, then rounding in modes 2 and 3 will round away from zero - * when the number is exactly halfway between two representable values. For example, - * rounding 2.5 to zero digits after the decimal point will return 3 and not 2. - * 2.49 will still round to 2, and 2.51 will still round to 3. */ - /* bufsize should be at least 20 for modes 0 and 1. For the other modes, - * bufsize should be two greater than the maximum number of output characters expected. */ - static int - JS_dtoa(double d, int mode, boolean biasUp, int ndigits, - boolean[] sign, StringBuffer buf) - { - /* Arguments ndigits, decpt, sign are similar to those - of ecvt and fcvt; trailing zeros are suppressed from - the returned string. If not null, *rve is set to point - to the end of the return value. If d is +-Infinity or NaN, - then *decpt is set to 9999. - - mode: - 0 ==> shortest string that yields d when read in - and rounded to nearest. - 1 ==> like 0, but with Steele & White stopping rule; - e.g. with IEEE P754 arithmetic , mode 0 gives - 1e23 whereas mode 1 gives 9.999999999999999e22. - 2 ==> max(1,ndigits) significant digits. This gives a - return value similar to that of ecvt, except - that trailing zeros are suppressed. - 3 ==> through ndigits past the decimal point. This - gives a return value similar to that from fcvt, - except that trailing zeros are suppressed, and - ndigits can be negative. - 4-9 should give the same return values as 2-3, i.e., - 4 <= mode <= 9 ==> same return as mode - 2 + (mode & 1). These modes are mainly for - debugging; often they run slower but sometimes - faster than modes 2-3. - 4,5,8,9 ==> left-to-right digit generation. - 6-9 ==> don't try fast floating-point estimate - (if applicable). - - Values of mode other than 0-9 are treated as mode 0. - - Sufficient space is allocated to the return value - to hold the suppressed trailing zeros. - */ - - int b2, b5, i, ieps, ilim, ilim0, ilim1, - j, j1, k, k0, m2, m5, s2, s5; - char dig; - long L; - long x; - BigInteger b, b1, delta, mlo, mhi, S; - int[] be = new int[1]; - int[] bbits = new int[1]; - double d2, ds, eps; - boolean spec_case, denorm, k_check, try_quick, leftright; - - if ((word0(d) & Sign_bit) != 0) { - /* set sign for everything, including 0's and NaNs */ - sign[0] = true; - // word0(d) &= ~Sign_bit; /* clear sign bit */ - d = setWord0(d, word0(d) & ~Sign_bit); - } - else - sign[0] = false; - - if ((word0(d) & Exp_mask) == Exp_mask) { - /* Infinity or NaN */ - buf.append(((word1(d) == 0) && ((word0(d) & Frac_mask) == 0)) ? "Infinity" : "NaN"); - return 9999; - } - if (d == 0) { -// no_digits: - buf.setLength(0); - buf.append('0'); /* copy "0" to buffer */ - return 1; - } - - b = d2b(d, be, bbits); - if ((i = (int)(word0(d) >>> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) { - d2 = setWord0(d, (word0(d) & Frac_mask1) | Exp_11); - /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 - * log10(x) = log(x) / log(10) - * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) - * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) - * - * This suggests computing an approximation k to log10(d) by - * - * k = (i - Bias)*0.301029995663981 - * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); - * - * We want k to be too large rather than too small. - * The error in the first-order Taylor series approximation - * is in our favor, so we just round up the constant enough - * to compensate for any error in the multiplication of - * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, - * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, - * adding 1e-13 to the constant term more than suffices. - * Hence we adjust the constant term to 0.1760912590558. - * (We could get a more accurate k by invoking log10, - * but this is probably not worthwhile.) - */ - i -= Bias; - denorm = false; - } - else { - /* d is denormalized */ - i = bbits[0] + be[0] + (Bias + (P-1) - 1); - x = (i > 32) ? word0(d) << (64 - i) | word1(d) >>> (i - 32) : word1(d) << (32 - i); -// d2 = x; -// word0(d2) -= 31*Exp_msk1; /* adjust exponent */ - d2 = setWord0(x, word0(x) - 31*Exp_msk1); - i -= (Bias + (P-1) - 1) + 1; - denorm = true; - } - /* At this point d = f*2^i, where 1 <= f < 2. d2 is an approximation of f. */ - ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; - k = (int)ds; - if (ds < 0.0 && ds != k) - k--; /* want k = floor(ds) */ - k_check = true; - if (k >= 0 && k <= Ten_pmax) { - if (d < tens[k]) - k--; - k_check = false; - } - /* At this point floor(log10(d)) <= k <= floor(log10(d))+1. - If k_check is zero, we're guaranteed that k = floor(log10(d)). */ - j = bbits[0] - i - 1; - /* At this point d = b/2^j, where b is an odd integer. */ - if (j >= 0) { - b2 = 0; - s2 = j; - } - else { - b2 = -j; - s2 = 0; - } - if (k >= 0) { - b5 = 0; - s5 = k; - s2 += k; - } - else { - b2 -= k; - b5 = -k; - s5 = 0; - } - /* At this point d/10^k = (b * 2^b2 * 5^b5) / (2^s2 * 5^s5), where b is an odd integer, - b2 >= 0, b5 >= 0, s2 >= 0, and s5 >= 0. */ - if (mode < 0 || mode > 9) - mode = 0; - try_quick = true; - if (mode > 5) { - mode -= 4; - try_quick = false; - } - leftright = true; - ilim = ilim1 = 0; - switch(mode) { - case 0: - case 1: - ilim = ilim1 = -1; - i = 18; - ndigits = 0; - break; - case 2: - leftright = false; - /* no break */ - case 4: - if (ndigits <= 0) - ndigits = 1; - ilim = ilim1 = i = ndigits; - break; - case 3: - leftright = false; - /* no break */ - case 5: - i = ndigits + k + 1; - ilim = i; - ilim1 = i - 1; - if (i <= 0) - i = 1; - } - /* ilim is the maximum number of significant digits we want, based on k and ndigits. */ - /* ilim1 is the maximum number of significant digits we want, based on k and ndigits, - when it turns out that k was computed too high by one. */ - - boolean fast_failed = false; - if (ilim >= 0 && ilim <= Quick_max && try_quick) { - - /* Try to get by with floating-point arithmetic. */ - - i = 0; - d2 = d; - k0 = k; - ilim0 = ilim; - ieps = 2; /* conservative */ - /* Divide d by 10^k, keeping track of the roundoff error and avoiding overflows. */ - if (k > 0) { - ds = tens[k&0xf]; - j = k >> 4; - if ((j & Bletch) != 0) { - /* prevent overflows */ - j &= Bletch - 1; - d /= bigtens[n_bigtens-1]; - ieps++; - } - for(; (j != 0); j >>= 1, i++) - if ((j & 1) != 0) { - ieps++; - ds *= bigtens[i]; - } - d /= ds; - } - else if ((j1 = -k) != 0) { - d *= tens[j1 & 0xf]; - for(j = j1 >> 4; (j != 0); j >>= 1, i++) - if ((j & 1) != 0) { - ieps++; - d *= bigtens[i]; - } - } - /* Check that k was computed correctly. */ - if (k_check && d < 1.0 && ilim > 0) { - if (ilim1 <= 0) - fast_failed = true; - else { - ilim = ilim1; - k--; - d *= 10.; - ieps++; - } - } - /* eps bounds the cumulative error. */ -// eps = ieps*d + 7.0; -// word0(eps) -= (P-1)*Exp_msk1; - eps = ieps*d + 7.0; - eps = setWord0(eps, word0(eps) - (P-1)*Exp_msk1); - if (ilim == 0) { - S = mhi = null; - d -= 5.0; - if (d > eps) { - buf.append('1'); - k++; - return k + 1; - } - if (d < -eps) { - buf.setLength(0); - buf.append('0'); /* copy "0" to buffer */ - return 1; - } - fast_failed = true; - } - if (!fast_failed) { - fast_failed = true; - if (leftright) { - /* Use Steele & White method of only - * generating digits needed. - */ - eps = 0.5/tens[ilim-1] - eps; - for(i = 0;;) { - L = (long)d; - d -= L; - buf.append((char)('0' + L)); - if (d < eps) { - return k + 1; - } - if (1.0 - d < eps) { -// goto bump_up; - char lastCh; - while (true) { - lastCh = buf.charAt(buf.length() - 1); - buf.setLength(buf.length() - 1); - if (lastCh != '9') break; - if (buf.length() == 0) { - k++; - lastCh = '0'; - break; - } - } - buf.append((char)(lastCh + 1)); - return k + 1; - } - if (++i >= ilim) - break; - eps *= 10.0; - d *= 10.0; - } - } - else { - /* Generate ilim digits, then fix them up. */ - eps *= tens[ilim-1]; - for(i = 1;; i++, d *= 10.0) { - L = (long)d; - d -= L; - buf.append((char)('0' + L)); - if (i == ilim) { - if (d > 0.5 + eps) { -// goto bump_up; - char lastCh; - while (true) { - lastCh = buf.charAt(buf.length() - 1); - buf.setLength(buf.length() - 1); - if (lastCh != '9') break; - if (buf.length() == 0) { - k++; - lastCh = '0'; - break; - } - } - buf.append((char)(lastCh + 1)); - return k + 1; - } - else - if (d < 0.5 - eps) { - while (buf.charAt(buf.length() - 1) == '0') - buf.setLength(buf.length() - 1); -// while(*--s == '0') ; -// s++; - return k + 1; - } - break; - } - } - } - } - if (fast_failed) { - buf.setLength(0); - d = d2; - k = k0; - ilim = ilim0; - } - } - - /* Do we have a "small" integer? */ - - if (be[0] >= 0 && k <= Int_max) { - /* Yes. */ - ds = tens[k]; - if (ndigits < 0 && ilim <= 0) { - S = mhi = null; - if (ilim < 0 || d < 5*ds || (!biasUp && d == 5*ds)) { - buf.setLength(0); - buf.append('0'); /* copy "0" to buffer */ - return 1; - } - buf.append('1'); - k++; - return k + 1; - } - for(i = 1;; i++) { - L = (long) (d / ds); - d -= L*ds; - buf.append((char)('0' + L)); - if (i == ilim) { - d += d; - if ((d > ds) || (d == ds && (((L & 1) != 0) || biasUp))) { -// bump_up: -// while(*--s == '9') -// if (s == buf) { -// k++; -// *s = '0'; -// break; -// } -// ++*s++; - char lastCh; - while (true) { - lastCh = buf.charAt(buf.length() - 1); - buf.setLength(buf.length() - 1); - if (lastCh != '9') break; - if (buf.length() == 0) { - k++; - lastCh = '0'; - break; - } - } - buf.append((char)(lastCh + 1)); - } - break; - } - d *= 10.0; - if (d == 0) - break; - } - return k + 1; - } - - m2 = b2; - m5 = b5; - mhi = mlo = null; - if (leftright) { - if (mode < 2) { - i = (denorm) ? be[0] + (Bias + (P-1) - 1 + 1) : 1 + P - bbits[0]; - /* i is 1 plus the number of trailing zero bits in d's significand. Thus, - (2^m2 * 5^m5) / (2^(s2+i) * 5^s5) = (1/2 lsb of d)/10^k. */ - } - else { - j = ilim - 1; - if (m5 >= j) - m5 -= j; - else { - s5 += j -= m5; - b5 += j; - m5 = 0; - } - if ((i = ilim) < 0) { - m2 -= i; - i = 0; - } - /* (2^m2 * 5^m5) / (2^(s2+i) * 5^s5) = (1/2 * 10^(1-ilim))/10^k. */ - } - b2 += i; - s2 += i; - mhi = BigInteger.valueOf(1); - /* (mhi * 2^m2 * 5^m5) / (2^s2 * 5^s5) = one-half of last printed (when mode >= 2) or - input (when mode < 2) significant digit, divided by 10^k. */ - } - /* We still have d/10^k = (b * 2^b2 * 5^b5) / (2^s2 * 5^s5). Reduce common factors in - b2, m2, and s2 without changing the equalities. */ - if (m2 > 0 && s2 > 0) { - i = (m2 < s2) ? m2 : s2; - b2 -= i; - m2 -= i; - s2 -= i; - } - - /* Fold b5 into b and m5 into mhi. */ - if (b5 > 0) { - if (leftright) { - if (m5 > 0) { - mhi = pow5mult(mhi, m5); - b1 = mhi.multiply(b); - b = b1; - } - if ((j = b5 - m5) != 0) - b = pow5mult(b, j); - } - else - b = pow5mult(b, b5); - } - /* Now we have d/10^k = (b * 2^b2) / (2^s2 * 5^s5) and - (mhi * 2^m2) / (2^s2 * 5^s5) = one-half of last printed or input significant digit, divided by 10^k. */ - - S = BigInteger.valueOf(1); - if (s5 > 0) - S = pow5mult(S, s5); - /* Now we have d/10^k = (b * 2^b2) / (S * 2^s2) and - (mhi * 2^m2) / (S * 2^s2) = one-half of last printed or input significant digit, divided by 10^k. */ - - /* Check for special case that d is a normalized power of 2. */ - spec_case = false; - if (mode < 2) { - if ( (word1(d) == 0) && ((word0(d) & Bndry_mask) == 0) - && ((word0(d) & (Exp_mask & Exp_mask << 1)) != 0) - ) { - /* The special case. Here we want to be within a quarter of the last input - significant digit instead of one half of it when the decimal output string's value is less than d. */ - b2 += Log2P; - s2 += Log2P; - spec_case = true; - } - } - - /* Arrange for convenient computation of quotients: - * shift left if necessary so divisor has 4 leading 0 bits. - * - * Perhaps we should just compute leading 28 bits of S once - * and for all and pass them and a shift to quorem, so it - * can do shifts and ors to compute the numerator for q. - */ - byte [] S_bytes = S.toByteArray(); - int S_hiWord = 0; - for (int idx = 0; idx < 4; idx++) { - S_hiWord = (S_hiWord << 8); - if (idx < S_bytes.length) - S_hiWord |= (S_bytes[idx] & 0xFF); - } - if ((i = (((s5 != 0) ? 32 - hi0bits(S_hiWord) : 1) + s2) & 0x1f) != 0) - i = 32 - i; - /* i is the number of leading zero bits in the most significant word of S*2^s2. */ - if (i > 4) { - i -= 4; - b2 += i; - m2 += i; - s2 += i; - } - else if (i < 4) { - i += 28; - b2 += i; - m2 += i; - s2 += i; - } - /* Now S*2^s2 has exactly four leading zero bits in its most significant word. */ - if (b2 > 0) - b = b.shiftLeft(b2); - if (s2 > 0) - S = S.shiftLeft(s2); - /* Now we have d/10^k = b/S and - (mhi * 2^m2) / S = maximum acceptable error, divided by 10^k. */ - if (k_check) { - if (b.compareTo(S) < 0) { - k--; - b = b.multiply(BigInteger.valueOf(10)); /* we botched the k estimate */ - if (leftright) - mhi = mhi.multiply(BigInteger.valueOf(10)); - ilim = ilim1; - } - } - /* At this point 1 <= d/10^k = b/S < 10. */ - - if (ilim <= 0 && mode > 2) { - /* We're doing fixed-mode output and d is less than the minimum nonzero output in this mode. - Output either zero or the minimum nonzero output depending on which is closer to d. */ - if ((ilim < 0 ) - || ((i = b.compareTo(S = S.multiply(BigInteger.valueOf(5)))) < 0) - || ((i == 0 && !biasUp))) { - /* Always emit at least one digit. If the number appears to be zero - using the current mode, then emit one '0' digit and set decpt to 1. */ - /*no_digits: - k = -1 - ndigits; - goto ret; */ - buf.setLength(0); - buf.append('0'); /* copy "0" to buffer */ - return 1; -// goto no_digits; - } -// one_digit: - buf.append('1'); - k++; - return k + 1; - } - if (leftright) { - if (m2 > 0) - mhi = mhi.shiftLeft(m2); - - /* Compute mlo -- check for special case - * that d is a normalized power of 2. - */ - - mlo = mhi; - if (spec_case) { - mhi = mlo; - mhi = mhi.shiftLeft(Log2P); - } - /* mlo/S = maximum acceptable error, divided by 10^k, if the output is less than d. */ - /* mhi/S = maximum acceptable error, divided by 10^k, if the output is greater than d. */ - - for(i = 1;;i++) { - BigInteger[] divResult = b.divideAndRemainder(S); - b = divResult[1]; - dig = (char)(divResult[0].intValue() + '0'); - /* Do we yet have the shortest decimal string - * that will round to d? - */ - j = b.compareTo(mlo); - /* j is b/S compared with mlo/S. */ - delta = S.subtract(mhi); - j1 = (delta.signum() <= 0) ? 1 : b.compareTo(delta); - /* j1 is b/S compared with 1 - mhi/S. */ - if ((j1 == 0) && (mode == 0) && ((word1(d) & 1) == 0)) { - if (dig == '9') { - buf.append('9'); - if (roundOff(buf)) { - k++; - buf.append('1'); - } - return k + 1; -// goto round_9_up; - } - if (j > 0) - dig++; - buf.append(dig); - return k + 1; - } - if ((j < 0) - || ((j == 0) - && (mode == 0) - && ((word1(d) & 1) == 0) - )) { - if (j1 > 0) { - /* Either dig or dig+1 would work here as the least significant decimal digit. - Use whichever would produce a decimal value closer to d. */ - b = b.shiftLeft(1); - j1 = b.compareTo(S); - if (((j1 > 0) || (j1 == 0 && (((dig & 1) == 1) || biasUp))) - && (dig++ == '9')) { - buf.append('9'); - if (roundOff(buf)) { - k++; - buf.append('1'); - } - return k + 1; -// goto round_9_up; - } - } - buf.append(dig); - return k + 1; - } - if (j1 > 0) { - if (dig == '9') { /* possible if i == 1 */ -// round_9_up: -// *s++ = '9'; -// goto roundoff; - buf.append('9'); - if (roundOff(buf)) { - k++; - buf.append('1'); - } - return k + 1; - } - buf.append((char)(dig + 1)); - return k + 1; - } - buf.append(dig); - if (i == ilim) - break; - b = b.multiply(BigInteger.valueOf(10)); - if (mlo == mhi) - mlo = mhi = mhi.multiply(BigInteger.valueOf(10)); - else { - mlo = mlo.multiply(BigInteger.valueOf(10)); - mhi = mhi.multiply(BigInteger.valueOf(10)); - } - } - } - else - for(i = 1;; i++) { -// (char)(dig = quorem(b,S) + '0'); - BigInteger[] divResult = b.divideAndRemainder(S); - b = divResult[1]; - dig = (char)(divResult[0].intValue() + '0'); - buf.append(dig); - if (i >= ilim) - break; - b = b.multiply(BigInteger.valueOf(10)); - } - - /* Round off last digit */ - - b = b.shiftLeft(1); - j = b.compareTo(S); - if ((j > 0) || (j == 0 && (((dig & 1) == 1) || biasUp))) { -// roundoff: -// while(*--s == '9') -// if (s == buf) { -// k++; -// *s++ = '1'; -// goto ret; -// } -// ++*s++; - if (roundOff(buf)) { - k++; - buf.append('1'); - return k + 1; - } - } - else { - /* Strip trailing zeros */ - while (buf.charAt(buf.length() - 1) == '0') - buf.setLength(buf.length() - 1); -// while(*--s == '0') ; -// s++; - } -// ret: -// Bfree(S); -// if (mhi) { -// if (mlo && mlo != mhi) -// Bfree(mlo); -// Bfree(mhi); -// } -// ret1: -// Bfree(b); -// JS_ASSERT(s < buf + bufsize); - return k + 1; - } - - /* Mapping of JSDToStrMode -> JS_dtoa mode */ - private static final int dtoaModes[] = { - 0, /* DTOSTR_STANDARD */ - 0, /* DTOSTR_STANDARD_EXPONENTIAL, */ - 3, /* DTOSTR_FIXED, */ - 2, /* DTOSTR_EXPONENTIAL, */ - 2}; /* DTOSTR_PRECISION */ - - static void - JS_dtostr(StringBuffer buffer, int mode, int precision, double d) - { - int decPt; /* Position of decimal point relative to first digit returned by JS_dtoa */ - boolean[] sign = new boolean[1]; /* true if the sign bit was set in d */ - int nDigits; /* Number of significand digits returned by JS_dtoa */ - -// JS_ASSERT(bufferSize >= (size_t)(mode <= DTOSTR_STANDARD_EXPONENTIAL ? DTOSTR_STANDARD_BUFFER_SIZE : -// DTOSTR_VARIABLE_BUFFER_SIZE(precision))); - - if (mode == DTOSTR_FIXED && (d >= 1e21 || d <= -1e21)) - mode = DTOSTR_STANDARD; /* Change mode here rather than below because the buffer may not be large enough to hold a large integer. */ - - decPt = JS_dtoa(d, dtoaModes[mode], mode >= DTOSTR_FIXED, precision, sign, buffer); - nDigits = buffer.length(); - - /* If Infinity, -Infinity, or NaN, return the string regardless of the mode. */ - if (decPt != 9999) { - boolean exponentialNotation = false; - int minNDigits = 0; /* Minimum number of significand digits required by mode and precision */ - int p; - int q; - - switch (mode) { - case DTOSTR_STANDARD: - if (decPt < -5 || decPt > 21) - exponentialNotation = true; - else - minNDigits = decPt; - break; - - case DTOSTR_FIXED: - if (precision >= 0) - minNDigits = decPt + precision; - else - minNDigits = decPt; - break; - - case DTOSTR_EXPONENTIAL: -// JS_ASSERT(precision > 0); - minNDigits = precision; - /* Fall through */ - case DTOSTR_STANDARD_EXPONENTIAL: - exponentialNotation = true; - break; - - case DTOSTR_PRECISION: -// JS_ASSERT(precision > 0); - minNDigits = precision; - if (decPt < -5 || decPt > precision) - exponentialNotation = true; - break; - } - - /* If the number has fewer than minNDigits, pad it with zeros at the end */ - if (nDigits < minNDigits) { - p = minNDigits; - nDigits = minNDigits; - do { - buffer.append('0'); - } while (buffer.length() != p); - } - - if (exponentialNotation) { - /* Insert a decimal point if more than one significand digit */ - if (nDigits != 1) { - buffer.insert(1, '.'); - } - buffer.append('e'); - if ((decPt - 1) >= 0) - buffer.append('+'); - buffer.append(decPt - 1); -// JS_snprintf(numEnd, bufferSize - (numEnd - buffer), "e%+d", decPt-1); - } else if (decPt != nDigits) { - /* Some kind of a fraction in fixed notation */ -// JS_ASSERT(decPt <= nDigits); - if (decPt > 0) { - /* dd...dd . dd...dd */ - buffer.insert(decPt, '.'); - } else { - /* 0 . 00...00dd...dd */ - for (int i = 0; i < 1 - decPt; i++) - buffer.insert(0, '0'); - buffer.insert(1, '.'); - } - } - } - - /* If negative and neither -0.0 nor NaN, output a leading '-'. */ - if (sign[0] && - !(word0(d) == Sign_bit && word1(d) == 0) && - !((word0(d) & Exp_mask) == Exp_mask && - ((word1(d) != 0) || ((word0(d) & Frac_mask) != 0)))) { - buffer.insert(0, '-'); - } - } - -} diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/IRFactory.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/IRFactory.java index ce6d5b6dd2e..d244c0a780b 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/IRFactory.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/IRFactory.java @@ -404,37 +404,6 @@ public class IRFactory { return new Node(TokenStream.ASSIGN, left, right, nodeOp); } - private Node createConvert(Class toType, Node expr) { - if (toType == null) - return expr; - Node result = new Node(TokenStream.CONVERT, expr); - result.putProp(Node.TYPE_PROP, Number.class); - return result; - } - - public static boolean hasSideEffects(Node exprTree) { - switch (exprTree.getType()) { - case TokenStream.INC: - case TokenStream.DEC: - case TokenStream.SETPROP: - case TokenStream.SETELEM: - case TokenStream.SETNAME: - case TokenStream.CALL: - case TokenStream.NEW: - return true; - default: - Node child = exprTree.getFirstChild(); - while (child != null) { - if (hasSideEffects(child)) - return true; - else - child = child.getNext(); - } - break; - } - return false; - } - private void reportError(String msgResource) { String message = Context.getMessage0(msgResource); diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/Node.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/Node.java index 4e9432dcf73..0fc4d32f110 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/Node.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/Node.java @@ -214,18 +214,10 @@ public class Node implements Cloneable { return this.intDatum; } - public boolean hasChildren() { - return first != null; - } - public Node getFirstChild() { return first; } - public Node getLastChild() { - return last; - } - public Node getNext() { return next; } @@ -238,19 +230,6 @@ public class Node implements Cloneable { return c; } - - public Node getChildBefore(Node child) { - if (child == first) - return null; - Node n = first; - while (n.next != child) { - n = n.next; - if (n == null) - throw new RuntimeException("node is not a child"); - } - return n; - } - public Node getLastSibling() { Node n = this; while (n.next != null) { @@ -259,14 +238,6 @@ public class Node implements Cloneable { return n; } - public void addChildToFront(Node child) { - child.next = first; - first = child; - if (last == null) { - last = child; - } - } - public void addChildToBack(Node child) { child.next = null; if (last == null) { @@ -277,15 +248,6 @@ public class Node implements Cloneable { last = child; } - public void addChildrenToFront(Node children) { - Node lastSib = children.getLastSibling(); - lastSib.next = first; - first = children; - if (last == null) { - last = lastSib; - } - } - public void addChildrenToBack(Node children) { if (last != null) { last.next = children; @@ -296,67 +258,6 @@ public class Node implements Cloneable { } } - /** - * Add 'child' before 'node'. - */ - public void addChildBefore(Node newChild, Node node) { - if (newChild.next != null) - throw new RuntimeException( - "newChild had siblings in addChildBefore"); - if (first == node) { - newChild.next = first; - first = newChild; - return; - } - Node prev = getChildBefore(node); - addChildAfter(newChild, prev); - } - - /** - * Add 'child' after 'node'. - */ - public void addChildAfter(Node newChild, Node node) { - if (newChild.next != null) - throw new RuntimeException( - "newChild had siblings in addChildAfter"); - newChild.next = node.next; - node.next = newChild; - if (last == node) - last = newChild; - } - - public void removeChild(Node child) { - Node prev = getChildBefore(child); - if (prev == null) - first = first.next; - else - prev.next = child.next; - if (child == last) last = prev; - child.next = null; - } - - public void replaceChild(Node child, Node newChild) { - newChild.next = child.next; - if (child == first) { - first = newChild; - } else { - Node prev = getChildBefore(child); - prev.next = newChild; - } - if (child == last) - last = newChild; - child.next = null; - } - - public void replaceChildAfter(Node prevChild, Node newChild) { - Node child = prevChild.next; - newChild.next = child.next; - prevChild.next = newChild; - if (child == last) - last = newChild; - child.next = null; - } - public static final int TARGET_PROP = 1, BREAK_PROP = 2, @@ -458,16 +359,6 @@ public class Node implements Cloneable { return props.getObject(propType); } - public int getIntProp(int propType, int defaultValue) { - if (props == null) - return defaultValue; - return props.getInt(propType, defaultValue); - } - - public int getExistingIntProp(int propType) { - return props.getExistingInt(propType); - } - public void putProp(int propType, Object prop) { if (prop == null) { removeProp(propType); @@ -561,37 +452,6 @@ public class Node implements Cloneable { || this.getIntDatum() == ((Node) o).getIntDatum(); } - public Node cloneNode() { - Node result; - try { - result = (Node) super.clone(); - result.next = null; - result.first = null; - result.last = null; - } - catch (CloneNotSupportedException e) { - throw new RuntimeException(e.getMessage()); - } - return result; - } - - public Node cloneTree() { - Node result = cloneNode(); - for (Node n2 = getFirstChild(); n2 != null; n2 = n2.getNext()) { - Node n2clone = n2.cloneTree(); - if (result.last != null) { - result.last.next = n2clone; - } - if (result.first == null) { - result.first = n2clone; - } - result.last = n2clone; - } - return result; - } - - - @Override public String toString() { if (Context.printTrees) { @@ -661,70 +521,10 @@ public class Node implements Cloneable { return null; } - public String toStringTree() { - return toStringTreeHelper(0); - } - - - private String toStringTreeHelper(int level) { - if (Context.printTrees) { - StringBuffer s = new StringBuffer(); - for (int i=0; i < level; i++) { - s.append(" "); - } - s.append(toString()); - s.append('\n'); - for (Node cursor = getFirstChild(); cursor != null; - cursor = cursor.getNext()) - { - Node n = cursor; - s.append(n.toStringTreeHelper(level+1)); - } - return s.toString(); - } - return ""; - } - - /** - * Checks if the subtree under this node is the same as another subtree. - * Returns null if it's equal, or a message describing the differences. - */ - public String checkTreeEquals(Node node2) { - boolean eq = false; - - if (type == node2.getType() && - getChildCount() == node2.getChildCount() && - getClass() == node2.getClass()) { - - eq = this.equals(node2); - } - - if (!eq) { - return "Node tree inequality:\nTree1:\n" + toStringTreeHelper(1) + - "\n\nTree2:\n" + node2.toStringTreeHelper(1); - } - - String res = null; - Node n, n2; - for (n = first, n2 = node2.first; - res == null && n != null; - n = n.next, n2 = n2.next) { - res = n.checkTreeEquals(n2); - if (res != null) { - return res; - } - } - return res; - } - public void setIsSyntheticBlock(boolean val) { isSyntheticBlock = val; } - public boolean isSyntheticBlock() { - return isSyntheticBlock; - } - int type; // type of the node; TokenStream.NAME for example Node next; // next sibling private Node first; // first element of a linked list of children diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/ObjToIntMap.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/ObjToIntMap.java deleted file mode 100644 index 782703cccd3..00000000000 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/ObjToIntMap.java +++ /dev/null @@ -1,694 +0,0 @@ -/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1997-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * Igor Bukanov - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License (the "GPL"), in which case the - * provisions of the GPL are applicable instead of those above. - * If you wish to allow use of your version of this file only - * under the terms of the GPL and not to allow others to use your - * version of this file under the NPL, indicate your decision by - * deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete - * the provisions above, a recipient may use your version of this - * file under either the NPL or the GPL. - */ -// Modified by Google - -package com.google.gwt.dev.js.rhino; - -import java.io.Serializable; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/** - * Map to associate objects to integers. - * The map does not synchronize any of its operation, so either use - * it from a single thread or do own synchronization or perform all mutation - * operations on one thread before passing the map to others - */ - -public class ObjToIntMap implements Serializable { - - public static final Object NULL_VALUE = new String(""); - -// Map implementation via hashtable, -// follows "The Art of Computer Programming" by Donald E. Knuth - -// ObjToIntMap is a copy cat of ObjToIntMap with API adjusted to object keys - - public static class Iterator { - - Iterator(ObjToIntMap master) { - this.master = master; - } - - final void init(Object[] keys, int[] values, int keyCount) { - this.keys = keys; - this.values = values; - this.cursor = -1; - this.remaining = keyCount; - } - - public void start() { - master.initIterator(this); - next(); - } - - public boolean done() { - return remaining < 0; - } - - public void next() { - if (remaining == -1) Context.codeBug(); - if (remaining == 0) { - remaining = -1; - cursor = -1; - }else { - for (++cursor; ; ++cursor) { - Object key = keys[cursor]; - if (key != null && key != DELETED) { - --remaining; - break; - } - } - } - } - - public Object getKey() { - Object key = keys[cursor]; - if (key == NULL_VALUE) { key = null; } - return key; - } - - public int getValue() { - return values[cursor]; - } - - public void setValue(int value) { - values[cursor] = value; - } - - ObjToIntMap master; - private int cursor; - private int remaining; - private Object[] keys; - private int[] values; - } - - public ObjToIntMap() { - this(4); - } - - public ObjToIntMap(int keyCountHint) { - if (keyCountHint < 0) Context.codeBug(); - // Table grow when number of stored keys >= 3/4 of max capacity - int minimalCapacity = keyCountHint * 4 / 3; - int i; - for (i = 2; (1 << i) < minimalCapacity; ++i) { } - power = i; - if (check && power < 2) Context.codeBug(); - } - - public boolean isEmpty() { - return keyCount == 0; - } - - public int size() { - return keyCount; - } - - public boolean has(Object key) { - if (key == null) { key = NULL_VALUE; } - return 0 <= findIndex(key); - } - - /** - * Get integer value assigned with key. - * @return key integer value or defaultValue if key is absent - */ - public int get(Object key, int defaultValue) { - if (key == null) { key = NULL_VALUE; } - int index = findIndex(key); - if (0 <= index) { - return values[index]; - } - return defaultValue; - } - - /** - * Get integer value assigned with key. - * @return key integer value - * @throws RuntimeException if key does not exist - */ - public int getExisting(Object key) { - if (key == null) { key = NULL_VALUE; } - int index = findIndex(key); - if (0 <= index) { - return values[index]; - } - // Key must exist - Context.codeBug(); - return 0; - } - - public void put(Object key, int value) { - if (key == null) { key = NULL_VALUE; } - int index = ensureIndex(key); - values[index] = value; - } - - /** - * If table already contains a key that equals to keyArg, return that key - * while setting its value to zero, otherwise add keyArg with 0 value to - * the table and return it. - */ - public Object intern(Object keyArg) { - boolean nullKey = false; - if (keyArg == null) { - nullKey = true; - keyArg = NULL_VALUE; - } - int index = ensureIndex(keyArg); - values[index] = 0; - return (nullKey) ? null : keys[index]; - } - - public void remove(Object key) { - if (key == null) { key = NULL_VALUE; } - int index = findIndex(key); - if (0 <= index) { - keys[index] = DELETED; - --keyCount; - } - } - - public void clear() { - int i = keys.length; - while (i != 0) { - keys[--i] = null; - } - keyCount = 0; - occupiedCount = 0; - } - - public Iterator newIterator() { - return new Iterator(this); - } - - // The sole purpose of the method is to avoid accessing private fields - // from the Iterator inner class to workaround JDK 1.1 compiler bug which - // generates code triggering VerifierError on recent JVMs - final void initIterator(Iterator i) { - i.init(keys, values, keyCount); - } - - /** Return array of present keys */ - public Object[] getKeys() { - Object[] array = new Object[keyCount]; - getKeys(array, 0); - return array; - } - - public void getKeys(Object[] array, int offset) { - int count = keyCount; - for (int i = 0; count != 0; ++i) { - Object key = keys[i]; - if (key != null && key != DELETED) { - if (key == NULL_VALUE) { key = null; } - array[offset] = key; - ++offset; - --count; - } - } - } - - private static int tableLookupStep(int fraction, int mask, int power) { - int shift = 32 - 2 * power; - if (shift >= 0) { - return ((fraction >>> shift) & mask) | 1; - } - else { - return (fraction & (mask >>> -shift)) | 1; - } - } - - private int findIndex(Object key) { - if (keys != null) { - int hash = key.hashCode(); - int fraction = hash * A; - int index = fraction >>> (32 - power); - Object test = keys[index]; - if (test != null) { - int N = 1 << power; - if (test == key - || (values[N + index] == hash && test.equals(key))) - { - return index; - } - // Search in table after first failed attempt - int mask = N - 1; - int step = tableLookupStep(fraction, mask, power); - int n = 0; - for (;;) { - if (check) { - if (n >= occupiedCount) Context.codeBug(); - ++n; - } - index = (index + step) & mask; - test = keys[index]; - if (test == null) { - break; - } - if (test == key - || (values[N + index] == hash && test.equals(key))) - { - return index; - } - } - } - } - return -1; - } - -// Insert key that is not present to table without deleted entries -// and enough free space - private int insertNewKey(Object key, int hash) { - if (check && occupiedCount != keyCount) Context.codeBug(); - if (check && keyCount == 1 << power) Context.codeBug(); - int fraction = hash * A; - int index = fraction >>> (32 - power); - int N = 1 << power; - if (keys[index] != null) { - int mask = N - 1; - int step = tableLookupStep(fraction, mask, power); - int firstIndex = index; - do { - if (check && keys[index] == DELETED) Context.codeBug(); - index = (index + step) & mask; - if (check && firstIndex == index) Context.codeBug(); - } while (keys[index] != null); - } - keys[index] = key; - values[N + index] = hash; - ++occupiedCount; - ++keyCount; - - return index; - } - - private void rehashTable() { - if (keys == null) { - if (check && keyCount != 0) Context.codeBug(); - if (check && occupiedCount != 0) Context.codeBug(); - int N = 1 << power; - keys = new Object[N]; - values = new int[2 * N]; - } - else { - // Check if removing deleted entries would free enough space - if (keyCount * 2 >= occupiedCount) { - // Need to grow: less then half of deleted entries - ++power; - } - int N = 1 << power; - Object[] oldKeys = keys; - int[] oldValues = values; - int oldN = oldKeys.length; - keys = new Object[N]; - values = new int[2 * N]; - - int remaining = keyCount; - occupiedCount = keyCount = 0; - for (int i = 0; remaining != 0; ++i) { - Object key = oldKeys[i]; - if (key != null && key != DELETED) { - int keyHash = oldValues[oldN + i]; - int index = insertNewKey(key, keyHash); - values[index] = oldValues[i]; - --remaining; - } - } - } - } - -// Ensure key index creating one if necessary - private int ensureIndex(Object key) { - int hash = key.hashCode(); - int index = -1; - int firstDeleted = -1; - if (keys != null) { - int fraction = hash * A; - index = fraction >>> (32 - power); - Object test = keys[index]; - if (test != null) { - int N = 1 << power; - if (test == key - || (values[N + index] == hash && test.equals(key))) - { - return index; - } - if (test == DELETED) { - firstDeleted = index; - } - - // Search in table after first failed attempt - int mask = N - 1; - int step = tableLookupStep(fraction, mask, power); - int n = 0; - for (;;) { - if (check) { - if (n >= occupiedCount) Context.codeBug(); - ++n; - } - index = (index + step) & mask; - test = keys[index]; - if (test == null) { - break; - } - if (test == key - || (values[N + index] == hash && test.equals(key))) - { - return index; - } - if (test == DELETED && firstDeleted < 0) { - firstDeleted = index; - } - } - } - } - // Inserting of new key - if (check && keys != null && keys[index] != null) - Context.codeBug(); - if (firstDeleted >= 0) { - index = firstDeleted; - } - else { - // Need to consume empty entry: check occupation level - if (keys == null || occupiedCount * 4 >= (1 << power) * 3) { - // Too litle unused entries: rehash - rehashTable(); - return insertNewKey(key, hash); - } - ++occupiedCount; - } - keys[index] = key; - values[(1 << power) + index] = hash; - ++keyCount; - return index; - } - - private void writeObject(ObjectOutputStream out) - throws IOException - { - out.defaultWriteObject(); - - int count = keyCount; - for (int i = 0; count != 0; ++i) { - Object key = keys[i]; - if (key != null && key != DELETED) { - --count; - out.writeObject(key); - out.writeInt(values[i]); - } - } - } - - private void readObject(ObjectInputStream in) - throws IOException, ClassNotFoundException - { - in.defaultReadObject(); - - int writtenKeyCount = keyCount; - if (writtenKeyCount != 0) { - keyCount = 0; - int N = 1 << power; - keys = new Object[N]; - values = new int[2 * N]; - for (int i = 0; i != writtenKeyCount; ++i) { - Object key = in.readObject(); - int hash = key.hashCode(); - int index = insertNewKey(key, hash); - values[index] = in.readInt(); - } - } - } - - static final long serialVersionUID = 3396438333234169727L; - -// A == golden_ratio * (1 << 32) = ((sqrt(5) - 1) / 2) * (1 << 32) -// See Knuth etc. - private static final int A = 0x9e3779b9; - - private static final Object DELETED = new Object(); - -// Structure of kyes and values arrays (N == 1 << power): -// keys[0 <= i < N]: key value or null or DELETED mark -// values[0 <= i < N]: value of key at keys[i] -// values[N <= i < 2*N]: hash code of key at keys[i-N] - - private transient Object[] keys; - private transient int[] values; - - private int power; - private int keyCount; - private transient int occupiedCount; // == keyCount + deleted_count - -// If true, enables consitency checks - private static final boolean check = false; - -/* TEST START - - public static void main(String[] args) { - if (!check) { - System.err.println("Set check to true and re-run"); - throw new RuntimeException("Set check to true and re-run"); - } - - ObjToIntMap map; - map = new ObjToIntMap(0); - testHash(map, 3); - map = new ObjToIntMap(0); - testHash(map, 10 * 1000); - map = new ObjToIntMap(); - testHash(map, 10 * 1000); - map = new ObjToIntMap(30 * 1000); - testHash(map, 10 * 100); - map.clear(); - testHash(map, 4); - map = new ObjToIntMap(0); - testHash(map, 10 * 100); - } - - private static void testHash(ObjToIntMap map, int N) { - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - check(-1 == map.get(key, -1)); - map.put(key, i); - check(i == map.get(key, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - map.put(key, i); - check(i == map.get(key, -1)); - } - - check(map.size() == N); - - System.out.print("."); System.out.flush(); - Object[] keys = map.getKeys(); - check(keys.length == N); - for (int i = 0; i != N; ++i) { - Object key = keys[i]; - check(map.has(key)); - } - - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - check(i == map.get(key, -1)); - } - - int Nsqrt = -1; - for (int i = 0; ; ++i) { - if (i * i >= N) { - Nsqrt = i; - break; - } - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i * i); - map.put(key, i); - check(i == map.get(key, -1)); - } - - check(map.size() == 2 * N - Nsqrt); - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i * i); - check(i == map.get(key, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(-1 - i * i); - map.put(key, i); - check(i == map.get(key, -1)); - } - - check(map.size() == 3 * N - Nsqrt); - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(-1 - i * i); - map.remove(key); - check(!map.has(key)); - } - - check(map.size() == 2 * N - Nsqrt); - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i * i); - check(i == map.get(key, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - int j = intSqrt(i); - if (j * j == i) { - check(j == map.get(key, -1)); - }else { - check(i == map.get(key, -1)); - } - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i * i); - map.remove(key); - check(-2 == map.get(key, -2)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - map.put(key, i); - check(i == map.get(key, -2)); - } - - check(map.size() == N); - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - check(i == map.get(key, -1)); - } - - System.out.print("."); System.out.flush(); - ObjToIntMap copy = (ObjToIntMap)writeAndRead(map); - check(copy.size() == N); - - for (int i = 0; i != N; ++i) { - Object key = testKey(i); - check(i == copy.get(key, -1)); - } - - System.out.print("."); System.out.flush(); - checkSameMaps(copy, map); - - System.out.println(); System.out.flush(); - } - - private static void checkSameMaps(ObjToIntMap map1, ObjToIntMap map2) { - check(map1.size() == map2.size()); - Object[] keys = map1.getKeys(); - check(keys.length == map1.size()); - for (int i = 0; i != keys.length; ++i) { - check(map1.get(keys[i], -1) == map2.get(keys[i], -1)); - } - } - - private static void check(boolean condition) { - if (!condition) Context.codeBug(); - } - - private static Object[] testPool; - - private static Object testKey(int i) { - int MAX_POOL = 100; - if (0 <= i && i < MAX_POOL) { - if (testPool != null && testPool[i] != null) { - return testPool[i]; - } - } - Object x = new Double(i + 0.5); - if (0 <= i && i < MAX_POOL) { - if (testPool == null) { - testPool = new Object[MAX_POOL]; - } - testPool[i] = x; - } - return x; - } - - private static int intSqrt(int i) { - int approx = (int)Math.sqrt(i) + 1; - while (approx * approx > i) { - --approx; - } - return approx; - } - - private static Object writeAndRead(Object obj) { - try { - java.io.ByteArrayOutputStream - bos = new java.io.ByteArrayOutputStream(); - java.io.ObjectOutputStream - out = new java.io.ObjectOutputStream(bos); - out.writeObject(obj); - out.close(); - byte[] data = bos.toByteArray(); - java.io.ByteArrayInputStream - bis = new java.io.ByteArrayInputStream(data); - java.io.ObjectInputStream - in = new java.io.ObjectInputStream(bis); - Object result = in.readObject(); - in.close(); - return result; - }catch (Exception ex) { - throw new RuntimeException("Unexpected"); - } - } - -// TEST END */ - -} diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/ScriptRuntime.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/ScriptRuntime.java index cdb811937db..588d6e57f3e 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/ScriptRuntime.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/ScriptRuntime.java @@ -49,31 +49,6 @@ public class ScriptRuntime { public static double NaN = 0.0d / 0.0; - public static String numberToString(double d, int base) { - if (Double.isNaN(d)) - return "NaN"; - if (d == Double.POSITIVE_INFINITY) - return "Infinity"; - if (d == Double.NEGATIVE_INFINITY) - return "-Infinity"; - if (d == 0.0) - return "0"; - - if ((base < 2) || (base > 36)) { - throw new Error(Context.getMessage1("msg.bad.radix", - Integer.toString(base))); - } - - if (base != 10) { - return DToA.JS_dtobasestr(base, d); - } else { - StringBuffer result = new StringBuffer(); - DToA.JS_dtostr(result, DToA.DTOSTR_STANDARD, 0, d); - return result.toString(); - } - - } - /* * Helper function for toNumber, parseInt, and TokenStream.getToken. */ @@ -171,68 +146,4 @@ public class ScriptRuntime { return sum; } - /** - * For escaping strings printed by object and array literals; not quite - * the same as 'escape.' - */ - public static String escapeString(String s) { - - StringBuffer sb = null; - - for(int i = 0, L = s.length(); i != L; ++i) { - int c = s.charAt(i); - - if (' ' <= c && c <= '~' && c != '"' && c != '\\') { - // an ordinary print character (like C isprint()) and not " - // or \ . Note single quote ' is not escaped - if (sb != null) { - sb.append((char)c); - } - continue; - } - if (sb == null) { - sb = new StringBuffer(L + 3); - sb.append(s); - sb.setLength(i); - } - - int escape = -1; - switch (c) { - case '\b': escape = 'b'; break; - case '\f': escape = 'f'; break; - case '\n': escape = 'n'; break; - case '\r': escape = 'r'; break; - case '\t': escape = 't'; break; - case 0xb: escape = 'v'; break; // Java lacks \v. - case '"': escape = '"'; break; - case ' ': escape = ' '; break; - case '\\': escape = '\\'; break; - } - if (escape >= 0) { - // an \escaped sort of character - sb.append('\\'); - sb.append((char)escape); - } else { - int hexSize; - if (c < 256) { - // 2-digit hex - sb.append("\\x"); - hexSize = 2; - } else { - // Unicode. - sb.append("\\u"); - hexSize = 4; - } - // append hexadecimal form of c left-padded with 0 - for (int shift = (hexSize - 1) * 4; shift >= 0; shift -= 4) { - int digit = 0xf & (c >> shift); - int hc = (digit < 10) ? '0' + digit : 'a' - 10 + digit; - sb.append((char)hc); - } - } - } - - return (sb == null) ? s : sb.toString(); - } - } diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java index cfa23180abf..f99a158905b 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java @@ -655,10 +655,6 @@ public class TokenStream { return false; } - public void clearPushback() { - this.pushbackToken = EOF; - } - public void ungetToken(int tt) { if (this.pushbackToken != EOF && tt != ERROR) { String message = Context.getMessage2("msg.token.replaces.pushback", @@ -688,37 +684,6 @@ public class TokenStream { return result; } - public static boolean isJSKeyword(String s) { - return getKeywordId(s) != 0; - } - - public static boolean isJSIdentifier(String s) { - int length = s.length(); - - if (length == 0 || !Character.isJavaIdentifierStart(s.charAt(0))) - return false; - - for (int i=1; i= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); @@ -746,11 +711,6 @@ public class TokenStream { || Character.getType((char)c) == Character.SPACE_SEPARATOR); } - public static boolean isJSLineTerminator(int c) { - return (c == '\n' || c == '\r' - || c == 0x2028 || c == 0x2029); - } - private void skipLine() throws IOException { // skip to end of line int c; diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/UintMap.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/UintMap.java index c2072b9565a..847b7958080 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/UintMap.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/UintMap.java @@ -454,201 +454,4 @@ class UintMap implements Serializable { // If true, enables consitency checks private static final boolean check = false; - -/* TEST START - - public static void main(String[] args) { - if (!check) { - System.err.println("Set check to true and re-run"); - throw new RuntimeException("Set check to true and re-run"); - } - - UintMap map; - map = new UintMap(); - testHash(map, 2); - map = new UintMap(); - testHash(map, 10 * 1000); - map = new UintMap(30 * 1000); - testHash(map, 10 * 100); - map.clear(); - testHash(map, 4); - map = new UintMap(0); - testHash(map, 10 * 100); - } - - private static void testHash(UintMap map, int N) { - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - map.put(i, i); - check(i == map.getInt(i, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - map.put(i, i); - check(i == map.getInt(i, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - map.put(i, new Integer(i)); - check(-1 == map.getInt(i, -1)); - Integer obj = (Integer)map.getObject(i); - check(obj != null && i == obj.intValue()); - } - - check(map.size() == N); - - System.out.print("."); System.out.flush(); - int[] keys = map.getKeys(); - check(keys.length == N); - for (int i = 0; i != N; ++i) { - int key = keys[i]; - check(map.has(key)); - check(!map.isIntType(key)); - check(map.isObjectType(key)); - Integer obj = (Integer) map.getObject(key); - check(obj != null && key == obj.intValue()); - } - - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - check(-1 == map.getInt(i, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - map.put(i * i, i); - check(i == map.getInt(i * i, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - check(i == map.getInt(i * i, -1)); - } - - System.out.print("."); System.out.flush(); - for (int i = 0; i != N; ++i) { - map.put(i * i, new Integer(i)); - check(-1 == map.getInt(i * i, -1)); - map.remove(i * i); - check(!map.has(i * i)); - map.put(i * i, i); - check(map.isIntType(i * i)); - check(null == map.getObject(i * i)); - map.remove(i * i); - check(!map.isObjectType(i * i)); - check(!map.isIntType(i * i)); - } - - int old_size = map.size(); - for (int i = 0; i != N; ++i) { - map.remove(i * i); - check(map.size() == old_size); - } - - System.out.print("."); System.out.flush(); - map.clear(); - check(map.size() == 0); - for (int i = 0; i != N; ++i) { - map.put(i * i, i); - map.put(i * i + 1, new Double(i+0.5)); - } - checkSameMaps(map, (UintMap)writeAndRead(map)); - - System.out.print("."); System.out.flush(); - map = new UintMap(0); - checkSameMaps(map, (UintMap)writeAndRead(map)); - map = new UintMap(1); - checkSameMaps(map, (UintMap)writeAndRead(map)); - map = new UintMap(1000); - checkSameMaps(map, (UintMap)writeAndRead(map)); - - System.out.print("."); System.out.flush(); - map = new UintMap(N / 10); - for (int i = 0; i != N; ++i) { - map.put(2*i+1, i); - } - checkSameMaps(map, (UintMap)writeAndRead(map)); - - System.out.print("."); System.out.flush(); - map = new UintMap(N / 10); - for (int i = 0; i != N; ++i) { - map.put(2*i+1, i); - } - for (int i = 0; i != N / 2; ++i) { - map.remove(2*i+1); - } - checkSameMaps(map, (UintMap)writeAndRead(map)); - - System.out.print("."); System.out.flush(); - map = new UintMap(); - for (int i = 0; i != N; ++i) { - map.put(2*i+1, new Double(i + 10)); - } - for (int i = 0; i != N / 2; ++i) { - map.remove(2*i+1); - } - checkSameMaps(map, (UintMap)writeAndRead(map)); - - System.out.println(); System.out.flush(); - - } - - private static void checkSameMaps(UintMap map1, UintMap map2) { - check(map1.size() == map2.size()); - int[] keys = map1.getKeys(); - check(keys.length == map1.size()); - for (int i = 0; i != keys.length; ++i) { - int key = keys[i]; - check(map2.has(key)); - check(map1.isObjectType(key) == map2.isObjectType(key)); - check(map1.isIntType(key) == map2.isIntType(key)); - Object o1 = map1.getObject(key); - Object o2 = map2.getObject(key); - if (map1.isObjectType(key)) { - check(o1.equals(o2)); - }else { - check(map1.getObject(key) == null); - check(map2.getObject(key) == null); - } - if (map1.isIntType(key)) { - check(map1.getExistingInt(key) == map2.getExistingInt(key)); - }else { - check(map1.getInt(key, -10) == -10); - check(map1.getInt(key, -11) == -11); - check(map2.getInt(key, -10) == -10); - check(map2.getInt(key, -11) == -11); - } - } - } - - private static void check(boolean condition) { - if (!condition) Context.codeBug(); - } - - private static Object writeAndRead(Object obj) { - try { - java.io.ByteArrayOutputStream - bos = new java.io.ByteArrayOutputStream(); - java.io.ObjectOutputStream - out = new java.io.ObjectOutputStream(bos); - out.writeObject(obj); - out.close(); - byte[] data = bos.toByteArray(); - java.io.ByteArrayInputStream - bis = new java.io.ByteArrayInputStream(data); - java.io.ObjectInputStream - in = new java.io.ObjectInputStream(bis); - Object result = in.readObject(); - in.close(); - return result; - }catch (Exception ex) { - ex.printStackTrace(); - throw new RuntimeException("Unexpected"); - } - } - -// TEST END */ } diff --git a/js/js.rhino-parser/src/com/google/gwt/dev/js/rhino/ObjArray.java b/js/js.rhino-parser/src/com/google/gwt/dev/js/rhino/ObjArray.java deleted file mode 100644 index 85156730145..00000000000 --- a/js/js.rhino-parser/src/com/google/gwt/dev/js/rhino/ObjArray.java +++ /dev/null @@ -1,356 +0,0 @@ -/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1997-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * Igor Bukanov - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License (the "GPL"), in which case the - * provisions of the GPL are applicable instead of those above. - * If you wish to allow use of your version of this file only - * under the terms of the GPL and not to allow others to use your - * version of this file under the NPL, indicate your decision by - * deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete - * the provisions above, a recipient may use your version of this - * file under either the NPL or the GPL. - */ -// Modified by Google - -package com.google.gwt.dev.js.rhino; - -import java.io.Serializable; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -/** -Implementation of resizable array with focus on minimizing memory usage by storing few initial array elements in object fields. Can also be used as a stack. -*/ - -public class ObjArray implements Serializable { - - public ObjArray() { } - - public ObjArray(int capacityHint) { - if (capacityHint < 0) throw new IllegalArgumentException(); - if (capacityHint > FIELDS_STORE_SIZE) { - data = new Object[capacityHint - FIELDS_STORE_SIZE]; - } - } - - public final boolean isEmpty() { - return size == 0; - } - - public final int size() { - return size; - } - - public final void setSize(int newSize) { - if (newSize < 0) throw new IllegalArgumentException(); - int N = size; - if (newSize < N) { - for (int i = newSize; i != N; ++i) { - setImpl(i, null); - } - }else if (newSize > N) { - if (newSize > FIELDS_STORE_SIZE) { - ensureCapacity(newSize); - } - } - size = newSize; - } - - public final Object get(int index) { - if (!(0 <= index && index < size)) throw invalidIndex(index, size); - return getImpl(index); - } - - public final void set(int index, Object value) { - if (!(0 <= index && index < size)) throw invalidIndex(index, size); - setImpl(index, value); - } - - private Object getImpl(int index) { - switch (index) { - case 0: return f0; - case 1: return f1; - case 2: return f2; - case 3: return f3; - case 4: return f4; - case 5: return f5; - } - return data[index - FIELDS_STORE_SIZE]; - } - - private void setImpl(int index, Object value) { - switch (index) { - case 0: f0 = value; break; - case 1: f1 = value; break; - case 2: f2 = value; break; - case 3: f3 = value; break; - case 4: f4 = value; break; - case 5: f5 = value; break; - default: data[index - FIELDS_STORE_SIZE] = value; - } - - } - - public int indexOf(Object obj) { - int N = size; - for (int i = 0; i != N; ++i) { - Object current = getImpl(i); - if (current == obj || (current != null && current.equals(obj))) { - return i; - } - } - return -1; - } - - public int lastIndexOf(Object obj) { - for (int i = size; i != 0;) { - --i; - Object current = getImpl(i); - if (current == obj || (current != null && current.equals(obj))) { - return i; - } - } - return -1; - } - - public final Object peek() { - int N = size; - if (N == 0) throw invalidEmptyStackAccess(); - return getImpl(N - 1); - } - - public final Object pop() { - int N = size; - --N; - Object top; - switch (N) { - case -1: throw invalidEmptyStackAccess(); - case 0: top = f0; f0 = null; break; - case 1: top = f1; f1 = null; break; - case 2: top = f2; f2 = null; break; - case 3: top = f3; f3 = null; break; - case 4: top = f4; f4 = null; break; - case 5: top = f5; f5 = null; break; - default: - top = data[N - FIELDS_STORE_SIZE]; - data[N - FIELDS_STORE_SIZE] = null; - } - size = N; - return top; - } - - public final void push(Object value) { - add(value); - } - - public final void add(Object value) { - int N = size; - if (N >= FIELDS_STORE_SIZE) { - ensureCapacity(N + 1); - } - size = N + 1; - setImpl(N, value); - } - - public final void add(int index, Object value) { - Object tmp; - int N = size; - if (!(0 <= index && index <= N)) throw invalidIndex(index, N + 1); - switch (index) { - case 0: - if (N == 0) { f0 = value; break; } - tmp = f0; f0 = value; value = tmp; - case 1: - if (N == 1) { f1 = value; break; } - tmp = f1; f1 = value; value = tmp; - case 2: - if (N == 2) { f2 = value; break; } - tmp = f2; f2 = value; value = tmp; - case 3: - if (N == 3) { f3 = value; break; } - tmp = f3; f3 = value; value = tmp; - case 4: - if (N == 4) { f4 = value; break; } - tmp = f4; f4 = value; value = tmp; - case 5: - if (N == 5) { f5 = value; break; } - tmp = f5; f5 = value; value = tmp; - - index = FIELDS_STORE_SIZE; - default: - ensureCapacity(N + 1); - if (index != N) { - System.arraycopy(data, index - FIELDS_STORE_SIZE, - data, index - FIELDS_STORE_SIZE + 1, - N - index); - } - data[index - FIELDS_STORE_SIZE] = value; - } - size = N + 1; - } - - public final void remove(int index) { - int N = size; - if (!(0 <= index && index < N)) throw invalidIndex(index, N); - --N; - switch (index) { - case 0: - if (N == 0) { f0 = null; break; } - f0 = f1; - case 1: - if (N == 1) { f1 = null; break; } - f1 = f2; - case 2: - if (N == 2) { f2 = null; break; } - f2 = f3; - case 3: - if (N == 3) { f3 = null; break; } - f3 = f4; - case 4: - if (N == 4) { f4 = null; break; } - f4 = f5; - case 5: - if (N == 5) { f5 = null; break; } - f5 = data[0]; - - index = FIELDS_STORE_SIZE; - default: - if (index != N) { - System.arraycopy(data, index - FIELDS_STORE_SIZE + 1, - data, index - FIELDS_STORE_SIZE, - N - index); - } - data[N - FIELDS_STORE_SIZE] = null; - } - size = N; - } - - public final void clear() { - int N = size; - for (int i = 0; i != N; ++i) { - setImpl(i, null); - } - size = 0; - } - - public final Object[] toArray() { - Object[] array = new Object[size]; - toArray(array, 0); - return array; - } - - public final void toArray(Object[] array) { - toArray(array, 0); - } - - public final void toArray(Object[] array, int offset) { - int N = size; - switch (N) { - default: - System.arraycopy(data, 0, array, offset + FIELDS_STORE_SIZE, - N - FIELDS_STORE_SIZE); - case 6: array[offset + 5] = f5; - case 5: array[offset + 4] = f4; - case 4: array[offset + 3] = f3; - case 3: array[offset + 2] = f2; - case 2: array[offset + 1] = f1; - case 1: array[offset + 0] = f0; - case 0: break; - } - } - - private void ensureCapacity(int minimalCapacity) { - int required = minimalCapacity - FIELDS_STORE_SIZE; - if (required <= 0) throw new IllegalArgumentException(); - if (data == null) { - int alloc = FIELDS_STORE_SIZE * 2; - if (alloc < required) { - alloc = required; - } - data = new Object[alloc]; - } else { - int alloc = data.length; - if (alloc < required) { - if (alloc <= FIELDS_STORE_SIZE) { - alloc = FIELDS_STORE_SIZE * 2; - } else { - alloc *= 2; - } - if (alloc < required) { - alloc = required; - } - Object[] tmp = new Object[alloc]; - if (size > FIELDS_STORE_SIZE) { - System.arraycopy(data, 0, tmp, 0, - size - FIELDS_STORE_SIZE); - } - data = tmp; - } - } - } - - private static RuntimeException invalidIndex(int index, int upperBound) { - // \u2209 is "NOT ELEMENT OF" - String msg = index+" \u2209 [0, "+upperBound+')'; - return new IndexOutOfBoundsException(msg); - } - - private static RuntimeException invalidEmptyStackAccess() { - throw new RuntimeException("Empty stack"); - } - - private void writeObject(ObjectOutputStream os) throws IOException { - os.defaultWriteObject(); - int N = size; - for (int i = 0; i != N; ++i) { - Object obj = getImpl(i); - os.writeObject(obj); - } - } - - private void readObject(ObjectInputStream is) - throws IOException, ClassNotFoundException - { - is.defaultReadObject(); // It reads size - int N = size; - if (N > FIELDS_STORE_SIZE) { - data = new Object[N - FIELDS_STORE_SIZE]; - } - for (int i = 0; i != N; ++i) { - Object obj = is.readObject(); - setImpl(i, obj); - } - } - - static final long serialVersionUID = 7448768847663119705L; - -// Number of data elements - private int size; - - private static final int FIELDS_STORE_SIZE = 6; - private transient Object f0, f1, f2, f3, f4, f5; - private transient Object[] data; -}