Skip to content

Commit f4cda62

Browse files
committed
Pass regexp as arguments. Really closes #10
1 parent e9936f6 commit f4cda62

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

v8.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ func (f V8Function) Call(args ...interface{}) (interface{}, error) {
6666
} else {
6767
if v8obj, ok := arg.(V8NamedObject); ok {
6868
arguments.WriteString(v8obj.Name)
69+
} else if re, ok := arg.(*regexp.Regexp); ok {
70+
arguments.WriteString(re.String())
6971
} else {
7072
json.NewEncoder(&arguments).Encode(arg)
7173
}
@@ -185,10 +187,14 @@ func (v *V8Context) Eval(in string) (res interface{}, err error) {
185187
out := C.GoString(ret)
186188
if out != "" {
187189
C.free(unsafe.Pointer(ret))
188-
var buf bytes.Buffer
189-
buf.Write([]byte(out))
190-
dec := json.NewDecoder(&buf)
191-
err = dec.Decode(&res)
190+
if len(out) >= 2 && out[0] == '/' && out[len(out)-1] == '/' {
191+
res, err = regexp.Compile(jsregexp.Translate(out))
192+
} else {
193+
var buf bytes.Buffer
194+
buf.Write([]byte(out))
195+
dec := json.NewDecoder(&buf)
196+
err = dec.Decode(&res)
197+
}
192198
return
193199
}
194200
return nil, nil

v8_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package v8
22

33
import (
44
"fmt"
5+
"regexp"
56
"sync"
67
"testing"
78
)
@@ -146,6 +147,26 @@ func TestEvalScriptArray(t *testing.T) {
146147
}
147148
}
148149

150+
func TestEvalScriptRegExp(t *testing.T) {
151+
ctx := NewContext()
152+
153+
res, err := ctx.Eval(`var a = /^[a-z][0-9]+$/; a`)
154+
if err != nil {
155+
t.Fatal("Unexpected error on eval,", err)
156+
}
157+
if res == nil {
158+
t.Fatal("Expected result from eval, received nil")
159+
}
160+
161+
v, ok := res.(*regexp.Regexp)
162+
if !ok {
163+
t.Fatal("Expected regexp, but not:", res)
164+
}
165+
if !v.MatchString("a123") {
166+
t.Fatal(`Expected /^[a-z][0-9]+$/i match "a123", but not:`, v)
167+
}
168+
}
169+
149170
func TestAddFuncReturnObject(t *testing.T) {
150171
ctx := NewContext()
151172
err := ctx.AddFunc("testFunc", func(args ...interface{}) interface{} {

v8wrap.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ extern "C" {
1010
char*
1111
__strdup(const char* ptr) {
1212
int l = strlen(ptr);
13-
//char* p = (char*) malloc(l + 1);
1413
char* p = new char[l + 1];
1514
strcpy(p, ptr);
1615
return p;
@@ -219,6 +218,10 @@ v8_execute(void *ctx, char* source) {
219218
}
220219
else if (result->IsFunction() || result->IsUndefined()) {
221220
return __strdup("");
221+
} else if (result->IsRegExp()) {
222+
v8::Handle<v8::RegExp> re = v8::Handle<v8::RegExp>::Cast(result);
223+
v8::String::Utf8Value ret(re->ToString());
224+
return __strdup(*ret);
222225
} else {
223226
return __strdup(to_json(result).c_str());
224227
}

0 commit comments

Comments
 (0)