private void init()

in analysis/jfr/src/main/java/org/eclipse/jifa/jfr/model/jfr/RecordedEvent.java [64:171]


    private void init(SymbolTable<SymbolBase> symbols) {
        IMCThread imcThread = getValue("eventThread");
        if (imcThread == null) {
            imcThread = getValue("sampledThread");
        }

        if (imcThread != null) {
            thread = new RecordedThread(imcThread);
        }

        Object value = getValue("startTime");
        if (value instanceof IQuantity) {
            IQuantity v = (IQuantity) value;
            startTime = toNanos(v, UnitLookup.EPOCH_NS);
        }

        IType<IItem> itemType = ItemToolkit.getItemType(item);
        String itemTypeId = itemType.getIdentifier();

        // fix for JDK Mission Control lib
        if ((itemTypeId.startsWith(EventConstant.EXECUTION_SAMPLE) && !itemTypeId.equals(EventConstant.EXECUTION_SAMPLE))) {
            itemTypeId = EventConstant.EXECUTION_SAMPLE;
        } else if (itemTypeId.startsWith(EventConstant.OBJECT_ALLOCATION_OUTSIDE_TLAB)
                && !itemTypeId.equals(EventConstant.OBJECT_ALLOCATION_OUTSIDE_TLAB)) {
            itemTypeId = EventConstant.OBJECT_ALLOCATION_OUTSIDE_TLAB;
        } else if (itemTypeId.startsWith(EventConstant.OBJECT_ALLOCATION_IN_NEW_TLAB)
                && !itemTypeId.equals(EventConstant.OBJECT_ALLOCATION_IN_NEW_TLAB)) {
            itemTypeId = EventConstant.OBJECT_ALLOCATION_IN_NEW_TLAB;
        }

        this.eventType = new EventType(itemTypeId);

        IMCStackTrace s = getValue("stackTrace");
        if (s != null) {
            List<? extends IMCFrame> frames = s.getFrames();
            RecordedStackTrace st = new RecordedStackTrace();
            List<RecordedFrame> list = new ArrayList<>();
            frames.forEach(frame -> {
                IMCMethod method = frame.getMethod();

                RecordedMethod m = new RecordedMethod();
                m.setDescriptor(method.getFormalDescriptor());
                m.setModifiers(method.getModifier() == null ? 0 : method.getModifier());

                IMCType type = method.getType();
                RecordedClass c = new RecordedClass();
                c.setName(type.getTypeName());
                c.setPackageName(type.getPackage().getName());
                if (symbols.isContains(c)) {
                    c = (RecordedClass) symbols.get(c);
                } else {
                    symbols.put(c);
                }
                m.setType(c);
                m.setName(method.getMethodName());
                if (symbols.isContains(m)) {
                    m = (RecordedMethod) symbols.get(m);
                } else {
                    symbols.put(m);
                }

                RecordedFrame f = new RecordedFrame();
                f.setMethod(m);
                f.setBytecodeIndex(frame.getBCI());
                f.setType(frame.getType().getName());

                if (symbols.isContains(f)) {
                    f = (RecordedFrame) symbols.get(f);
                } else {
                    symbols.put(f);
                }

                list.add(f);
            });
            st.setFrames(list);
            if (symbols.isContains(st)) {
                st = (RecordedStackTrace) symbols.get(st);
            } else {
                symbols.put(st);
            }
            stackTrace = st;
        }

        if (ACTIVE_SETTING.equals(itemType.getIdentifier())) {
            String eventName = null;
            long eventId = -1;
            String settingName = null;
            for (Map.Entry<IAccessorKey<?>, ? extends IDescribable> entry : itemType.getAccessorKeys().entrySet()) {
                if (entry.getKey().getIdentifier().equals("settingFor")) {
                    IMemberAccessor<?, IItem> accessor = itemType.getAccessor(entry.getKey());
                    LabeledIdentifier id = (LabeledIdentifier) accessor.getMember(item);
                    eventName = id.getInterfaceId();
                    eventId = id.getImplementationId();
                    continue;
                }
                if (entry.getKey().getIdentifier().equals("name")) {
                    IMemberAccessor<?, IItem> accessor = itemType.getAccessor(entry.getKey());
                    settingName = (String) accessor.getMember(item);
                }
                if (eventName != null && settingName != null && eventId >= 0) {
                    break;
                }
            }
            if (eventName != null && settingName != null && eventId >= 0) {
                this.activeSetting = new ActiveSetting(eventName, eventId, settingName);
            }
        }
    }