abs icon indicating copy to clipboard operation
abs copied to clipboard

A bug in the flag() builtin function

Open s5unty opened this issue 3 years ago • 0 comments

#!/usr/bin/env abs

cli = require('@cli')

@cli.cmd("foo", "opts", {"s": 1 })
f foo(argv, flags) {
    echo("flags: %s", flags.str())
}

@cli.cmd("bar", "opts", {"ss":1 })
f bar(argv, flags) {
    echo("flags: %s", flags.str())
}

cli.run()
 % ./bug.abs foo -s
 flags: {"s": "./bug.abs"}
 % ./bug.abs bar -ss
 flags: {"ss": true}

When the flagFN() function iterates through os.Args, the first v value is "abs", which causes the flag "s" to be misinterpreted.

diff --git evaluator/functions.go evaluator/functions.go
index 5d3d7c0..52999a7 100644
--- evaluator/functions.go
+++ evaluator/functions.go
@@ -615,7 +615,7 @@ func flagFn(tok token.Token, env *object.Environment, args ...object.Object) obj
        // passed to the script
        // This is O(n) but again, performance
        // is not a big deal in ABS
-       for _, v := range os.Args {
+       for _, v := range os.Args[1:] {
                // If the flag was found in the previous
                // argument...
                if found {

s5unty avatar Dec 12 '21 06:12 s5unty