elves / elvish

Powerful scripting language & versatile interactive shell
https://elv.sh/
BSD 2-Clause "Simplified" License
5.72k stars 303 forks source link

Using randint builtin causes panic when both limits are given #1856

Open MrOverlord opened 1 week ago

MrOverlord commented 1 week ago

Running the following script

var xd = 9223372036854775808 # 1 + signed 64 bit integer max
echo (randint $xd)           # this works fine
echo (randint 0 $xd)         # this should be equivalent to the line above

results in

11786879508667618912
panic: interface conversion: vals.Num is int, not *big.Int

goroutine 1 [running]:
src.elv.sh/pkg/eval.randint({0xc00020e160, 0x2, 0x0?})
    src.elv.sh/pkg/eval/builtin_fn_num.go:378 +0x6f1
reflect.Value.call({0x608cee3ef780?, 0x608cee478288?, 0x608cee476e00?}, {0x608cee2e26bf, 0x4}, {0xc000204360, 0x2, 0x2?})
    reflect/value.go:581 +0xca6
reflect.Value.Call({0x608cee3ef780?, 0x608cee478288?, 0x608cee3c1e80?}, {0xc000204360?, 0x608cee476e00?, 0x7c155a971db8?})
    reflect/value.go:365 +0xb9
src.elv.sh/pkg/eval.(*goFn).Call(0xc0001d2230, 0xc000222100, {0xc00020e0c0, 0x2, 0x608cee3ec440?}, 0xc000204330)
    src.elv.sh/pkg/eval/go_fn.go:247 +0xa30
src.elv.sh/pkg/eval.(*formOp).exec(0xc000040480, 0xc000222100)
    src.elv.sh/pkg/eval/compile_effect.go:297 +0x373
src.elv.sh/pkg/eval.(*pipelineOp).exec.func1({0x608cee47d3e0?, 0xc000040480?}, 0xc000202130)
    src.elv.sh/pkg/eval/compile_effect.go:120 +0x53
src.elv.sh/pkg/eval.(*pipelineOp).exec(0xc00007e680, 0xc000222080)
    src.elv.sh/pkg/eval/compile_effect.go:134 +0x96e
src.elv.sh/pkg/eval.chunkOp.exec({{0x42, 0x4f}, {0xc0000345c0, 0x1, 0x1}}, 0xc000222080)
    src.elv.sh/pkg/eval/compile_effect.go:32 +0x6c
src.elv.sh/pkg/eval.outputCaptureOp.exec({{0x41, 0x50}, {0x608cee47d420, 0xc0000b47b0}}, 0xc000222000)
    src.elv.sh/pkg/eval/compile_value.go:373 +0xb2
src.elv.sh/pkg/eval.compoundOp.exec({{0x41, 0x50}, 0x0, {0xc0000345b0, 0x1, 0x1}}, 0xc000222000)
    src.elv.sh/pkg/eval/compile_value.go:74 +0x75
src.elv.sh/pkg/eval.(*formOp).exec(0xc000040500, 0xc000222000)
    src.elv.sh/pkg/eval/compile_effect.go:274 +0x232
src.elv.sh/pkg/eval.(*pipelineOp).exec.func1({0x608cee47d3e0?, 0xc000040500?}, 0xc000202110)
    src.elv.sh/pkg/eval/compile_effect.go:120 +0x53
src.elv.sh/pkg/eval.(*pipelineOp).exec(0xc00007e6c0, 0xc000040580)
    src.elv.sh/pkg/eval/compile_effect.go:134 +0x96e
src.elv.sh/pkg/eval.chunkOp.exec({{0x0, 0x51}, {0xc0000b44b0, 0x3, 0x3}}, 0xc000040580)
    src.elv.sh/pkg/eval/compile_effect.go:32 +0x6c
src.elv.sh/pkg/eval.nsOp.prepare.func1()
    src.elv.sh/pkg/eval/compiler.go:77 +0x22
src.elv.sh/pkg/eval.(*Evaler).Eval(0xc0000be000, {{0xc00002a120, 0x26}, {0xc0000d2000, 0x51}, 0x1}, {{0x608cee480978, 0xc0000aa050}, {0xc0000120d8, 0x3, ...}, ...})
    src.elv.sh/pkg/eval/eval.go:343 +0x518
src.elv.sh/pkg/shell.evalInTTY({0xc000122088, 0xc000122090, 0xc000122098}, 0xc0000be000, {0x0, 0x0}, {{0xc00002a120, 0x26}, {0xc0000d2000, 0x51}, ...})
    src.elv.sh/pkg/shell/shell.go:191 +0x1ff
src.elv.sh/pkg/shell.script(0xc0000be000, {0xc000122088, 0xc000122090, 0xc000122098}, {0xc000138010?, 0x0?, 0x0?}, 0xc0001cfc75)
    src.elv.sh/pkg/shell/script.go:65 +0x425
src.elv.sh/pkg/shell.(*Program).Run(0xc0001e0270, {0xc000122088, 0xc000122090, 0xc000122098}, {0xc000138010, 0x1, 0x1})
    src.elv.sh/pkg/shell/shell.go:90 +0x32d
src.elv.sh/pkg/prog.composite.Run({0xc00015a960?, 0xc0001cfe18?, 0x608cee0aceea?}, {0xc000122088, 0xc000122090, 0xc000122098}, {0xc000138010, 0x1, 0x1})
    src.elv.sh/pkg/prog/prog.go:192 +0x117
src.elv.sh/pkg/prog.Run({0xc000122088, 0xc000122090, 0xc000122098}, {0xc000138000, 0x2, 0x2}, {0x608cee47e3e8, 0xc000124510})
    src.elv.sh/pkg/prog/prog.go:158 +0x4c7
main.main()
    src.elv.sh/cmd/withpprof/elvish/main.go:17 +0x188

Output of "elvish -version"

0.21.0+archlinux1

Code of Conduct