From 1de1359e3b99785ea94f7d75c8aa0dac6b034f24 Mon Sep 17 00:00:00 2001 From: zsfelfoldi Date: Fri, 8 May 2015 12:27:35 +0200 Subject: [PATCH 1/2] Otto.ToValue concurrency error fixed --- jsre/jsre.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/jsre/jsre.go b/jsre/jsre.go index 7549b5e1e..7de41428b 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -286,7 +286,7 @@ func (self *JSRE) loadScript(call otto.FunctionCall) otto.Value { // uses the "prettyPrint" JS function to format a value func (self *JSRE) PrettyPrint(v interface{}) (val otto.Value, err error) { var method otto.Value - v, err = self.vm.ToValue(v) + v, err = self.ToValue(v) if err != nil { return } @@ -298,8 +298,22 @@ func (self *JSRE) PrettyPrint(v interface{}) (val otto.Value, err error) { } // creates an otto value from a go type +func (self *JSRE) ToValue(v interface{}) (otto.Value, error) { + done := make(chan bool) + req := &evalReq{ + fn: func(res *evalResult) { + res.result, res.err = self.vm.ToValue(v) + }, + done: done, + } + self.evalQueue <- req + <-done + return req.res.result, req.res.err +} + func (self *JSRE) ToVal(v interface{}) otto.Value { - result, err := self.vm.ToValue(v) + + result, err := self.ToValue(v) if err != nil { fmt.Println("Value unknown:", err) return otto.UndefinedValue() From d7dabce73291d2bb768625c7e465f2f645980dbf Mon Sep 17 00:00:00 2001 From: zsfelfoldi Date: Fri, 8 May 2015 13:29:48 +0200 Subject: [PATCH 2/2] ToVal serialization fix --- jsre/jsre.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jsre/jsre.go b/jsre/jsre.go index 7de41428b..adf2f8121 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -297,7 +297,7 @@ func (self *JSRE) PrettyPrint(v interface{}) (val otto.Value, err error) { return method.Call(method, v) } -// creates an otto value from a go type +// creates an otto value from a go type (serialized version) func (self *JSRE) ToValue(v interface{}) (otto.Value, error) { done := make(chan bool) req := &evalReq{ @@ -311,9 +311,10 @@ func (self *JSRE) ToValue(v interface{}) (otto.Value, error) { return req.res.result, req.res.err } +// creates an otto value from a go type (non-serialized version) func (self *JSRE) ToVal(v interface{}) otto.Value { - result, err := self.ToValue(v) + result, err := self.vm.ToValue(v) if err != nil { fmt.Println("Value unknown:", err) return otto.UndefinedValue()