Skip to content

Commit

Permalink
Match max program size of regexp package (#89)
Browse files Browse the repository at this point in the history
  • Loading branch information
anuraaga authored Apr 19, 2024
1 parent c11c53d commit ea78258
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 30 deletions.
5 changes: 5 additions & 0 deletions internal/cre2/cre2.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ void cre2_opt_set_longest_match(void* opt, int flag);
void cre2_opt_set_posix_syntax(void* opt, int flag);
void cre2_opt_set_case_sensitive(void* opt, int flag);
void cre2_opt_set_latin1_encoding(void* opt);
void cre2_opt_set_max_mem(void* opt, int64_t size);
void* malloc(size_t size);
void free(void* ptr);
Expand Down Expand Up @@ -107,6 +108,10 @@ func OptSetLatin1Encoding(opt unsafe.Pointer) {
C.cre2_opt_set_latin1_encoding(opt)
}

func OptSetMaxMem(opt unsafe.Pointer, size int) {
C.cre2_opt_set_max_mem(opt, C.int64_t(size))
}

func Malloc(size int) unsafe.Pointer {
return C.malloc(C.size_t(size))
}
Expand Down
4 changes: 4 additions & 0 deletions internal/re2.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ import (
"unicode/utf8"
)

// Use same max size as regexp package.
// https://github.com/golang/go/blob/master/src/regexp/syntax/parse.go#L95
const maxSize = 128 << 20

type Regexp struct {
ptr wasmPtr

Expand Down
1 change: 1 addition & 0 deletions internal/re2_tinygowasm.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func (abi *libre2ABI) endOperation(allocation) {
func newRE(abi *libre2ABI, pattern cString, opts CompileOptions) wasmPtr {
opt := cre2.NewOpt()
defer cre2.DeleteOpt(opt)
cre2.OptSetMaxMem(opt, maxSize)
cre2.OptSetLogErrors(opt, false)
if opts.Longest {
cre2.OptSetLongestMatch(opt, true)
Expand Down
66 changes: 36 additions & 30 deletions internal/re2_wazero.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ type libre2ABI struct {
cre2OptSetPosixSyntax lazyFunction
cre2OptSetCaseSensitive lazyFunction
cre2OptSetLatin1Encoding lazyFunction
cre2OptSetMaxMem lazyFunction

malloc lazyFunction
free lazyFunction
Expand Down Expand Up @@ -219,6 +220,7 @@ func newABI() *libre2ABI {
cre2OptSetPosixSyntax: newLazyFunction("cre2_opt_set_posix_syntax"),
cre2OptSetCaseSensitive: newLazyFunction("cre2_opt_set_case_sensitive"),
cre2OptSetLatin1Encoding: newLazyFunction("cre2_opt_set_latin1_encoding"),
cre2OptSetMaxMem: newLazyFunction("cre2_opt_set_max_mem"),

malloc: newLazyFunction("malloc"),
free: newLazyFunction("free"),
Expand All @@ -238,44 +240,48 @@ func (abi *libre2ABI) endOperation(a allocation) {
func newRE(abi *libre2ABI, pattern cString, opts CompileOptions) wasmPtr {
ctx := context.Background()
optPtr := uint32(0)
if opts != (CompileOptions{}) {
res, err := abi.cre2OptNew.Call0(ctx)
if err != nil {
res, err := abi.cre2OptNew.Call0(ctx)
if err != nil {
panic(err)
}
optPtr = uint32(res)
defer func() {
if _, err := abi.cre2OptDelete.Call1(ctx, uint64(optPtr)); err != nil {
panic(err)
}
optPtr = uint32(res)
defer func() {
if _, err := abi.cre2OptDelete.Call1(ctx, uint64(optPtr)); err != nil {
panic(err)
}
}()
if opts.Longest {
_, err = abi.cre2OptSetLongestMatch.Call2(ctx, uint64(optPtr), 1)
if err != nil {
panic(err)
}
}()

_, err = abi.cre2OptSetMaxMem.Call2(ctx, uint64(optPtr), uint64(maxSize))
if err != nil {
panic(err)
}

if opts.Longest {
_, err = abi.cre2OptSetLongestMatch.Call2(ctx, uint64(optPtr), 1)
if err != nil {
panic(err)
}
if opts.Posix {
_, err = abi.cre2OptSetPosixSyntax.Call2(ctx, uint64(optPtr), 1)
if err != nil {
panic(err)
}
}
if opts.Posix {
_, err = abi.cre2OptSetPosixSyntax.Call2(ctx, uint64(optPtr), 1)
if err != nil {
panic(err)
}
if opts.CaseInsensitive {
_, err = abi.cre2OptSetCaseSensitive.Call2(ctx, uint64(optPtr), 0)
if err != nil {
panic(err)
}
}
if opts.CaseInsensitive {
_, err = abi.cre2OptSetCaseSensitive.Call2(ctx, uint64(optPtr), 0)
if err != nil {
panic(err)
}
if opts.Latin1 {
_, err = abi.cre2OptSetLatin1Encoding.Call1(ctx, uint64(optPtr))
if err != nil {
panic(err)
}
}
if opts.Latin1 {
_, err = abi.cre2OptSetLatin1Encoding.Call1(ctx, uint64(optPtr))
if err != nil {
panic(err)
}
}

res, err := abi.cre2New.Call3(ctx, uint64(pattern.ptr), uint64(pattern.length), uint64(optPtr))
res, err = abi.cre2New.Call3(ctx, uint64(pattern.ptr), uint64(pattern.length), uint64(optPtr))
if err != nil {
panic(err)
}
Expand Down

0 comments on commit ea78258

Please sign in to comment.