Skip to content

Commit a73954a

Browse files
committed
Separate go's type as boolean/number/string #9
1 parent 38a0a3b commit a73954a

File tree

4 files changed

+41
-38
lines changed

4 files changed

+41
-38
lines changed

v8.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"fmt"
2727
"regexp"
2828
"runtime"
29+
"strconv"
2930
"text/template"
3031
"unsafe"
3132

@@ -63,17 +64,18 @@ func (f V8Function) Call(args ...interface{}) (interface{}, error) {
6364
})
6465
arguments.WriteString("(" + buf.String() + ")")
6566
} else {
66-
obj, ok := arg.(V8Object)
67-
if ok {
68-
// arg is a JavaScript object
67+
if obj, ok := arg.(V8Object); ok {
6968
arguments.WriteString(obj.Name)
70-
} else {
71-
// arg is a Go object; marshal to JSON
72-
b, err := json.Marshal(arg)
73-
if err != nil {
74-
return nil, err
69+
} else if num, ok := arg.(float64); ok {
70+
arguments.WriteString(fmt.Sprintf("%v", num))
71+
} else if bln, ok := arg.(bool); ok {
72+
if bln {
73+
arguments.WriteString("true")
74+
} else {
75+
arguments.WriteString("false")
7576
}
76-
arguments.WriteString(string(b))
77+
} else if str, ok := arg.(string); ok {
78+
arguments.WriteString(str)
7779
}
7880
}
7981
if i != len(args)-1 {
@@ -108,6 +110,23 @@ func _go_v8_callback(contextId uint32, functionName *C.char, v8Objects *C.v8data
108110
case C.v8function:
109111
argv = append(argv, V8Function{ctx, C.GoString(obj.repr)})
110112
break
113+
case C.v8number:
114+
if f, err := strconv.ParseFloat(C.GoString(obj.repr), 64); err == nil {
115+
argv = append(argv, f)
116+
} else {
117+
argv = append(argv, 0.0)
118+
}
119+
break
120+
case C.v8string:
121+
argv = append(argv, C.GoString(obj.repr))
122+
break
123+
case C.v8boolean:
124+
if C.GoString(obj.repr) == "true" {
125+
argv = append(argv, true)
126+
} else {
127+
argv = append(argv, false)
128+
}
129+
break
111130
default:
112131
// Should be a JSON string, so pass it as-is
113132
argv = append(argv, C.GoString(obj.repr))

v8_test.go

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

33
import (
4-
"encoding/json"
54
"fmt"
65
"sync"
76
"testing"
@@ -57,20 +56,15 @@ func TestAddFunc(t *testing.T) {
5756
t.Fatal("Unexpected number of _gov8_testFunc's arguments.", len(args))
5857
}
5958
// First argument
60-
var num float64
61-
err := json.Unmarshal([]byte(args[0].(string)), &num)
62-
if err != nil {
63-
t.Fatal("Error unmarshalling arg 0", err)
64-
}
65-
59+
num := args[0].(float64)
6660
argVal := int(num)
6761
if argVal != 10 {
6862
t.Fatal("Unexpected value for arg 0, expected 10, received:", argVal)
6963
}
7064

7165
// Second argument
7266
argVal2 := args[1].(string)
73-
if argVal2 != `"Test string"` {
67+
if argVal2 != `Test string` {
7468
t.Fatal("Unexpected value for arg 1, expected Test string, received:", argVal2)
7569
}
7670

@@ -95,21 +89,9 @@ func TestAddFunc(t *testing.T) {
9589
func TestAddFuncReturnObject(t *testing.T) {
9690
ctx := NewContext()
9791
err := ctx.AddFunc("testFunc", func(args ...interface{}) interface{} {
98-
var arg0 float64
99-
err := json.Unmarshal([]byte(args[0].(string)), &arg0)
100-
if err != nil {
101-
t.Fatal("Error unmarshalling arg 0", err)
102-
}
103-
104-
var arg1 string
105-
err = json.Unmarshal([]byte(args[1].(string)), &arg1)
106-
if err != nil {
107-
t.Fatal("Error unmarshalling arg 1", err)
108-
}
109-
11092
return map[string]interface{}{
111-
"arg0": arg0,
112-
"arg1": arg1,
93+
"arg0": args[0].(float64),
94+
"arg1": args[1].(string),
11395
}
11496
})
11597
if err != nil {

v8wrap.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,22 @@ _go_call(const v8::Arguments& args) {
6565
for (int i = 0; i < realArgs->Length(); i++) {
6666
v8::Local<v8::Value> arg = realArgs->Get(i);
6767

68+
v8::String::Utf8Value argString(arg);
6869
if (arg->IsRegExp()) {
6970
data[i].obj_type = v8regexp;
70-
71-
v8::String::Utf8Value argString(arg);
7271
data[i].repr = __strdup(*argString);
7372
} else if (arg->IsFunction()) {
7473
data[i].obj_type = v8function;
75-
76-
v8::String::Utf8Value argString(arg);
74+
data[i].repr = __strdup(*argString);
75+
} else if (arg->IsNumber()) {
76+
data[i].obj_type = v8number;
77+
data[i].repr = __strdup(*argString);
78+
} else if (arg->IsBoolean()) {
79+
data[i].obj_type = v8boolean;
7780
data[i].repr = __strdup(*argString);
7881
} else {
79-
// Convert to JSON
8082
data[i].obj_type = v8string;
81-
data[i].repr = __strdup(to_json(arg).c_str());
83+
data[i].repr = __strdup(*argString);
8284
}
8385
}
8486

v8wrap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ extern char* v8_execute(void* ctx, char* str);
1212
extern char* v8_error(void* ctx);
1313

1414
typedef enum {
15-
v8regexp, v8string, v8function
15+
v8boolean, v8number, v8string, v8function, v8regexp
1616
} v8type;
1717

1818
typedef struct {

0 commit comments

Comments
 (0)