Skip to content

Mapping a type to a type of the same name causes stack overflow #1835

@Saalvage

Description

@Saalvage

I have the following header:

typedef int MyFlags;

#define FLAG_ONE 1
#define FLAG_TWO 2

class Test {
public:
    void MyMethod(MyFlags a);
};

I would like to end up with Test.MyMethod having MyFlags as a parameter instead of int.

To this end at first I var @enum = ctx.GenerateEnumFromMacros("MyFlags", "FLAG_(.*)").

I then use the following TypeMap:

[TypeMap("MyFlags")]
public class MyFlagsMap : TypeMap {
    internal static TagType Type { private get; set; }

    public override Type SignatureType(TypePrinterContext ctx) {
        return Type;
    }
}

whereas MyFlagsMap.Type = new TagType(@enum).

This results in a stack overflow on calls such as typeMap.SignatureType(ctx).ToString() (which are used at various points) as ToString on Type again goes over the type maps and calls ToString on the signature type, repeat ad infinitum.

One potential solution is adding the following method to TypeMap:

public virtual string Print(TypePrinterContext ctx)
{
    return SignatureType(ctx).ToString();
}

and replacing all calls such as typeMap.SignatureType(ctx).ToString() with typeMap.Print(ctx).

However, this would require modifications on the end of the user which is not ideal. Some other way to avoid the cycles here seems preferable, but I don't see a straightforward way of achieving that atm..

P.S.: For anyone stumbling across this issue seeking to accomplish something similar to me while a fix hasn't yet been implemented:
A simple workaround is initially picking a different name for the generated enum and renaming it it in the Postprocess step.

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