SOURCES: custom_rhino.diff (NEW) - from dojo-release-1.2.2-shrinksafe

glen glen at pld-linux.org
Wed Jan 7 13:35:57 CET 2009


Author: glen                         Date: Wed Jan  7 12:35:57 2009 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- from dojo-release-1.2.2-shrinksafe

---- Files affected:
SOURCES:
   custom_rhino.diff (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/custom_rhino.diff
diff -u /dev/null SOURCES/custom_rhino.diff:1.1
--- /dev/null	Wed Jan  7 13:35:57 2009
+++ SOURCES/custom_rhino.diff	Wed Jan  7 13:35:51 2009
@@ -0,0 +1,1343 @@
+Index: src/org/mozilla/javascript/BaseFunction.java
+===================================================================
+RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/BaseFunction.java,v
+retrieving revision 1.63
+diff -u -8 -p -r1.63 BaseFunction.java
+--- src/org/mozilla/javascript/BaseFunction.java	16 May 2007 12:41:00 -0000	1.63
++++ src/org/mozilla/javascript/BaseFunction.java	19 Oct 2007 11:28:27 -0000
+@@ -371,16 +371,38 @@ public class BaseFunction extends IdScri
+         sb.append(getArity());
+         sb.append("]\n");
+         if (!justbody) {
+             sb.append("}\n");
+         }
+         return sb.toString();
+     }
+ 
++        String compress(int indent, int flags)
++        {
++            StringBuffer sb = new StringBuffer();
++    		String FuncName = null;
++            boolean justbody = (0 != (flags & Decompiler.ONLY_BODY_FLAG));
++            if (!justbody) {
++                sb.append("function");
++    			FuncName = getFunctionName();
++    			if(FuncName.length()>0){
++    				sb.append(" "+FuncName);
++    			}
++                sb.append("(){");
++            }
++           sb.append("[native code, arity=");
++            sb.append(getArity());
++            sb.append("]");
++            if (!justbody) {
++                sb.append("}");
++            }
++            return sb.toString();
++        }
++    
+     public int getArity() { return 0; }
+ 
+     public int getLength() { return 0; }
+ 
+     public String getFunctionName()
+     {
+         return "";
+     }
+Index: src/org/mozilla/javascript/Context.java
+===================================================================
+RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/Context.java,v
+retrieving revision 1.255.2.1
+diff -u -8 -p -r1.255.2.1 Context.java
+--- src/org/mozilla/javascript/Context.java	6 Jun 2007 14:58:49 -0000	1.255.2.1
++++ src/org/mozilla/javascript/Context.java	19 Oct 2007 11:28:27 -0000
+@@ -1211,16 +1211,43 @@ public class Context
+      * @param securityDomain an arbitrary object that specifies security
+      *        information about the origin or owner of the script. For
+      *        implementations that don't care about security, this value
+      *        may be null.
+      * @return the result of evaluating the source
+      *
+      * @exception IOException if an IOException was generated by the Reader
+      */
++        public final String decompileReader(Scriptable scope, Reader in,
++    		                                       String sourceName, int lineno,
++    		                                       Object securityDomain)
++    		        throws IOException
++    		    {
++    		        Script script = compileReader(scope, in, sourceName, lineno,
++    		                                      securityDomain);
++    		        if (script != null) {
++    					// System.err.println(script);
++    		            return decompileScript(script, 0);
++    		        } else {
++    		            return null;
++    		        }
++    		    }
++    		
++        public final String compressReader(Scriptable scope, Script script, String source,
++    			String sourceName, int lineno, Object securityDomain){
++        	
++    		if (script != null) {
++    			// System.err.println(script);    			
++    			return compressScript(script, 0, source,lineno);    			
++    		} else {
++    			return null;
++    		}
++    	}
++       
++    		
+     public final Object evaluateReader(Scriptable scope, Reader in,
+                                        String sourceName, int lineno,
+                                        Object securityDomain)
+         throws IOException
+     {
+         Script script = compileReader(scope, in, sourceName, lineno,
+                                       securityDomain);
+         if (script != null) {
+@@ -1393,16 +1420,44 @@ public class Context
+         catch (IOException ioe) {
+             // Should never happen because we just made the reader
+             // from a String
+             throw new RuntimeException();
+         }
+     }
+ 
+     /**
++     * Compress the script.
++     * <p>
++     * Compressed script is returned.
++     * 
++     * @param script the script object
++     * @param indent the number of spaces to indent the result
++     * @return a string representing the script source
++     */
++    public final String compressScript(Script script, int indent, String source,int lineno)
++    {
++        //Make sure to clear out the TokenMapper state before running.
++        //This allows for more than one script to be compressed.
++        //However, this is not a very clean way to do the reset.
++        TokenMapper.reset();
++        Decompiler.tm = new TokenMapper();
++
++        NativeFunction scriptImpl = (NativeFunction) script;
++        
++        CompilerEnvirons compilerEnv = new CompilerEnvirons();
++
++        Parser parser = new Parser(compilerEnv, compilerEnv.getErrorReporter());
++        
++        ScriptOrFnNode tree = parser.parse(source, null, lineno);
++ 
++        return scriptImpl.compress( tree,indent, 0);
++    }
++
++    /**
+      * Decompile the script.
+      * <p>
+      * The canonical source of the script is returned.
+      *
+      * @param script the script to decompile
+      * @param indent the number of spaces to indent the result
+      * @return a string representing the script source
+      */
+@@ -2287,27 +2342,27 @@ public class Context
+                                Interpreter compiler,
+                                ErrorReporter compilationErrorReporter)
+         throws IOException
+     {
+         if (securityDomain != null && securityController == null) {
+             throw new IllegalArgumentException(
+                 "securityDomain should be null if setSecurityController() was never called");
+         }
+-
+         // One of sourceReader or sourceString has to be null
+         if (!(sourceReader == null ^ sourceString == null)) Kit.codeBug();
+         // scope should be given if and only if compiling function
+         if (!(scope == null ^ returnFunction)) Kit.codeBug();
+ 
+         CompilerEnvirons compilerEnv = new CompilerEnvirons();
+         compilerEnv.initFromContext(this);
+         if (compilationErrorReporter == null) {
+             compilationErrorReporter = compilerEnv.getErrorReporter();
+         }
++        
+ 
+         if (debugger != null) {
+             if (sourceReader != null) {
+                 sourceString = Kit.readReader(sourceReader);
+                 sourceReader = null;
+             }
+         }
+ 
+Index: src/org/mozilla/javascript/Decompiler.java
+===================================================================
+RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/Decompiler.java,v
+retrieving revision 1.23
+diff -u -8 -p -r1.23 Decompiler.java
+--- src/org/mozilla/javascript/Decompiler.java	4 Apr 2007 20:52:09 -0000	1.23
++++ src/org/mozilla/javascript/Decompiler.java	19 Oct 2007 11:28:28 -0000
+@@ -36,16 +36,21 @@
+  * them with the notice and other provisions required by the GPL. If you do
+  * not delete the provisions above, a recipient may use your version of this
+  * file under either the MPL or the GPL.
+  *
+  * ***** END LICENSE BLOCK ***** */
+ 
+ package org.mozilla.javascript;
+ 
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.HashMap;
++import java.util.List;
++
+ /**
+  * The following class save decompilation information about the source.
+  * Source information is returned from the parser as a String
+  * associated with function nodes and with the toplevel script.  When
+  * saved in the constant pool of a class, this string will be UTF-8
+  * encoded, and token values will occupy a single byte.
+ 
+  * Source is saved (mostly) as token numbers.  The tokens saved pretty
+@@ -69,16 +74,282 @@ package org.mozilla.javascript;
+  * followed by a character giving the length of the string (assumed to
+  * be less than 2^16), followed by the characters of the string
+  * inlined into the source string.  Changing this to some reference to
+  * to the string in the compiled class' constant pool would probably
+  * save a lot of space... but would require some method of deriving
+  * the final constant pool entry from information available at parse
+  * time.
+  */
++
++class TokenMapper {
++	private ArrayList functionBracePositions = new ArrayList();
++
++	/**
++	 * Map of all replaced tokens
++	 */
++	private ArrayList replacedTokens = new ArrayList();
++
++	/**
++	 * Collection of Function nodes
++	 */
++	private static ObjArray funcObjects = new ObjArray();
++
++	/**
++	 * Map of each Function node and all the variables in its current function
++	 * scope, other variables found while traversing the prototype chain and
++	 * variables found in the top-level scope.
++	 */
++	private static ArrayList functionVarMappings = new ArrayList();
++
++	public int functionNum = 0;
++
++	private int parentScope = 0;
++
++	private int lastTokenCount = 0;
++
++	/**
++	 * Reset the static members for the TokenMapper.
++	 */
++	public static void reset() {
++		funcObjects = new ObjArray();
++		functionVarMappings = new ArrayList();
++	}
++
++	/**
++	 * Generate new compressed tokens
++	 * <p>
++	 * 
++	 * @param token
++	 *            value of the string token
++	 * @param hasNewMapping
++	 *            boolean value indicating a new variable binding
++	 * @return compressed token
++	 */
++	private String getMappedToken(String token, boolean hasNewMapping) {
++		String newToken = null;
++		HashMap tokens = null;
++		String blank = new String("");
++		int localScope = functionBracePositions.size() - 1;
++
++		String oldToken = getPreviousTokenMapping(token, hasNewMapping);
++
++		if (!oldToken.equalsIgnoreCase(blank)) {
++			return oldToken;
++		} else if ((hasNewMapping || isInScopeChain(token))) {
++			lastTokenCount++;
++			newToken = new String("_" + Integer.toHexString(lastTokenCount));
++			if (newToken.length() >= token.length()) {
++				newToken = token;
++			}
++			if (hasNewMapping) {
++				tokens = (HashMap) replacedTokens.get(localScope);
++			} else {
++				tokens = (HashMap) replacedTokens.get(parentScope);
++			}
++
++			tokens.put(token, newToken);
++			return newToken;
++		}
++		return token;
++	}
++
++	/**
++	 * Checks for variable names in prototype chain
++	 * <p>
++	 * 
++	 * @param token
++	 *            value of the string token
++	 * @return boolean value indicating if the token is present in the chained
++	 *         scope
++	 */
++	private boolean isInScopeChain(String token) {
++		int scope = functionBracePositions.size();
++		HashMap chainedScopeVars = (HashMap) functionVarMappings
++				.get(functionNum);
++		if (!chainedScopeVars.isEmpty()) {
++			for (int i = scope; i > 0; i--) {
++				if (chainedScopeVars.containsKey(new Integer(i))) {
++					parentScope = i - 1;
++					List temp = Arrays.asList((String[]) chainedScopeVars
++							.get(new Integer(i)));
++					if (temp.indexOf(token) != -1) {
++						return true;
++					}
++				}
++			}
++		}
++		return false;
++	}
++
++	/**
++	 * Checks previous token mapping
++	 * <p>
++	 * 
++	 * @param token
++	 *            value of the string token
++	 * @param hasNewMapping
++	 *            boolean value indicating a new variable binding
++	 * @return string value of the previous token or blank string
++	 */
++	private String getPreviousTokenMapping(String token, boolean hasNewMapping) {
++		String result = new String("");
++		int scope = replacedTokens.size() - 1;
++
++		if (scope < 0) {
++			return result;
++		}
++
++		if (hasNewMapping) {
++			HashMap tokens = (HashMap) (replacedTokens.get(scope));
++			if (tokens.containsKey(token)) {
++				result = (String) tokens.get(token);
++				return result;
++			}
++		} else {
++			for (int i = scope; i > -1; i--) {
++				HashMap tokens = (HashMap) (replacedTokens.get(i));
++				if (tokens.containsKey(token)) {
++					result = (String) tokens.get(token);
++					return result;
++				}
++			}
++		}
++		return result;
++	}
++
++	/**
++	 * Generate mappings for each Function node and parameters and variables
++	 * names associated with it.
++	 * <p>
++	 * 
++	 * @param parseTree
++	 *            Mapping for each function node and corresponding parameters &
++	 *            variables names
++	 */
++	private void collectFunctionMappings(ScriptOrFnNode parseTree) {
++		int level = -1;
++		collectFuncNodes(parseTree, level);
++	}
++
++	/**
++	 * Recursive method to traverse all Function nodes
++	 * <p>
++	 * 
++	 * @param parseTree
++	 *            Mapping for each function node and corresponding parameters &
++	 *            variables names
++	 * @param level
++	 *            scoping level
++	 */
++	private static void collectFuncNodes(ScriptOrFnNode parseTree, int level) {
++		level++;
++		functionVarMappings.add(new HashMap());
++
++		HashMap bindingNames = (HashMap) functionVarMappings
++				.get(functionVarMappings.size() - 1);
++		bindingNames.put(new Integer(level), parseTree.getParamAndVarNames());
++		funcObjects.add(parseTree);
++
++		int nestedCount = parseTree.getFunctionCount();
++		for (int i = 0; i != nestedCount; ++i) {
++			collectFuncNodes(parseTree.getFunctionNode(i), level);
++			bindingNames = (HashMap) functionVarMappings
++					.get(functionVarMappings.size() - 1);
++			bindingNames.put(new Integer(level), parseTree
++					.getParamAndVarNames());
++		}
++	}
++
++	/**
++	 * Compress the script
++	 * <p>
++	 * 
++	 * @param encodedSource
++	 *            encoded source string
++	 * @param offset
++	 *            position within the encoded source
++	 * @param asQuotedString
++	 *            boolean value indicating a quoted string
++	 * @param sb
++	 *            String buffer reference
++	 * @param prevToken
++	 *            Previous token in encoded source
++	 * @param inArgsList
++	 *            boolean value indicating position inside arguments list
++	 * @param currentLevel
++	 *            embeded function level
++	 * @param parseTree
++	 *            Mapping of each function node and corresponding parameters &
++	 *            variables names
++	 * @return compressed script
++	 */
++	public int sourceCompress(String encodedSource, int offset,
++			boolean asQuotedString, StringBuffer sb, int prevToken,
++			boolean inArgsList, int currentLevel, ScriptOrFnNode parseTree) {
++
++		boolean hasNewMapping = false;
++
++		if (functionVarMappings.isEmpty())
++			collectFunctionMappings(parseTree);
++
++		int length = encodedSource.charAt(offset);
++		++offset;
++		if ((0x8000 & length) != 0) {
++			length = ((0x7FFF & length) << 16) | encodedSource.charAt(offset);
++			++offset;
++		}
++		if (sb != null) {
++			String str = encodedSource.substring(offset, offset + length);
++			String sourceStr = new String(str);
++			if ((prevToken == Token.VAR) || (inArgsList)) {
++				hasNewMapping = true;
++			}
++			if (((functionBracePositions.size() > 0) && (currentLevel >= (((Integer) functionBracePositions
++					.get(functionBracePositions.size() - 1)).intValue())))
++					|| (inArgsList)) {
++				if (prevToken != Token.DOT) {
++					str = this.getMappedToken(str, hasNewMapping);
++				}
++			}
++			if ((!inArgsList) && (asQuotedString)) {
++				if ((prevToken == Token.LC) || (prevToken == Token.COMMA)) {
++					str = sourceStr;
++				}
++			}
++			if (!asQuotedString) {
++				sb.append(str);
++			} else {
++				sb.append('"');
++				sb.append(ScriptRuntime.escapeString(str));
++				sb.append('"');
++			}
++		}
++		return offset + length;
++	}
++
++	public void enterNestingLevel(int braceNesting) {
++		functionBracePositions.add(new Integer(braceNesting + 1));
++		replacedTokens.add(new HashMap());
++	}
++
++	public void leaveNestingLevel(int braceNesting) {
++		Integer bn = new Integer(braceNesting);
++
++		if ((functionBracePositions.contains(bn))
++				&& (replacedTokens.size() > 0)) {
++			// remove our mappings now!
++			int scopedSize = replacedTokens.size();
++			replacedTokens.remove(scopedSize - 1);
++			functionBracePositions.remove(bn);
++		}
++	}
++}
++	
++	
+ public class Decompiler
+ {
+     /**
+      * Flag to indicate that the decompilation should omit the
+      * function header and trailing brace.
+      */
+     public static final int ONLY_BODY_FLAG = 1 << 0;
+ 
+@@ -265,16 +536,536 @@ public class Decompiler
+     }
+ 
+     private String sourceToString(int offset)
+     {
+         if (offset < 0 || sourceTop < offset) Kit.codeBug();
+         return new String(sourceBuffer, offset, sourceTop - offset);
+     }
+ 
++    //Used to be private, but making it public so we
++    //can reset the token state between compression runs.
++    //Not very pretty.
++    public static TokenMapper tm = new TokenMapper();
++    
++    /**
++     * Compress the script
++     * <p>
++     * 
++     * @param encodedSource encoded source string
++     * @param flags Flags specifying format of decompilation output
++     * @param properties Decompilation properties
++     * @param parseTree Mapping for each function node and corresponding parameters & variables names
++     * @return compressed script
++     */
++    public static String compress(String encodedSource, int flags,
++            UintMap properties, ScriptOrFnNode parseTree){
++    	
++    	 int length = encodedSource.length();
++         if (length == 0) { return ""; }
++         int indent = properties.getInt(INITIAL_INDENT_PROP, 0);
++         if (indent < 0) throw new IllegalArgumentException();
++         int indentGap = properties.getInt(INDENT_GAP_PROP, 4);
++         if (indentGap < 0) throw new IllegalArgumentException();
++         int caseGap = properties.getInt(CASE_GAP_PROP, 2);
++         if (caseGap < 0) throw new IllegalArgumentException();
++         StringBuffer result = new StringBuffer();
++         boolean justFunctionBody = (0 != (flags & Decompiler.ONLY_BODY_FLAG));
++         boolean toSource = (0 != (flags & Decompiler.TO_SOURCE_FLAG));
++         // Spew tokens in source, for debugging.
++         // as TYPE number char
++         if (printSource) {
++             System.err.println("length:" + length);
++             for (int i = 0; i < length; ++i) {
++                 // Note that tokenToName will fail unless Context.printTrees
++                 // is true.
++                 String tokenname = null;
++                 if (Token.printNames) {
++                     tokenname = Token.name(encodedSource.charAt(i));
++                 }
++                 if (tokenname == null) {
++                     tokenname = "---";
++                 }
++                 String pad = tokenname.length() > 7
++                     ? "\t"
++                     : "\t\t";
++                 System.err.println
++                     (tokenname
++                      + pad + (int)encodedSource.charAt(i)
++                      + "\t'" + ScriptRuntime.escapeString
++                      (encodedSource.substring(i, i+1))
++                      + "'");
++             }
++             System.err.println();
++         }
++         int braceNesting = 0;
++         boolean afterFirstEOL = false;
++         int i = 0;
++         int prevToken = 0;
++         boolean primeFunctionNesting = false;
++         boolean inArgsList = false;
++         boolean primeInArgsList = false;
++         int topFunctionType;
++         if (encodedSource.charAt(i) == Token.SCRIPT) {
++             ++i;
++             topFunctionType = -1;
++         } else {
++             topFunctionType = encodedSource.charAt(i + 1);
++         }
++         if (!toSource) {
++             // add an initial newline to exactly match js.
++             // result.append('\n');
++             for (int j = 0; j < indent; j++){
++                 // result.append(' ');
++                 result.append("");
++             }
++         } else {
++             if (topFunctionType == FunctionNode.FUNCTION_EXPRESSION) {
++                 result.append('(');
++             }
++         }
++         while (i < length) {
++           if(i>0){
++               prevToken = encodedSource.charAt(i-1);
++           }
++           // System.out.println(Token.name(getNext(source, length, i)));
++           switch(encodedSource.charAt(i)) {
++             case Token.NAME:
++             case Token.REGEXP:  // re-wrapped in '/'s in parser...
++                 int jumpPos = getSourceStringEnd(encodedSource, i+1);
++                 if(Token.OBJECTLIT == encodedSource.charAt(jumpPos)){
++                     i = printSourceString(encodedSource, i + 1, false, result);
++                 }else{
++                     i = tm.sourceCompress(	encodedSource, i + 1, false, result, prevToken, 
++                                             inArgsList, braceNesting, parseTree);
++                 }
++                 continue;
++             case Token.STRING:
++                 i = printSourceString(encodedSource, i + 1, true, result);
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list