cue: fix builtin type signature
Change-Id: Ifcc3ef67028eec33e3fdfab3b482770e6357f53b
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2953
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtin.go b/cue/builtin.go
index 58d0bcf..54367ba 100644
--- a/cue/builtin.go
+++ b/cue/builtin.go
@@ -359,7 +359,10 @@
}
func (c *callCtxt) errf(src source, underlying error, format string, args ...interface{}) {
- a := make([]interface{}, 0, 1+len(args))
+ a := make([]interface{}, 0, 2+len(args))
+ if err, ok := underlying.(*valueError); ok {
+ a = append(a, err.err)
+ }
a = append(a, format)
a = append(a, args...)
err := c.ctx.mkErr(src, a...)
diff --git a/cue/builtin_test.go b/cue/builtin_test.go
index a9c467f..5c03f11 100644
--- a/cue/builtin_test.go
+++ b/cue/builtin_test.go
@@ -78,6 +78,9 @@
test("encoding/hex", `hex.Decode("foo")`),
`_|_(error in call to encoding/hex.Decode: encoding/hex: invalid byte: U+006F 'o')`,
}, {
+ test("encoding/hex", `hex.Dump('foo')`),
+ `"00000000 66 6f 6f |foo|\n"`,
+ }, {
test("encoding/json", `json.Validate("{\"a\":10}", {b:string})`),
`true`,
}, {
diff --git a/cue/builtins.go b/cue/builtins.go
index 1fc722d..e312947 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -142,7 +142,7 @@
Const: "64",
}, {
Name: "Sum",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -161,7 +161,7 @@
Const: "64",
}, {
Name: "Sum",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -183,7 +183,7 @@
Const: "64",
}, {
Name: "Sum256",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -193,7 +193,7 @@
},
}, {
Name: "Sum224",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -221,7 +221,7 @@
Const: "128",
}, {
Name: "Sum512",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -231,7 +231,7 @@
},
}, {
Name: "Sum384",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -241,7 +241,7 @@
},
}, {
Name: "Sum512_224",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -251,7 +251,7 @@
},
}, {
Name: "Sum512_256",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -290,7 +290,7 @@
},
}, {
Name: "Encode",
- Params: []kind{topKind, stringKind},
+ Params: []kind{topKind, bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
encoding, src := c.value(0), c.bytes(1)
@@ -304,7 +304,7 @@
}, {
Name: "Decode",
Params: []kind{topKind, stringKind},
- Result: stringKind,
+ Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
encoding, s := c.value(0), c.string(1)
c.ret, c.err = func() (interface{}, error) {
@@ -356,7 +356,7 @@
},
}, {
Name: "Decode",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: listKind,
Func: func(c *callCtxt) {
r := c.reader(0)
@@ -390,7 +390,7 @@
}, {
Name: "Decode",
Params: []kind{stringKind},
- Result: stringKind,
+ Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
c.ret, c.err = func() (interface{}, error) {
@@ -399,7 +399,7 @@
},
}, {
Name: "Dump",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -409,7 +409,7 @@
},
}, {
Name: "Encode",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
@@ -422,7 +422,7 @@
"encoding/json": &builtinPkg{
native: []*builtin{{
Name: "Valid",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: boolKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -432,7 +432,7 @@
},
}, {
Name: "Compact",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
@@ -446,7 +446,7 @@
},
}, {
Name: "Indent",
- Params: []kind{stringKind, stringKind, stringKind},
+ Params: []kind{bytesKind | stringKind, stringKind, stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
@@ -460,7 +460,7 @@
},
}, {
Name: "HTMLEscape",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
@@ -507,7 +507,7 @@
},
}, {
Name: "Unmarshal",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
b := c.bytes(0)
@@ -525,7 +525,7 @@
},
}, {
Name: "Validate",
- Params: []kind{stringKind, topKind},
+ Params: []kind{bytesKind | stringKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
@@ -588,7 +588,7 @@
},
}, {
Name: "Unmarshal",
- Params: []kind{stringKind},
+ Params: []kind{bytesKind | stringKind},
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
@@ -598,7 +598,7 @@
},
}, {
Name: "Validate",
- Params: []kind{stringKind, topKind},
+ Params: []kind{bytesKind | stringKind, topKind},
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
@@ -1978,7 +1978,7 @@
"strings": &builtinPkg{
native: []*builtin{{
Name: "ByteAt",
- Params: []kind{stringKind, intKind},
+ Params: []kind{bytesKind | stringKind, intKind},
Result: intKind,
Func: func(c *callCtxt) {
b, i := c.bytes(0), c.int(1)
@@ -1991,8 +1991,8 @@
},
}, {
Name: "ByteSlice",
- Params: []kind{stringKind, intKind, intKind},
- Result: stringKind,
+ Params: []kind{bytesKind | stringKind, intKind, intKind},
+ Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
b, start, end := c.bytes(0), c.int(1), c.int(2)
c.ret, c.err = func() (interface{}, error) {
diff --git a/cue/gen.go b/cue/gen.go
index 9d22f41..cd30512 100644
--- a/cue/gen.go
+++ b/cue/gen.go
@@ -428,7 +428,9 @@
cueKind += "bottomKind"
case "bool":
cueKind += "boolKind"
- case "string", "bytes", "reader":
+ case "bytes", "reader":
+ cueKind += "bytesKind|stringKind"
+ case "string":
cueKind += "stringKind"
case "int", "int8", "int16", "int32", "rune", "int64",
"uint", "byte", "uint8", "uint16", "uint32", "uint64",