Skip to content

Commit a3dc281

Browse files
committed
Remove "assert" library
The runtime spends a lot of time during the assertion. The internal "assert" library impacts perfomance. Version is inlined into bytecode.
1 parent ef5b0eb commit a3dc281

File tree

11 files changed

+212
-203
lines changed

11 files changed

+212
-203
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,5 @@ equals("foo,bar,baz", join(",", ["foo", "bar", "baz"]))
170170
```
171171
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
172172
BenchmarkExec
173-
BenchmarkExec-8 1318488 887.4 ns/op 0 B/op 0 allocs/op
173+
BenchmarkExec-8 1432002 833.2 ns/op 0 B/op 0 allocs/op
174174
```

assert/assert.go

Lines changed: 0 additions & 88 deletions
This file was deleted.

bytecode/Program.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bytecode/Version.go

Lines changed: 11 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bytecode/proto.fbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ union Op {
3333
OpRet
3434
}
3535

36-
table Version {
36+
struct Version {
3737
minor:ubyte;
3838
major:ubyte;
3939
}

compiler/compiler.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,12 @@ func (c *Compiler) reset() {
3030
}
3131

3232
func (c *Compiler) writeVersion(major, minor byte) flatbuffers.UOffsetT {
33-
bytecode.VersionStart(c.b)
34-
bytecode.VersionAddMajor(c.b, major)
35-
bytecode.VersionAddMinor(c.b, minor)
36-
return bytecode.VersionEnd(c.b)
33+
return bytecode.CreateVersion(c.b, minor, major)
3734
}
3835

39-
func (c *Compiler) writeProgram(version, frames flatbuffers.UOffsetT) flatbuffers.UOffsetT {
36+
func (c *Compiler) writeProgram(frames flatbuffers.UOffsetT) flatbuffers.UOffsetT {
4037
bytecode.ProgramStart(c.b)
41-
bytecode.ProgramAddVer(c.b, version)
38+
bytecode.ProgramAddVer(c.b, c.writeVersion(MajorVersion, MinorVersion))
4239
bytecode.ProgramAddFrames(c.b, frames)
4340
return bytecode.ProgramEnd(c.b)
4441
}
@@ -151,7 +148,6 @@ func (c *Compiler) Compile(node *ast.Node) []byte {
151148
c.reset()
152149

153150
c.b.Finish(c.writeProgram(
154-
c.writeVersion(MajorVersion, MinorVersion),
155151
c.writeFrames(node),
156152
))
157153

delegate/delegator.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package delegate
22

33
import (
4-
"github.com/regeda/expr/assert"
54
"github.com/regeda/expr/memory"
65
)
76

@@ -14,12 +13,3 @@ type DelegatorFunc func(*memory.Memory, []memory.Addr) (memory.Addr, error)
1413
func (f DelegatorFunc) Delegate(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
1514
return f(mem, argv)
1615
}
17-
18-
func (f DelegatorFunc) Assert(a assert.Asserter) DelegatorFunc {
19-
return func(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
20-
if err := a.Assert(argv); err != nil {
21-
return memory.Nil, err
22-
}
23-
return f(mem, argv)
24-
}
25-
}

stdlib/compare.go

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,26 @@
11
package stdlib
22

33
import (
4-
"github.com/regeda/expr/assert"
4+
"errors"
5+
56
"github.com/regeda/expr/delegate"
67
"github.com/regeda/expr/memory"
78
)
89

910
var Compare = delegate.Module{
10-
"equals": delegate.DelegatorFunc(equals).
11-
Assert(assert.Every(
12-
assert.Len(2),
13-
assert.Any(
14-
assert.TypeInt64,
15-
assert.TypeBytes,
16-
assert.Every(
17-
assert.TypeVector,
18-
assert.VectorAt(0, assert.Any(
19-
assert.TypeInt64,
20-
assert.TypeBytes,
21-
)),
22-
assert.VectorAt(1, assert.Any(
23-
assert.TypeInt64,
24-
assert.TypeBytes,
25-
)),
26-
),
27-
),
28-
)),
29-
"contains": delegate.DelegatorFunc(contains).
30-
Assert(assert.Every(
31-
assert.Len(2),
32-
assert.TypeAt(0, memory.TypeVector),
33-
assert.Any(
34-
assert.Every(
35-
assert.VectorAt(0, assert.TypeInt64),
36-
assert.TypeAt(1, memory.TypeInt64),
37-
),
38-
assert.Every(
39-
assert.VectorAt(0, assert.TypeBytes),
40-
assert.TypeAt(1, memory.TypeBytes),
41-
),
42-
),
43-
)),
44-
"intersects": delegate.DelegatorFunc(intersects).
45-
Assert(assert.Every(
46-
assert.Len(2),
47-
assert.TypeVector,
48-
assert.Any(
49-
assert.Every(
50-
assert.VectorAt(0, assert.Type(memory.TypeInt64)),
51-
assert.VectorAt(1, assert.Type(memory.TypeInt64)),
52-
),
53-
assert.Every(
54-
assert.VectorAt(0, assert.Type(memory.TypeBytes)),
55-
assert.VectorAt(1, assert.Type(memory.TypeBytes)),
56-
),
57-
),
58-
)),
11+
"equals": delegate.DelegatorFunc(equals),
12+
"contains": delegate.DelegatorFunc(contains),
13+
"intersects": delegate.DelegatorFunc(intersects),
5914
}
6015

16+
var (
17+
errEqualsExpectedTwoArgs = errors.New("equals: expected 2 args")
18+
)
19+
6120
func equals(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
21+
if len(argv) != 2 {
22+
return memory.Nil, errEqualsExpectedTwoArgs
23+
}
6224
if !argv[0].EqualType(argv[1]) {
6325
return memory.False, nil
6426
}
@@ -79,7 +41,22 @@ func equals(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
7941
return memory.False, nil
8042
}
8143

44+
var (
45+
errContainsExpectedTwoArgs = errors.New("contains: expected 2 args")
46+
errContainsExpectedArrayAt0 = errors.New("contains: expected array at 0")
47+
errContainsExpectedScalarAt1 = errors.New("contains: expected scalar at 1")
48+
)
49+
8250
func contains(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
51+
if len(argv) != 2 {
52+
return memory.Nil, errContainsExpectedTwoArgs
53+
}
54+
if !argv[0].TypeOf(memory.TypeVector) {
55+
return memory.Nil, errContainsExpectedArrayAt0
56+
}
57+
if argv[1].TypeOf(memory.TypeVector) {
58+
return memory.Nil, errContainsExpectedScalarAt1
59+
}
8360
for _, p := range argv[0].Vector() {
8461
if p.EqualBytes(argv[1]) {
8562
return memory.True, nil
@@ -88,7 +65,18 @@ func contains(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
8865
return memory.False, nil
8966
}
9067

68+
var (
69+
errIntersectsExpectedTwoArgs = errors.New("intersects: expected 2 args")
70+
errIntersectsExpectedArrays = errors.New("intersects: expected arrays")
71+
)
72+
9173
func intersects(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
74+
if len(argv) != 2 {
75+
return memory.Nil, errIntersectsExpectedTwoArgs
76+
}
77+
if !argv[0].EqualType(argv[1]) || !argv[0].TypeOf(memory.TypeVector) {
78+
return memory.Nil, errIntersectsExpectedArrays
79+
}
9280
for _, a := range argv[0].Vector() {
9381
for _, b := range argv[1].Vector() {
9482
if a.EqualBytes(b) {

0 commit comments

Comments
 (0)