src/jdk/nashorn/internal/objects/NativeError.java

Print this page

        

*** 142,151 **** --- 142,179 ---- Global.checkObject(self); return ECMAException.printStackTrace((ScriptObject)self); } /** + * Nashorn extension: Error.prototype.getStackTrace() + * "stack" property is an array typed value containing {@link StackTraceElement} + * objects of JavaScript stack frames. + * + * @param self self reference + * + * @return stack trace as a script array. + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) + public static Object getStackTrace(final Object self) { + Global.checkObject(self); + final ScriptObject sobj = (ScriptObject)self; + if (sobj.has(STACK)) { + return sobj.get(STACK); + } + + final Object exception = ECMAException.getException(sobj); + Object[] res; + if (exception instanceof Throwable) { + res = getScriptFrames((Throwable)exception); + } else { + res = ScriptRuntime.EMPTY_ARRAY; + } + + return new NativeArray(res); + } + + /** * Nashorn extension: Error.prototype.lineNumber * * @param self self reference * * @return line number from which error was thrown
*** 227,238 **** return value; } /** * Nashorn extension: Error.prototype.stack ! * "stack" property is an array typed value containing {@link StackTraceElement} ! * objects of JavaScript stack frames. * * @param self self reference * * @return value of "stack" property */ --- 255,266 ---- return value; } /** * Nashorn extension: Error.prototype.stack ! * "stack" property is a string typed value containing JavaScript stack frames. ! * Each frame information is separated bv "\n" character. * * @param self self reference * * @return value of "stack" property */
*** 242,272 **** if (sobj.has(STACK)) { return sobj.get(STACK); } final Object exception = ECMAException.getException(sobj); ! Object[] res; if (exception instanceof Throwable) { ! final StackTraceElement[] frames = ((Throwable)exception).getStackTrace(); ! final List<StackTraceElement> filtered = new ArrayList<>(); ! for (final StackTraceElement st : frames) { ! if (ECMAErrors.isScriptFrame(st)) { ! final String className = "<" + st.getFileName() + ">"; ! String methodName = st.getMethodName(); ! if (methodName.equals(CompilerConstants.RUN_SCRIPT.symbolName())) { ! methodName = "<program>"; ! } ! filtered.add(new StackTraceElement(className, methodName, ! st.getFileName(), st.getLineNumber())); } ! } ! res = filtered.toArray(); } else { ! res = ScriptRuntime.EMPTY_ARRAY; } - - return new NativeArray(res); } /** * Nashorn extension * Accessed from {@link Global} while setting up the Error.prototype --- 270,301 ---- if (sobj.has(STACK)) { return sobj.get(STACK); } final Object exception = ECMAException.getException(sobj); ! final StringBuilder buf = new StringBuilder(); if (exception instanceof Throwable) { ! final Object[] frames = getScriptFrames((Throwable)exception); ! for (final Object fr : frames) { ! final StackTraceElement st = (StackTraceElement)fr; ! buf.append(st.getMethodName()); ! buf.append(" @ "); ! buf.append(st.getFileName()); ! buf.append(':'); ! buf.append(st.getLineNumber()); ! buf.append('\n'); ! } ! final int len = buf.length(); ! // remove trailing '\n' ! if (len > 0) { ! assert buf.charAt(len - 1) == '\n'; ! buf.deleteCharAt(len - 1); } ! return buf.toString(); } else { ! return ""; } } /** * Nashorn extension * Accessed from {@link Global} while setting up the Error.prototype
*** 333,338 **** --- 362,384 ---- return MethodHandles.lookup().findStatic(NativeError.class, name, MH.type(rtype, types)); } catch (final NoSuchMethodException | IllegalAccessException e) { throw new MethodHandleFactory.LookupException(e); } } + + private static Object[] getScriptFrames(final Throwable exception) { + final StackTraceElement[] frames = ((Throwable)exception).getStackTrace(); + final List<StackTraceElement> filtered = new ArrayList<>(); + for (final StackTraceElement st : frames) { + if (ECMAErrors.isScriptFrame(st)) { + final String className = "<" + st.getFileName() + ">"; + String methodName = st.getMethodName(); + if (methodName.equals(CompilerConstants.RUN_SCRIPT.symbolName())) { + methodName = "<program>"; + } + filtered.add(new StackTraceElement(className, methodName, + st.getFileName(), st.getLineNumber())); + } + } + return filtered.toArray(); + } }