private RubyStackTraceElement[] getTraceSubset(int level, Integer length, StackTraceElement[] stacktrace) { runtime.incrementCallerCount(); if (length != null && length == 0) return new RubyStackTraceElement[0]; RubyStackTraceElement[] trace = TraceType.Gather.CALLER.getBacktraceData(this, stacktrace, false).getBacktrace(runtime); int traceLength = safeLength(level, length, trace); if (traceLength < 0) return null; trace = Arrays.copyOfRange(trace, level, level + traceLength); if (RubyInstanceConfig.LOG_CALLERS) TraceType.dumpCaller(trace); return trace; }
private RubyStackTraceElement[] getTraceSubset(int level, Integer length, StackTraceElement[] stacktrace) { runtime.incrementCallerCount(); if (length != null && length == 0) return new RubyStackTraceElement[0]; RubyStackTraceElement[] trace = TraceType.Gather.CALLER.getBacktraceData(this, stacktrace, false).getBacktrace(runtime); int traceLength = safeLength(level, length, trace); if (traceLength < 0) return null; trace = Arrays.copyOfRange(trace, level, level + traceLength); if (RubyInstanceConfig.LOG_CALLERS) TraceType.dumpCaller(trace); return trace; }
/** * Create an Array with backtrace information for Kernel#caller * @param runtime * @param level * @param length * @return an Array with the backtrace */ public IRubyObject createCallerBacktrace(int level, Integer length, StackTraceElement[] stacktrace) { runtime.incrementCallerCount(); RubyStackTraceElement[] trace = getTraceSubset(level, length, stacktrace); if (trace == null) return nil; RubyArray newTrace = runtime.newArray(trace.length); for (int i = level; i - level < trace.length; i++) { addBackTraceElement(runtime, newTrace, trace[i - level]); } if (RubyInstanceConfig.LOG_CALLERS) TraceType.dumpCaller(newTrace); return newTrace; }
/** * Create an Array with backtrace information for Kernel#caller * @param runtime * @param level * @param length * @return an Array with the backtrace */ public IRubyObject createCallerBacktrace(int level, Integer length, StackTraceElement[] stacktrace) { runtime.incrementCallerCount(); RubyStackTraceElement[] trace = getTraceSubset(level, length, stacktrace); if (trace == null) return nil; RubyArray newTrace = runtime.newArray(trace.length); for (int i = level; i - level < trace.length; i++) { addBackTraceElement(runtime, newTrace, trace[i - level]); } if (RubyInstanceConfig.LOG_CALLERS) TraceType.dumpCaller(newTrace); return newTrace; }