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;
-}