Skip to content

Commit 65bd673

Browse files
committed
Add OpCallBuiltin opcode to avoid an extra allocation
1 parent 078f2e8 commit 65bd673

File tree

13 files changed

+393
-293
lines changed

13 files changed

+393
-293
lines changed

builtin/builtin.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,24 @@ import (
88
type Function struct {
99
Name string
1010
Func func(args ...interface{}) (interface{}, error)
11+
Builtin1 func(arg interface{}) interface{}
1112
Types []reflect.Type
1213
Validate func(args []reflect.Type) (reflect.Type, error)
1314
}
1415

16+
var Index map[string]int
17+
18+
func init() {
19+
Index = make(map[string]int)
20+
for i, fn := range Builtins {
21+
Index[fn.Name] = i
22+
}
23+
}
24+
1525
var Builtins = []*Function{
1626
{
17-
Name: "len",
18-
Func: Len,
27+
Name: "len",
28+
Builtin1: Len,
1929
Validate: func(args []reflect.Type) (reflect.Type, error) {
2030
if len(args) != 1 {
2131
return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args))
@@ -28,8 +38,8 @@ var Builtins = []*Function{
2838
},
2939
},
3040
{
31-
Name: "abs",
32-
Func: Abs,
41+
Name: "abs",
42+
Builtin1: Abs,
3343
Validate: func(args []reflect.Type) (reflect.Type, error) {
3444
if len(args) != 1 {
3545
return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args))
@@ -42,8 +52,8 @@ var Builtins = []*Function{
4252
},
4353
},
4454
{
45-
Name: "int",
46-
Func: Int,
55+
Name: "int",
56+
Builtin1: Int,
4757
Validate: func(args []reflect.Type) (reflect.Type, error) {
4858
if len(args) != 1 {
4959
return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args))
@@ -60,8 +70,8 @@ var Builtins = []*Function{
6070
},
6171
},
6272
{
63-
Name: "float",
64-
Func: Float,
73+
Name: "float",
74+
Builtin1: Float,
6575
Validate: func(args []reflect.Type) (reflect.Type, error) {
6676
if len(args) != 1 {
6777
return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args))

builtin/func.go

Lines changed: 61 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -6,168 +6,164 @@ import (
66
"strconv"
77
)
88

9-
func Len(xs ...interface{}) (interface{}, error) {
10-
x := xs[0]
9+
func Len(x interface{}) interface{} {
1110
v := reflect.ValueOf(x)
1211
switch v.Kind() {
1312
case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
14-
return v.Len(), nil
13+
return v.Len()
1514
default:
16-
return nil, fmt.Errorf("invalid argument for len (type %T)", x)
15+
panic(fmt.Sprintf("invalid argument for len (type %T)", x))
1716
}
1817
}
1918

20-
func Abs(xs ...interface{}) (interface{}, error) {
21-
x := xs[0]
19+
func Abs(x interface{}) interface{} {
2220
switch x.(type) {
2321
case float32:
2422
if x.(float32) < 0 {
25-
return -x.(float32), nil
23+
return -x.(float32)
2624
} else {
27-
return x, nil
25+
return x
2826
}
2927
case float64:
3028
if x.(float64) < 0 {
31-
return -x.(float64), nil
29+
return -x.(float64)
3230
} else {
33-
return x, nil
31+
return x
3432
}
3533
case int:
3634
if x.(int) < 0 {
37-
return -x.(int), nil
35+
return -x.(int)
3836
} else {
39-
return x, nil
37+
return x
4038
}
4139
case int8:
4240
if x.(int8) < 0 {
43-
return -x.(int8), nil
41+
return -x.(int8)
4442
} else {
45-
return x, nil
43+
return x
4644
}
4745
case int16:
4846
if x.(int16) < 0 {
49-
return -x.(int16), nil
47+
return -x.(int16)
5048
} else {
51-
return x, nil
49+
return x
5250
}
5351
case int32:
5452
if x.(int32) < 0 {
55-
return -x.(int32), nil
53+
return -x.(int32)
5654
} else {
57-
return x, nil
55+
return x
5856
}
5957
case int64:
6058
if x.(int64) < 0 {
61-
return -x.(int64), nil
59+
return -x.(int64)
6260
} else {
63-
return x, nil
61+
return x
6462
}
6563
case uint:
6664
if x.(uint) < 0 {
67-
return -x.(uint), nil
65+
return -x.(uint)
6866
} else {
69-
return x, nil
67+
return x
7068
}
7169
case uint8:
7270
if x.(uint8) < 0 {
73-
return -x.(uint8), nil
71+
return -x.(uint8)
7472
} else {
75-
return x, nil
73+
return x
7674
}
7775
case uint16:
7876
if x.(uint16) < 0 {
79-
return -x.(uint16), nil
77+
return -x.(uint16)
8078
} else {
81-
return x, nil
79+
return x
8280
}
8381
case uint32:
8482
if x.(uint32) < 0 {
85-
return -x.(uint32), nil
83+
return -x.(uint32)
8684
} else {
87-
return x, nil
85+
return x
8886
}
8987
case uint64:
9088
if x.(uint64) < 0 {
91-
return -x.(uint64), nil
89+
return -x.(uint64)
9290
} else {
93-
return x, nil
91+
return x
9492
}
9593
}
96-
return nil, fmt.Errorf("invalid argument for abs (type %T)", x)
94+
panic(fmt.Sprintf("invalid argument for abs (type %T)", x))
9795
}
9896

99-
func Int(xs ...interface{}) (interface{}, error) {
100-
x := xs[0]
97+
func Int(x interface{}) interface{} {
10198
switch x := x.(type) {
10299
case float32:
103-
return int(x), nil
100+
return int(x)
104101
case float64:
105-
return int(x), nil
102+
return int(x)
106103
case int:
107-
return x, nil
104+
return x
108105
case int8:
109-
return int(x), nil
106+
return int(x)
110107
case int16:
111-
return int(x), nil
108+
return int(x)
112109
case int32:
113-
return int(x), nil
110+
return int(x)
114111
case int64:
115-
return int(x), nil
112+
return int(x)
116113
case uint:
117-
return int(x), nil
114+
return int(x)
118115
case uint8:
119-
return int(x), nil
116+
return int(x)
120117
case uint16:
121-
return int(x), nil
118+
return int(x)
122119
case uint32:
123-
return int(x), nil
120+
return int(x)
124121
case uint64:
125-
return int(x), nil
122+
return int(x)
126123
case string:
127124
i, err := strconv.Atoi(x)
128125
if err != nil {
129-
return nil, fmt.Errorf("invalid operation: int(%s)", x)
126+
panic(fmt.Sprintf("invalid operation: int(%s)", x))
130127
}
131-
return i, nil
128+
return i
132129
default:
133-
return nil, fmt.Errorf("invalid operation: int(%T)", x)
130+
panic(fmt.Sprintf("invalid operation: int(%T)", x))
134131
}
135132
}
136133

137-
func Float(xs ...interface{}) (interface{}, error) {
138-
x := xs[0]
134+
func Float(x interface{}) interface{} {
139135
switch x := x.(type) {
140136
case float32:
141-
return float64(x), nil
137+
return float64(x)
142138
case float64:
143-
return x, nil
139+
return x
144140
case int:
145-
return float64(x), nil
141+
return float64(x)
146142
case int8:
147-
return float64(x), nil
143+
return float64(x)
148144
case int16:
149-
return float64(x), nil
145+
return float64(x)
150146
case int32:
151-
return float64(x), nil
147+
return float64(x)
152148
case int64:
153-
return float64(x), nil
149+
return float64(x)
154150
case uint:
155-
return float64(x), nil
151+
return float64(x)
156152
case uint8:
157-
return float64(x), nil
153+
return float64(x)
158154
case uint16:
159-
return float64(x), nil
155+
return float64(x)
160156
case uint32:
161-
return float64(x), nil
157+
return float64(x)
162158
case uint64:
163-
return float64(x), nil
159+
return float64(x)
164160
case string:
165161
f, err := strconv.ParseFloat(x, 64)
166162
if err != nil {
167-
return nil, fmt.Errorf("invalid operation: float(%s)", x)
163+
panic(fmt.Sprintf("invalid operation: float(%s)", x))
168164
}
169-
return f, nil
165+
return f
170166
default:
171-
return nil, fmt.Errorf("invalid operation: float(%T)", x)
167+
panic(fmt.Sprintf("invalid operation: float(%T)", x))
172168
}
173169
}

0 commit comments

Comments
 (0)