Simplified CreateFunction
This commit is contained in:
parent
2ac1f6bac8
commit
01fc848621
11
ph7.go
11
ph7.go
@ -489,6 +489,7 @@ func write_vm_output(buf unsafe.Pointer, bufLen C.uint, userData unsafe.Pointer)
|
||||
}
|
||||
|
||||
func (vm *VM) SetOutputWriter(w io.Writer) error {
|
||||
// TODO Does this need to reset to the default if it receives nil?
|
||||
vm.outputWriter = w
|
||||
return newError(C.vm_set_output_callback(vm.ptr, vm.pointerKey))
|
||||
}
|
||||
@ -562,24 +563,22 @@ func (vm *VM) Close() error {
|
||||
return newError(C.ph7_vm_release(vm.ptr))
|
||||
}
|
||||
|
||||
type ForeignFunction interface {
|
||||
Call(ctx *Context, args []*Value) ResultCode
|
||||
}
|
||||
type Function func(ctx *Context, args []*Value) ResultCode
|
||||
|
||||
//export call_foreign_function
|
||||
func call_foreign_function(ctx *C.ph7_context, argc C.int, argv **C.ph7_value) C.int {
|
||||
fkey := C.ph7_context_user_data(ctx)
|
||||
// TODO it looks like ph7 looks for a VFS at the user data pointer. WTF? Should we use it for that?
|
||||
f := pointer.Restore(fkey).(ForeignFunction)
|
||||
f := pointer.Restore(fkey).(Function)
|
||||
args := make([]*Value, 0, argc)
|
||||
argvSlice := unsafe.Slice(argv, argc)
|
||||
for i := range argvSlice {
|
||||
args = append(args, (*Value)(argvSlice[i]))
|
||||
}
|
||||
return C.int(f.Call((*Context)(ctx), args))
|
||||
return C.int(f((*Context)(ctx), args))
|
||||
}
|
||||
|
||||
func (vm *VM) CreateFunction(name string, f ForeignFunction) error {
|
||||
func (vm *VM) CreateFunction(name string, f Function) error {
|
||||
cname := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cname))
|
||||
|
||||
|
18
ph7_test.go
18
ph7_test.go
@ -139,23 +139,23 @@ func TestOutputWriter(t *testing.T) {
|
||||
// TODO Test failing writer, including vm.OutputWriteError
|
||||
// TODO Test setting writer twice
|
||||
|
||||
type CtxFunc func(*ph7.Context) error
|
||||
|
||||
func (r CtxFunc) Call(ctx *ph7.Context, _ []*ph7.Value) ph7.ResultCode {
|
||||
err := r(ctx)
|
||||
if err != nil {
|
||||
return r(ctx).(ph7.Error).Code
|
||||
func CtxFunc(f func(*ph7.Context) error) ph7.Function {
|
||||
return func(ctx *ph7.Context, _ []*ph7.Value) ph7.ResultCode {
|
||||
err := f(ctx)
|
||||
if err != nil {
|
||||
return f(ctx).(ph7.Error).Code
|
||||
}
|
||||
return ph7.ResultCodeOK
|
||||
}
|
||||
return ph7.ResultCodeOK
|
||||
}
|
||||
|
||||
func testResultCode(t *testing.T, expectedOutput string, f CtxFunc) {
|
||||
func testResultCode(t *testing.T, expectedOutput string, f func(*ph7.Context) error) {
|
||||
t.Helper()
|
||||
const script = "echo doStuff();"
|
||||
vm, close := setupVM(t, script)
|
||||
defer close()
|
||||
|
||||
mustSucceed(t, vm.CreateFunction("doStuff", f))
|
||||
mustSucceed(t, vm.CreateFunction("doStuff", CtxFunc(f)))
|
||||
expectOutput(t, vm, expectedOutput)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user