From 3ee698473e4cd474b37ce7ff2037d3fea0b5e3cc Mon Sep 17 00:00:00 2001 From: "igor%mir2.org" Date: Thu, 20 Feb 2003 09:18:12 +0000 Subject: [PATCH] Praising changes: remove direct access to VariableTable in ScriptOrFnNode and instead provide methods to access its functionality. In this way VariableTable can be changed without affecting the rest of code. git-svn-id: svn://10.0.0.236/trunk@138031 18797224-902f-48f8-a5cc-f745e15eee43 --- .../org/mozilla/javascript/FunctionNode.java | 4 -- .../org/mozilla/javascript/Interpreter.java | 17 +++---- .../org/mozilla/javascript/JavaAdapter.java | 3 +- .../mozilla/javascript/ScriptOrFnNode.java | 29 +++++++++--- .../mozilla/javascript/optimizer/Codegen.java | 44 ++++++++----------- .../javascript/optimizer/OptFunctionNode.java | 7 ++- .../javascript/regexp/NativeRegExp.java | 4 +- 7 files changed, 56 insertions(+), 52 deletions(-) diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/FunctionNode.java b/mozilla/js/rhino/src/org/mozilla/javascript/FunctionNode.java index 5da8c69c30a..8d580436a49 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/FunctionNode.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/FunctionNode.java @@ -92,10 +92,6 @@ public class FunctionNode extends ScriptOrFnNode { itsFunctionType = functionType; } - public int getParameterCount() { - return getVariableTable().getParameterCount(); - } - protected void finishParsing(IRFactory irFactory) { super.finishParsing(irFactory); int functionCount = getFunctionCount(); diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java b/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java index 902993c4cd2..55bb921db6f 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/Interpreter.java @@ -103,7 +103,6 @@ public class Interpreter { generateRegExpLiterals(cx, scope); - itsVariableTable = scriptOrFn.getVariableTable(); generateICodeFromTree(scriptOrFn); if (Context.printICode) dumpICode(itsData); @@ -129,7 +128,6 @@ public class Interpreter { itsData.itsNeedsActivation = theFunction.requiresActivation(); - itsVariableTable = theFunction.getVariableTable(); generateICodeFromTree(theFunction.getLastChild()); itsData.itsName = theFunction.getFunctionName(); @@ -220,7 +218,7 @@ public class Interpreter { itsData.itsDoubleTable = tmp; } - itsData.itsMaxVars = itsVariableTable.size(); + itsData.itsMaxVars = scriptOrFn.getParameterAndVarCount(); // itsMaxFrameArray: interpret method needs this amount for its // stack and sDbl arrays itsData.itsMaxFrameArray = itsData.itsMaxVars @@ -228,8 +226,8 @@ public class Interpreter { + itsData.itsMaxTryDepth + itsData.itsMaxStack; - itsData.argNames = itsVariableTable.getAllVariables(); - itsData.argCount = itsVariableTable.getParameterCount(); + itsData.argNames = scriptOrFn.getParameterAndVarNames(); + itsData.argCount = scriptOrFn.getParameterCount(); } private int updateLineNumber(Node node, int iCodeTop) { @@ -676,7 +674,7 @@ public class Interpreter { // use typeofname if an activation frame exists // since the vars all exist there instead of in jregs if (itsInFunctionFlag && !itsData.itsNeedsActivation) - index = itsVariableTable.getOrdinal(name); + index = scriptOrFn.getParameterOrVarIndex(name); if (index == -1) { iCodeTop = addByte(TokenStream.TYPEOFNAME, iCodeTop); iCodeTop = addString(name, iCodeTop); @@ -726,7 +724,7 @@ public class Interpreter { iCodeTop); itsStackDepth--; } else { - int i = itsVariableTable.getOrdinal(name); + int i = scriptOrFn.getParameterOrVarIndex(name); iCodeTop = addByte(type == TokenStream.INC ? TokenStream.VARINC : TokenStream.VARDEC, @@ -932,7 +930,7 @@ public class Interpreter { iCodeTop = addByte(TokenStream.GETPROP, iCodeTop); itsStackDepth--; } else { - int index = itsVariableTable.getOrdinal(name); + int index = scriptOrFn.getParameterOrVarIndex(name); iCodeTop = addByte(TokenStream.GETVAR, iCodeTop); iCodeTop = addByte(index, iCodeTop); itsStackDepth++; @@ -951,7 +949,7 @@ public class Interpreter { String name = child.getString(); child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); - int index = itsVariableTable.getOrdinal(name); + int index = scriptOrFn.getParameterOrVarIndex(name); iCodeTop = addByte(TokenStream.SETVAR, iCodeTop); iCodeTop = addByte(index, iCodeTop); } @@ -2886,7 +2884,6 @@ public class Interpreter { private InterpreterData itsData; private ScriptOrFnNode scriptOrFn; - private VariableTable itsVariableTable; private int itsTryDepth = 0; private int itsStackDepth = 0; private String itsSourceFile; diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/JavaAdapter.java b/mozilla/js/rhino/src/org/mozilla/javascript/JavaAdapter.java index 09d09e99903..357b1a7cfbf 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/JavaAdapter.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/JavaAdapter.java @@ -305,8 +305,7 @@ public class JavaAdapter extends ScriptableObject { ScriptableObject.getProperty(p, "length")); } else if (f instanceof FunctionNode) { // This is used only by optimizer/Codegen - length = ((FunctionNode) f).getVariableTable() - .getParameterCount(); + length = ((FunctionNode)f).getParameterCount(); } else { continue; } diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/ScriptOrFnNode.java b/mozilla/js/rhino/src/org/mozilla/javascript/ScriptOrFnNode.java index b5465cf63cd..0c9850b6b03 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/ScriptOrFnNode.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/ScriptOrFnNode.java @@ -41,11 +41,6 @@ public class ScriptOrFnNode extends Node { super(nodeType); } - public final VariableTable getVariableTable() { - if (variableTable == null) { variableTable = new VariableTable(); } - return variableTable; - } - public final String getSourceName() { return sourceName; } public final void setSourceName(String sourceName) { @@ -127,6 +122,30 @@ public class ScriptOrFnNode extends Node { return variableTable.hasVariable(name); } + public final int getParameterOrVarIndex(String name) { + if (variableTable == null) { return -1; } + return variableTable.getOrdinal(name); + } + + public final String getParameterOrVarName(int index) { + return variableTable.getVariable(index); + } + + public final int getParameterCount() { + if (variableTable == null) { return 0; } + return variableTable.getParameterCount(); + } + + public final int getParameterAndVarCount() { + if (variableTable == null) { return 0; } + return variableTable.size(); + } + + public final String[] getParameterAndVarNames() { + if (variableTable == null) { return new String[0]; } + return variableTable.getAllVariables(); + } + public final void addParameter(String name) { if (variableTable == null) { variableTable = new VariableTable(); } variableTable.addParameter(name); diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java index 3baf798bdfe..91b361408f3 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java @@ -413,7 +413,6 @@ public class Codegen extends Interpreter { if (inFunction) { fnCurrent = (OptFunctionNode)scriptOrFn; inDirectCallFunction = fnCurrent.isTargetOfDirectCall(); - vars = fnCurrent.getVariableTable(); this.name = fnCurrent.getClassName(); classFile = new ClassFileWriter(name, superClassName, itsSourceFile); String name = fnCurrent.getFunctionName(); @@ -430,7 +429,7 @@ public class Codegen extends Interpreter { addByteCode(ByteCode.ALOAD_1); addByteCode(ByteCode.ALOAD_2); addByteCode(ByteCode.ALOAD_3); - for (int i = 0; i < vars.getParameterCount(); i++) { + for (int i = 0; i < scriptOrFn.getParameterCount(); i++) { push(i); addByteCode(ByteCode.ALOAD, 4); addByteCode(ByteCode.ARRAYLENGTH); @@ -483,7 +482,7 @@ public class Codegen extends Interpreter { markLabel(isObjectLabel); } } - generatePrologue(cx, true, vars.getParameterCount()); + generatePrologue(cx, true, scriptOrFn.getParameterCount()); } else { startNewMethod("call", "(Lorg/mozilla/javascript/Context;" + @@ -498,7 +497,6 @@ public class Codegen extends Interpreter { // better be a script if (scriptOrFn.getType() != TokenStream.SCRIPT) badTree(); - vars = scriptOrFn.getVariableTable(); boolean isPrimary = nameHelper.getTargetExtends() == null && nameHelper.getTargetImplements() == null; this.name = getScriptClassName(null, isPrimary); @@ -1118,7 +1116,6 @@ public class Codegen extends Interpreter { { trivialInit = true; boolean inCtor = false; - VariableTable vars = scriptOrFn.getVariableTable(); if (methodName.equals("")) { inCtor = true; setNonTrivialInit(methodName); @@ -1148,27 +1145,25 @@ public class Codegen extends Interpreter { "functionName", "Ljava/lang/String;"); } - if (vars != null) { - int N = vars.size(); - if (N != 0) { - setNonTrivialInit(methodName); - push(N); - addByteCode(ByteCode.ANEWARRAY, "java/lang/String"); - for (int i = 0; i != N; i++) { - addByteCode(ByteCode.DUP); - push(i); - push(vars.getVariable(i)); - addByteCode(ByteCode.AASTORE); - } - addByteCode(ByteCode.ALOAD_0); - addByteCode(ByteCode.SWAP); - classFile.add(ByteCode.PUTFIELD, - "org/mozilla/javascript/NativeFunction", - "argNames", "[Ljava/lang/String;"); + int N = scriptOrFn.getParameterAndVarCount(); + if (N != 0) { + setNonTrivialInit(methodName); + push(N); + addByteCode(ByteCode.ANEWARRAY, "java/lang/String"); + for (int i = 0; i != N; i++) { + addByteCode(ByteCode.DUP); + push(i); + push(scriptOrFn.getParameterOrVarName(i)); + addByteCode(ByteCode.AASTORE); } + addByteCode(ByteCode.ALOAD_0); + addByteCode(ByteCode.SWAP); + classFile.add(ByteCode.PUTFIELD, + "org/mozilla/javascript/NativeFunction", + "argNames", "[Ljava/lang/String;"); } - int parmCount = vars == null ? 0 : vars.getParameterCount(); + int parmCount = scriptOrFn.getParameterCount(); if (parmCount != 0) { setNonTrivialInit(methodName); addByteCode(ByteCode.ALOAD_0); @@ -1378,7 +1373,7 @@ public class Codegen extends Interpreter { !((OptFunctionNode)scriptOrFn).requiresActivation(); if (hasVarsInRegs) { // No need to create activation. Pad arguments if need be. - int parmCount = vars.getParameterCount(); + int parmCount = scriptOrFn.getParameterCount(); if (inFunction && parmCount > 0 && directParameterCount < 0) { // Set up args array // check length of arguments, pad if need be @@ -3771,7 +3766,6 @@ public class Codegen extends Interpreter { private boolean itsForcedObjectParameters; private boolean trivialInit; private short itsLocalAllocationBase; - private VariableTable vars; private OptLocalVariable[] debugVars; private int epilogueLabel; private int optLevel; diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/OptFunctionNode.java b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/OptFunctionNode.java index fc186168c22..e8ca97c2974 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/OptFunctionNode.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/optimizer/OptFunctionNode.java @@ -48,12 +48,11 @@ class OptFunctionNode extends FunctionNode { protected void finishParsing(IRFactory irFactory) { super.finishParsing(irFactory); - VariableTable vars = getVariableTable(); - int N = vars.size(); + int N = getParameterAndVarCount(); int parameterCount = getParameterCount(); optVars = new OptLocalVariable[N]; for (int i = 0; i != N; ++i) { - String name = vars.getVariable(i); + String name = getParameterOrVarName(i); optVars[i] = new OptLocalVariable(name, i < parameterCount); } } @@ -130,7 +129,7 @@ class OptFunctionNode extends FunctionNode { } OptLocalVariable getVar(String name) { - int index = getVariableTable().getOrdinal(name); + int index = getParameterOrVarIndex(name); if (index < 0) { return null; } return optVars[index]; } diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/regexp/NativeRegExp.java b/mozilla/js/rhino/src/org/mozilla/javascript/regexp/NativeRegExp.java index 2e3e6bb4d76..43e0031cb40 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/regexp/NativeRegExp.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/regexp/NativeRegExp.java @@ -1018,8 +1018,8 @@ System.out.println(); case '*': case '+': case '}': - case '?': - reportError("msg.bad.quant", + case '?': + reportError("msg.bad.quant", String.valueOf(src[state.cp - 1]), state); return false; default: