Skip to content

How to generate anonymous enums into a enum #2199

@wherewhere

Description

@wherewhere

In jvmti.h, it has:

enum {
    JVMTI_THREAD_STATE_ALIVE = 0x0001,
    JVMTI_THREAD_STATE_TERMINATED = 0x0002,
    JVMTI_THREAD_STATE_RUNNABLE = 0x0004,
    JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400,
    JVMTI_THREAD_STATE_WAITING = 0x0080,
    JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010,
    JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020,
    JVMTI_THREAD_STATE_SLEEPING = 0x0040,
    JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100,
    JVMTI_THREAD_STATE_PARKED = 0x0200,
    JVMTI_THREAD_STATE_SUSPENDED = 0x100000,
    JVMTI_THREAD_STATE_INTERRUPTED = 0x200000,
    JVMTI_THREAD_STATE_IN_NATIVE = 0x400000,
    JVMTI_THREAD_STATE_VENDOR_1 = 0x10000000,
    JVMTI_THREAD_STATE_VENDOR_2 = 0x20000000,
    JVMTI_THREAD_STATE_VENDOR_3 = 0x40000000
};

And it also has:

enum {
    JVMTI_JAVA_LANG_THREAD_STATE_MASK = JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT,
    JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0,
    JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = JVMTI_THREAD_STATE_TERMINATED,
    JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE,
    JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
    JVMTI_JAVA_LANG_THREAD_STATE_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY,
    JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
};

Because the next enums use the first enums, the generator generated:

public const int JVMTI_JAVA_LANG_THREAD_STATE_MASK = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_TERMINATED | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_ALIVE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_RUNNABLE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING_INDEFINITELY | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT;
public const int JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0;
public const int JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_TERMINATED;
public const int JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_ALIVE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_RUNNABLE;
public const int JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_ALIVE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER;
public const int JVMTI_JAVA_LANG_THREAD_STATE_WAITING = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_ALIVE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING_INDEFINITELY;
public const int JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_ALIVE | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING | __AnonymousEnum_jvmti_L87_C1.JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT;

But not generated the __AnonymousEnum_jvmti_L87_C1 type. Which cause:

error CS0103: The name '__AnonymousEnum_jvmti_L87_C1' does not exist in the current context

I try to use enums.json to let this consts into a enum, but I found that enums.json does not work for anonymous enums.

{
  "$schema": "https://github.com/microsoft/win32metadata/raw/main/generation/WinSDK/enums.schema.json",
  "items": [
    {
      "namespace": "Java.Runtime.Tool",
      "name": "JVMTI_JAVA_LANG_THREAD_STATE",
      "autoPopulate": {
        "filter": "JVMTI_JAVA_LANG_THREAD_STATE_",
        "header": "jvmti.h"
      }
    }
  ]
}

Is that any way to generate anonymous enums into a enum? Besides, in classfile_constants.h there are all of anonymous enums, which make Api class full of consts.

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions