File tree Expand file tree Collapse file tree 3 files changed +35
-5
lines changed Expand file tree Collapse file tree 3 files changed +35
-5
lines changed Original file line number Diff line number Diff line change @@ -66,6 +66,8 @@ func (f V8Function) Call(args ...interface{}) (interface{}, error) {
66
66
} else {
67
67
if v8obj , ok := arg .(V8NamedObject ); ok {
68
68
arguments .WriteString (v8obj .Name )
69
+ } else if re , ok := arg .(* regexp.Regexp ); ok {
70
+ arguments .WriteString (re .String ())
69
71
} else {
70
72
json .NewEncoder (& arguments ).Encode (arg )
71
73
}
@@ -185,10 +187,14 @@ func (v *V8Context) Eval(in string) (res interface{}, err error) {
185
187
out := C .GoString (ret )
186
188
if out != "" {
187
189
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
+ }
192
198
return
193
199
}
194
200
return nil , nil
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ package v8
2
2
3
3
import (
4
4
"fmt"
5
+ "regexp"
5
6
"sync"
6
7
"testing"
7
8
)
@@ -146,6 +147,26 @@ func TestEvalScriptArray(t *testing.T) {
146
147
}
147
148
}
148
149
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
+
149
170
func TestAddFuncReturnObject (t * testing.T ) {
150
171
ctx := NewContext ()
151
172
err := ctx .AddFunc ("testFunc" , func (args ... interface {}) interface {} {
Original file line number Diff line number Diff line change @@ -10,7 +10,6 @@ extern "C" {
10
10
char *
11
11
__strdup (const char * ptr) {
12
12
int l = strlen (ptr);
13
- // char* p = (char*) malloc(l + 1);
14
13
char * p = new char [l + 1 ];
15
14
strcpy (p, ptr);
16
15
return p;
@@ -219,6 +218,10 @@ v8_execute(void *ctx, char* source) {
219
218
}
220
219
else if (result->IsFunction () || result->IsUndefined ()) {
221
220
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);
222
225
} else {
223
226
return __strdup (to_json (result).c_str ());
224
227
}
You can’t perform that action at this time.
0 commit comments