cue: always check for errors before calling builtin functions
This removes an optimization that was not always correct.
Aside from fixing the cases in the issue, this also guards
against calling builtins when unnecessary.
Fixes #178.
Change-Id: I051e191662045fce28b3d02c57fa228a6ef4e21e
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/4208
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/cue/builtins.go b/cue/builtins.go
index bc72a98..5305379 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -163,10 +163,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := md5.Sum(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := md5.Sum(data)
+ return a[:]
+ }()
+ }
},
}},
},
@@ -183,10 +185,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha1.Sum(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha1.Sum(data)
+ return a[:]
+ }()
+ }
},
}},
},
@@ -206,10 +210,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha256.Sum256(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha256.Sum256(data)
+ return a[:]
+ }()
+ }
},
}, {
Name: "Sum224",
@@ -217,10 +223,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha256.Sum224(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha256.Sum224(data)
+ return a[:]
+ }()
+ }
},
}},
},
@@ -246,10 +254,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha512.Sum512(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha512.Sum512(data)
+ return a[:]
+ }()
+ }
},
}, {
Name: "Sum384",
@@ -257,10 +267,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha512.Sum384(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha512.Sum384(data)
+ return a[:]
+ }()
+ }
},
}, {
Name: "Sum512_224",
@@ -268,10 +280,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha512.Sum512_224(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha512.Sum512_224(data)
+ return a[:]
+ }()
+ }
},
}, {
Name: "Sum512_256",
@@ -279,10 +293,12 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- a := sha512.Sum512_256(data)
- return a[:]
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ a := sha512.Sum512_256(data)
+ return a[:]
+ }()
+ }
},
}},
},
@@ -293,12 +309,14 @@
Result: intKind,
Func: func(c *callCtxt) {
encoding, n := c.value(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- if err := encoding.Null(); err != nil {
- return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
- }
- return base64.StdEncoding.EncodedLen(n), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if err := encoding.Null(); err != nil {
+ return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
+ }
+ return base64.StdEncoding.EncodedLen(n), nil
+ }()
+ }
},
}, {
Name: "DecodedLen",
@@ -306,12 +324,14 @@
Result: intKind,
Func: func(c *callCtxt) {
encoding, x := c.value(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- if err := encoding.Null(); err != nil {
- return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
- }
- return base64.StdEncoding.DecodedLen(x), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if err := encoding.Null(); err != nil {
+ return 0, fmt.Errorf("base64: unsupported encoding: %v", err)
+ }
+ return base64.StdEncoding.DecodedLen(x), nil
+ }()
+ }
},
}, {
Name: "Encode",
@@ -319,12 +339,14 @@
Result: stringKind,
Func: func(c *callCtxt) {
encoding, src := c.value(0), c.bytes(1)
- c.ret, c.err = func() (interface{}, error) {
- if err := encoding.Null(); err != nil {
- return "", fmt.Errorf("base64: unsupported encoding: %v", err)
- }
- return base64.StdEncoding.EncodeToString(src), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if err := encoding.Null(); err != nil {
+ return "", fmt.Errorf("base64: unsupported encoding: %v", err)
+ }
+ return base64.StdEncoding.EncodeToString(src), nil
+ }()
+ }
},
}, {
Name: "Decode",
@@ -332,12 +354,14 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
encoding, s := c.value(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- if err := encoding.Null(); err != nil {
- return nil, fmt.Errorf("base64: unsupported encoding: %v", err)
- }
- return base64.StdEncoding.DecodeString(s)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if err := encoding.Null(); err != nil {
+ return nil, fmt.Errorf("base64: unsupported encoding: %v", err)
+ }
+ return base64.StdEncoding.DecodeString(s)
+ }()
+ }
},
}},
},
@@ -348,36 +372,38 @@
Result: stringKind,
Func: func(c *callCtxt) {
x := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- buf := &bytes.Buffer{}
- w := csv.NewWriter(buf)
- iter, err := x.List()
- if err != nil {
- return "", err
- }
- for iter.Next() {
- row, err := iter.Value().List()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ buf := &bytes.Buffer{}
+ w := csv.NewWriter(buf)
+ iter, err := x.List()
if err != nil {
return "", err
}
- a := []string{}
- for row.Next() {
- col := row.Value()
- if str, err := col.String(); err == nil {
- a = append(a, str)
- } else {
- b, err := col.MarshalJSON()
- if err != nil {
- return "", err
- }
- a = append(a, string(b))
+ for iter.Next() {
+ row, err := iter.Value().List()
+ if err != nil {
+ return "", err
}
+ a := []string{}
+ for row.Next() {
+ col := row.Value()
+ if str, err := col.String(); err == nil {
+ a = append(a, str)
+ } else {
+ b, err := col.MarshalJSON()
+ if err != nil {
+ return "", err
+ }
+ a = append(a, string(b))
+ }
+ }
+ _ = w.Write(a)
}
- _ = w.Write(a)
- }
- w.Flush()
- return buf.String(), nil
- }()
+ w.Flush()
+ return buf.String(), nil
+ }()
+ }
},
}, {
Name: "Decode",
@@ -385,9 +411,11 @@
Result: listKind,
Func: func(c *callCtxt) {
r := c.reader(0)
- c.ret, c.err = func() (interface{}, error) {
- return csv.NewReader(r).ReadAll()
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return csv.NewReader(r).ReadAll()
+ }()
+ }
},
}},
},
@@ -398,9 +426,11 @@
Result: intKind,
Func: func(c *callCtxt) {
n := c.int(0)
- c.ret = func() interface{} {
- return hex.EncodedLen(n)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return hex.EncodedLen(n)
+ }()
+ }
},
}, {
Name: "DecodedLen",
@@ -408,9 +438,11 @@
Result: intKind,
Func: func(c *callCtxt) {
x := c.int(0)
- c.ret = func() interface{} {
- return hex.DecodedLen(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return hex.DecodedLen(x)
+ }()
+ }
},
}, {
Name: "Decode",
@@ -418,9 +450,11 @@
Result: bytesKind | stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- return hex.DecodeString(s)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return hex.DecodeString(s)
+ }()
+ }
},
}, {
Name: "Dump",
@@ -428,9 +462,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- return hex.Dump(data)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return hex.Dump(data)
+ }()
+ }
},
}, {
Name: "Encode",
@@ -438,9 +474,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
- c.ret = func() interface{} {
- return hex.EncodeToString(src)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return hex.EncodeToString(src)
+ }()
+ }
},
}},
},
@@ -451,9 +489,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret = func() interface{} {
- return json.Valid(data)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return json.Valid(data)
+ }()
+ }
},
}, {
Name: "Compact",
@@ -461,13 +501,15 @@
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
- c.ret, c.err = func() (interface{}, error) {
- dst := bytes.Buffer{}
- if err := json.Compact(&dst, src); err != nil {
- return "", err
- }
- return dst.String(), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ dst := bytes.Buffer{}
+ if err := json.Compact(&dst, src); err != nil {
+ return "", err
+ }
+ return dst.String(), nil
+ }()
+ }
},
}, {
Name: "Indent",
@@ -475,13 +517,15 @@
Result: stringKind,
Func: func(c *callCtxt) {
src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
- c.ret, c.err = func() (interface{}, error) {
- dst := bytes.Buffer{}
- if err := json.Indent(&dst, src, prefix, indent); err != nil {
- return "", err
- }
- return dst.String(), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ dst := bytes.Buffer{}
+ if err := json.Indent(&dst, src, prefix, indent); err != nil {
+ return "", err
+ }
+ return dst.String(), nil
+ }()
+ }
},
}, {
Name: "HTMLEscape",
@@ -489,11 +533,13 @@
Result: stringKind,
Func: func(c *callCtxt) {
src := c.bytes(0)
- c.ret = func() interface{} {
- dst := &bytes.Buffer{}
- json.HTMLEscape(dst, src)
- return dst.String()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ dst := &bytes.Buffer{}
+ json.HTMLEscape(dst, src)
+ return dst.String()
+ }()
+ }
},
}, {
Name: "Marshal",
@@ -501,10 +547,12 @@
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- b, err := json.Marshal(v)
- return string(b), err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ b, err := json.Marshal(v)
+ return string(b), err
+ }()
+ }
},
}, {
Name: "MarshalStream",
@@ -512,23 +560,25 @@
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
- iter, err := v.List()
- if err != nil {
- return "", err
- }
- buf := &bytes.Buffer{}
- for iter.Next() {
- b, err := json.Marshal(iter.Value())
+ iter, err := v.List()
if err != nil {
return "", err
}
- buf.Write(b)
- buf.WriteByte('\n')
- }
- return buf.String(), nil
- }()
+ buf := &bytes.Buffer{}
+ for iter.Next() {
+ b, err := json.Marshal(iter.Value())
+ if err != nil {
+ return "", err
+ }
+ buf.Write(b)
+ buf.WriteByte('\n')
+ }
+ return buf.String(), nil
+ }()
+ }
},
}, {
Name: "Unmarshal",
@@ -536,17 +586,19 @@
Result: topKind,
Func: func(c *callCtxt) {
b := c.bytes(0)
- c.ret, c.err = func() (interface{}, error) {
- if !json.Valid(b) {
- return nil, fmt.Errorf("json: invalid JSON")
- }
- expr, err := parser.ParseExpr("json", b)
- if err != nil {
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if !json.Valid(b) {
+ return nil, fmt.Errorf("json: invalid JSON")
+ }
+ expr, err := parser.ParseExpr("json", b)
+ if err != nil {
- return nil, fmt.Errorf("json: could not parse JSON: %v", err)
- }
- return expr, nil
- }()
+ return nil, fmt.Errorf("json: could not parse JSON: %v", err)
+ }
+ return expr, nil
+ }()
+ }
},
}, {
Name: "Validate",
@@ -554,22 +606,24 @@
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
- c.ret, c.err = func() (interface{}, error) {
- if !json.Valid(b) {
- return false, fmt.Errorf("json: invalid JSON")
- }
- r := internal.GetRuntime(v).(*Runtime)
- inst, err := r.Compile("json.Validate", b)
- if err != nil {
- return false, err
- }
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if !json.Valid(b) {
+ return false, fmt.Errorf("json: invalid JSON")
+ }
+ r := internal.GetRuntime(v).(*Runtime)
+ inst, err := r.Compile("json.Validate", b)
+ if err != nil {
+ return false, err
+ }
- v = v.Unify(inst.Value())
- if v.Err() != nil {
- return false, v.Err()
- }
- return true, nil
- }()
+ v = v.Unify(inst.Value())
+ if v.Err() != nil {
+ return false, v.Err()
+ }
+ return true, nil
+ }()
+ }
},
}},
},
@@ -580,10 +634,12 @@
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- b, err := goyaml.Marshal(v)
- return string(b), err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ b, err := goyaml.Marshal(v)
+ return string(b), err
+ }()
+ }
},
}, {
Name: "MarshalStream",
@@ -591,25 +647,27 @@
Result: stringKind,
Func: func(c *callCtxt) {
v := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
- iter, err := v.List()
- if err != nil {
- return "", err
- }
- buf := &bytes.Buffer{}
- for i := 0; iter.Next(); i++ {
- if i > 0 {
- buf.WriteString("---\n")
- }
- b, err := goyaml.Marshal(iter.Value())
+ iter, err := v.List()
if err != nil {
return "", err
}
- buf.Write(b)
- }
- return buf.String(), nil
- }()
+ buf := &bytes.Buffer{}
+ for i := 0; iter.Next(); i++ {
+ if i > 0 {
+ buf.WriteString("---\n")
+ }
+ b, err := goyaml.Marshal(iter.Value())
+ if err != nil {
+ return "", err
+ }
+ buf.Write(b)
+ }
+ return buf.String(), nil
+ }()
+ }
},
}, {
Name: "Unmarshal",
@@ -617,9 +675,11 @@
Result: topKind,
Func: func(c *callCtxt) {
data := c.bytes(0)
- c.ret, c.err = func() (interface{}, error) {
- return yaml.Unmarshal("", data)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return yaml.Unmarshal("", data)
+ }()
+ }
},
}, {
Name: "Validate",
@@ -627,31 +687,33 @@
Result: boolKind,
Func: func(c *callCtxt) {
b, v := c.bytes(0), c.value(1)
- c.ret, c.err = func() (interface{}, error) {
- d, err := yaml.NewDecoder("yaml.Validate", b)
- if err != nil {
- return false, err
- }
- r := internal.GetRuntime(v).(*Runtime)
- for {
- expr, err := d.Decode()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ d, err := yaml.NewDecoder("yaml.Validate", b)
if err != nil {
- if err == io.EOF {
- return true, nil
+ return false, err
+ }
+ r := internal.GetRuntime(v).(*Runtime)
+ for {
+ expr, err := d.Decode()
+ if err != nil {
+ if err == io.EOF {
+ return true, nil
+ }
+ return false, err
}
- return false, err
- }
- inst, err := r.CompileExpr(expr)
- if err != nil {
- return false, err
- }
+ inst, err := r.CompileExpr(expr)
+ if err != nil {
+ return false, err
+ }
- if x := v.Unify(inst.Value()); x.Err() != nil {
- return false, x.Err()
+ if x := v.Unify(inst.Value()); x.Err() != nil {
+ return false, x.Err()
+ }
}
- }
- }()
+ }()
+ }
},
}},
},
@@ -662,9 +724,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return html.EscapeString(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return html.EscapeString(s)
+ }()
+ }
},
}, {
Name: "Unescape",
@@ -672,9 +736,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return html.UnescapeString(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return html.UnescapeString(s)
+ }()
+ }
},
}},
},
@@ -685,17 +751,19 @@
Result: listKind,
Func: func(c *callCtxt) {
x, n := c.list(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- if n < 0 {
- return nil, fmt.Errorf("negative index")
- }
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if n < 0 {
+ return nil, fmt.Errorf("negative index")
+ }
- if n > len(x) {
- return []Value{}, nil
- }
+ if n > len(x) {
+ return []Value{}, nil
+ }
- return x[n:], nil
- }()
+ return x[n:], nil
+ }()
+ }
},
}, {
Name: "FlattenN",
@@ -703,31 +771,33 @@
Result: listKind,
Func: func(c *callCtxt) {
xs, depth := c.value(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- var flattenN func(Value, int) ([]Value, error)
- flattenN = func(xs Value, depth int) ([]Value, error) {
- var res []Value
- iter, err := xs.List()
- if err != nil {
- return nil, err
- }
- for iter.Next() {
- val := iter.Value()
- if val.Kind() == ListKind && depth != 0 {
- d := depth - 1
- values, err := flattenN(val, d)
- if err != nil {
- return nil, err
- }
- res = append(res, values...)
- } else {
- res = append(res, val)
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var flattenN func(Value, int) ([]Value, error)
+ flattenN = func(xs Value, depth int) ([]Value, error) {
+ var res []Value
+ iter, err := xs.List()
+ if err != nil {
+ return nil, err
}
+ for iter.Next() {
+ val := iter.Value()
+ if val.Kind() == ListKind && depth != 0 {
+ d := depth - 1
+ values, err := flattenN(val, d)
+ if err != nil {
+ return nil, err
+ }
+ res = append(res, values...)
+ } else {
+ res = append(res, val)
+ }
+ }
+ return res, nil
}
- return res, nil
- }
- return flattenN(xs, depth)
- }()
+ return flattenN(xs, depth)
+ }()
+ }
},
}, {
Name: "Take",
@@ -735,17 +805,19 @@
Result: listKind,
Func: func(c *callCtxt) {
x, n := c.list(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- if n < 0 {
- return nil, fmt.Errorf("negative index")
- }
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if n < 0 {
+ return nil, fmt.Errorf("negative index")
+ }
- if n > len(x) {
- return x, nil
- }
+ if n > len(x) {
+ return x, nil
+ }
- return x[:n], nil
- }()
+ return x[:n], nil
+ }()
+ }
},
}, {
Name: "Slice",
@@ -753,25 +825,27 @@
Result: listKind,
Func: func(c *callCtxt) {
x, i, j := c.list(0), c.int(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- if i < 0 {
- return nil, fmt.Errorf("negative index")
- }
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if i < 0 {
+ return nil, fmt.Errorf("negative index")
+ }
- if i > j {
- return nil, fmt.Errorf("invalid index: %v > %v", i, j)
- }
+ if i > j {
+ return nil, fmt.Errorf("invalid index: %v > %v", i, j)
+ }
- if i > len(x) {
- return nil, fmt.Errorf("slice bounds out of range")
- }
+ if i > len(x) {
+ return nil, fmt.Errorf("slice bounds out of range")
+ }
- if j > len(x) {
- return nil, fmt.Errorf("slice bounds out of range")
- }
+ if j > len(x) {
+ return nil, fmt.Errorf("slice bounds out of range")
+ }
- return x[i:j], nil
- }()
+ return x[i:j], nil
+ }()
+ }
},
}, {
Name: "MinItems",
@@ -779,9 +853,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
a, n := c.list(0), c.int(1)
- c.ret = func() interface{} {
- return len(a) >= n
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return len(a) >= n
+ }()
+ }
},
}, {
Name: "MaxItems",
@@ -789,9 +865,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
a, n := c.list(0), c.int(1)
- c.ret = func() interface{} {
- return len(a) <= n
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return len(a) <= n
+ }()
+ }
},
}, {
Name: "UniqueItems",
@@ -799,19 +877,21 @@
Result: boolKind,
Func: func(c *callCtxt) {
a := c.list(0)
- c.ret = func() interface{} {
- b := []string{}
- for _, v := range a {
- b = append(b, fmt.Sprint(v))
- }
- sort.Strings(b)
- for i := 1; i < len(b); i++ {
- if b[i-1] == b[i] {
- return false
+ if c.do() {
+ c.ret = func() interface{} {
+ b := []string{}
+ for _, v := range a {
+ b = append(b, fmt.Sprint(v))
}
- }
- return true
- }()
+ sort.Strings(b)
+ for i := 1; i < len(b); i++ {
+ if b[i-1] == b[i] {
+ return false
+ }
+ }
+ return true
+ }()
+ }
},
}, {
Name: "Contains",
@@ -819,14 +899,16 @@
Result: boolKind,
Func: func(c *callCtxt) {
a, v := c.list(0), c.value(1)
- c.ret = func() interface{} {
- for _, w := range a {
- if v.Equals(w) {
- return true
+ if c.do() {
+ c.ret = func() interface{} {
+ for _, w := range a {
+ if v.Equals(w) {
+ return true
+ }
}
- }
- return false
- }()
+ return false
+ }()
+ }
},
}, {
Name: "Avg",
@@ -927,40 +1009,42 @@
Result: listKind,
Func: func(c *callCtxt) {
start, limit, step := c.decimal(0), c.decimal(1), c.decimal(2)
- c.ret, c.err = func() (interface{}, error) {
- if step.IsZero() {
- return nil, fmt.Errorf("step must be non zero")
- }
-
- if !step.Negative && +1 == start.Cmp(limit) {
- return nil, fmt.Errorf("end must be greater than start when step is positive")
- }
-
- if step.Negative && -1 == start.Cmp(limit) {
- return nil, fmt.Errorf("end must be less than start when step is negative")
- }
-
- var vals []*internal.Decimal
- num := start
- for {
- if !step.Negative && -1 != num.Cmp(limit) {
- break
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if step.IsZero() {
+ return nil, fmt.Errorf("step must be non zero")
}
- if step.Negative && +1 != num.Cmp(limit) {
- break
+ if !step.Negative && +1 == start.Cmp(limit) {
+ return nil, fmt.Errorf("end must be greater than start when step is positive")
}
- vals = append(vals, num)
- d := apd.New(0, 0)
- _, err := internal.BaseContext.Add(d, step, num)
- if err != nil {
- return nil, err
+ if step.Negative && -1 == start.Cmp(limit) {
+ return nil, fmt.Errorf("end must be less than start when step is negative")
}
- num = d
- }
- return vals, nil
- }()
+
+ var vals []*internal.Decimal
+ num := start
+ for {
+ if !step.Negative && -1 != num.Cmp(limit) {
+ break
+ }
+
+ if step.Negative && +1 != num.Cmp(limit) {
+ break
+ }
+
+ vals = append(vals, num)
+ d := apd.New(0, 0)
+ _, err := internal.BaseContext.Add(d, step, num)
+ if err != nil {
+ return nil, err
+ }
+ num = d
+ }
+ return vals, nil
+ }()
+ }
},
}, {
Name: "Sum",
@@ -1026,9 +1110,11 @@
Result: intKind,
Func: func(c *callCtxt) {
x, y := c.bigInt(0), c.bigInt(1)
- c.ret = func() interface{} {
- return big.Jacobi(x, y)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return big.Jacobi(x, y)
+ }()
+ }
},
}, {
Name: "MaxBase",
@@ -1039,11 +1125,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Floor(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Floor(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Ceil",
@@ -1051,11 +1139,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Ceil(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Ceil(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Trunc",
@@ -1063,11 +1153,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := roundTruncContext.RoundToIntegralExact(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := roundTruncContext.RoundToIntegralExact(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Round",
@@ -1075,11 +1167,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := roundUpContext.RoundToIntegralExact(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := roundUpContext.RoundToIntegralExact(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "RoundToEven",
@@ -1087,11 +1181,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := roundEvenContext.RoundToIntegralExact(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := roundEvenContext.RoundToIntegralExact(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "MultipleOf",
@@ -1099,11 +1195,13 @@
Result: boolKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
- c.ret, c.err = func() (interface{}, error) {
- var d apd.Decimal
- cond, err := mulContext.Quo(&d, x, y)
- return !cond.Inexact(), err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d apd.Decimal
+ cond, err := mulContext.Quo(&d, x, y)
+ return !cond.Inexact(), err
+ }()
+ }
},
}, {
Name: "Abs",
@@ -1111,11 +1209,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Abs(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Abs(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Acosh",
@@ -1123,9 +1223,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Acosh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Acosh(x)
+ }()
+ }
},
}, {
Name: "Asin",
@@ -1133,9 +1235,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Asin(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Asin(x)
+ }()
+ }
},
}, {
Name: "Acos",
@@ -1143,9 +1247,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Acos(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Acos(x)
+ }()
+ }
},
}, {
Name: "Asinh",
@@ -1153,9 +1259,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Asinh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Asinh(x)
+ }()
+ }
},
}, {
Name: "Atan",
@@ -1163,9 +1271,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Atan(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Atan(x)
+ }()
+ }
},
}, {
Name: "Atan2",
@@ -1173,9 +1283,11 @@
Result: numKind,
Func: func(c *callCtxt) {
y, x := c.float64(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Atan2(y, x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Atan2(y, x)
+ }()
+ }
},
}, {
Name: "Atanh",
@@ -1183,9 +1295,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Atanh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Atanh(x)
+ }()
+ }
},
}, {
Name: "Cbrt",
@@ -1193,11 +1307,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Cbrt(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Cbrt(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "E",
@@ -1238,12 +1354,14 @@
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
- c.ret = func() interface{} {
- var d internal.Decimal
- d.Set(x)
- d.Negative = y.Negative
- return &d
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var d internal.Decimal
+ d.Set(x)
+ d.Negative = y.Negative
+ return &d
+ }()
+ }
},
}, {
Name: "Dim",
@@ -1251,17 +1369,19 @@
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Sub(&d, x, y)
- if err != nil {
- return nil, err
- }
- if d.Negative {
- return zero, nil
- }
- return &d, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Sub(&d, x, y)
+ if err != nil {
+ return nil, err
+ }
+ if d.Negative {
+ return zero, nil
+ }
+ return &d, nil
+ }()
+ }
},
}, {
Name: "Erf",
@@ -1269,9 +1389,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Erf(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Erf(x)
+ }()
+ }
},
}, {
Name: "Erfc",
@@ -1279,9 +1401,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Erfc(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Erfc(x)
+ }()
+ }
},
}, {
Name: "Erfinv",
@@ -1289,9 +1413,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Erfinv(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Erfinv(x)
+ }()
+ }
},
}, {
Name: "Erfcinv",
@@ -1299,9 +1425,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Erfcinv(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Erfcinv(x)
+ }()
+ }
},
}, {
Name: "Exp",
@@ -1309,11 +1437,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Exp(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Exp(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Exp2",
@@ -1321,11 +1451,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Pow(&d, two, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Pow(&d, two, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Expm1",
@@ -1333,9 +1465,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Expm1(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Expm1(x)
+ }()
+ }
},
}, {
Name: "Gamma",
@@ -1343,9 +1477,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Gamma(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Gamma(x)
+ }()
+ }
},
}, {
Name: "Hypot",
@@ -1353,9 +1489,11 @@
Result: numKind,
Func: func(c *callCtxt) {
p, q := c.float64(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Hypot(p, q)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Hypot(p, q)
+ }()
+ }
},
}, {
Name: "J0",
@@ -1363,9 +1501,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.J0(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.J0(x)
+ }()
+ }
},
}, {
Name: "Y0",
@@ -1373,9 +1513,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Y0(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Y0(x)
+ }()
+ }
},
}, {
Name: "J1",
@@ -1383,9 +1525,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.J1(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.J1(x)
+ }()
+ }
},
}, {
Name: "Y1",
@@ -1393,9 +1537,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Y1(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Y1(x)
+ }()
+ }
},
}, {
Name: "Jn",
@@ -1403,9 +1549,11 @@
Result: numKind,
Func: func(c *callCtxt) {
n, x := c.int(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Jn(n, x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Jn(n, x)
+ }()
+ }
},
}, {
Name: "Yn",
@@ -1413,9 +1561,11 @@
Result: numKind,
Func: func(c *callCtxt) {
n, x := c.int(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Yn(n, x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Yn(n, x)
+ }()
+ }
},
}, {
Name: "Ldexp",
@@ -1423,9 +1573,11 @@
Result: numKind,
Func: func(c *callCtxt) {
frac, exp := c.float64(0), c.int(1)
- c.ret = func() interface{} {
- return math.Ldexp(frac, exp)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Ldexp(frac, exp)
+ }()
+ }
},
}, {
Name: "Log",
@@ -1433,11 +1585,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Ln(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Ln(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Log10",
@@ -1445,11 +1599,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Log10(&d, x)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Log10(&d, x)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Log2",
@@ -1457,16 +1613,18 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret, c.err = func() (interface{}, error) {
- var d, ln2 internal.Decimal
- _, _ = apdContext.Ln(&ln2, two)
- _, err := apdContext.Ln(&d, x)
- if err != nil {
- return &d, err
- }
- _, err = apdContext.Quo(&d, &d, &ln2)
- return &d, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d, ln2 internal.Decimal
+ _, _ = apdContext.Ln(&ln2, two)
+ _, err := apdContext.Ln(&d, x)
+ if err != nil {
+ return &d, err
+ }
+ _, err = apdContext.Quo(&d, &d, &ln2)
+ return &d, nil
+ }()
+ }
},
}, {
Name: "Log1p",
@@ -1474,9 +1632,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Log1p(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Log1p(x)
+ }()
+ }
},
}, {
Name: "Logb",
@@ -1484,9 +1644,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Logb(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Logb(x)
+ }()
+ }
},
}, {
Name: "Ilogb",
@@ -1494,9 +1656,11 @@
Result: intKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Ilogb(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Ilogb(x)
+ }()
+ }
},
}, {
Name: "Mod",
@@ -1504,9 +1668,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.float64(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Mod(x, y)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Mod(x, y)
+ }()
+ }
},
}, {
Name: "Pow",
@@ -1514,11 +1680,13 @@
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.decimal(0), c.decimal(1)
- c.ret, c.err = func() (interface{}, error) {
- var d internal.Decimal
- _, err := apdContext.Pow(&d, x, y)
- return &d, err
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var d internal.Decimal
+ _, err := apdContext.Pow(&d, x, y)
+ return &d, err
+ }()
+ }
},
}, {
Name: "Pow10",
@@ -1526,9 +1694,11 @@
Result: numKind,
Func: func(c *callCtxt) {
n := c.int32(0)
- c.ret = func() interface{} {
- return apd.New(1, n)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return apd.New(1, n)
+ }()
+ }
},
}, {
Name: "Remainder",
@@ -1536,9 +1706,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x, y := c.float64(0), c.float64(1)
- c.ret = func() interface{} {
- return math.Remainder(x, y)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Remainder(x, y)
+ }()
+ }
},
}, {
Name: "Signbit",
@@ -1546,9 +1718,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
x := c.decimal(0)
- c.ret = func() interface{} {
- return x.Negative
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return x.Negative
+ }()
+ }
},
}, {
Name: "Cos",
@@ -1556,9 +1730,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Cos(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Cos(x)
+ }()
+ }
},
}, {
Name: "Sin",
@@ -1566,9 +1742,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Sin(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Sin(x)
+ }()
+ }
},
}, {
Name: "Sinh",
@@ -1576,9 +1754,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Sinh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Sinh(x)
+ }()
+ }
},
}, {
Name: "Cosh",
@@ -1586,9 +1766,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Cosh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Cosh(x)
+ }()
+ }
},
}, {
Name: "Sqrt",
@@ -1596,9 +1778,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Sqrt(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Sqrt(x)
+ }()
+ }
},
}, {
Name: "Tan",
@@ -1606,9 +1790,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Tan(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Tan(x)
+ }()
+ }
},
}, {
Name: "Tanh",
@@ -1616,9 +1802,11 @@
Result: numKind,
Func: func(c *callCtxt) {
x := c.float64(0)
- c.ret = func() interface{} {
- return math.Tanh(x)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return math.Tanh(x)
+ }()
+ }
},
}},
},
@@ -1629,11 +1817,13 @@
Result: intKind,
Func: func(c *callCtxt) {
x, n := c.bigInt(0), c.uint(1)
- c.ret = func() interface{} {
- var z big.Int
- z.Lsh(x, n)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.Lsh(x, n)
+ return &z
+ }()
+ }
},
}, {
Name: "Rsh",
@@ -1641,11 +1831,13 @@
Result: intKind,
Func: func(c *callCtxt) {
x, n := c.bigInt(0), c.uint(1)
- c.ret = func() interface{} {
- var z big.Int
- z.Rsh(x, n)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.Rsh(x, n)
+ return &z
+ }()
+ }
},
}, {
Name: "At",
@@ -1653,12 +1845,14 @@
Result: intKind,
Func: func(c *callCtxt) {
x, i := c.bigInt(0), c.uint(1)
- c.ret, c.err = func() (interface{}, error) {
- if i > 1<<62 {
- return 0, fmt.Errorf("bit index too large")
- }
- return x.Bit(int(i)), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if i > 1<<62 {
+ return 0, fmt.Errorf("bit index too large")
+ }
+ return x.Bit(int(i)), nil
+ }()
+ }
},
}, {
Name: "Set",
@@ -1666,11 +1860,13 @@
Result: intKind,
Func: func(c *callCtxt) {
x, i, bit := c.bigInt(0), c.int(1), c.uint(2)
- c.ret = func() interface{} {
- var z big.Int
- z.SetBit(x, i, bit)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.SetBit(x, i, bit)
+ return &z
+ }()
+ }
},
}, {
Name: "And",
@@ -1678,11 +1874,13 @@
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
- c.ret = func() interface{} {
- var z big.Int
- z.And(a, b)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.And(a, b)
+ return &z
+ }()
+ }
},
}, {
Name: "Or",
@@ -1690,11 +1888,13 @@
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
- c.ret = func() interface{} {
- var z big.Int
- z.Or(a, b)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.Or(a, b)
+ return &z
+ }()
+ }
},
}, {
Name: "Xor",
@@ -1702,11 +1902,13 @@
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
- c.ret = func() interface{} {
- var z big.Int
- z.Xor(a, b)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.Xor(a, b)
+ return &z
+ }()
+ }
},
}, {
Name: "Clear",
@@ -1714,11 +1916,13 @@
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.bigInt(0), c.bigInt(1)
- c.ret = func() interface{} {
- var z big.Int
- z.AndNot(a, b)
- return &z
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var z big.Int
+ z.AndNot(a, b)
+ return &z
+ }()
+ }
},
}, {
Name: "OnesCount",
@@ -1726,13 +1930,15 @@
Result: intKind,
Func: func(c *callCtxt) {
x := c.bigInt(0)
- c.ret = func() interface{} {
- var count int
- for _, w := range x.Bits() {
- count += bits.OnesCount64(uint64(w))
- }
- return count
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ var count int
+ for _, w := range x.Bits() {
+ count += bits.OnesCount64(uint64(w))
+ }
+ return count
+ }()
+ }
},
}, {
Name: "Len",
@@ -1740,9 +1946,11 @@
Result: intKind,
Func: func(c *callCtxt) {
x := c.bigInt(0)
- c.ret = func() interface{} {
- return x.BitLen()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return x.BitLen()
+ }()
+ }
},
}},
},
@@ -1753,13 +1961,15 @@
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- host, port, err := net.SplitHostPort(s)
- if err != nil {
- return nil, err
- }
- return []string{host, port}, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ host, port, err := net.SplitHostPort(s)
+ if err != nil {
+ return nil, err
+ }
+ return []string{host, port}, nil
+ }()
+ }
},
}, {
Name: "JoinHostPort",
@@ -1767,46 +1977,48 @@
Result: stringKind,
Func: func(c *callCtxt) {
host, port := c.value(0), c.value(1)
- c.ret, c.err = func() (interface{}, error) {
- var err error
- hostStr := ""
- switch host.Kind() {
- case ListKind:
- ipdata := netGetIP(host)
- if len(ipdata) != 4 && len(ipdata) != 16 {
- err = fmt.Errorf("invalid host %q", host)
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ var err error
+ hostStr := ""
+ switch host.Kind() {
+ case ListKind:
+ ipdata := netGetIP(host)
+ if len(ipdata) != 4 && len(ipdata) != 16 {
+ err = fmt.Errorf("invalid host %q", host)
+ }
+ hostStr = ipdata.String()
+ case BytesKind:
+ var b []byte
+ b, err = host.Bytes()
+ hostStr = string(b)
+ default:
+ hostStr, err = host.String()
}
- hostStr = ipdata.String()
- case BytesKind:
- var b []byte
- b, err = host.Bytes()
- hostStr = string(b)
- default:
- hostStr, err = host.String()
- }
- if err != nil {
- return "", err
- }
+ if err != nil {
+ return "", err
+ }
- portStr := ""
- switch port.Kind() {
- case StringKind:
- portStr, err = port.String()
- case BytesKind:
- var b []byte
- b, err = port.Bytes()
- portStr = string(b)
- default:
- var i int64
- i, err = port.Int64()
- portStr = strconv.Itoa(int(i))
- }
- if err != nil {
- return "", err
- }
+ portStr := ""
+ switch port.Kind() {
+ case StringKind:
+ portStr, err = port.String()
+ case BytesKind:
+ var b []byte
+ b, err = port.Bytes()
+ portStr = string(b)
+ default:
+ var i int64
+ i, err = port.Int64()
+ portStr = strconv.Itoa(int(i))
+ }
+ if err != nil {
+ return "", err
+ }
- return net.JoinHostPort(hostStr, portStr), nil
- }()
+ return net.JoinHostPort(hostStr, portStr), nil
+ }()
+ }
},
}, {
Name: "FQDN",
@@ -1814,15 +2026,17 @@
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- for i := 0; i < len(s); i++ {
- if s[i] >= utf8.RuneSelf {
- return false
+ if c.do() {
+ c.ret = func() interface{} {
+ for i := 0; i < len(s); i++ {
+ if s[i] >= utf8.RuneSelf {
+ return false
+ }
}
- }
- _, err := idnaProfile.ToASCII(s)
- return err == nil
- }()
+ _, err := idnaProfile.ToASCII(s)
+ return err == nil
+ }()
+ }
},
}, {
Name: "IPv4len",
@@ -1836,13 +2050,15 @@
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- goip := net.ParseIP(s)
- if goip == nil {
- return nil, fmt.Errorf("invalid IP address %q", s)
- }
- return netToList(goip), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ goip := net.ParseIP(s)
+ if goip == nil {
+ return nil, fmt.Errorf("invalid IP address %q", s)
+ }
+ return netToList(goip), nil
+ }()
+ }
},
}, {
Name: "IPv4",
@@ -1850,10 +2066,12 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- return netGetIP(ip).To4() != nil
- }()
+ return netGetIP(ip).To4() != nil
+ }()
+ }
},
}, {
Name: "IP",
@@ -1861,10 +2079,12 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- return netGetIP(ip) != nil
- }()
+ return netGetIP(ip) != nil
+ }()
+ }
},
}, {
Name: "LoopbackIP",
@@ -1872,9 +2092,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsLoopback()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsLoopback()
+ }()
+ }
},
}, {
Name: "MulticastIP",
@@ -1882,9 +2104,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsMulticast()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsMulticast()
+ }()
+ }
},
}, {
Name: "InterfaceLocalMulticastIP",
@@ -1892,9 +2116,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsInterfaceLocalMulticast()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsInterfaceLocalMulticast()
+ }()
+ }
},
}, {
Name: "LinkLocalMulticastIP",
@@ -1902,9 +2128,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsLinkLocalMulticast()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsLinkLocalMulticast()
+ }()
+ }
},
}, {
Name: "LinkLocalUnicastIP",
@@ -1912,9 +2140,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsLinkLocalUnicast()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsLinkLocalUnicast()
+ }()
+ }
},
}, {
Name: "GlobalUnicastIP",
@@ -1922,9 +2152,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsGlobalUnicast()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsGlobalUnicast()
+ }()
+ }
},
}, {
Name: "UnspecifiedIP",
@@ -1932,9 +2164,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret = func() interface{} {
- return netGetIP(ip).IsUnspecified()
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return netGetIP(ip).IsUnspecified()
+ }()
+ }
},
}, {
Name: "ToIP4",
@@ -1942,17 +2176,19 @@
Result: listKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- ipdata := netGetIP(ip)
- if ipdata == nil {
- return nil, fmt.Errorf("invalid IP %q", ip)
- }
- ipv4 := ipdata.To4()
- if ipv4 == nil {
- return nil, fmt.Errorf("cannot convert %q to IPv4", ipdata)
- }
- return netToList(ipv4), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ ipdata := netGetIP(ip)
+ if ipdata == nil {
+ return nil, fmt.Errorf("invalid IP %q", ip)
+ }
+ ipv4 := ipdata.To4()
+ if ipv4 == nil {
+ return nil, fmt.Errorf("cannot convert %q to IPv4", ipdata)
+ }
+ return netToList(ipv4), nil
+ }()
+ }
},
}, {
Name: "ToIP16",
@@ -1960,13 +2196,15 @@
Result: listKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- ipdata := netGetIP(ip)
- if ipdata == nil {
- return nil, fmt.Errorf("invalid IP %q", ip)
- }
- return netToList(ipdata), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ ipdata := netGetIP(ip)
+ if ipdata == nil {
+ return nil, fmt.Errorf("invalid IP %q", ip)
+ }
+ return netToList(ipdata), nil
+ }()
+ }
},
}, {
Name: "IPString",
@@ -1974,13 +2212,15 @@
Result: stringKind,
Func: func(c *callCtxt) {
ip := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- ipdata := netGetIP(ip)
- if ipdata == nil {
- return "", fmt.Errorf("invalid IP %q", ip)
- }
- return ipdata.String(), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ ipdata := netGetIP(ip)
+ if ipdata == nil {
+ return "", fmt.Errorf("invalid IP %q", ip)
+ }
+ return ipdata.String(), nil
+ }()
+ }
},
}},
},
@@ -1991,10 +2231,12 @@
Result: listKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- file, dir := split(path)
- return []string{file, dir}
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ file, dir := split(path)
+ return []string{file, dir}
+ }()
+ }
},
}, {
Name: "Match",
@@ -2002,9 +2244,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
pattern, name := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- return path.Match(pattern, name)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return path.Match(pattern, name)
+ }()
+ }
},
}, {
Name: "Clean",
@@ -2012,9 +2256,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- return pathClean(path)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return pathClean(path)
+ }()
+ }
},
}, {
Name: "Ext",
@@ -2022,9 +2268,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- return pathExt(path)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return pathExt(path)
+ }()
+ }
},
}, {
Name: "Base",
@@ -2032,9 +2280,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- return pathBase(path)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return pathBase(path)
+ }()
+ }
},
}, {
Name: "IsAbs",
@@ -2042,9 +2292,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- return pathIsAbs(path)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return pathIsAbs(path)
+ }()
+ }
},
}, {
Name: "Dir",
@@ -2052,9 +2304,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
path := c.string(0)
- c.ret = func() interface{} {
- return pathDir(path)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return pathDir(path)
+ }()
+ }
},
}},
},
@@ -2065,17 +2319,19 @@
Result: stringKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return "", err
- }
- m := re.FindStringIndex(s)
- if m == nil {
- return "", errNoMatch
- }
- return s[m[0]:m[1]], nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return "", err
+ }
+ m := re.FindStringIndex(s)
+ if m == nil {
+ return "", errNoMatch
+ }
+ return s[m[0]:m[1]], nil
+ }()
+ }
},
}, {
Name: "FindAll",
@@ -2083,17 +2339,19 @@
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
- m := re.FindAllString(s, n)
- if m == nil {
- return nil, errNoMatch
- }
- return m, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
+ }
+ m := re.FindAllString(s, n)
+ if m == nil {
+ return nil, errNoMatch
+ }
+ return m, nil
+ }()
+ }
},
}, {
Name: "FindSubmatch",
@@ -2101,17 +2359,19 @@
Result: listKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
- m := re.FindStringSubmatch(s)
- if m == nil {
- return nil, errNoMatch
- }
- return m, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
+ }
+ m := re.FindStringSubmatch(s)
+ if m == nil {
+ return nil, errNoMatch
+ }
+ return m, nil
+ }()
+ }
},
}, {
Name: "FindAllSubmatch",
@@ -2119,17 +2379,19 @@
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
- m := re.FindAllStringSubmatch(s, n)
- if m == nil {
- return nil, errNoMatch
- }
- return m, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
+ }
+ m := re.FindAllStringSubmatch(s, n)
+ if m == nil {
+ return nil, errNoMatch
+ }
+ return m, nil
+ }()
+ }
},
}, {
Name: "FindNamedSubmatch",
@@ -2137,27 +2399,29 @@
Result: structKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
- names := re.SubexpNames()
- if len(names) == 0 {
- return nil, errNoNamedGroup
- }
- m := re.FindStringSubmatch(s)
- if m == nil {
- return nil, errNoMatch
- }
- r := make(map[string]string, len(names)-1)
- for k, name := range names {
- if name != "" {
- r[name] = m[k]
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
}
- }
- return r, nil
- }()
+ names := re.SubexpNames()
+ if len(names) == 0 {
+ return nil, errNoNamedGroup
+ }
+ m := re.FindStringSubmatch(s)
+ if m == nil {
+ return nil, errNoMatch
+ }
+ r := make(map[string]string, len(names)-1)
+ for k, name := range names {
+ if name != "" {
+ r[name] = m[k]
+ }
+ }
+ return r, nil
+ }()
+ }
},
}, {
Name: "FindAllNamedSubmatch",
@@ -2165,31 +2429,33 @@
Result: listKind,
Func: func(c *callCtxt) {
pattern, s, n := c.string(0), c.string(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
- names := re.SubexpNames()
- if len(names) == 0 {
- return nil, errNoNamedGroup
- }
- m := re.FindAllStringSubmatch(s, n)
- if m == nil {
- return nil, errNoMatch
- }
- result := make([]map[string]string, len(m))
- for i, m := range m {
- r := make(map[string]string, len(names)-1)
- for k, name := range names {
- if name != "" {
- r[name] = m[k]
- }
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
}
- result[i] = r
- }
- return result, nil
- }()
+ names := re.SubexpNames()
+ if len(names) == 0 {
+ return nil, errNoNamedGroup
+ }
+ m := re.FindAllStringSubmatch(s, n)
+ if m == nil {
+ return nil, errNoMatch
+ }
+ result := make([]map[string]string, len(m))
+ for i, m := range m {
+ r := make(map[string]string, len(names)-1)
+ for k, name := range names {
+ if name != "" {
+ r[name] = m[k]
+ }
+ }
+ result[i] = r
+ }
+ return result, nil
+ }()
+ }
},
}, {
Name: "Match",
@@ -2197,9 +2463,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
pattern, s := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- return regexp.MatchString(pattern, s)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return regexp.MatchString(pattern, s)
+ }()
+ }
},
}, {
Name: "QuoteMeta",
@@ -2207,9 +2475,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return regexp.QuoteMeta(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return regexp.QuoteMeta(s)
+ }()
+ }
},
}},
},
@@ -2220,9 +2490,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- return literal.Unquote(s)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return literal.Unquote(s)
+ }()
+ }
},
}, {
Name: "ParseBool",
@@ -2230,9 +2502,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
str := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- return strconv.ParseBool(str)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return strconv.ParseBool(str)
+ }()
+ }
},
}, {
Name: "FormatBool",
@@ -2240,9 +2514,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
b := c.bool(0)
- c.ret = func() interface{} {
- return strconv.FormatBool(b)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.FormatBool(b)
+ }()
+ }
},
}, {
Name: "ParseFloat",
@@ -2250,9 +2526,11 @@
Result: numKind,
Func: func(c *callCtxt) {
s, bitSize := c.string(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- return strconv.ParseFloat(s, bitSize)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return strconv.ParseFloat(s, bitSize)
+ }()
+ }
},
}, {
Name: "IntSize",
@@ -2263,9 +2541,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, base, bitSize := c.string(0), c.int(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- return strconv.ParseUint(s, base, bitSize)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return strconv.ParseUint(s, base, bitSize)
+ }()
+ }
},
}, {
Name: "ParseInt",
@@ -2273,9 +2553,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, base, bitSize := c.string(0), c.int(1), c.int(2)
- c.ret, c.err = func() (interface{}, error) {
- return strconv.ParseInt(s, base, bitSize)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return strconv.ParseInt(s, base, bitSize)
+ }()
+ }
},
}, {
Name: "Atoi",
@@ -2283,9 +2565,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- return strconv.Atoi(s)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return strconv.Atoi(s)
+ }()
+ }
},
}, {
Name: "FormatFloat",
@@ -2293,9 +2577,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
f, fmt, prec, bitSize := c.float64(0), c.byte(1), c.int(2), c.int(3)
- c.ret = func() interface{} {
- return strconv.FormatFloat(f, fmt, prec, bitSize)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.FormatFloat(f, fmt, prec, bitSize)
+ }()
+ }
},
}, {
Name: "FormatUint",
@@ -2303,9 +2589,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
i, base := c.uint64(0), c.int(1)
- c.ret = func() interface{} {
- return strconv.FormatUint(i, base)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.FormatUint(i, base)
+ }()
+ }
},
}, {
Name: "FormatInt",
@@ -2313,9 +2601,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
i, base := c.int64(0), c.int(1)
- c.ret = func() interface{} {
- return strconv.FormatInt(i, base)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.FormatInt(i, base)
+ }()
+ }
},
}, {
Name: "Quote",
@@ -2323,9 +2613,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strconv.Quote(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.Quote(s)
+ }()
+ }
},
}, {
Name: "QuoteToASCII",
@@ -2333,9 +2625,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strconv.QuoteToASCII(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.QuoteToASCII(s)
+ }()
+ }
},
}, {
Name: "QuoteToGraphic",
@@ -2343,9 +2637,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strconv.QuoteToGraphic(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.QuoteToGraphic(s)
+ }()
+ }
},
}, {
Name: "QuoteRune",
@@ -2353,9 +2649,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
- c.ret = func() interface{} {
- return strconv.QuoteRune(r)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.QuoteRune(r)
+ }()
+ }
},
}, {
Name: "QuoteRuneToASCII",
@@ -2363,9 +2661,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
- c.ret = func() interface{} {
- return strconv.QuoteRuneToASCII(r)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.QuoteRuneToASCII(r)
+ }()
+ }
},
}, {
Name: "QuoteRuneToGraphic",
@@ -2373,9 +2673,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
r := c.rune(0)
- c.ret = func() interface{} {
- return strconv.QuoteRuneToGraphic(r)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.QuoteRuneToGraphic(r)
+ }()
+ }
},
}, {
Name: "IsPrint",
@@ -2383,9 +2685,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
r := c.rune(0)
- c.ret = func() interface{} {
- return strconv.IsPrint(r)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.IsPrint(r)
+ }()
+ }
},
}, {
Name: "IsGraphic",
@@ -2393,9 +2697,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
r := c.rune(0)
- c.ret = func() interface{} {
- return strconv.IsGraphic(r)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strconv.IsGraphic(r)
+ }()
+ }
},
}},
},
@@ -2406,12 +2712,14 @@
Result: intKind,
Func: func(c *callCtxt) {
b, i := c.bytes(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- if i < 0 || i >= len(b) {
- return 0, fmt.Errorf("index out of range")
- }
- return b[i], nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if i < 0 || i >= len(b) {
+ return 0, fmt.Errorf("index out of range")
+ }
+ return b[i], nil
+ }()
+ }
},
}, {
Name: "ByteSlice",
@@ -2419,12 +2727,14 @@
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) {
- if start < 0 || start > end || end > len(b) {
- return nil, fmt.Errorf("index out of range")
- }
- return b[start:end], nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if start < 0 || start > end || end > len(b) {
+ return nil, fmt.Errorf("index out of range")
+ }
+ return b[start:end], nil
+ }()
+ }
},
}, {
Name: "Runes",
@@ -2432,9 +2742,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return []rune(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return []rune(s)
+ }()
+ }
},
}, {
Name: "MinRunes",
@@ -2442,10 +2754,12 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, min := c.string(0), c.int(1)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- return len([]rune(s)) >= min
- }()
+ return len([]rune(s)) >= min
+ }()
+ }
},
}, {
Name: "MaxRunes",
@@ -2453,10 +2767,12 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, max := c.string(0), c.int(1)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- return len([]rune(s)) <= max
- }()
+ return len([]rune(s)) <= max
+ }()
+ }
},
}, {
Name: "ToTitle",
@@ -2464,20 +2780,22 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- prev := ' '
- return strings.Map(
- func(r rune) rune {
- if unicode.IsSpace(prev) {
+ prev := ' '
+ return strings.Map(
+ func(r rune) rune {
+ if unicode.IsSpace(prev) {
+ prev = r
+ return unicode.ToTitle(r)
+ }
prev = r
- return unicode.ToTitle(r)
- }
- prev = r
- return r
- },
- s)
- }()
+ return r
+ },
+ s)
+ }()
+ }
},
}, {
Name: "ToCamel",
@@ -2485,20 +2803,22 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
+ if c.do() {
+ c.ret = func() interface{} {
- prev := ' '
- return strings.Map(
- func(r rune) rune {
- if unicode.IsSpace(prev) {
+ prev := ' '
+ return strings.Map(
+ func(r rune) rune {
+ if unicode.IsSpace(prev) {
+ prev = r
+ return unicode.ToLower(r)
+ }
prev = r
- return unicode.ToLower(r)
- }
- prev = r
- return r
- },
- s)
- }()
+ return r
+ },
+ s)
+ }()
+ }
},
}, {
Name: "Compare",
@@ -2506,9 +2826,11 @@
Result: intKind,
Func: func(c *callCtxt) {
a, b := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Compare(a, b)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Compare(a, b)
+ }()
+ }
},
}, {
Name: "Count",
@@ -2516,9 +2838,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Count(s, substr)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Count(s, substr)
+ }()
+ }
},
}, {
Name: "Contains",
@@ -2526,9 +2850,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Contains(s, substr)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Contains(s, substr)
+ }()
+ }
},
}, {
Name: "ContainsAny",
@@ -2536,9 +2862,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.ContainsAny(s, chars)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.ContainsAny(s, chars)
+ }()
+ }
},
}, {
Name: "LastIndex",
@@ -2546,9 +2874,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.LastIndex(s, substr)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.LastIndex(s, substr)
+ }()
+ }
},
}, {
Name: "IndexAny",
@@ -2556,9 +2886,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.IndexAny(s, chars)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.IndexAny(s, chars)
+ }()
+ }
},
}, {
Name: "LastIndexAny",
@@ -2566,9 +2898,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, chars := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.LastIndexAny(s, chars)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.LastIndexAny(s, chars)
+ }()
+ }
},
}, {
Name: "SplitN",
@@ -2576,9 +2910,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s, sep, n := c.string(0), c.string(1), c.int(2)
- c.ret = func() interface{} {
- return strings.SplitN(s, sep, n)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.SplitN(s, sep, n)
+ }()
+ }
},
}, {
Name: "SplitAfterN",
@@ -2586,9 +2922,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s, sep, n := c.string(0), c.string(1), c.int(2)
- c.ret = func() interface{} {
- return strings.SplitAfterN(s, sep, n)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.SplitAfterN(s, sep, n)
+ }()
+ }
},
}, {
Name: "Split",
@@ -2596,9 +2934,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s, sep := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Split(s, sep)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Split(s, sep)
+ }()
+ }
},
}, {
Name: "SplitAfter",
@@ -2606,9 +2946,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s, sep := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.SplitAfter(s, sep)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.SplitAfter(s, sep)
+ }()
+ }
},
}, {
Name: "Fields",
@@ -2616,9 +2958,11 @@
Result: listKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strings.Fields(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Fields(s)
+ }()
+ }
},
}, {
Name: "Join",
@@ -2638,9 +2982,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, prefix := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.HasPrefix(s, prefix)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.HasPrefix(s, prefix)
+ }()
+ }
},
}, {
Name: "HasSuffix",
@@ -2648,9 +2994,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
s, suffix := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.HasSuffix(s, suffix)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.HasSuffix(s, suffix)
+ }()
+ }
},
}, {
Name: "Repeat",
@@ -2658,9 +3006,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, count := c.string(0), c.int(1)
- c.ret = func() interface{} {
- return strings.Repeat(s, count)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Repeat(s, count)
+ }()
+ }
},
}, {
Name: "ToUpper",
@@ -2668,9 +3018,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strings.ToUpper(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.ToUpper(s)
+ }()
+ }
},
}, {
Name: "ToLower",
@@ -2678,9 +3030,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strings.ToLower(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.ToLower(s)
+ }()
+ }
},
}, {
Name: "Trim",
@@ -2688,9 +3042,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Trim(s, cutset)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Trim(s, cutset)
+ }()
+ }
},
}, {
Name: "TrimLeft",
@@ -2698,9 +3054,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.TrimLeft(s, cutset)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.TrimLeft(s, cutset)
+ }()
+ }
},
}, {
Name: "TrimRight",
@@ -2708,9 +3066,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, cutset := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.TrimRight(s, cutset)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.TrimRight(s, cutset)
+ }()
+ }
},
}, {
Name: "TrimSpace",
@@ -2718,9 +3078,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return strings.TrimSpace(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.TrimSpace(s)
+ }()
+ }
},
}, {
Name: "TrimPrefix",
@@ -2728,9 +3090,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, prefix := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.TrimPrefix(s, prefix)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.TrimPrefix(s, prefix)
+ }()
+ }
},
}, {
Name: "TrimSuffix",
@@ -2738,9 +3102,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, suffix := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.TrimSuffix(s, suffix)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.TrimSuffix(s, suffix)
+ }()
+ }
},
}, {
Name: "Replace",
@@ -2748,9 +3114,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s, old, new, n := c.string(0), c.string(1), c.string(2), c.int(3)
- c.ret = func() interface{} {
- return strings.Replace(s, old, new, n)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Replace(s, old, new, n)
+ }()
+ }
},
}, {
Name: "Index",
@@ -2758,9 +3126,11 @@
Result: intKind,
Func: func(c *callCtxt) {
s, substr := c.string(0), c.string(1)
- c.ret = func() interface{} {
- return strings.Index(s, substr)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return strings.Index(s, substr)
+ }()
+ }
},
}},
},
@@ -2771,14 +3141,16 @@
Result: boolKind,
Func: func(c *callCtxt) {
object, n := c.structVal(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- iter := object.Fields(Hidden(false), Optional(false))
- count := 0
- for iter.Next() {
- count++
- }
- return count >= n, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ iter := object.Fields(Hidden(false), Optional(false))
+ count := 0
+ for iter.Next() {
+ count++
+ }
+ return count >= n, nil
+ }()
+ }
},
}, {
Name: "MaxFields",
@@ -2786,14 +3158,16 @@
Result: boolKind,
Func: func(c *callCtxt) {
object, n := c.structVal(0), c.int(1)
- c.ret, c.err = func() (interface{}, error) {
- iter := object.Fields(Hidden(false), Optional(false))
- count := 0
- for iter.Next() {
- count++
- }
- return count <= n, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ iter := object.Fields(Hidden(false), Optional(false))
+ count := 0
+ for iter.Next() {
+ count++
+ }
+ return count <= n, nil
+ }()
+ }
},
}},
},
@@ -2804,41 +3178,43 @@
Result: stringKind,
Func: func(c *callCtxt) {
data := c.value(0)
- c.ret, c.err = func() (interface{}, error) {
- buf := &bytes.Buffer{}
- tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ buf := &bytes.Buffer{}
+ tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
- write := func(v Value) error {
- b, err := v.Bytes()
- if err != nil {
- return err
+ write := func(v Value) error {
+ b, err := v.Bytes()
+ if err != nil {
+ return err
+ }
+ _, err = tw.Write(b)
+ if err != nil {
+ return err
+ }
+ return nil
}
- _, err = tw.Write(b)
- if err != nil {
- return err
- }
- return nil
- }
- switch data.Kind() {
- case BytesKind, StringKind:
- if err := write(data); err != nil {
- return "", err
- }
- case ListKind:
- for i, _ := data.List(); i.Next(); {
- if err := write(i.Value()); err != nil {
+ switch data.Kind() {
+ case BytesKind, StringKind:
+ if err := write(data); err != nil {
return "", err
}
- _, _ = tw.Write([]byte{'\n'})
+ case ListKind:
+ for i, _ := data.List(); i.Next(); {
+ if err := write(i.Value()); err != nil {
+ return "", err
+ }
+ _, _ = tw.Write([]byte{'\n'})
+ }
+ default:
+ return "", fmt.Errorf("tabwriter.Write: unsupported type %v", data.Kind())
}
- default:
- return "", fmt.Errorf("tabwriter.Write: unsupported type %v", data.Kind())
- }
- err := tw.Flush()
- return buf.String(), err
- }()
+ err := tw.Flush()
+ return buf.String(), err
+ }()
+ }
},
}},
},
@@ -2849,21 +3225,23 @@
Result: stringKind,
Func: func(c *callCtxt) {
templ, data := c.string(0), c.value(1)
- c.ret, c.err = func() (interface{}, error) {
- t, err := template.New("").Parse(templ)
- if err != nil {
- return "", err
- }
- var x interface{}
- if err := data.Decode(&x); err != nil {
- return "", err
- }
- buf := &bytes.Buffer{}
- if err := t.Execute(buf, x); err != nil {
- return "", err
- }
- return buf.String(), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ t, err := template.New("").Parse(templ)
+ if err != nil {
+ return "", err
+ }
+ var x interface{}
+ if err := data.Decode(&x); err != nil {
+ return "", err
+ }
+ buf := &bytes.Buffer{}
+ if err := t.Execute(buf, x); err != nil {
+ return "", err
+ }
+ return buf.String(), nil
+ }()
+ }
},
}, {
Name: "HTMLEscape",
@@ -2871,9 +3249,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return template.HTMLEscapeString(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return template.HTMLEscapeString(s)
+ }()
+ }
},
}, {
Name: "JSEscape",
@@ -2881,9 +3261,11 @@
Result: stringKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret = func() interface{} {
- return template.JSEscapeString(s)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ return template.JSEscapeString(s)
+ }()
+ }
},
}},
},
@@ -2912,12 +3294,14 @@
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- if _, err := time.ParseDuration(s); err != nil {
- return false, err
- }
- return true, nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ if _, err := time.ParseDuration(s); err != nil {
+ return false, err
+ }
+ return true, nil
+ }()
+ }
},
}, {
Name: "ParseDuration",
@@ -2925,13 +3309,15 @@
Result: intKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- d, err := time.ParseDuration(s)
- if err != nil {
- return 0, err
- }
- return int64(d), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ d, err := time.ParseDuration(s)
+ if err != nil {
+ return 0, err
+ }
+ return int64(d), nil
+ }()
+ }
},
}, {
Name: "ANSIC",
@@ -3035,9 +3421,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
s := c.string(0)
- c.ret, c.err = func() (interface{}, error) {
- return timeFormat(s, time.RFC3339Nano)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return timeFormat(s, time.RFC3339Nano)
+ }()
+ }
},
}, {
Name: "Format",
@@ -3045,9 +3433,11 @@
Result: boolKind,
Func: func(c *callCtxt) {
value, layout := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- return timeFormat(value, layout)
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ return timeFormat(value, layout)
+ }()
+ }
},
}, {
Name: "Parse",
@@ -3055,13 +3445,15 @@
Result: stringKind,
Func: func(c *callCtxt) {
layout, value := c.string(0), c.string(1)
- c.ret, c.err = func() (interface{}, error) {
- t, err := time.Parse(layout, value)
- if err != nil {
- return "", err
- }
- return t.UTC().Format(time.RFC3339Nano), nil
- }()
+ if c.do() {
+ c.ret, c.err = func() (interface{}, error) {
+ t, err := time.Parse(layout, value)
+ if err != nil {
+ return "", err
+ }
+ return t.UTC().Format(time.RFC3339Nano), nil
+ }()
+ }
},
}, {
Name: "Unix",
@@ -3069,10 +3461,12 @@
Result: stringKind,
Func: func(c *callCtxt) {
sec, nsec := c.int64(0), c.int64(1)
- c.ret = func() interface{} {
- t := time.Unix(sec, nsec)
- return t.UTC().Format(time.RFC3339Nano)
- }()
+ if c.do() {
+ c.ret = func() interface{} {
+ t := time.Unix(sec, nsec)
+ return t.UTC().Format(time.RFC3339Nano)
+ }()
+ }
},
}},
},
diff --git a/cue/gen.go b/cue/gen.go
index 7f607eb..6f3025d 100644
--- a/cue/gen.go
+++ b/cue/gen.go
@@ -38,6 +38,7 @@
"strings"
"cuelang.org/go/cue"
+ "cuelang.org/go/cue/errors"
cueformat "cuelang.org/go/cue/format"
"cuelang.org/go/cue/load"
)
@@ -196,7 +197,8 @@
if err := instances[0].Err; err != nil {
if !strings.Contains(err.Error(), "no CUE files") {
- log.Fatal(err)
+ errors.Print(os.Stderr, err, nil)
+ log.Fatalf("error processing %s: %v", dir, err)
}
return
}
@@ -341,14 +343,10 @@
args := []string{}
vals := []string{}
kind := []string{}
- omitCheck := true
for _, f := range x.Type.Params.List {
for _, name := range f.Names {
typ := g.goKind(f.Type)
- argKind, ground := g.goToCUE(f.Type)
- if !ground {
- omitCheck = false
- }
+ argKind := g.goToCUE(f.Type)
vals = append(vals, fmt.Sprintf("c.%s(%d)", typ, len(args)))
args = append(args, name.Name)
kind = append(kind, argKind)
@@ -356,7 +354,7 @@
}
fmt.Fprintf(g.w, "Params: []kind{%s},\n", strings.Join(kind, ", "))
- result, _ := g.goToCUE(x.Type.Results.List[0].Type)
+ result := g.goToCUE(x.Type.Results.List[0].Type)
fmt.Fprintf(g.w, "Result: %s,\n", result)
argList := strings.Join(args, ", ")
valList := strings.Join(vals, ", ")
@@ -371,10 +369,8 @@
if init != "" {
fmt.Fprintln(g.w, init)
}
- if !omitCheck {
- fmt.Fprintln(g.w, "if c.do() {")
- defer fmt.Fprintln(g.w, "}")
- }
+ fmt.Fprintln(g.w, "if c.do() {")
+ defer fmt.Fprintln(g.w, "}")
if len(types) == 1 {
fmt.Fprint(g.w, "c.ret = func() interface{} ")
} else {
@@ -422,9 +418,8 @@
}
}
-func (g *generator) goToCUE(expr ast.Expr) (cueKind string, omitCheck bool) {
+func (g *generator) goToCUE(expr ast.Expr) (cueKind string) {
// TODO: detect list and structs types for return values.
- omitCheck = true
switch k := g.goKind(expr); k {
case "error":
cueKind += "bottomKind"
@@ -440,13 +435,7 @@
cueKind += "intKind"
case "float64", "bigRat", "bigFloat", "decimal":
cueKind += "numKind"
- case "list":
- cueKind += "listKind"
- case "decimalList":
- omitCheck = false
- cueKind += "listKind"
- case "strList":
- omitCheck = false
+ case "list", "decimalList", "strList":
cueKind += "listKind"
case "structVal":
cueKind += "structKind"
@@ -463,8 +452,7 @@
// log.Println("Unknown type:", k)
// Must use callCtxt.value method for these types and resolve manually.
cueKind += "topKind" // TODO: can be more precise
- omitCheck = false
}
}
- return cueKind, omitCheck
+ return cueKind
}
diff --git a/cue/resolve_test.go b/cue/resolve_test.go
index e161ab8..4bf4703 100644
--- a/cue/resolve_test.go
+++ b/cue/resolve_test.go
@@ -2797,6 +2797,19 @@
B: test.A & {}
`,
out: `<0>{test: <1>{[]: <2>(ID: string)-><3>{name: <2>.ID}, A: <4>{name: "A", field1: "1", field2: "2"}}, B: <5>{name: "A", field1: "1", field2: "2"}}`,
+ }, {
+ desc: "Issue #178",
+ in: `
+ import "encoding/csv"
+ import "encoding/hex"
+
+ foo: csv.Decode(data)
+ data: bytes
+
+ len: int
+ bar: hex.EncodedLen(len)
+ `,
+ out: `<0>{foo: <1>.Decode (<2>.data), data: bytes, len: int, bar: <3>.EncodedLen (<2>.len)}`,
}}
rewriteHelper(t, testCases, evalFull)
}