restructure project
This commit is contained in:
37
internal/builtins/ffi.go
Normal file
37
internal/builtins/ffi.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package builtins
|
||||
|
||||
import (
|
||||
"monkey/internal/object"
|
||||
"monkey/internal/typing"
|
||||
)
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"plugin"
|
||||
)
|
||||
|
||||
// FFI ...
|
||||
func FFI(args ...object.Object) object.Object {
|
||||
if err := typing.Check(
|
||||
"ffi", args,
|
||||
typing.ExactArgs(2),
|
||||
typing.WithTypes(object.STRING_OBJ, object.STRING_OBJ),
|
||||
); err != nil {
|
||||
return newError(err.Error())
|
||||
}
|
||||
|
||||
name := args[0].(*object.String).Value
|
||||
symbol := args[1].(*object.String).Value
|
||||
|
||||
p, err := plugin.Open(fmt.Sprintf("%s.so", name))
|
||||
if err != nil {
|
||||
return newError("error loading plugin: %s", err)
|
||||
}
|
||||
|
||||
v, err := p.Lookup(symbol)
|
||||
if err != nil {
|
||||
return newError("error finding symbol: %s", err)
|
||||
}
|
||||
|
||||
return &object.Builtin{Name: symbol, Fn: v.(object.BuiltinFunction)}
|
||||
}
|
||||
Reference in New Issue
Block a user