diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/RhinoException.java b/mozilla/js/rhino/src/org/mozilla/javascript/RhinoException.java index 26765088243..c92b5ebb484 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/RhinoException.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/RhinoException.java @@ -24,6 +24,7 @@ * Contributor(s): * Norris Boyd * Igor Bukanov + * Hannes Wallnoefer * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which @@ -55,11 +56,6 @@ import java.util.regex.Pattern; */ public abstract class RhinoException extends RuntimeException { - static class DefaultFilenameFilter implements FilenameFilter { - public boolean accept(File dir, String name) { - return name.regionMatches(true, name.length() - 3, ".js", 0, 3); - } - } RhinoException() { @@ -232,29 +228,16 @@ public abstract class RhinoException extends RuntimeException /** * Get a string representing the script stack of this exception. * If optimization is enabled, this includes java stack elements - * with a source name ending with ".js". + * whose source and method names suggest they have been generated + * by the Rhino script compiler. * @return a script stack dump * @since 1.6R6 */ public String getScriptStackTrace() - { - return getScriptStackTrace(new DefaultFilenameFilter()); - } - - /** - * Get a string representing the script stack of this exception. - * If optimization is enabled, this includes java stack elements - * with a source name matching the filter. - * @param filter the file name filter to determine whether a file is a - * script file - * @return a script stack dump - * @since 1.6R6 - */ - public String getScriptStackTrace(FilenameFilter filter) { StringBuilder buffer = new StringBuilder(); String lineSeparator = SecurityUtilities.getSystemProperty("line.separator"); - ScriptStackElement[] stack = getScriptStack(filter); + ScriptStackElement[] stack = getScriptStack(); for (ScriptStackElement elem : stack) { if (useMozillaStackStyle) { elem.renderMozillaStyle(buffer); @@ -267,33 +250,29 @@ public abstract class RhinoException extends RuntimeException } /** - * Get the script stack of this exception as an array of - * {@link ScriptStackElement}s. - * If optimization is enabled, this includes java stack elements - * with a source name ending with ".js". - * @return the script stack for this exception - * @since 1.7R3 + * Get a string representing the script stack of this exception. + * @deprecated the filter argument is ignored as we are able to + * recognize script stack elements by our own. Use + * #getScriptStackTrace() instead. + * @param filter ignored + * @return a script stack dump + * @since 1.6R6 */ - public ScriptStackElement[] getScriptStack() { - return getScriptStack(new FilenameFilter() { - public boolean accept(File dir, String name) { - return name.endsWith(".js"); - } - }); + public String getScriptStackTrace(FilenameFilter filter) + { + return getScriptStackTrace(); } /** * Get the script stack of this exception as an array of * {@link ScriptStackElement}s. * If optimization is enabled, this includes java stack elements - * with a source name matching the filter. - * @param filter the file name filter to determine whether a file is a - * script file + * whose source and method names suggest they have been generated + * by the Rhino script compiler. * @return the script stack for this exception * @since 1.7R3 */ - public ScriptStackElement[] getScriptStack(FilenameFilter filter) - { + public ScriptStackElement[] getScriptStack() { List list = new ArrayList(); ScriptStackElement[][] interpreterStack = null; if (interpreterStackInfo != null) { @@ -308,20 +287,22 @@ public abstract class RhinoException extends RuntimeException // kudos to Marc Guillemot for coming up with this Pattern pattern = Pattern.compile("_c_(.*)_\\d+"); for (StackTraceElement e : stack) { - String name = e.getFileName(); - if (e.getLineNumber() > -1 && name != null - && filter.accept(null, name)) { - String functionName = e.getMethodName(); - Matcher match = pattern.matcher(functionName); + String fileName = e.getFileName(); + if (e.getMethodName().startsWith("_c_") + && e.getLineNumber() > -1 + && fileName != null + && !fileName.endsWith(".java")) { + String methodName = e.getMethodName(); + Matcher match = pattern.matcher(methodName); // the method representing the main script is always "_c_script_0" - // at least we hope so - functionName = !"_c_script_0".equals(functionName) && match.find() ? + methodName = !"_c_script_0".equals(methodName) && match.find() ? match.group(1) : null; - list.add(new ScriptStackElement(e.getFileName(), functionName, e.getLineNumber())); - } else if (interpreterStack != null - && interpreterStack.length > interpreterStackIndex - && "org.mozilla.javascript.Interpreter".equals(e.getClassName()) - && "interpretLoop".equals(e.getMethodName())) { + list.add(new ScriptStackElement(fileName, methodName, e.getLineNumber())); + } else if ("org.mozilla.javascript.Interpreter".equals(e.getClassName()) + && "interpretLoop".equals(e.getMethodName()) + && interpreterStack != null + && interpreterStack.length > interpreterStackIndex) { for (ScriptStackElement elem : interpreterStack[interpreterStackIndex++]) { list.add(elem); }