Skip to content

Commit e68d3e1

Browse files
authored
[fix] lock and disable convert for Call() func (#89)
* add call lock * not convert
1 parent da38955 commit e68d3e1

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

call.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import (
99

1010
// Call executes a Starlark function or builtin saved in the thread and returns the result.
1111
func (m *Machine) Call(name string, args ...interface{}) (out interface{}, err error) {
12+
m.mu.Lock()
13+
defer m.mu.Unlock()
14+
1215
defer func() {
1316
if r := recover(); r != nil {
1417
err = errorStarlarkPanic("call", r)
@@ -49,7 +52,12 @@ func (m *Machine) Call(name string, args ...interface{}) (out interface{}, err e
4952

5053
// call and convert result
5154
res, err := starlark.Call(m.thread, callFunc, sl, nil)
52-
out = convert.FromValue(res)
55+
if m.enableOutConv { // convert to interface{} if enabled
56+
out = convert.FromValue(res)
57+
} else {
58+
out = res
59+
}
60+
// handle error
5361
if err != nil {
5462
return out, errorStarlarkError("call", err)
5563
}

call_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,40 @@ def work(x):
212212
})
213213
}
214214
}
215+
216+
func TestMachine_Call_Convert(t *testing.T) {
217+
m := starlet.NewDefault()
218+
m.SetCustomTag("json")
219+
_, err := m.RunScript([]byte(`
220+
def work(x, y):
221+
return x * y
222+
`), nil)
223+
if err != nil {
224+
t.Errorf("expected no error, got %v", err)
225+
return
226+
}
227+
228+
// call and check --- conversion is enabled by default
229+
got, err := m.Call("work", 10, 20)
230+
if err != nil {
231+
t.Errorf("expected no error, got %v", err)
232+
return
233+
}
234+
if got != int64(200) {
235+
t.Errorf("expected 200, got %v", got)
236+
}
237+
238+
// not convert
239+
m.SetOutputConversionEnabled(false)
240+
got, err = m.Call("work", 5, 6)
241+
if err != nil {
242+
t.Errorf("expected no error, got %v", err)
243+
return
244+
}
245+
if v, ok := got.(starlark.Value); !ok {
246+
t.Errorf("expected starlark Value, got %T", got)
247+
return
248+
} else if v != starlark.MakeInt(30) {
249+
t.Errorf("got unexpected value: %v", v)
250+
}
251+
}

0 commit comments

Comments
 (0)