From dda3ccddadbc81ef04c7ea93ec4267d4be4ba68d Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Tue, 27 Apr 1999 06:23:48 +0000 Subject: [PATCH] Removing copies of Rhino code git-svn-id: svn://10.0.0.236/trunk@29406 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/js2/java/BinaryDigitReader.java | 43 - mozilla/js/js2/java/Context.java | 79 - mozilla/js/js2/java/FunctionNode.java | 18 - mozilla/js/js2/java/IRFactory.java | 994 ------------- mozilla/js/js2/java/Interpreter.java | 35 - mozilla/js/js2/java/JSStack.java | 39 - mozilla/js/js2/java/LineBuffer.java | 333 ----- mozilla/js/js2/java/Node.java | 524 ------- .../js/js2/java/PostorderNodeIterator.java | 57 - mozilla/js/js2/java/PreorderNodeIterator.java | 58 - mozilla/js/js2/java/ScriptRuntime.java | 128 -- mozilla/js/js2/java/ShallowNodeIterator.java | 35 - mozilla/js/js2/java/TokenStream.java | 1299 ----------------- mozilla/js/js2/java/WrappedException.java | 56 - 14 files changed, 3698 deletions(-) delete mode 100644 mozilla/js/js2/java/BinaryDigitReader.java delete mode 100644 mozilla/js/js2/java/Context.java delete mode 100644 mozilla/js/js2/java/FunctionNode.java delete mode 100644 mozilla/js/js2/java/IRFactory.java delete mode 100644 mozilla/js/js2/java/Interpreter.java delete mode 100644 mozilla/js/js2/java/JSStack.java delete mode 100644 mozilla/js/js2/java/LineBuffer.java delete mode 100644 mozilla/js/js2/java/Node.java delete mode 100644 mozilla/js/js2/java/PostorderNodeIterator.java delete mode 100644 mozilla/js/js2/java/PreorderNodeIterator.java delete mode 100644 mozilla/js/js2/java/ScriptRuntime.java delete mode 100644 mozilla/js/js2/java/ShallowNodeIterator.java delete mode 100644 mozilla/js/js2/java/TokenStream.java delete mode 100644 mozilla/js/js2/java/WrappedException.java diff --git a/mozilla/js/js2/java/BinaryDigitReader.java b/mozilla/js/js2/java/BinaryDigitReader.java deleted file mode 100644 index 882fde202b3..00000000000 --- a/mozilla/js/js2/java/BinaryDigitReader.java +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -final class BinaryDigitReader { - int lgBase; // Logarithm of base of number - int digit; // Current digit value in radix given by base - int digitPos; // Bit position of last bit extracted from digit - String digits; // String containing the digits - int start; // Index of the first remaining digit - int end; // Index past the last remaining digit - - BinaryDigitReader(int base, String digits, int start, int end) { - lgBase = 0; - while (base != 1) { - lgBase++; - base >>= 1; - } - digitPos = 0; - this.digits = digits; - this.start = start; - this.end = end; - } - - /* Return the next binary digit from the number or -1 if done */ - int getNextBinaryDigit() - { - if (digitPos == 0) { - if (start == end) - return -1; - - char c = digits.charAt(start++); - if ('0' <= c && c <= '9') - digit = c - '0'; - else if ('a' <= c && c <= 'z') - digit = c - 'a' + 10; - else digit = c - 'A' + 10; - digitPos = lgBase; - } - return digit >> --digitPos & 1; - } -} diff --git a/mozilla/js/js2/java/Context.java b/mozilla/js/js2/java/Context.java deleted file mode 100644 index cb32c9e7f18..00000000000 --- a/mozilla/js/js2/java/Context.java +++ /dev/null @@ -1,79 +0,0 @@ -import java.util.Hashtable; - -class Context { - - static boolean printTrees = true; - public static final int VERSION_DEFAULT = 0; - public static final int VERSION_1_2 = 120; - - public Context() { - setLanguageVersion(VERSION_DEFAULT); - } - - public synchronized void enter() throws ThreadLinkException, - InterruptedException - { - Thread t = Thread.currentThread(); - - while (currentThread != null) { - - // Check to avoid deadlock - if (t == currentThread) { - throw new ThreadLinkException( - "Context already associated with a Thread"); - } - wait(); - } - currentThread = t; - - synchronized (threadContexts) { - Context cx = (Context) threadContexts.get(t); - if (cx != null) { - currentThread = null; - throw new ThreadLinkException( - "Thread already associated with a Context"); - } - threadContexts.put(t, this); - } - } - - static Context getContext() { - Thread t = Thread.currentThread(); - Context cx = (Context) threadContexts.get(t); - if (cx == null) { - throw new WrappedException(new ThreadLinkException( - "No Context associated with current Thread")); - } - return cx; - } - - public void setLanguageVersion(int version) { - this.version = version; - } - - public int getLanguageVersion() { - return version; - } - int version; - - static String getMessage(String messageId, Object[] arguments) - { - return messageId; - } - - static void reportError(String message, String sourceName, - int lineno, String lineSource, - int lineOffset) - { - } - - static void reportWarning(String message, String sourceName, - int lineno, String lineSource, - int lineOffset) - { - } - - private Thread currentThread; - private static Hashtable threadContexts = new Hashtable(11); -}; - \ No newline at end of file diff --git a/mozilla/js/js2/java/FunctionNode.java b/mozilla/js/js2/java/FunctionNode.java deleted file mode 100644 index 9ffad550aa5..00000000000 --- a/mozilla/js/js2/java/FunctionNode.java +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -import java.util.*; - -public class FunctionNode extends Node { - - public FunctionNode(String name, Node left, Node right) { - super(TokenStream.FUNCTION, left, right, name); - } - - public String getFunctionName() { - return getString(); - } - -} diff --git a/mozilla/js/js2/java/IRFactory.java b/mozilla/js/js2/java/IRFactory.java deleted file mode 100644 index 1b6997519fd..00000000000 --- a/mozilla/js/js2/java/IRFactory.java +++ /dev/null @@ -1,994 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -/** - * This class allows the creation of nodes, and follows the Factory pattern. - * - * @see Node - * @see NodeFactory - * @see ASTFactory - - * @author Mike McCabe - * @author Norris Boyd - */ -public class IRFactory { - - public IRFactory(TokenStream ts) { - this.ts = ts; - } - - /** - * Script (for associating file/url names with toplevel scripts.) - */ - public Object createScript(Object body, String sourceName, - int baseLineno, int endLineno, Object source) - { - Node result = new Node(TokenStream.SCRIPT, sourceName); - Node children = ((Node) body).getFirstChild(); - if (children != null) - result.addChildrenToBack(children); - result.putProp(Node.SOURCENAME_PROP, sourceName); - result.putProp(Node.BASE_LINENO_PROP, new Integer(baseLineno)); - result.putProp(Node.END_LINENO_PROP, new Integer(endLineno)); - if (source != null) - result.putProp(Node.SOURCE_PROP, source); - return result; - } - - /** - * Leaf - */ - public Object createLeaf(int nodeType) { - return new Node(nodeType); - } - - public Object createLeaf(int nodeType, String id) { - return new Node(nodeType, id); - } - - public Object createLeaf(int nodeType, int nodeOp) { - return new Node(nodeType, new Integer(nodeOp)); - } - - /** - * Statement leaf nodes. - */ - - public Object createSwitch(int lineno) { - return new Node(TokenStream.SWITCH, new Integer(lineno)); - } - - public Object createVariables(int lineno) { - return new Node(TokenStream.VAR, new Integer(lineno)); - } - - public Object createExprStatement(Object expr, int lineno) { - return new Node(TokenStream.EXPRSTMT, (Node) expr, new Integer(lineno)); - } - - /** - * Name - */ - public Object createName(String name) { - return new Node(TokenStream.NAME, name); - } - - /** - * String (for literals) - */ - public Object createString(String string) { - return new Node(TokenStream.STRING, string); - } - - /** - * Number (for literals) - */ - public Object createNumber(Number number) { - return new Node(TokenStream.NUMBER, number); - } - - /** - * Catch clause of try/catch/finally - * @param varName the name of the variable to bind to the exception - * @param catchCond the condition under which to catch the exception. - * May be null if no condition is given. - * @param stmts the statements in the catch clause - * @param lineno the starting line number of the catch clause - */ - public Object createCatch(String varName, Object catchCond, Object stmts, - int lineno) - { - if (catchCond == null) - catchCond = new Node(TokenStream.PRIMARY, - new Integer(TokenStream.TRUE)); - Node result = new Node(TokenStream.CATCH, (Node)createName(varName), - (Node)catchCond, (Node)stmts); - result.setDatum(new Integer(lineno)); - return result; - } - - /** - * Throw - */ - public Object createThrow(Object expr, int lineno) { - return new Node(TokenStream.THROW, (Node)expr, new Integer(lineno)); - } - - /** - * Return - */ - public Object createReturn(Object expr, int lineno) { - return expr == null - ? new Node(TokenStream.RETURN, new Integer(lineno)) - : new Node(TokenStream.RETURN, (Node)expr, new Integer(lineno)); - } - - /** - * Label - */ - public Object createLabel(String label, int lineno) { - Node result = new Node(TokenStream.LABEL, new Integer(lineno)); - Node name = new Node(TokenStream.NAME, label); - result.addChildToBack(name); - return result; - } - - /** - * Break (possibly labeled) - */ - public Object createBreak(String label, int lineno) { - Node result = new Node(TokenStream.BREAK, new Integer(lineno)); - if (label == null) { - return result; - } else { - Node name = new Node(TokenStream.NAME, label); - result.addChildToBack(name); - return result; - } - } - - /** - * Continue (possibly labeled) - */ - public Object createContinue(String label, int lineno) { - Node result = new Node(TokenStream.CONTINUE, new Integer(lineno)); - if (label == null) { - return result; - } else { - Node name = new Node(TokenStream.NAME, label); - result.addChildToBack(name); - return result; - } - } - - /** - * Statement block - * Creates the empty statement block - * Must make subsequent calls to add statements to the node - */ - public Object createBlock(int lineno) { - return new Node(TokenStream.BLOCK, new Integer(lineno)); - } - - public Object createFunctionNode(String name, Object args, - Object statements) - { - if (name == null) - name = ""; - return new FunctionNode(name, (Node) args, (Node) statements); - } - - public Object createFunction(String name, Object args, Object statements, - String sourceName, int baseLineno, - int endLineno, Object source) - { - Node f = (Node) createFunctionNode(name, args, statements); - f.putProp(Node.SOURCENAME_PROP, sourceName); - f.putProp(Node.BASE_LINENO_PROP, new Integer(baseLineno)); - f.putProp(Node.END_LINENO_PROP, new Integer(endLineno)); - if (source != null) - f.putProp(Node.SOURCE_PROP, source); - Node result = new Node(TokenStream.FUNCTION, name); - result.putProp(Node.FUNCTION_PROP, f); - return result; - } - - /** - * Add a child to the back of the given node. This function - * breaks the Factory abstraction, but it removes a requirement - * from implementors of Node. - */ - public void addChildToBack(Object parent, Object child) { - ((Node)parent).addChildToBack((Node)child); - } - - /** - * While - */ - public Object createWhile(Object cond, Object body, int lineno) { - // Just add a GOTO to the condition in the do..while - Node result = (Node) createDoWhile(body, cond, lineno); - Node condTarget = (Node) result.getProp(Node.CONTINUE_PROP); - Node GOTO = new Node(TokenStream.GOTO); - GOTO.putProp(Node.TARGET_PROP, condTarget); - result.addChildToFront(GOTO); - return result; - } - - /** - * DoWhile - */ - public Object createDoWhile(Object body, Object cond, int lineno) { - Node result = new Node(TokenStream.LOOP, new Integer(lineno)); - Node bodyTarget = new Node(TokenStream.TARGET); - Node condTarget = new Node(TokenStream.TARGET); - Node IFEQ = new Node(TokenStream.IFEQ, (Node)cond); - IFEQ.putProp(Node.TARGET_PROP, bodyTarget); - Node breakTarget = new Node(TokenStream.TARGET); - - result.addChildToBack(bodyTarget); - result.addChildrenToBack((Node)body); - result.addChildToBack(condTarget); - result.addChildToBack(IFEQ); - result.addChildToBack(breakTarget); - - result.putProp(Node.BREAK_PROP, breakTarget); - result.putProp(Node.CONTINUE_PROP, condTarget); - - return result; - } - - /** - * For - */ - public Object createFor(Object init, Object test, Object incr, - Object body, int lineno) - { - if (((Node) test).getType() == TokenStream.VOID) { - test = new Node(TokenStream.PRIMARY, - new Integer(TokenStream.TRUE)); - } - Node result = (Node)createWhile(test, body, lineno); - Node initNode = (Node) init; - if (initNode.getType() != TokenStream.VOID) { - if (initNode.getType() != TokenStream.VAR) - initNode = new Node(TokenStream.POP, initNode); - result.addChildToFront(initNode); - } - Node condTarget = (Node)result.getProp(Node.CONTINUE_PROP); - Node incrTarget = new Node(TokenStream.TARGET); - result.addChildBefore(incrTarget, condTarget); - if (((Node) incr).getType() != TokenStream.VOID) { - incr = createUnary(TokenStream.POP, incr); - result.addChildAfter((Node)incr, incrTarget); - } - result.putProp(Node.CONTINUE_PROP, incrTarget); - return result; - } - - /** - * For .. In - * - */ - public Object createForIn(Object lhs, Object obj, Object body, int lineno) { - String name; - Node lhsNode = (Node) lhs; - Node objNode = (Node) obj; - int type = lhsNode.getType(); - - Node lvalue = lhsNode; - switch (type) { - - case TokenStream.NAME: - case TokenStream.GETPROP: - case TokenStream.GETELEM: - break; - - case TokenStream.VAR: - /* - * check that there was only one variable given. - * we can't do this in the parser, because then the - * parser would have to know something about the - * 'init' node of the for-in loop. - */ - Node lastChild = lhsNode.getLastChild(); - if (lhsNode.getFirstChild() != lastChild) { - reportError("msg.mult.index"); - } - lvalue = new Node(TokenStream.NAME, lastChild.getString()); - break; - - default: - reportError("msg.bad.for.in.lhs"); - return objNode; - } - - Node init = new Node(TokenStream.ENUMINIT, objNode); - Node next = new Node(TokenStream.ENUMNEXT); - next.putProp(Node.ENUM_PROP, init); - Node temp = createNewTemp(next); - Node cond = new Node(TokenStream.EQOP, new Integer(TokenStream.NE)); - cond.addChildToBack(temp); - cond.addChildToBack(new Node(TokenStream.PRIMARY, - new Integer(TokenStream.NULL))); - Node newBody = new Node(TokenStream.BLOCK); - Node assign = (Node) createAssignment(TokenStream.NOP, lvalue, - createUseTemp(temp), null, - false); - newBody.addChildToBack(new Node(TokenStream.POP, assign)); - newBody.addChildToBack((Node) body); - Node result = (Node) createWhile(cond, newBody, lineno); - - result.addChildToFront(init); - if (type == TokenStream.VAR) - result.addChildToFront(lhsNode); - - Node done = new Node(TokenStream.ENUMDONE); - done.putProp(Node.ENUM_PROP, init); - result.addChildToBack(done); - - return result; - } - - /** - * Try/Catch/Finally - * - * The IRFactory tries to express as much as possible in the tree; - * the responsibilities remaining for Codegen are to add the Java - * handlers: (Either (but not both) of TARGET and FINALLY might not - * be defined) - - * - a catch handler for javascript exceptions that unwraps the - * exception onto the stack and GOTOes to the catch target - - * TARGET_PROP in the try node. - - * - a finally handler that catches any exception, stores it to a - * temporary, and JSRs to the finally target - FINALLY_PROP in the - * try node - before re-throwing the exception. - - * ... and a goto to GOTO around these handlers. - */ - public Object createTryCatchFinally(Object tryblock, Object catchblocks, - Object finallyblock, int lineno) - { - Node trynode = (Node)tryblock; - - // short circuit - if (trynode.getType() == TokenStream.BLOCK && !trynode.hasChildren()) - return trynode; - - Node pn = new Node(TokenStream.TRY, trynode, new Integer(lineno)); - Node catchNodes = (Node)catchblocks; - boolean hasCatch = catchNodes.hasChildren(); - boolean hasFinally = false; - Node finallyNode = null; - Node finallyTarget = null; - if (finallyblock != null) { - finallyNode = (Node)finallyblock; - hasFinally = (finallyNode.getType() != TokenStream.BLOCK - || finallyNode.hasChildren()); - if (hasFinally) { - // make a TARGET for the finally that the tcf node knows about - finallyTarget = new Node(TokenStream.TARGET); - pn.putProp(Node.FINALLY_PROP, finallyTarget); - - // add jsr finally to the try block - Node jsrFinally = new Node(TokenStream.JSR); - jsrFinally.putProp(Node.TARGET_PROP, finallyTarget); - pn.addChildToBack(jsrFinally); - } - } - - // short circuit - if (!hasFinally && !hasCatch) // bc finally might be an empty block... - return trynode; - - Node endTarget = new Node(TokenStream.TARGET); - Node GOTOToEnd = new Node(TokenStream.GOTO); - GOTOToEnd.putProp(Node.TARGET_PROP, endTarget); - pn.addChildToBack(GOTOToEnd); - - if (hasCatch) { - /* - * - Given - - try { - throw 3; - } catch (e: e instanceof Object) { - print("object"); - } catch (e2) { - print(e2); - } - - rewrite as - - try { - throw 3; - } catch (x) { - o = newScope(); - o.e = x; - with (o) { - if (e instanceof Object) { - print("object"); - } - } - o2 = newScope(); - o2.e2 = x; - with (o2) { - if (true) { - print(e2); - } - } - } - */ - // make a TARGET for the catch that the tcf node knows about - Node catchTarget = new Node(TokenStream.TARGET); - pn.putProp(Node.TARGET_PROP, catchTarget); - // mark it - pn.addChildToBack(catchTarget); - - // get the exception object and store it in a temp - Node exn = createNewLocal(new Node(TokenStream.VOID)); - pn.addChildToBack(new Node(TokenStream.POP, exn)); - - Node endCatch = new Node(TokenStream.TARGET); - - // add [jsr finally?] goto end to each catch block - // expects catchNode children to be (cond block) pairs. - Node cb = catchNodes.getFirstChild(); - while (cb != null) { - Node catchStmt = new Node(TokenStream.BLOCK); - int catchLineNo = ((Integer)cb.getDatum()).intValue(); - - Node name = cb.getFirstChild(); - Node cond = name.getNextSibling(); - Node catchBlock = cond.getNextSibling(); - cb.removeChild(name); - cb.removeChild(cond); - cb.removeChild(catchBlock); - - Node newScope = createNewLocal(new Node(TokenStream.NEWSCOPE)); - Node initScope = new Node(TokenStream.SETPROP, newScope, - new Node(TokenStream.STRING, - name.getString()), - createUseLocal(exn)); - catchStmt.addChildToBack(new Node(TokenStream.POP, initScope)); - - catchBlock.addChildToBack(new Node(TokenStream.LEAVEWITH)); - Node GOTOToEndCatch = new Node(TokenStream.GOTO); - GOTOToEndCatch.putProp(Node.TARGET_PROP, endCatch); - catchBlock.addChildToBack(GOTOToEndCatch); - - Node ifStmt = (Node) createIf(cond, catchBlock, null, catchLineNo); - // Try..catch produces "with" code in order to limit - // the scope of the exception object. - // OPT: We should be able to figure out the correct - // scoping at compile-time and avoid the - // runtime overhead. - Node withStmt = (Node) createWith(createUseLocal(newScope), - ifStmt, catchLineNo); - catchStmt.addChildToBack(withStmt); - - pn.addChildToBack(catchStmt); - - // move to next cb - cb = cb.getNextSibling(); - } - - // Generate code to rethrow if no catch clause was executed - Node rethrow = new Node(TokenStream.THROW, createUseLocal(exn)); - pn.addChildToBack(rethrow); - - pn.addChildToBack(endCatch); - // add a JSR finally if needed - if (hasFinally) { - Node jsrFinally = new Node(TokenStream.JSR); - jsrFinally.putProp(Node.TARGET_PROP, finallyTarget); - pn.addChildToBack(jsrFinally); - Node GOTO = new Node(TokenStream.GOTO); - GOTO.putProp(Node.TARGET_PROP, endTarget); - pn.addChildToBack(GOTO); - } - } - - if (hasFinally) { - pn.addChildToBack(finallyTarget); - Node returnTemp = createNewLocal(new Node(TokenStream.VOID)); - Node popAndMake = new Node(TokenStream.POP, returnTemp); - pn.addChildToBack(popAndMake); - pn.addChildToBack(finallyNode); - Node ret = createUseLocal(returnTemp); - - // add the magic prop that makes it output a RET - ret.putProp(Node.TARGET_PROP, Boolean.TRUE); - pn.addChildToBack(ret); - } - pn.addChildToBack(endTarget); - return pn; - } - - /** - * Throw, Return, Label, Break and Continue are defined in ASTFactory. - */ - - /** - * With - */ - public Object createWith(Object obj, Object body, int lineno) { - Node result = new Node(TokenStream.BLOCK, new Integer(lineno)); - result.addChildToBack(new Node(TokenStream.ENTERWITH, (Node)obj)); - Node bodyNode = new Node(TokenStream.WITH, (Node) body, - new Integer(lineno)); - result.addChildrenToBack(bodyNode); - result.addChildToBack(new Node(TokenStream.LEAVEWITH)); - return result; - } - - /** - * Array Literal - *
createArrayLiteral rewrites its argument as array creation - * plus a series of array element entries, so later compiler - * stages don't need to know about array literals. - */ - public Object createArrayLiteral(Object obj) { - Node array; - Node result; - array = result = new Node(TokenStream.NEW, - new Node(TokenStream.NAME, "Array")); - Node temp = createNewTemp(result); - result = temp; - - java.util.Enumeration children = ((Node) obj).getChildIterator(); - - Node elem = null; - int i = 0; - while (children.hasMoreElements()) { - elem = (Node) children.nextElement(); - if (elem.getType() == TokenStream.PRIMARY && - elem.getInt() == TokenStream.UNDEFINED) - { - i++; - continue; - } - Node addelem = new Node(TokenStream.SETELEM, createUseTemp(temp), - new Node(TokenStream.NUMBER, - new Integer(i)), - elem); - i++; - result = new Node(TokenStream.COMMA, result, addelem); - } - - /* - * If the version is 120, then new Array(4) means create a new - * array with 4 as the first element. In this case, we might - * need to explicitly check against trailing undefined - * elements in the array literal, and set the length manually - * if these occur. Otherwise, we can add an argument to the - * node specifying new Array() to provide the array length. - * (Which will make Array optimizations involving allocating a - * Java array to back the javascript array work better.) - */ - if (Context.getContext().getLanguageVersion() == Context.VERSION_1_2) { - /* When last array element is empty, we need to set the - * length explicitly, because we can't depend on SETELEM - * to do it for us - because empty [,,] array elements - * never set anything at all. */ - if (elem != null && - elem.getType() == TokenStream.PRIMARY && - elem.getInt() == TokenStream.UNDEFINED) - { - Node setlength = new Node(TokenStream.SETPROP, - createUseTemp(temp), - new Node(TokenStream.STRING, - "length"), - new Node(TokenStream.NUMBER, - new Integer(i))); - result = new Node(TokenStream.COMMA, result, setlength); - } - } else { - array.addChildToBack(new Node(TokenStream.NUMBER, - new Integer(i))); - } - return new Node(TokenStream.COMMA, result, createUseTemp(temp)); - } - - /** - * Object Literals - *
createObjectLiteral rewrites its argument as object - * creation plus object property entries, so later compiler - * stages don't need to know about object literals. - */ - public Object createObjectLiteral(Object obj) { - Node result = new Node(TokenStream.NEW, new Node(TokenStream.NAME, - "Object")); - Node temp = createNewTemp(result); - result = temp; - - java.util.Enumeration children = ((Node) obj).getChildIterator(); - - while (children.hasMoreElements()) { - Node elem = (Node)children.nextElement(); - - int op = (elem.getType() == TokenStream.NAME) - ? TokenStream.SETPROP - : TokenStream.SETELEM; - Node addelem = new Node(op, createUseTemp(temp), - elem, (Node)children.nextElement()); - result = new Node(TokenStream.COMMA, result, addelem); - } - return new Node(TokenStream.COMMA, result, createUseTemp(temp)); - } - - /** - * Regular expressions - */ - public Object createRegExp(String string, String flags) { - return flags.length() == 0 - ? new Node(TokenStream.OBJECT, - new Node(TokenStream.STRING, string)) - : new Node(TokenStream.OBJECT, - new Node(TokenStream.STRING, string), - new Node(TokenStream.STRING, flags)); - } - - /** - * If statement - */ - public Object createIf(Object cond, Object ifTrue, Object ifFalse, - int lineno) - { - Node result = new Node(TokenStream.BLOCK, new Integer(lineno)); - Node ifNotTarget = new Node(TokenStream.TARGET); - Node IFNE = new Node(TokenStream.IFNE, (Node) cond); - IFNE.putProp(Node.TARGET_PROP, ifNotTarget); - - result.addChildToBack(IFNE); - result.addChildrenToBack((Node)ifTrue); - - if (ifFalse != null) { - Node GOTOToEnd = new Node(TokenStream.GOTO); - Node endTarget = new Node(TokenStream.TARGET); - GOTOToEnd.putProp(Node.TARGET_PROP, endTarget); - result.addChildToBack(GOTOToEnd); - result.addChildToBack(ifNotTarget); - result.addChildrenToBack((Node)ifFalse); - result.addChildToBack(endTarget); - } else { - result.addChildToBack(ifNotTarget); - } - - return result; - } - - public Object createTernary(Object cond, Object ifTrue, Object ifFalse) { - return createIf(cond, ifTrue, ifFalse, -1); - } - - /** - * Unary - */ - public Object createUnary(int nodeType, Object child) { - Node childNode = (Node) child; - if (nodeType == TokenStream.DELPROP) { - int childType = childNode.getType(); - Node left; - Node right; - if (childType == TokenStream.NAME) { - // Transform Delete(Name "a") - // to Delete(Bind("a"), String("a")) - childNode.setType(TokenStream.BINDNAME); - left = childNode; - right = childNode.cloneNode(); - right.setType(TokenStream.STRING); - } else if (childType == TokenStream.GETPROP || - childType == TokenStream.GETELEM) - { - left = childNode.getFirstChild(); - right = childNode.getLastChild(); - childNode.removeChild(left); - childNode.removeChild(right); - } else { - reportError("msg.del.nonref"); - return new Node(TokenStream.PRIMARY, - new Integer(TokenStream.TRUE)); - } - return new Node(nodeType, left, right); - } - return new Node(nodeType, childNode); - } - - public Object createUnary(int nodeType, int nodeOp, Object child) { - Node childNode = (Node) child; - int childType = childNode.getType(); - if (nodeOp == TokenStream.TYPEOF && - childType == TokenStream.NAME) - { - childNode.setType(TokenStream.TYPEOF); - return childNode; - } - - if (nodeType == TokenStream.INC || nodeType == TokenStream.DEC) { - - if (!hasSideEffects(childNode) - && (nodeOp == TokenStream.POST) - && (childType == TokenStream.NAME - || childType == TokenStream.GETPROP - || childType == TokenStream.GETELEM)) - { - // if it's not a LHS type, createAssignment (below) will throw - // an exception. - return new Node(nodeType, childNode); - } - - /* - * Transform INC/DEC ops to +=1, -=1, - * expecting later optimization of all +/-=1 cases to INC, DEC. - */ - // we have to use Double for now, because - // 0.0 and 1.0 are stored as dconst_[01], - // and using a Float creates a stack mismatch. - Node rhs = (Node) createNumber(new Double(1.0)); - - return createAssignment(nodeType == TokenStream.INC - ? TokenStream.ADD - : TokenStream.SUB, - childNode, - rhs, - ScriptRuntime.NumberClass, - nodeOp == TokenStream.POST); - } - - Node result = new Node(nodeType, new Integer(nodeOp)); - result.addChildToBack((Node)child); - return result; - } - - /** - * Binary - */ - public Object createBinary(int nodeType, Object left, Object right) { - Node temp; - switch (nodeType) { - - case TokenStream.DOT: - nodeType = TokenStream.GETPROP; - Node idNode = (Node) right; - idNode.setType(TokenStream.STRING); - String id = idNode.getString(); - if (id.equals("__proto__") || id.equals("__parent__")) { - Node result = new Node(nodeType, (Node) left); - result.putProp(Node.SPECIAL_PROP_PROP, id); - return result; - } - break; - - case TokenStream.LB: - // OPT: could optimize to GETPROP iff string can't be a number - nodeType = TokenStream.GETELEM; - break; -/* - case TokenStream.AND: - temp = createNewTemp((Node) left); - return createTernary(temp, right, createUseTemp(temp)); - - case TokenStream.OR: - temp = createNewTemp((Node) left); - return createTernary(temp, createUseTemp(temp), right); -*/ - } - return new Node(nodeType, (Node)left, (Node)right); - } - - public Object createBinary(int nodeType, int nodeOp, Object left, - Object right) - { - if (nodeType == TokenStream.ASSIGN) { - return createAssignment(nodeOp, (Node) left, (Node) right, - null, false); - } - return new Node(nodeType, (Node) left, (Node) right, - new Integer(nodeOp)); - } - - public Object createAssignment(int nodeOp, Node left, Node right, - Class convert, boolean postfix) - { - int nodeType = left.getType(); - String idString; - Node id = null; - switch (nodeType) { - case TokenStream.NAME: - return createSetName(nodeOp, left, right, convert, postfix); - - case TokenStream.GETPROP: - idString = (String) left.getProp(Node.SPECIAL_PROP_PROP); - if (idString != null) - id = new Node(TokenStream.STRING, idString); - /* fall through */ - case TokenStream.GETELEM: - if (id == null) - id = left.getLastChild(); - return createSetProp(nodeType, nodeOp, left.getFirstChild(), - id, right, convert, postfix); - default: - reportError("msg.bad.lhs.assign"); - return left; - } - } - - private Node createConvert(Class toType, Node expr) { - if (toType == null) - return expr; - Node result = new Node(TokenStream.CONVERT, expr); - result.putProp(Node.TYPE_PROP, ScriptRuntime.NumberClass); - return result; - } - - private Object createSetName(int nodeOp, Node left, Node right, - Class convert, boolean postfix) - { - if (nodeOp == TokenStream.NOP) { - left.setType(TokenStream.BINDNAME); - return new Node(TokenStream.SETNAME, left, right); - } - - String s = left.getString(); - - if (s.equals("__proto__") || s.equals("__parent__")) { - Node result = new Node(TokenStream.SETPROP, left, right); - result.putProp(Node.SPECIAL_PROP_PROP, s); - return result; - } - - Node opLeft = new Node(TokenStream.NAME, s); - if (convert != null) - opLeft = createConvert(convert, opLeft); - if (postfix) - opLeft = createNewTemp(opLeft); - Node op = new Node(nodeOp, opLeft, right); - - Node lvalueLeft = new Node(TokenStream.BINDNAME, s); - Node result = new Node(TokenStream.SETNAME, lvalueLeft, op); - if (postfix) { - result = new Node(TokenStream.COMMA, result, - createUseTemp(opLeft)); - } - return result; - } - - public Node createNewTemp(Node n) { - int type = n.getType(); - if (type == TokenStream.STRING || type == TokenStream.NUMBER) { - // Optimization: clone these values rather than storing - // and loading from a temp - return n; - } - Node result = new Node(TokenStream.NEWTEMP, n); - return result; - } - - public Node createUseTemp(Node newTemp) { - int type = newTemp.getType(); - if (type == TokenStream.NEWTEMP) { - Node result = new Node(TokenStream.USETEMP); - result.putProp(Node.TEMP_PROP, newTemp); - Integer n = (Integer) newTemp.getProp(Node.USES_PROP); - if (n == null) { - n = new Integer(1); - } else { - if (n.intValue() < Integer.MAX_VALUE) - n = new Integer(n.intValue() + 1); - } - newTemp.putProp(Node.USES_PROP, n); - return result; - } - return newTemp.cloneNode(); - } - - public Node createNewLocal(Node n) { - Node result = new Node(TokenStream.NEWLOCAL, n); - return result; - } - - public Node createUseLocal(Node newLocal) { - int type = newLocal.getType(); - if (type == TokenStream.NEWLOCAL) { - Node result = new Node(TokenStream.USELOCAL); - result.putProp(Node.LOCAL_PROP, newLocal); - return result; - } - return newLocal.cloneNode(); // what's this path for ? - } - - public static boolean hasSideEffects(Node exprTree) { - switch (exprTree.getType()) { - case TokenStream.SETPROP: - case TokenStream.SETELEM: - case TokenStream.CALL: - case TokenStream.NEW: - return true; - default: - Node child = exprTree.getFirstChild(); - while (child != null) { - if (hasSideEffects(child)) - return true; - else - child = child.getNextSibling(); - } - break; - } - return false; - } - - private Node createSetProp(int nodeType, int nodeOp, Node obj, Node id, - Node expr, Class convert, boolean postfix) - { - int type = nodeType == TokenStream.GETPROP - ? TokenStream.SETPROP - : TokenStream.SETELEM; - - Object datum = id.getDatum(); - if (type == TokenStream.SETPROP && datum != null && - datum instanceof String) - { - String s = (String) datum; - if (s.equals("__proto__") || s.equals("__parent__")) { - Node result = new Node(type, obj, expr); - result.putProp(Node.SPECIAL_PROP_PROP, s); - return result; - } - } - - if (nodeOp == TokenStream.NOP) - return new Node(type, obj, id, expr); -/* - if the RHS expression could modify the LHS we have - to construct a temporary to hold the LHS context - prior to running the expression - -*/ - Node tmp1, tmp2, opLeft; - if (hasSideEffects(expr) || (obj.getType() != TokenStream.NAME)) { - tmp1 = createNewTemp(obj); - Node useTmp1 = createUseTemp(tmp1); - - tmp2 = createNewTemp(id); - Node useTmp2 = createUseTemp(tmp2); - - opLeft = new Node(nodeType, useTmp1, useTmp2); - } else { - tmp1 = obj.cloneNode(); - tmp2 = id.cloneNode(); - opLeft = new Node(nodeType, obj, id); - } - - if (convert != null) - opLeft = createConvert(convert, opLeft); - if (postfix) - opLeft = createNewTemp(opLeft); - Node op = new Node(nodeOp, opLeft, expr); - - Node result = new Node(type, tmp1, tmp2, op); - if (postfix) { - result = new Node(TokenStream.COMMA, result, - createUseTemp(opLeft)); - } - - return result; - } - - private void reportError(String msgResource) { - String message = Context.getMessage(msgResource, null); - Context.reportError(message, ts.getSourceName(), ts.getLineno(), - ts.getLine(), ts.getOffset()); - } - - // Only needed to get file/line information. Could create an interface - // that TokenStream implements if we want to make the connection less - // direct. - private TokenStream ts; -} - diff --git a/mozilla/js/js2/java/Interpreter.java b/mozilla/js/js2/java/Interpreter.java deleted file mode 100644 index 7e1e3b4608c..00000000000 --- a/mozilla/js/js2/java/Interpreter.java +++ /dev/null @@ -1,35 +0,0 @@ -public class Interpreter { - - - void executeScript(Node node) - { - Node child = node.getFirstChild(); - while (child != null) { - if (child.getType() != TokenStream.FUNCTION) - executeCode(child); - child = child.getNextSibling(); - } - } - - void executeCode(Node top) - { - PostorderNodeIterator ni = new PostorderNodeIterator(top); - - JSStack theStack = new JSStack(); - - Node n = ni.nextNode(); - while (n != null) { - ni = n.execute(theStack, ni); - n = ni.nextNode(); - } - - while (!theStack.isEmpty()) { - System.out.println("Stack Slot contains " + theStack.pop()); - } - - - } - - - -} \ No newline at end of file diff --git a/mozilla/js/js2/java/JSStack.java b/mozilla/js/js2/java/JSStack.java deleted file mode 100644 index af2ae6e557f..00000000000 --- a/mozilla/js/js2/java/JSStack.java +++ /dev/null @@ -1,39 +0,0 @@ - -import java.util.Stack; - -class JSStack { - - Stack stack = new Stack(); - int frameTop; - - void newFrame(StackValue returnAddress) - { - stack.push(returnAddress); - stack.push(new StackValue(frameTop)); - frameTop = stack.size(); - } - - StackValue popFrame() - { - stack.setSize(frameTop); - StackValue oldFrame = (StackValue)(stack.pop()); - frameTop = oldFrame.i; - return (StackValue)stack.pop(); - } - - void push(StackValue v) - { - stack.push(v); - } - - boolean isEmpty() - { - return stack.isEmpty(); - } - - StackValue pop() - { - return (StackValue)stack.pop(); - } - -} \ No newline at end of file diff --git a/mozilla/js/js2/java/LineBuffer.java b/mozilla/js/js2/java/LineBuffer.java deleted file mode 100644 index f3b73cea8fb..00000000000 --- a/mozilla/js/js2/java/LineBuffer.java +++ /dev/null @@ -1,333 +0,0 @@ -/* -*- Mode: Java; tab-width: 8 -*- - * Copyright © 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -import java.io.Reader; -import java.io.IOException; - -/** - * An input buffer that combines fast character-based access with - * (slower) support for retrieving the text of the current line. It - * also supports building strings directly out of the internal buffer - * to support fast scanning with minimal object creation. - * - * Note that it is customized in several ways to support the - * TokenStream class, and should not be considered general. - * - * Credits to Kipp Hickman and John Bandhauer. - * - * @author Mike McCabe - */ -final class LineBuffer { - /* - * for smooth operation of getLine(), this should be greater than - * the length of any expected line. Currently, 256 is 3% slower - * than 4096 for large compiles, but seems safer given evaluateString. - * Strings for the scanner are are built with StringBuffers - * instead of directly out of the buffer whenever a string crosses - * a buffer boundary, so small buffer sizes will mean that more - * objects are created. - */ - static final int BUFLEN = 256; - - LineBuffer(Reader in, int lineno) { - this.in = in; - this.lineno = lineno; - } - - int read() throws IOException { - if (end == offset && !fill()) - return -1; - - // Do only a bitmask + branch per character, at the cost of - // three branches per low-bits-only character. - if ((buffer[offset] & '\ufff0') == 0) { - if (buffer[offset] == '\r') { - // if the next character is a newline, skip past it. - if ((offset + 1) < end) { - if (buffer[offset + 1] == '\n') - offset++; - } else { - // set a flag for fill(), in case the first char of the - // next fill is a newline. - lastWasCR = true; - } - } - else if (buffer[offset] != '\n') { - return (int) buffer[offset++]; - } - offset++; - prevStart = lineStart; - lineStart = offset; - lineno++; - return '\n'; - } - - return (int) buffer[offset++]; - } - - void unread() { - if (offset == 0) - // We can get here when we're asked to unread() an - // implicit EOF_CHAR. - - // This would also be wrong behavior in the general case, - // because a peek() could map a buffer.length offset to 0 - // in the process of a fill(), and leave it there. But - // the scanner never calls peek() or a failed match() - // followed by unread()... this would violate 1-character - // lookahead. So we're OK. - return; - offset--; - if ((buffer[offset] & '\ufff0') == 0 - && (buffer[offset] == '\r' || buffer[offset] == '\n')) { - // back off from the line start we presumably just registered... - lineStart = prevStart; - lineno--; - } - } - - int peek() throws IOException { - if (end == offset && !fill()) - return -1; - - if (buffer[offset] == '\r') - return '\n'; - - return buffer[offset]; - } - - boolean match(char c) throws IOException { - if (end == offset && !fill()) - return false; - - // This'd be a place where we'd need to map '\r' to '\n' and - // do other updates, but TokenStream never looks ahead for - // '\n', so we don't bother. - if (buffer[offset] == c) { - offset++; - return true; - } - return false; - } - - // Reconstruct a source line from the buffers. This can be slow... - String getLine() { - StringBuffer result = new StringBuffer(); - - int start = lineStart; - if (start >= offset) { - // the line begins somewhere in the other buffer; get that first. - if (otherStart < otherEnd) - // if a line ending was seen in the other buffer... otherwise - // just ignore this strange case. - result.append(otherBuffer, otherStart, - otherEnd - otherStart); - start = 0; - } - - // get the part of the line in the current buffer. - result.append(buffer, start, offset - start); - - // Get the remainder of the line. - int i = offset; - while(true) { - if (i == buffer.length) { - // we're out of buffer, let's just expand it. We do - // this instead of reading into a StringBuffer to - // preserve the stream for later reads. - char[] newBuffer = new char[buffer.length * 2]; - System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); - buffer = newBuffer; - int charsRead = 0; - try { - charsRead = in.read(buffer, end, buffer.length - end); - } catch (IOException ioe) { - // ignore it, we're already displaying an error... - } - if (charsRead < 0) - break; - end += charsRead; - } - if (buffer[i] == '\r' || buffer[i] == '\n') - break; - i++; - } - - result.append(buffer, offset, i - offset); - return result.toString(); - } - - // Get the offset of the current character, relative to - // the line that getLine() returns. - int getOffset() { - if (lineStart >= offset) - // The line begins somewhere in the other buffer. - return offset + (otherEnd - otherStart); - else - return offset - lineStart; - } - - // Set a mark to indicate that the reader should begin - // accumulating characters for getString(). The string begins - // with the last character read. - void startString() { - if (offset == 0) { - // We can get here if startString is called after a peek() - // or failed match() with offset past the end of the - // buffer. - - // We're at the beginning of the buffer, and the previous character - // (which we want to include) is at the end of the last one, so - // we just go to StringBuffer mode. - stringSoFar = new StringBuffer(); - stringSoFar.append(otherBuffer, otherEnd - 1, 1); - - stringStart = -1; // Set sentinel value. - } else { - // Support restarting strings - stringSoFar = null; - stringStart = offset - 1; - } - } - - // Get a string consisting of the characters seen since the last - // startString. - String getString() { - String result; - - /* - * There's one strange case here: If the character offset currently - * points to (which we never want to include in the string) is - * a newline, then if the previous character is a carriage return, - * we probably want to exclude that as well. If the offset is 0, - * then we hope that fill() handled excluding it from stringSoFar. - */ - int loseCR = (offset > 0 && - buffer[offset] == '\n' && buffer[offset - 1] == '\r') ? - 1 : 0; - - if (stringStart != -1) { - // String mark is valid, and in this buffer. - - result = new String(buffer, stringStart, - offset - stringStart - loseCR); - } else { - // Exclude cr as well as nl of newline. If offset is 0, then - // hopefully fill() did the right thing. - result = (stringSoFar.append(buffer, 0, offset - loseCR)).toString(); - } - - stringStart = -1; - stringSoFar = null; - return result; - } - - boolean fill() throws IOException { - // not sure I care... - if (end - offset != 0) - throw new IOException("fill of non-empty buffer"); - - // If there's a string currently being accumulated, save - // off the progress. - - /* - * Exclude an end-of-buffer carriage return. NOTE this is not - * fully correct in the general case, because we really only - * want to exclude the carriage return if it's followed by a - * linefeed at the beginning of the next buffer. But we fudge - * because the scanner doesn't do this. - */ - int loseCR = (offset > 0 && lastWasCR) ? 1 : 0; - - if (stringStart != -1) { - // The mark is in the current buffer, save off from the mark to the - // end. - stringSoFar = new StringBuffer(); - - stringSoFar.append(buffer, stringStart, end - stringStart - loseCR); - stringStart = -1; - } else if (stringSoFar != null) { - // the string began prior to the current buffer, so save the - // whole current buffer. - stringSoFar.append(buffer, 0, end - loseCR); - } - - // swap buffers - char[] tempBuffer = buffer; - buffer = otherBuffer; - otherBuffer = tempBuffer; - - // allocate the buffers lazily, in case we're handed a short string. - if (buffer == null) { - buffer = new char[BUFLEN]; - } - - // buffers have switched, so move the newline marker. - otherStart = lineStart; - otherEnd = end; - - // set lineStart to a sentinel value, unless this is the first - // time around. - prevStart = lineStart = (otherBuffer == null) ? 0 : buffer.length + 1; - - offset = 0; - end = in.read(buffer, 0, buffer.length); - if (end < 0) { - end = 0; - - // can't null buffers here, because a string might be retrieved - // out of the other buffer, and a 0-length string might be - // retrieved out of this one. - - hitEOF = true; - return false; - } - - // If the last character of the previous fill was a carriage return, - // then ignore a newline. - - // There's another bizzare special case here. If lastWasCR is - // true, and we see a newline, and the buffer length is - // 1... then we probably just read the last character of the - // file, and returning after advancing offset is not the right - // thing to do. Instead, we try to ignore the newline (and - // likely get to EOF for real) by doing yet another fill(). - if (lastWasCR) { - if (buffer[0] == '\n') { - offset++; - if (end == 1) - return fill(); - } - lineStart = offset; - lastWasCR = false; - } - return true; - } - - int getLineno() { return lineno; } - boolean eof() { return hitEOF; } - - private Reader in; - private char[] otherBuffer = null; - private char[] buffer = null; - - // Yes, there are too too many of these. - private int offset = 0; - private int end = 0; - private int otherEnd; - private int lineno; - - private int lineStart = 0; - private int otherStart = 0; - private int prevStart = 0; - - private boolean lastWasCR = false; - private boolean hitEOF = false; - - private int stringStart = -1; - private StringBuffer stringSoFar = null; -} - - diff --git a/mozilla/js/js2/java/Node.java b/mozilla/js/js2/java/Node.java deleted file mode 100644 index 99568daa3dd..00000000000 --- a/mozilla/js/js2/java/Node.java +++ /dev/null @@ -1,524 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -import java.util.*; - -/** - * This class implements the root of the intermediate representation. - * - * @author Norris Boyd - * @author Mike McCabe - */ - -public class Node implements Cloneable { - - public Node(int nodeType) { - type = nodeType; - } - - public Node(int nodeType, Node child) { - type = nodeType; - first = last = child; - child.next = null; - } - - public Node(int nodeType, Node left, Node right) { - type = nodeType; - first = left; - last = right; - left.next = right; - right.next = null; - } - - public Node(int nodeType, Node left, Node mid, Node right) { - type = nodeType; - first = left; - last = right; - left.next = mid; - mid.next = right; - right.next = null; - } - - public Node(int nodeType, Object datum) { - type = nodeType; - this.datum = datum; - } - - public Node(int nodeType, Node child, Object datum) { - this(nodeType, child); - this.datum = datum; - } - - public Node(int nodeType, Node left, Node right, Object datum) { - this(nodeType, left, right); - this.datum = datum; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - - public boolean hasChildren() { - return first != null; - } - - public Node getFirstChild() { - return first; - } - - public Node getLastChild() { - return last; - } - - public Node getNextSibling() { - return next; - } - - 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) { - n = n.next; - } - return n; - } - - public ShallowNodeIterator getChildIterator() { - return new ShallowNodeIterator(first); - } - - public PreorderNodeIterator getPreorderIterator() { - return new PreorderNodeIterator(this); - } - - 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) { - first = last = child; - return; - } - last.next = child; - 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; - } - last = children.getLastSibling(); - if (first == null) { - first = children; - } - } - - /** - * 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 static final int - TARGET_PROP = 1, - BREAK_PROP = 2, - CONTINUE_PROP = 3, - ENUM_PROP = 4, - FUNCTION_PROP = 5, - TEMP_PROP = 6, - LOCAL_PROP = 7, - CODEOFFSET_PROP = 8, - FIXUPS_PROP = 9, - VARS_PROP = 10, - USES_PROP = 11, - REGEXP_PROP = 12, - CASES_PROP = 13, - DEFAULT_PROP = 14, - CASEARRAY_PROP = 15, - SOURCENAME_PROP = 16, - SOURCE_PROP = 17, - TYPE_PROP = 18, - SPECIAL_PROP_PROP = 19, - LABEL_PROP = 20, - FINALLY_PROP = 21, - LOCALCOUNT_PROP = 22, - /* - the following properties are defined and manipulated by the - optimizer - - TARGETBLOCK_PROP - the block referenced by a branch node - VARIABLE_PROP - the variable referenced by a BIND or NAME node - LASTUSE_PROP - that variable node is the last reference before - a new def or the end of the block - ISNUMBER_PROP - this node generates code on Number children and - delivers a Number result (as opposed to Objects) - DIRECTCALL_PROP - this call node should emit code to test the function - object against the known class and call diret if it - matches. - */ - - TARGETBLOCK_PROP = 23, - VARIABLE_PROP = 24, - LASTUSE_PROP = 25, - ISNUMBER_PROP = 26, - DIRECTCALL_PROP = 27, - - BASE_LINENO_PROP = 28, - END_LINENO_PROP = 29, - SPECIALCALL_PROP = 30; - - public static final int // this value of the ISNUMBER_PROP specifies - BOTH = 0, // which of the children are Number types - LEFT = 1, - RIGHT = 2; - - private static String propNames[]; - - private static final String propToString(int propType) { - if (Context.printTrees && propNames == null) { - // If Context.printTrees is false, the compiler - // can remove all these strings. - String[] a = { - "TARGET", - "BREAK", - "CONTINUE", - "ENUM", - "FUNCTION", - "TEMP", - "LOCAL", - "CODEOFFSET", - "FIXUPS", - "VARS", - "USES", - "REGEXP", - "SWITCHES", - "CASES", - "DEFAULT", - "CASEARRAY", - "SOURCENAME", - "SOURCE", - "TYPE", - "SPECIAL_PROP", - "LABEL", - "FINALLY", - "LOCALCOUNT", - "TARGETBLOCK", - "VARIABLE", - "LASTUSE", - "ISNUMBER", - "DIRECTCALL", - "BASE_LINENO", - "END_LINENO", - "SPECIALCALL" - }; - propNames = a; - } - return propNames[propType]; - } - - public Object getProp(int propType) { - if (props == null) - return null; - return props.get(new Integer(propType)); - } - - public void putProp(int propType, Object prop) { - if (props == null) - props = new Hashtable(2); - if (prop == null) - props.remove(new Integer(propType)); - else - props.put(new Integer(propType), prop); - } - - public Object getDatum() { - return datum; - } - - public void setDatum(Object datum) { - this.datum = datum; - } - - public int getInt() { - return ((Number) datum).intValue(); - } - - public double getDouble() { - return ((Number) datum).doubleValue(); - } - - public long getLong() { - return ((Number) datum).longValue(); - } - - public String getString() { - return (String) datum; - } - - 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 String toString() { - if (Context.printTrees) { - StringBuffer sb = new StringBuffer(TokenStream.tokenToName(type)); - if (type == TokenStream.TARGET) { - sb.append(" "); - sb.append(hashCode()); - } - if (datum != null) { - sb.append(' '); - sb.append(datum.toString()); - } - if (props == null) - return sb.toString(); - - Enumeration keys = props.keys(); - Enumeration elems = props.elements(); - while (keys.hasMoreElements()) { - Integer key = (Integer) keys.nextElement(); - Object elem = elems.nextElement(); - sb.append(" ["); - sb.append(propToString(key.intValue())); - sb.append(": "); - switch (key.intValue()) { - case FIXUPS_PROP : // can't add this as it recurses - sb.append("fixups property"); - break; - case SOURCE_PROP : // can't add this as it has unprintables - sb.append("source property"); - break; - case TARGETBLOCK_PROP : // can't add this as it recurses - sb.append("target block property"); - break; - case LASTUSE_PROP : // can't add this as it is dull - sb.append("last use property"); - break; - default : - sb.append(elem.toString()); - break; - } - sb.append("]"); - } - return sb.toString(); - } - 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'); - ShallowNodeIterator iterator = getChildIterator(); - if (iterator != null) { - while (iterator.hasMoreElements()) { - Node n = (Node) iterator.nextElement(); - if (n.getType() == TokenStream.FUNCTION) { - Node p = (Node) n.getProp(Node.FUNCTION_PROP); - if (p != null) - n = p; - } - s.append(n.toStringTreeHelper(level+1)); - } - } - return s.toString(); - } - return ""; - } - - /************************************************************************************************/ - - PostorderNodeIterator findTryNode(JSStack theStack, PostorderNodeIterator ni) - { - while (true) { - Node p = ni.peekParent(); - if (p == null) { - StackValue ret = theStack.popFrame(); - ni = ret.p; - if (ni == null) return null; - } - else { - if (p.type == TokenStream.TRY) - return ni; - ni.pop(); - } - } - - } - - PostorderNodeIterator execute(JSStack theStack, PostorderNodeIterator ni) - { - StackValue lhs; - StackValue rhs; - Number num; - - switch (type) { - - case TokenStream.NUMBER : - num = (Number)getDatum(); - System.out.println("number " + num.doubleValue()); - theStack.push(new StackValue(num.doubleValue())); - return ni; - - case TokenStream.SETNAME : - rhs = theStack.pop(); // the new value - lhs = theStack.pop(); // the target lvalue - System.out.println("setname " + lhs.s + " to " + rhs.d); - return ni; - - case TokenStream.BINDNAME : - System.out.println("bindname " + getString()); - theStack.push(new StackValue(getString())); - return ni; - - case TokenStream.NAME : - System.out.println("name " + getString()); - theStack.push(new StackValue(22.0)); - return ni; - - case TokenStream.CALL : - System.out.println("call"); - lhs = theStack.pop(); // the function object - /* - here we look up the first arg, find that it's a known function - and return the nodeIterator for it's tree. Also, begin execution - for that function by constructing a frame on the stack. - */ - theStack.newFrame(new StackValue(ni)); - ni = new PostorderNodeIterator(Brenda.tf); - return ni; - - case TokenStream.RETURN : - lhs = theStack.pop(); // the return value - rhs = theStack.pop(); // the return address - ni = rhs.p; - theStack.push(lhs); - return ni; - - case TokenStream.ADD : - rhs = theStack.pop(); - lhs = theStack.pop(); - theStack.push(new StackValue(lhs.d + rhs.d)); - return ni; - - case TokenStream.THROW : - lhs = theStack.pop(); // the exception object - ni = findTryNode(theStack, ni); - return ni; - - } - - return ni; - } - - - /************************************************************************************************/ - - - public Node getFirst() { return first; } - public Node getNext() { return next; } - - protected int type; // type of the node; TokenStream.NAME for example - protected Node next; // next sibling - protected Node first; // first element of a linked list of children - protected Node last; // last element of a linked list of children - protected Hashtable props; - protected Object datum; // encapsulated data; depends on type -} - diff --git a/mozilla/js/js2/java/PostorderNodeIterator.java b/mozilla/js/js2/java/PostorderNodeIterator.java deleted file mode 100644 index 77a3776839d..00000000000 --- a/mozilla/js/js2/java/PostorderNodeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ - -import java.util.Stack; - -class PostorderNodeIterator { - - PostorderNodeIterator(Node n) - { - stack = new Stack(); - while (n.first != null) { - stack.push(n); - n = n.first; - } - start = n; - } - - Node peekParent() - { - if (stack.isEmpty()) - return null; - else - return (Node)stack.peek(); - } - - void pop() - { - if (stack.isEmpty()) - current = null; - else - current = (Node)stack.pop(); - } - - Node nextNode() - { - if (current == null) - return current = start; - - if (stack.isEmpty()) - return current = null; - else { - current = current.next; - if (current != null) { - while (current.first != null) { - stack.push(current); - current = current.first; - } - } - else - current = (Node)stack.pop(); - } - - return current; - } - - Node start; - Node current; - Stack stack; -} \ No newline at end of file diff --git a/mozilla/js/js2/java/PreorderNodeIterator.java b/mozilla/js/js2/java/PreorderNodeIterator.java deleted file mode 100644 index bc5fc623b38..00000000000 --- a/mozilla/js/js2/java/PreorderNodeIterator.java +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, All Rights Reserved. - */ - -import java.util.Stack; - -/** - * This class implements a preorder tree iterator for the Node class. - * - * @see Node - * @author Norris Boyd - */ -public class PreorderNodeIterator { - public PreorderNodeIterator(Node n) { - start = n; - stack = new Stack(); - } - - public Node currentNode() { - return current; - } - - public Node getCurrentParent() { - return currentParent; - } - - public Node nextNode() { - if (current == null) - return current = start; - if (current.first != null) { - stack.push(current); - currentParent = current; - current = current.first; - } else { - current = current.next; - boolean isEmpty; - for (;;) { - isEmpty = stack.isEmpty(); - if (isEmpty || current != null) - break; - current = (Node) stack.pop(); - current = current.next; - } - currentParent = isEmpty ? null : (Node) stack.peek(); - } - return current; - } - - public void replaceCurrent(Node newNode) { - currentParent.replaceChild(current, newNode); - current = newNode; - } - - private Node start; - private Node current; - private Node currentParent; - private Stack stack; -} diff --git a/mozilla/js/js2/java/ScriptRuntime.java b/mozilla/js/js2/java/ScriptRuntime.java deleted file mode 100644 index 336a51a2ab2..00000000000 --- a/mozilla/js/js2/java/ScriptRuntime.java +++ /dev/null @@ -1,128 +0,0 @@ -class ScriptRuntime { - /* - * There's such a huge space (and some time) waste for the Foo.class - * syntax: the compiler sticks in a test of a static field in the - * enclosing class for null and the code for creating the class value. - * It has to do this since the reference has to get pushed off til - * executiontime (i.e. can't force an early load), but for the - * 'standard' classes - especially those in java.lang, we can trust - * that they won't cause problems by being loaded early. - */ - - public final static Class StringClass = String.class; - public final static Class NumberClass = Number.class; - public final static Class BooleanClass = Boolean.class; - public final static Class ByteClass = Byte.class; - public final static Class ShortClass = Short.class; - public final static Class IntegerClass = Integer.class; - public final static Class LongClass = Long.class; - public final static Class FloatClass = Float.class; - public final static Class DoubleClass = Double.class; - public final static Class CharacterClass = Character.class; - public final static Class ObjectClass = Object.class; - - // This definition of NaN is identical to that in java.lang.Double - // except that it is not final. This is a workaround for a bug in - // the Microsoft VM, versions 2.01 and 3.0P1, that causes some uses - // (returns at least) of Double.NaN to be converted to 1.0. - // So we use ScriptRuntime.NaN instead of Double.NaN. - public static double NaN = 0.0d / 0.0; - - /* - * Helper function for toNumber, parseInt, and TokenStream.getToken. - */ - static double stringToNumber(String s, int start, int radix) { - char digitMax = '9'; - char lowerCaseBound = 'a'; - char upperCaseBound = 'A'; - int len = s.length(); - if (radix < 10) { - digitMax = (char) ('0' + radix - 1); - } - if (radix > 10) { - lowerCaseBound = (char) ('a' + radix - 10); - upperCaseBound = (char) ('A' + radix - 10); - } - int end; - double sum = 0.0; - for (end=start; end < len; end++) { - char c = s.charAt(end); - int newDigit; - if ('0' <= c && c <= digitMax) - newDigit = c - '0'; - else if ('a' <= c && c < lowerCaseBound) - newDigit = c - 'a' + 10; - else if ('A' <= c && c < upperCaseBound) - newDigit = c - 'A' + 10; - else - break; - sum = sum*radix + newDigit; - } - if (start == end) { - return NaN; - } - if (sum >= 9007199254740992.0) { - if (radix == 10) { - /* If we're accumulating a decimal number and the number - * is >= 2^53, then the result from the repeated multiply-add - * above may be inaccurate. Call Java to get the correct - * answer. - */ - try { - return Double.valueOf(s.substring(start, end)).doubleValue(); - } catch (NumberFormatException nfe) { - return NaN; - } - } else if (radix == 2 || radix == 4 || radix == 8 || - radix == 16 || radix == 32) - { - /* The number may also be inaccurate for one of these bases. - * This happens if the addition in value*radix + digit causes - * a round-down to an even least significant mantissa bit - * when the first dropped bit is a one. If any of the - * following digits in the number (which haven't been added - * in yet) are nonzero then the correct action would have - * been to round up instead of down. An example of this - * occurs when reading the number 0x1000000000000081, which - * rounds to 0x1000000000000000 instead of 0x1000000000000100. - */ - BinaryDigitReader bdr = new BinaryDigitReader(radix, s, start, end); - int bit; - sum = 0.0; - - /* Skip leading zeros. */ - do { - bit = bdr.getNextBinaryDigit(); - } while (bit == 0); - - if (bit == 1) { - /* Gather the 53 significant bits (including the leading 1) */ - sum = 1.0; - for (int j = 52; j != 0; j--) { - bit = bdr.getNextBinaryDigit(); - if (bit < 0) - return sum; - sum = sum*2 + bit; - } - /* bit54 is the 54th bit (the first dropped from the mantissa) */ - int bit54 = bdr.getNextBinaryDigit(); - if (bit54 >= 0) { - double factor = 2.0; - int sticky = 0; /* sticky is 1 if any bit beyond the 54th is 1 */ - int bit3; - - while ((bit3 = bdr.getNextBinaryDigit()) >= 0) { - sticky |= bit3; - factor *= 2; - } - sum += bit54 & (bit | sticky); - sum *= factor; - } - } - } - /* We don't worry about inaccurate numbers for any other base. */ - } - return sum; - } - -} \ No newline at end of file diff --git a/mozilla/js/js2/java/ShallowNodeIterator.java b/mozilla/js/js2/java/ShallowNodeIterator.java deleted file mode 100644 index 991df032264..00000000000 --- a/mozilla/js/js2/java/ShallowNodeIterator.java +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, All Rights Reserved. - */ - -import java.util.Enumeration; - -/** - * This class implements a child iterator for the Node class. - * - * @see Node - * @author Norris Boyd - */ -class ShallowNodeIterator implements Enumeration { - - public ShallowNodeIterator(Node n) { - current = n; - } - - public boolean hasMoreElements() { - return current != null; - } - - public Object nextElement() { - return nextNode(); - } - - public Node nextNode() { - Node result = current; - current = current.next; - return result; - } - - private Node current; -} - diff --git a/mozilla/js/js2/java/TokenStream.java b/mozilla/js/js2/java/TokenStream.java deleted file mode 100644 index a8764526562..00000000000 --- a/mozilla/js/js2/java/TokenStream.java +++ /dev/null @@ -1,1299 +0,0 @@ -/* -*- Mode: Java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -import java.io.*; - -/** - * This class implements the JavaScript scanner. - * - * It is based on the C source files jsscan.c and jsscan.h - * in the jsref package. - * - * @see com.netscape.javascript.Parser - * - * @author Mike McCabe - * @author Brendan Eich - */ - -public class TokenStream { - /* - * JSTokenStream flags, mirroring those in jsscan.h. These are used - * by the parser to change/check the state of the scanner. - */ - - public final static int - TSF_ERROR = 0x0001, // fatal error while scanning -// TSF_EOF = 0x0002, // hit end of file - TSF_NEWLINES = 0x0004, // tokenize newlines - TSF_FUNCTION = 0x0008, // scanning inside function body - TSF_RETURN_EXPR = 0x0010, // function has 'return expr;' - TSF_RETURN_VOID = 0x0020, // function has 'return;' -// TSF_INTERACTIVE = 0x0040, // interactive parsing mode -// TSF_COMMAND = 0x0080, // command parsing mode -// TSF_LOOKAHEAD = 0x0100, // looking ahead for a token - TSF_REGEXP = 0x0200; // looking for a regular expression - - /* - * For chars - because we need something out-of-range - * to check. (And checking EOF by exception is annoying.) - * Note distinction from EOF token type! - */ - private final static int - EOF_CHAR = -1; - - /** - * Token types. These values correspond to JSTokenType values in - * jsscan.c. - */ - - public final static int - // start enum - ERROR = -1, // well-known as the only code < EOF - EOF = 0, // end of file token - (not EOF_CHAR) - EOL = 1, // end of line - // Beginning here are interpreter bytecodes. Their values - // must not exceed 127. - POPV = 2, - ENTERWITH = 3, - LEAVEWITH = 4, - RETURN = 5, - GOTO = 6, - IFEQ = 7, - IFNE = 8, - DUP = 9, - SETNAME = 10, - BITOR = 11, - BITXOR = 12, - BITAND = 13, - EQ = 14, - NE = 15, - LT = 16, - LE = 17, - GT = 18, - GE = 19, - LSH = 20, - RSH = 21, - URSH = 22, - ADD = 23, - SUB = 24, - MUL = 25, - DIV = 26, - MOD = 27, - BITNOT = 28, - NEG = 29, - NEW = 30, - DELPROP = 31, - TYPEOF = 32, - NAMEINC = 33, - PROPINC = 34, - ELEMINC = 35, - NAMEDEC = 36, - PROPDEC = 37, - ELEMDEC = 38, - GETPROP = 39, - SETPROP = 40, - GETELEM = 41, - SETELEM = 42, - CALL = 43, - NAME = 44, - NUMBER = 45, - STRING = 46, - ZERO = 47, - ONE = 48, - NULL = 49, - THIS = 50, - FALSE = 51, - TRUE = 52, - SHEQ = 53, // shallow equality (===) - SHNE = 54, // shallow inequality (!==) - CLOSURE = 55, - OBJECT = 56, - POP = 57, - POS = 58, - VARINC = 59, - VARDEC = 60, - BINDNAME = 61, - THROW = 62, - IN = 63, - INSTANCEOF = 64, - GOSUB = 65, - RETSUB = 66, - CALLSPECIAL = 67, - GETTHIS = 68, - NEWTEMP = 69, - USETEMP = 70, - GETBASE = 71, - GETVAR = 72, - SETVAR = 73, - UNDEFINED = 74, - TRY = 75, - ENDTRY = 76, - NEWSCOPE = 77, - TYPEOFNAME = 78, - ENUMINIT = 79, - ENUMNEXT = 80, - GETPROTO = 81, - GETPARENT = 82, - SETPROTO = 83, - SETPARENT = 84, - SCOPE = 85, - GETSCOPEPARENT = 86, - JTHROW = 87, - // End of interpreter bytecodes - SEMI = 88, // semicolon - LB = 89, // left and right brackets - RB = 90, - LC = 91, // left and right curlies (braces) - RC = 92, - LP = 93, // left and right parentheses - RP = 94, - COMMA = 95, // comma operator - ASSIGN = 96, // assignment ops (= += -= etc.) - HOOK = 97, // conditional (?:) - COLON = 98, - OR = 99, // logical or (||) - AND = 100, // logical and (&&) - EQOP = 101, // equality ops (== !=) - RELOP = 102, // relational ops (< <= > >=) - SHOP = 103, // shift ops (<< >> >>>) - UNARYOP = 104, // unary prefix operator - INC = 105, // increment/decrement (++ --) - DEC = 106, - DOT = 107, // member operator (.) - PRIMARY = 108, // true, false, null, this, super - FUNCTION = 109, // function keyword - EXPORT = 110, // export keyword - IMPORT = 111, // import keyword - IF = 112, // if keyword - ELSE = 113, // else keyword - SWITCH = 114, // switch keyword - CASE = 115, // case keyword - DEFAULT = 116, // default keyword - WHILE = 117, // while keyword - DO = 118, // do keyword - FOR = 119, // for keyword - BREAK = 120, // break keyword - CONTINUE = 121, // continue keyword - VAR = 122, // var keyword - WITH = 123, // with keyword - CATCH = 124, // catch keyword - FINALLY = 125, // finally keyword - RESERVED = 126, // reserved keywords - - /** Added by Mike - these are JSOPs in the jsref, but I - * don't have them yet in the java implementation... - * so they go here. Also whatever I needed. - - * Most of these go in the 'op' field when returning - * more general token types, eg. 'DIV' as the op of 'ASSIGN'. - */ - NOP = 127, // NOP - NOT = 128, // etc. - PRE = 129, // for INC, DEC nodes. - POST = 130, - - /** - * For JSOPs associated with keywords... - * eg. op = THIS; token = PRIMARY - */ - - VOID = 131, - - /* types used for the parse tree - these never get returned - * by the scanner. - */ - BLOCK = 132, // statement block - ARRAYLIT = 133, // array literal - OBJLIT = 134, // object literal - LABEL = 135, // label - TARGET = 136, - LOOP = 137, - ENUMDONE = 138, - EXPRSTMT = 139, - PARENT = 140, - CONVERT = 141, - JSR = 142, - NEWLOCAL = 143, - USELOCAL = 144, - SCRIPT = 145; // top-level node for entire script - // end enum - - - /* for mapping int token types to printable strings. - * make sure to add 1 to index before using these! - */ - private static String names[]; - private static void checkNames() { - if (Context.printTrees && names == null) { - String[] a = { - "error", - "eof", - "eol", - "popv", - "enterwith", - "leavewith", - "return", - "goto", - "ifeq", - "ifne", - "dup", - "setname", - "bitor", - "bitxor", - "bitand", - "eq", - "ne", - "lt", - "le", - "gt", - "ge", - "lsh", - "rsh", - "ursh", - "add", - "sub", - "mul", - "div", - "mod", - "bitnot", - "neg", - "new", - "delprop", - "typeof", - "nameinc", - "propinc", - "eleminc", - "namedec", - "propdec", - "elemdec", - "getprop", - "setprop", - "getelem", - "setelem", - "call", - "name", - "number", - "string", - "zero", - "one", - "null", - "this", - "false", - "true", - "sheq", - "shne", - "closure", - "object", - "pop", - "pos", - "varinc", - "vardec", - "bindname", - "throw", - "in", - "instanceof", - "gosub", - "retsub", - "callspecial", - "getthis", - "newtemp", - "usetemp", - "getbase", - "getvar", - "setvar", - "undefined", - "try", - "endtry", - "newscope", - "typeofname", - "enuminit", - "enumnext", - "getproto", - "getparent", - "setproto", - "setparent", - "scope", - "getscopeparent", - "jthrow", - "semi", - "lb", - "rb", - "lc", - "rc", - "lp", - "rp", - "comma", - "assign", - "hook", - "colon", - "or", - "and", - "eqop", - "relop", - "shop", - "unaryop", - "inc", - "dec", - "dot", - "primary", - "function", - "export", - "import", - "if", - "else", - "switch", - "case", - "default", - "while", - "do", - "for", - "break", - "continue", - "var", - "with", - "catch", - "finally", - "reserved", - "nop", - "not", - "pre", - "post", - "void", - "block", - "arraylit", - "objlit", - "label", - "target", - "loop", - "enumdone", - "exprstmt", - "parent", - "convert", - "jsr", - "newlocal", - "uselocal", - "script" - }; - names = a; - } - } - - /* This function uses the cached op, string and number fields in - * TokenStream; if getToken has been called since the passed token - * was scanned, the op or string printed may be incorrect. - */ - public String tokenToString(int token) { - if (Context.printTrees) { - checkNames(); - if (token + 1 >= names.length) - return null; - - if (token == UNARYOP || - token == ASSIGN || - token == PRIMARY || - token == EQOP || - token == SHOP || - token == RELOP) { - return names[token + 1] + " " + names[this.op + 1]; - } - - if (token == STRING || token == OBJECT || token == NAME) - return names[token + 1] + " `" + this.string + "'"; - - if (token == NUMBER) - return "NUMBER " + this.number; - - return names[token + 1]; - } - return ""; - } - - public static String tokenToName(int type) { - checkNames(); - return names == null ? "" : names[type + 1]; - } - - private static java.util.Hashtable keywords; - - static { - String[] strings = { - "break", - "case", - "continue", - "default", - "delete", - "do", - "else", - "export", - "false", - "for", - "function", - "if", - "in", - "new", - "null", - "return", - "switch", - "this", - "true", - "typeof", - "var", - "void", - "while", - "with", - - // the following are #ifdef RESERVE_JAVA_KEYWORDS in jsscan.c - "abstract", - "boolean", - "byte", - "catch", - "char", - "class", - "const", - "debugger", - "double", - "enum", - "extends", - "final", - "finally", - "float", - "goto", - "implements", - "import", - "instanceof", - "int", - "interface", - "long", - "native", - "package", - "private", - "protected", - "public", - "short", - "static", - "super", - "synchronized", - "throw", - "throws", - "transient", - "try", - "volatile" - }; - int[] values = { - BREAK, // break - CASE, // case - CONTINUE, // continue - DEFAULT, // default - DELPROP, // delete - DO, // do - ELSE, // else - EXPORT, // export - PRIMARY | (FALSE << 8), // false - FOR, // for - FUNCTION, // function - IF, // if - RELOP | (IN << 8), // in - NEW, // new - PRIMARY | (NULL << 8), // null - RETURN, // return - SWITCH, // switch - PRIMARY | (THIS << 8), // this - PRIMARY | (TRUE << 8), // true - UNARYOP | (TYPEOF << 8), // typeof - VAR, // var - UNARYOP | (VOID << 8), // void - WHILE, // while - WITH, // with - RESERVED, // abstract - RESERVED, // boolean - RESERVED, // byte - CATCH, // catch - RESERVED, // char - RESERVED, // class - RESERVED, // const - RESERVED, // debugger - RESERVED, // double - RESERVED, // enum - RESERVED, // extends - RESERVED, // final - FINALLY, // finally - RESERVED, // float - RESERVED, // goto - RESERVED, // implements - IMPORT, // import - RELOP | (INSTANCEOF << 8), // instanceof - RESERVED, // int - RESERVED, // interface - RESERVED, // long - RESERVED, // native - RESERVED, // package - RESERVED, // private - RESERVED, // protected - RESERVED, // public - RESERVED, // short - RESERVED, // static - PRIMARY | (NOP << 8), // super - RESERVED, // synchronized - THROW, // throw - RESERVED, // throws - RESERVED, // transient - TRY, // try - RESERVED // volatile - }; - keywords = new java.util.Hashtable(strings.length); - Integer res = new Integer(RESERVED); - for (int i=0; i < strings.length; i++) - keywords.put(strings[i], values[i] == RESERVED - ? res - : new Integer(values[i])); - } - - private int stringToKeyword(String name) { - Integer result = (Integer) keywords.get(name); - if (result == null) - return EOF; - int x = result.intValue(); - this.op = x >> 8; - return x & 0xff; - } - - public TokenStream(Reader in, - String sourceName, int lineno) - { - this.in = new LineBuffer(in, lineno); - - this.pushbackToken = EOF; - this.sourceName = sourceName; - flags = 0; - } - - /* return and pop the token from the stream if it matches... - * otherwise return null - */ - public boolean matchToken(int toMatch) throws IOException { - int token = getToken(); - if (token == toMatch) - return true; - - // didn't match, push back token - tokenno--; - this.pushbackToken = token; - return false; - } - - public void clearPushback() { - this.pushbackToken = EOF; - } - - public void ungetToken(int tt) { - if (this.pushbackToken != EOF && tt != ERROR) { - Object[] errArgs = { tokenToString(tt), - tokenToString(this.pushbackToken) }; - String message = Context.getMessage("msg.token.replaces.pushback", - errArgs); - throw new RuntimeException(message); - } - this.pushbackToken = tt; - tokenno--; - } - - public int peekToken() throws IOException { - int result = getToken(); - - this.pushbackToken = result; - tokenno--; - return result; - } - - public int peekTokenSameLine() throws IOException { - int result; - - flags |= TSF_NEWLINES; // SCAN_NEWLINES from jsscan.h - result = peekToken(); - flags &= ~TSF_NEWLINES; // HIDE_NEWLINES from jsscan.h - if (this.pushbackToken == EOL) - this.pushbackToken = EOF; - return result; - } - - /* helper functions... these might be better inlined. - * These are needed because the java.lang.Character.isWhatever - * functions accept unicode, and we want to limit - * identifiers to ASCII. - */ - protected static boolean isJSIdentifier(String s) { - int length = s.length(); - - if (length == 0 || !isJSIdentifierStart(s.charAt(0))) - return false; - - for (int i=1; i= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || c == '_' - || c == '$'); - } - - protected static boolean isJSIdentifierPart(int c) { - return ((c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || (c >= '0' && c <= '9') - || c == '_' - || c == '$'); - } - - private static boolean isAlpha(int c) { - return ((c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z')); - } - - static boolean isDigit(int c) { - return (c >= '0' && c <= '9'); - } - - static boolean isXDigit(int c) { - return ((c >= '0' && c <= '9') - || (c >= 'a' && c <= 'f') - || (c >= 'A' && c <= 'F')); - } - - /* As defined in ECMA. jsscan.c uses C isspace() (which allows - * \v, I think.) note that code in in.read() implicitly accepts - * '\r' == \u000D as well. - */ - static boolean isJSSpace(int c) { - return (c == '\u0009' || c == '\u000B' - || c == '\u000C' || c == '\u0020'); - } - - public int getToken() throws IOException { - int c; - tokenno++; - // If there was a fatal error, keep returning TOK_ERROR. - if ((flags & TSF_ERROR) != 0) - return ERROR; - - // Check for pushed-back token - if (this.pushbackToken != EOF) { - int result = this.pushbackToken; - this.pushbackToken = EOF; - return result; - } - - // Eat whitespace, possibly sensitive to newlines. - do { - c = in.read(); - if (c == '\n') - if ((flags & TSF_NEWLINES) != 0) - break; - } while (isJSSpace(c) || c == '\n'); - - if (c == EOF_CHAR) - return EOF; - - // identifier/keyword/instanceof? - if (isJSIdentifierStart(c)) { - in.startString(); - do { - c = in.read(); - } while (isJSIdentifierPart(c)); - in.unread(); - - int result; - - String str = in.getString(); - // OPT we shouldn't have to make a string (object!) to - // check if it's a keyword. - - // Return the corresponding token if it's a keyword - if ((result = stringToKeyword(str)) != EOF) { - return result; - } - - this.string = str; - return NAME; - } - - // is it a number? - if (isDigit(c) || (c == '.' && isDigit(in.peek()))) { - int base = 10; - in.startString(); - - double dval = ScriptRuntime.NaN; - long longval = 0; - boolean isInteger = true; - - if (c == '0') { - c = in.read(); - if (c == 'x' || c == 'X') { - c = in.read(); - base = 16; - // restart the string, losing leading 0x - in.startString(); - } else if (isDigit(c)) { - if (c < '8') { - base = 8; - // Restart the string, losing the leading 0 - in.startString(); - } else { - /* Checking against c < '8' is non-ECMA, but - * is required to support legacy code; we've - * supported it in the past, and it's likely - * that "08" and "09" are in use in code - * having to do with dates. So we need to - * support it, which makes our behavior a - * superset of ECMA in this area. We raise a - * warning if a non-octal digit is - * encountered, then proceed as if it were - * decimal. - */ - Object[] errArgs = { String.valueOf((char)c) }; - Context.reportWarning - (Context.getMessage("msg.bad.octal.literal", - errArgs), - getSourceName(), in.getLineno(), - getLine(), getOffset()); - // implicitly retain the leading 0 - } - } else { - // implicitly retain the leading 0 - } - } - - while (isXDigit(c)) { - if (base < 16 && (isAlpha(c) - || (base == 8 && c >= '8'))) { - break; - } - c = in.read(); - } - - if (base == 10 && (c == '.' || c == 'e' || c == 'E')) { - isInteger = false; - if (c == '.') { - do { - c = in.read(); - } while (isDigit(c)); - } - - if (c == 'e' || c == 'E') { - c = in.read(); - if (c == '+' || c == '-') { - c = in.read(); - } - if (!isDigit(c)) { - in.getString(); // throw away string in progress - reportError("msg.missing.exponent", null); - return ERROR; - } - do { - c = in.read(); - } while (isDigit(c)); - } - } - in.unread(); - String numString = in.getString(); - - if (base == 10 && !isInteger) { - try { - // Use Java conversion to number from string... - dval = (Double.valueOf(numString)).doubleValue(); - } - catch (NumberFormatException ex) { - Object[] errArgs = { ex.getMessage() }; - reportError("msg.caught.nfe", errArgs); - return ERROR; - } - } else { - dval = ScriptRuntime.stringToNumber(numString, 0, base); - longval = (long) dval; - - // is it an integral fits-in-a-long value? - if (longval != dval) - isInteger = false; - } - - if (!isInteger) { - /* Can't handle floats right now, because postfix INC/DEC - generate Doubles, but I would generate a Float through this - path, and it causes a stack mismatch. FIXME (MS) - if (Float.MIN_VALUE <= dval && dval <= Float.MAX_VALUE) - this.number = new Xloat((float) dval); - else - */ - this.number = new Double(dval); - } else { - // We generate the smallest possible type here - if (Byte.MIN_VALUE <= longval && longval <= Byte.MAX_VALUE) - this.number = new Byte((byte)longval); - else if (Short.MIN_VALUE <= longval && - longval <= Short.MAX_VALUE) - this.number = new Short((short)longval); - else if (Integer.MIN_VALUE <= longval && - longval <= Integer.MAX_VALUE) - this.number = new Integer((int)longval); - else { - // May lose some precision here, but that's the - // appropriate semantics. - this.number = new Double(longval); - } - } - return NUMBER; - } - - // is it a string? - if (c == '"' || c == '\'') { - // We attempt to accumulate a string the fast way, by - // building it directly out of the reader. But if there - // are any escaped characters in the string, we revert to - // building it out of a StringBuffer. - - StringBuffer stringBuf = null; - - int quoteChar = c; - int val = 0; - - c = in.read(); - in.startString(); // start after the first " - while(c != quoteChar) { - if (c == '\n' || c == EOF_CHAR) { - in.unread(); - in.getString(); // throw away the string in progress - reportError("msg.unterminated.string.lit", null); - return ERROR; - } - - if (c == '\\') { - // We've hit an escaped character; revert to the - // slow method of building a string. - if (stringBuf == null) { - // Don't include the backslash - in.unread(); - stringBuf = new StringBuffer(in.getString()); - in.read(); - } - - switch (c = in.read()) { - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\u000B'; break; - // \v a late addition to the ECMA spec. - // '\v' doesn't seem to be valid Java. - - default: - if (isDigit(c) && c < '8') { - val = c - '0'; - c = in.read(); - if (isDigit(c) && c < '8') { - val = 8 * val + c - '0'; - c = in.read(); - if (isDigit(c) && c < '8') { - val = 8 * val + c - '0'; - c = in.read(); - } - } - in.unread(); - if (val > 0377) { - reportError("msg.oct.esc.too.large", null); - return ERROR; - } - c = val; - } else if (c == 'u') { - /* - * Get 4 hex digits; if the u escape is not - * followed by 4 hex digits, use 'u' + the literal - * character sequence that follows. Do some manual - * match (OK because we're in a string) to avoid - * multi-char match on the underlying stream. - */ - int c1, c2, c3, c4; - - c1 = in.read(); - if (!isXDigit(c1)) { - in.unread(); - c = 'u'; - } else { - val = Character.digit((char) c1, 16); - c2 = in.read(); - if (!isXDigit(c2)) { - in.unread(); - stringBuf.append('u'); - c = c1; - } else { - val = 16 * val - + Character.digit((char) c2, 16); - c3 = in.read(); - if (!isXDigit(c3)) { - in.unread(); - stringBuf.append('u'); - stringBuf.append((char)c1); - c = c2; - } else { - val = 16 * val - + Character.digit((char) c3, 16); - c4 = in.read(); - if (!isXDigit(c4)) { - in.unread(); - stringBuf.append('u'); - stringBuf.append((char)c1); - stringBuf.append((char)c2); - c = c3; - } else { - // got 4 hex digits! Woo Hoo! - val = 16 * val - + Character.digit((char) c4, 16); - c = val; - } - } - } - } - } else if (c == 'x') { - /* Get 2 hex digits, defaulting to 'x' + literal - * sequence, as above. - */ - int c1, c2; - - c1 = in.read(); - if (!isXDigit(c1)) { - in.unread(); - c = 'x'; - } else { - val = Character.digit((char) c1, 16); - c2 = in.read(); - if (!isXDigit(c2)) { - in.unread(); - stringBuf.append('x'); - c = c1; - } else { - // got 2 hex digits - val = 16 * val - + Character.digit((char) c2, 16); - c = val; - } - } - } - } - } - - if (stringBuf != null) - stringBuf.append((char) c); - c = in.read(); - } - - if (stringBuf != null) - this.string = stringBuf.toString(); - else { - in.unread(); // miss the trailing " - this.string = in.getString(); - in.read(); - } - return STRING; - } - - switch (c) - { - case '\n': return EOL; - case ';': return SEMI; - case '[': return LB; - case ']': return RB; - case '{': return LC; - case '}': return RC; - case '(': return LP; - case ')': return RP; - case ',': return COMMA; - case '?': return HOOK; - case ':': return COLON; - case '.': return DOT; - - case '|': - if (in.match('|')) { - return OR; - } else if (in.match('=')) { - this.op = BITOR; - return ASSIGN; - } else { - return BITOR; - } - - case '^': - if (in.match('=')) { - this.op = BITXOR; - return ASSIGN; - } else { - return BITXOR; - } - - case '&': - if (in.match('&')) { - return AND; - } else if (in.match('=')) { - this.op = BITAND; - return ASSIGN; - } else { - return BITAND; - } - - case '=': - if (in.match('=')) { - if (in.match('=')) - this.op = SHEQ; - else - this.op = EQ; - return EQOP; - } else { - this.op = NOP; - return ASSIGN; - } - - case '!': - if (in.match('=')) { - if (in.match('=')) - this.op = SHNE; - else - this.op = NE; - return EQOP; - } else { - this.op = NOT; - return UNARYOP; - } - - case '<': - /* NB:treat HTML begin-comment as comment-till-eol */ - if (in.match('!')) { - if (in.match('-')) { - if (in.match('-')) { - while ((c = in.read()) != EOF_CHAR && c != '\n') - /* skip to end of line */; - in.unread(); - return getToken(); // in place of 'goto retry' - } - in.unread(); - } - in.unread(); - } - if (in.match('<')) { - if (in.match('=')) { - this.op = LSH; - return ASSIGN; - } else { - this.op = LSH; - return SHOP; - } - } else { - if (in.match('=')) { - this.op = LE; - return RELOP; - } else { - this.op = LT; - return RELOP; - } - } - - case '>': - if (in.match('>')) { - if (in.match('>')) { - if (in.match('=')) { - this.op = URSH; - return ASSIGN; - } else { - this.op = URSH; - return SHOP; - } - } else { - if (in.match('=')) { - this.op = RSH; - return ASSIGN; - } else { - this.op = RSH; - return SHOP; - } - } - } else { - if (in.match('=')) { - this.op = GE; - return RELOP; - } else { - this.op = GT; - return RELOP; - } - } - - case '*': - if (in.match('=')) { - this.op = MUL; - return ASSIGN; - } else { - return MUL; - } - - case '/': - // is it a // comment? - if (in.match('/')) { - while ((c = in.read()) != EOF_CHAR && c != '\n') - /* skip to end of line */; - in.unread(); - return getToken(); - } - if (in.match('*')) { - while ((c = in.read()) != -1 - && !(c == '*' && in.match('/'))) { - if (c == '\n') { - } else if (c == '/' && in.match('*')) { - if (in.match('/')) - return getToken(); - reportError("msg.nested.comment", null); - return ERROR; - } - } - if (c == EOF_CHAR) { - reportError("msg.unterminated.comment", null); - return ERROR; - } - return getToken(); // `goto retry' - } - - // is it a regexp? - if ((flags & TSF_REGEXP) != 0) { - // We don't try to use the in.startString/in.getString - // approach, because escaped characters (which break it) - // seem likely to be common. - StringBuffer re = new StringBuffer(); - while ((c = in.read()) != '/') { - if (c == '\n' || c == EOF_CHAR) { - in.unread(); - reportError("msg.unterminated.re.lit", null); - return ERROR; - } - if (c == '\\') { - re.append((char) c); - c = in.read(); - } - - re.append((char) c); - } - - StringBuffer flagsBuf = new StringBuffer(); - while (true) { - if (in.match('g')) - flagsBuf.append('g'); - else if (in.match('i')) - flagsBuf.append('i'); - else if (in.match('m')) - flagsBuf.append('m'); - else - break; - } - - if (isAlpha(in.peek())) { - reportError("msg.invalid.re.flag", null); - return ERROR; - } - - this.string = re.toString(); - this.regExpFlags = flagsBuf.toString(); - return OBJECT; - } - - - if (in.match('=')) { - this.op = DIV; - return ASSIGN; - } else { - return DIV; - } - - case '%': - this.op = MOD; - if (in.match('=')) { - return ASSIGN; - } else { - return MOD; - } - - case '~': - this.op = BITNOT; - return UNARYOP; - - case '+': - case '-': - if (in.match('=')) { - if (c == '+') { - this.op = ADD; - return ASSIGN; - } else { - this.op = SUB; - return ASSIGN; - } - } else if (in.match((char) c)) { - if (c == '+') { - return INC; - } else { - return DEC; - } - } else if (c == '-') { - return SUB; - } else { - return ADD; - } - - default: - reportError("msg.illegal.character", null); - return ERROR; - } - } - - private void reportError(String messageProperty, Object[] args) { - flags |= TSF_ERROR; - String message = Context.getMessage(messageProperty, args); - Context.reportError(message, getSourceName(), - getLineno(), getLine(), getOffset()); - } - - public String getSourceName() { return sourceName; } - public int getLineno() { return in.getLineno(); } - public int getOp() { return op; } - public String getString() { return string; } - public Number getNumber() { return number; } - public String getLine() { return in.getLine(); } - public int getOffset() { return in.getOffset(); } - public int getTokenno() { return tokenno; } - public boolean eof() { return in.eof(); } - - // instance variables - private LineBuffer in; - - - /* for TSF_REGEXP, etc. - * should this be manipulated by gettor/settor functions? - * should it be passed to getToken(); - */ - public int flags; - public String regExpFlags; - - private String sourceName; - private String line; - private int pushbackToken; - private int tokenno; - - private int op; - - // Set this to an inital non-null value so that the Parser has - // something to retrieve even if an error has occured and no - // string is found. Fosters one class of error, but saves lots of - // code. - private String string = ""; - private Number number; -} diff --git a/mozilla/js/js2/java/WrappedException.java b/mozilla/js/js2/java/WrappedException.java deleted file mode 100644 index e3ea145dc71..00000000000 --- a/mozilla/js/js2/java/WrappedException.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: java; tab-width: 8 -*- - * Copyright © 1997, 1998 Netscape Communications Corporation, - * All Rights Reserved. - */ - -/** - * A wrapper for runtime exceptions. - * - * Used by the JavaScript runtime to wrap and propagate exceptions that occur - * during runtime. - * - * @author Norris Boyd - */ -public class WrappedException extends RuntimeException { - - /** - * Create a new exception wrapped around an existing exception. - * - * @param exception the exception to wrap - */ - public WrappedException(Throwable exception) { - super(exception.getMessage()); - this.exception = exception.fillInStackTrace(); - } - - /** - * Get the message for the exception. - * - * Delegates to the wrapped exception. - */ - public String getMessage() { - return "WrappedException of " + exception.toString(); - } - - /** - * Get the wrapped exception. - * - * @return the exception that was presented as a argument to the - * constructor when this object was created - */ - public Throwable getWrappedException() { - return exception; - } - - /** - * Get the wrapped exception. - * - * @return the exception that was presented as a argument to the - * constructor when this object was created - */ - public Object unwrap() { - return exception; - } - - private Throwable exception; -}