Skip to content

Cross referencing arguments cause StackOverflowError #47

@pcoltau

Description

@pcoltau

When cross referencing arguments, it will cause a StackOverflowError.

I have the following Args class:

class Args(parser: ArgParser) {
    val caseInsensitive by parser.flagging("-c", "--case_insensitive",
            help = "Help")

    val includedExtensions by parser.adding("-e", "--include_ext",
            help = "Help")
        { extensionCheckCaseInsensitive() }.default(Collections.emptyList())

    private fun String.extensionCheckCaseInsensitive() =
            if (caseInsensitive) this.toLowerCase() else this
}

The includedExtensions needs to check the other argument caseInsensitive in order to format the extensions. This could be done after the parsing is done, but it is more convenient to do as part of the parser's formatting.

The parser is called like this in the main function:

val parsedArgs: Args
try {
    parsedArgs = ArgParser(args).parseInto(::Args)
} catch (e: SystemExitException) {
    e.printAndExit()
}

When running the above code, it will produce a StackOverflowError, which I did not expect:

Exception in thread "main" java.lang.StackOverflowError
	at java.lang.String.<init>(String.java:207)
	at java.lang.StringBuilder.toString(StringBuilder.java:407)
	at com.xenomachina.argparser.ArgParser.parseShortOpts(ArgParser.kt:579)
	at com.xenomachina.argparser.ArgParser.access$parseShortOpts(ArgParser.kt:38)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:492)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
	at com.xenomachina.argparser.ArgParser.getParseOptions(ArgParser.kt)
	at com.xenomachina.argparser.ArgParser.force(ArgParser.kt:446)
	at com.xenomachina.argparser.DefaultKt$default$3.getValue(Default.kt:73)
	at com.xenomachina.argparser.ArgParser$Delegate.getValue(ArgParser.kt:340)
	at com.myPackage.Args.getCaseInsensitive(Args.kt)
	at com.myPackage.Args.extensionCheckCaseInsensitive(Args.kt:55)
	at com.myPackage.Args.access$extensionCheckCaseInsensitive(Args.kt:46)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:52)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:46)
	at com.xenomachina.argparser.ArgParser$adding$1.invoke(ArgParser.kt:135)
	at com.xenomachina.argparser.ArgParser$adding$1.invoke(ArgParser.kt:38)
	at com.xenomachina.argparser.OptionDelegate.parseOption(OptionDelegate.kt:60)
	at com.xenomachina.argparser.ArgParser.parseShortOpts(ArgParser.kt:587)
	at com.xenomachina.argparser.ArgParser.access$parseShortOpts(ArgParser.kt:38)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:492)
	at com.xenomachina.argparser.ArgParser$parseOptions$2.invoke(ArgParser.kt:38)
	at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
	at com.xenomachina.argparser.ArgParser.getParseOptions(ArgParser.kt)
	at com.xenomachina.argparser.ArgParser.force(ArgParser.kt:446)
	at com.xenomachina.argparser.DefaultKt$default$3.getValue(Default.kt:73)
	at com.xenomachina.argparser.ArgParser$Delegate.getValue(ArgParser.kt:340)
	at com.myPackage.Args.getCaseInsensitive(Args.kt)
	at com.myPackage.Args.extensionCheckCaseInsensitive(Args.kt:55)
	at com.myPackage.Args.access$extensionCheckCaseInsensitive(Args.kt:46)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:52)
	at com.myPackage.Args$includedExtensions$2.invoke(Args.kt:46)
...

Am I doing something wrong, or is this a bug?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions