public static StackTrace build()

in analysis/jfr/src/main/java/org/eclipse/jifa/jfr/util/StackTraceUtil.java [33:86]


    public static StackTrace build(RecordedStackTrace stackTrace, SymbolTable<SymbolBase> symbols) {
        StackTrace result = new StackTrace();
        result.setTruncated(stackTrace.isTruncated());

        DescriptorUtil util = new DescriptorUtil();
        List<RecordedFrame> srcFrames = stackTrace.getFrames();
        Frame[] dstFrames = new Frame[srcFrames.size()];
        for (int i = 0; i < srcFrames.size(); i++) {
            RecordedFrame frame = srcFrames.get(i);
            Frame dstFrame;
            if (frame.isJavaFrame()) {
                dstFrame = new JavaFrame();
                ((JavaFrame) dstFrame).setJavaFrame(frame.isJavaFrame());
                ((JavaFrame) dstFrame).setType(JavaFrame.Type.typeOf(frame.getType()));
                ((JavaFrame) dstFrame).setBci(frame.getBytecodeIndex());
            } else {
                dstFrame = new Frame();
            }

            RecordedMethod method = frame.getMethod();
            JavaMethod dstMethod = new JavaMethod();
            dstMethod.setPackageName(method.getType().getPackageName());
            dstMethod.setType(method.getType().getName());
            dstMethod.setName(method.getName());
            dstMethod.setDescriptor(util.decodeMethodArgs(method.getDescriptor()));

            dstMethod.setModifiers(method.getModifiers());
            dstMethod.setHidden(method.isHidden());
            if (symbols.isContains(dstMethod)) {
                dstMethod = (JavaMethod) symbols.get(dstMethod);
            } else {
                symbols.put(dstMethod);
            }

            dstFrame.setMethod(dstMethod);
            dstFrame.setLine(frame.getLineNumber());
            if (symbols.isContains(dstFrame)) {
                dstFrame = (Frame) symbols.get(dstFrame);
            } else {
                symbols.put(dstFrame);
            }

            dstFrames[i] = dstFrame;
        }

        result.setFrames(dstFrames);
        if (symbols.isContains(result)) {
            result = (StackTrace) symbols.get(result);
        } else {
            symbols.put(result);
        }

        return result;
    }