started taking ffi out of the main vm, putting it to a separate module
This commit is contained in:
parent
2528dcdbe5
commit
65f2f862f8
69
moo/kernel/FFI.moo
Normal file
69
moo/kernel/FFI.moo
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
class FFI(Object)
|
||||||
|
{
|
||||||
|
dcl name handle funcs.
|
||||||
|
|
||||||
|
method(#class) new: aString
|
||||||
|
{
|
||||||
|
^self new open: aString.
|
||||||
|
}
|
||||||
|
|
||||||
|
method open: aString
|
||||||
|
{
|
||||||
|
self.funcs := Dictionary new.
|
||||||
|
self.name := aString.
|
||||||
|
|
||||||
|
self.handle := self privateOpen: self.name.
|
||||||
|
|
||||||
|
"[ self.handle := self privateOpen: self.name ]
|
||||||
|
on: Exception do: [
|
||||||
|
]
|
||||||
|
on: XException do: [
|
||||||
|
]."
|
||||||
|
|
||||||
|
^self.
|
||||||
|
}
|
||||||
|
|
||||||
|
method close
|
||||||
|
{
|
||||||
|
self privateClose: self.handle.
|
||||||
|
self.handle := nil.
|
||||||
|
}
|
||||||
|
|
||||||
|
method call: aFunctionName withSig: aString withArgs: anArray
|
||||||
|
{
|
||||||
|
| f |
|
||||||
|
|
||||||
|
## f := self.funcs at: aFunctionName.
|
||||||
|
## f isNil ifTrue: [
|
||||||
|
## f := self privateGetSymbol: aFunctionName in: self.handle.
|
||||||
|
## f isNil ifTrue: [ self error: 'No such function' ].
|
||||||
|
## self.funcs at: aFunctionName put: f.
|
||||||
|
## ].
|
||||||
|
f := self privateGetSymbol: aFunctionName in: self.handle.
|
||||||
|
f isNil ifTrue: [ self error: 'No such function' ].
|
||||||
|
|
||||||
|
^self privateCall: f withSig: aString withArgs: anArray
|
||||||
|
}
|
||||||
|
|
||||||
|
method privateOpen: aString
|
||||||
|
{
|
||||||
|
<primitive: #_ffi_open>
|
||||||
|
^nil. ## TODO: Error signal: 'can not open'
|
||||||
|
}
|
||||||
|
|
||||||
|
method privateClose: aHandle
|
||||||
|
{
|
||||||
|
<primitive: #_ffi_close>
|
||||||
|
}
|
||||||
|
|
||||||
|
method privateCall: aSymbol withSig: aString withArgs: anArray
|
||||||
|
{
|
||||||
|
<primitive: #_ffi_call>
|
||||||
|
}
|
||||||
|
|
||||||
|
method privateGetSymbol: aString in: aHandle
|
||||||
|
{
|
||||||
|
<primitive: #_ffi_getsym>
|
||||||
|
^nil.
|
||||||
|
}
|
||||||
|
}
|
@ -9,77 +9,6 @@
|
|||||||
|
|
||||||
(* -------------------------------------------------------------------------- *)
|
(* -------------------------------------------------------------------------- *)
|
||||||
|
|
||||||
class FFI(Object)
|
(*#include 'FFI.moo'.*)
|
||||||
{
|
|
||||||
dcl name handle funcs.
|
|
||||||
|
|
||||||
method(#class) new: aString
|
|
||||||
{
|
|
||||||
^self new open: aString.
|
|
||||||
}
|
|
||||||
|
|
||||||
method open: aString
|
|
||||||
{
|
|
||||||
self.funcs := Dictionary new.
|
|
||||||
self.name := aString.
|
|
||||||
|
|
||||||
self.handle := self privateOpen: self.name.
|
|
||||||
|
|
||||||
"[ self.handle := self privateOpen: self.name ]
|
|
||||||
on: Exception do: [
|
|
||||||
]
|
|
||||||
on: XException do: [
|
|
||||||
]."
|
|
||||||
|
|
||||||
^self.
|
|
||||||
}
|
|
||||||
|
|
||||||
method close
|
|
||||||
{
|
|
||||||
self privateClose: self.handle.
|
|
||||||
self.handle := nil.
|
|
||||||
}
|
|
||||||
|
|
||||||
method call: aFunctionName withSig: aString withArgs: anArray
|
|
||||||
{
|
|
||||||
| f |
|
|
||||||
|
|
||||||
## f := self.funcs at: aFunctionName.
|
|
||||||
## f isNil ifTrue: [
|
|
||||||
## f := self privateGetSymbol: aFunctionName in: self.handle.
|
|
||||||
## f isNil ifTrue: [ self error: 'No such function' ].
|
|
||||||
## self.funcs at: aFunctionName put: f.
|
|
||||||
## ].
|
|
||||||
f := self privateGetSymbol: aFunctionName in: self.handle.
|
|
||||||
f isNil ifTrue: [ self error: 'No such function' ].
|
|
||||||
|
|
||||||
^self privateCall: f withSig: aString withArgs: anArray
|
|
||||||
}
|
|
||||||
|
|
||||||
method privateOpen: aString
|
|
||||||
{
|
|
||||||
<primitive: #_ffi_open>
|
|
||||||
^nil. ## TODO: Error signal: 'can not open'
|
|
||||||
}
|
|
||||||
|
|
||||||
method privateClose: aHandle
|
|
||||||
{
|
|
||||||
<primitive: #_ffi_close>
|
|
||||||
}
|
|
||||||
|
|
||||||
method privateCall: aSymbol withSig: aString withArgs: anArray
|
|
||||||
{
|
|
||||||
<primitive: #_ffi_call>
|
|
||||||
}
|
|
||||||
|
|
||||||
method privateGetSymbol: aString in: aHandle
|
|
||||||
{
|
|
||||||
<primitive: #_ffi_getsym>
|
|
||||||
^nil.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(* -------------------------------------------------------------------------- *)
|
|
||||||
|
|
||||||
#include 'Stdio.moo'.
|
#include 'Stdio.moo'.
|
||||||
#include 'Console.moo'.
|
#include 'Console.moo'.
|
||||||
|
@ -60,14 +60,14 @@ libmoo_la_LIBADD = $(LIBADD_LIB_COMMON)
|
|||||||
|
|
||||||
if ENABLE_STATIC_MODULE
|
if ENABLE_STATIC_MODULE
|
||||||
libmoo_la_LDFLAGS += -L$(abs_builddir)/../mod
|
libmoo_la_LDFLAGS += -L$(abs_builddir)/../mod
|
||||||
libmoo_la_LIBADD += -lmoo-console -lmoo-stdio -ltermcap
|
libmoo_la_LIBADD += -lmoo-console -lmoo-stdio #-ltermcap
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bin_PROGRAMS = moo
|
bin_PROGRAMS = moo
|
||||||
moo_SOURCES = main.c
|
moo_SOURCES = main.c
|
||||||
moo_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
moo_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
||||||
moo_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
moo_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
||||||
moo_LDADD = $(LIBADD_LIB_COMMON) -lmoo #-ldyncall_s
|
moo_LDADD = $(LIBADD_LIB_COMMON) -lmoo
|
||||||
|
|
||||||
|
|
||||||
install-data-hook:
|
install-data-hook:
|
||||||
|
@ -84,7 +84,7 @@ host_triplet = @host@
|
|||||||
@WIN32_TRUE@am__append_1 = -DMOO_DEFAULT_MODPREFIX=\"libmoo-\" -DMOO_DEFAULT_MODPOSTFIX=\"-1\"
|
@WIN32_TRUE@am__append_1 = -DMOO_DEFAULT_MODPREFIX=\"libmoo-\" -DMOO_DEFAULT_MODPOSTFIX=\"-1\"
|
||||||
@WIN32_FALSE@am__append_2 = -DMOO_DEFAULT_MODPREFIX=\"$(libdir)/libmoo-\" -DMOO_DEFAULT_MODPOSTFIX=\"\"
|
@WIN32_FALSE@am__append_2 = -DMOO_DEFAULT_MODPREFIX=\"$(libdir)/libmoo-\" -DMOO_DEFAULT_MODPOSTFIX=\"\"
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am__append_3 = -L$(abs_builddir)/../mod
|
@ENABLE_STATIC_MODULE_TRUE@am__append_3 = -L$(abs_builddir)/../mod
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am__append_4 = -lmoo-console -lmoo-stdio -ltermcap
|
@ENABLE_STATIC_MODULE_TRUE@am__append_4 = -lmoo-console -lmoo-stdio #-ltermcap
|
||||||
bin_PROGRAMS = moo$(EXEEXT)
|
bin_PROGRAMS = moo$(EXEEXT)
|
||||||
subdir = lib
|
subdir = lib
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||||
@ -430,7 +430,7 @@ libmoo_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_4)
|
|||||||
moo_SOURCES = main.c
|
moo_SOURCES = main.c
|
||||||
moo_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
moo_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
||||||
moo_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
moo_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
||||||
moo_LDADD = $(LIBADD_LIB_COMMON) -lmoo #-ldyncall_s
|
moo_LDADD = $(LIBADD_LIB_COMMON) -lmoo
|
||||||
all: moo-cfg.h
|
all: moo-cfg.h
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||||
|
|
||||||
|
295
moo/lib/exec.c
295
moo/lib/exec.c
@ -50,11 +50,6 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_DYNCALL)
|
|
||||||
/* TODO: defined dcAllocMem and dcFreeMeme before builing the dynload and dyncall library */
|
|
||||||
# include <dyncall.h> /* TODO: remove this. make dyXXXX calls to callbacks */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define PROC_STATE_RUNNING 3
|
#define PROC_STATE_RUNNING 3
|
||||||
#define PROC_STATE_WAITING 2
|
#define PROC_STATE_WAITING 2
|
||||||
@ -76,7 +71,6 @@
|
|||||||
(MOO_OOP_TO_SMOOI((x)->heap_ftime_sec) == MOO_OOP_TO_SMOOI((y)->heap_ftime_sec) && MOO_OOP_TO_SMOOI((x)->heap_ftime_nsec) < MOO_OOP_TO_SMOOI((y)->heap_ftime_nsec)) \
|
(MOO_OOP_TO_SMOOI((x)->heap_ftime_sec) == MOO_OOP_TO_SMOOI((y)->heap_ftime_sec) && MOO_OOP_TO_SMOOI((x)->heap_ftime_nsec) < MOO_OOP_TO_SMOOI((y)->heap_ftime_nsec)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
#define LOAD_IP(moo, v_ctx) ((moo)->ip = MOO_OOP_TO_SMOOI((v_ctx)->ip))
|
#define LOAD_IP(moo, v_ctx) ((moo)->ip = MOO_OOP_TO_SMOOI((v_ctx)->ip))
|
||||||
#define STORE_IP(moo, v_ctx) ((v_ctx)->ip = MOO_SMOOI_TO_OOP((moo)->ip))
|
#define STORE_IP(moo, v_ctx) ((v_ctx)->ip = MOO_SMOOI_TO_OOP((moo)->ip))
|
||||||
|
|
||||||
@ -2658,287 +2652,6 @@ static moo_pfrc_t pf_error_as_string (moo_t* moo, moo_ooi_t nargs)
|
|||||||
return MOO_PF_SUCCESS;
|
return MOO_PF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static moo_pfrc_t pf_ffi_open (moo_t* moo, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
moo_oop_t rcv, arg;
|
|
||||||
void* handle;
|
|
||||||
|
|
||||||
MOO_ASSERT (moo, nargs == 1);
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
|
||||||
arg = MOO_STACK_GETARG(moo, nargs, 0);
|
|
||||||
|
|
||||||
if (!MOO_ISTYPEOF(moo, arg, MOO_OBJ_TYPE_CHAR))
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!moo->vmprim.dl_open)
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* TODO: check null-termination... */
|
|
||||||
handle = moo->vmprim.dl_open (moo, ((moo_oop_char_t)arg)->slot);
|
|
||||||
if (!handle)
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOO_STACK_POP (moo);
|
|
||||||
/* TODO: how to hold an address? as an integer???? or a byte array? fix this not to loose accuracy*/
|
|
||||||
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(handle));
|
|
||||||
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_ffi_close (moo_t* moo, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
moo_oop_t rcv, arg;
|
|
||||||
void* handle;
|
|
||||||
|
|
||||||
MOO_ASSERT (moo, nargs == 1);
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GETRCV(moo, nargs);
|
|
||||||
arg = MOO_STACK_GETARG(moo, nargs, 0);
|
|
||||||
|
|
||||||
|
|
||||||
if (!MOO_OOP_IS_SMOOI(arg))
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOO_STACK_POP (moo);
|
|
||||||
|
|
||||||
handle = (void*)MOO_OOP_TO_SMOOI(arg); /* TODO: how to store void* ???. fix this not to loose accuracy */
|
|
||||||
if (moo->vmprim.dl_close) moo->vmprim.dl_close (moo, handle);
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_ffi_call (moo_t* moo, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
#if defined(USE_DYNCALL)
|
|
||||||
moo_oop_t rcv, fun, sig, args;
|
|
||||||
|
|
||||||
MOO_ASSERT (moo, nargs == 3);
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GET(moo, moo->sp - 3);
|
|
||||||
fun = MOO_STACK_GET(moo, moo->sp - 2);
|
|
||||||
sig = MOO_STACK_GET(moo, moo->sp - 1);
|
|
||||||
args = MOO_STACK_GET(moo, moo->sp);
|
|
||||||
|
|
||||||
if (!MOO_OOP_IS_SMOOI(fun)) /* TODO: how to store pointer */
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MOO_ISTYPEOF(moo, sig, MOO_OBJ_TYPE_CHAR) || MOO_OBJ_GET_SIZE(sig) <= 0)
|
|
||||||
{
|
|
||||||
MOO_DEBUG0 (moo, "FFI: wrong signature...\n");
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MOO_CLASSOF(moo,args) != moo->_array) /* TODO: check if arr is a kind of array??? or check if it's indexed */
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
moo_oow_t i;
|
|
||||||
DCCallVM* dc;
|
|
||||||
void* f;
|
|
||||||
moo_oop_oop_t arr;
|
|
||||||
int mode_set;
|
|
||||||
|
|
||||||
f = MOO_OOP_TO_SMOOI(fun); /* TODO: decode pointer properly */
|
|
||||||
arr = (moo_oop_oop_t)args;
|
|
||||||
|
|
||||||
dc = dcNewCallVM (4096);
|
|
||||||
if (!dc) return MOO_PF_HARD_FAILURE; /* TODO: proper error handling */
|
|
||||||
|
|
||||||
MOO_DEBUG1 (moo, "FFI: CALLING............%p\n", f);
|
|
||||||
/*dcMode (dc, DC_CALL_C_DEFAULT);
|
|
||||||
dcReset (dc);*/
|
|
||||||
|
|
||||||
/*for (i = 2; i < MOO_OBJ_GET_SIZE(sig); i++)
|
|
||||||
{
|
|
||||||
if (((moo_oop_char_t)sig)->slot[i] == '|')
|
|
||||||
{
|
|
||||||
dcMode (dc, DC_CALL_C_ELLIPSIS);
|
|
||||||
MOO_DEBUG0 (moo, "CALL MODE 111 ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
|
||||||
mode_set = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!mode_set) */ dcMode (dc, DC_CALL_C_DEFAULT);
|
|
||||||
|
|
||||||
for (i = 2; i < MOO_OBJ_GET_SIZE(sig); i++)
|
|
||||||
{
|
|
||||||
MOO_DEBUG1 (moo, "FFI: CALLING ARG %c\n", ((moo_oop_char_t)sig)->slot[i]);
|
|
||||||
switch (((moo_oop_char_t)sig)->slot[i])
|
|
||||||
{
|
|
||||||
/* TODO: support more types... */
|
|
||||||
/*
|
|
||||||
case '|':
|
|
||||||
dcMode (dc, DC_CALL_C_ELLIPSIS_VARARGS);
|
|
||||||
MOO_DEBUG2 (moo, "CALL MODE 222 ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
/* TODO: sanity check on the argument type */
|
|
||||||
dcArgChar (dc, MOO_OOP_TO_CHAR(arr->slot[i - 2]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
dcArgInt (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'l':
|
|
||||||
dcArgLong (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'L':
|
|
||||||
dcArgLongLong (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 's':
|
|
||||||
{
|
|
||||||
moo_oow_t bcslen, ucslen;
|
|
||||||
moo_bch_t bcs[1024];
|
|
||||||
|
|
||||||
ucslen = MOO_OBJ_GET_SIZE(arr->slot[i - 2]);
|
|
||||||
moo_convootobchars (moo, ((moo_oop_char_t)arr->slot[i - 2])->slot, &ucslen, bcs, &bcslen); /* proper string conversion */
|
|
||||||
|
|
||||||
bcs[bcslen] = '\0';
|
|
||||||
dcArgPointer (dc, bcs);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* TODO: ERROR HANDLING */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
MOO_STACK_POPS (moo, nargs);
|
|
||||||
|
|
||||||
switch (((moo_oop_char_t)sig)->slot[0])
|
|
||||||
{
|
|
||||||
/* TODO: support more types... */
|
|
||||||
/* TODO: proper return value conversion */
|
|
||||||
case 'c':
|
|
||||||
{
|
|
||||||
char r = dcCallChar (dc, f);
|
|
||||||
MOO_STACK_SETTOP (moo, MOO_CHAR_TO_OOP(r));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
{
|
|
||||||
int r = dcCallInt (dc, f);
|
|
||||||
MOO_DEBUG1 (moo, "CALLED... %d\n", r);
|
|
||||||
MOO_DEBUG2 (moo, "CALL ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
|
||||||
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'l':
|
|
||||||
{
|
|
||||||
long r = dcCallLong (dc, f);
|
|
||||||
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'L':
|
|
||||||
{
|
|
||||||
long long r = dcCallLongLong (dc, f);
|
|
||||||
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 's':
|
|
||||||
{
|
|
||||||
moo_oow_t bcslen, ucslen;
|
|
||||||
moo_ooch_t ucs[1024];
|
|
||||||
moo_oop_t s;
|
|
||||||
char* r = dcCallPointer (dc, f);
|
|
||||||
|
|
||||||
bcslen = strlen(r);
|
|
||||||
moo_convbtooochars (moo, r, &bcslen, ucs, &ucslen); /* proper string conversion */
|
|
||||||
|
|
||||||
s = moo_makestring(moo, ucs, ucslen)
|
|
||||||
if (!s)
|
|
||||||
{
|
|
||||||
dcFree (dc);
|
|
||||||
return MOO_PF_HARD_FAILURE; /* TODO: proper error h andling */
|
|
||||||
}
|
|
||||||
|
|
||||||
MOO_STACK_SETTOP (moo, s);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* TOOD: ERROR HANDLING */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
dcFree (dc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
#else
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static moo_pfrc_t pf_ffi_getsym (moo_t* moo, moo_ooi_t nargs)
|
|
||||||
{
|
|
||||||
moo_oop_t rcv, hnd, fun;
|
|
||||||
void* sym;
|
|
||||||
|
|
||||||
MOO_ASSERT (moo, nargs == 2);
|
|
||||||
|
|
||||||
rcv = MOO_STACK_GET(moo, moo->sp - 2);
|
|
||||||
fun = MOO_STACK_GET(moo, moo->sp - 1);
|
|
||||||
hnd = MOO_STACK_GET(moo, moo->sp);
|
|
||||||
|
|
||||||
if (!MOO_OOP_IS_SMOOI(hnd)) /* TODO: how to store pointer */
|
|
||||||
{
|
|
||||||
/* TODO: more info on error */
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MOO_ISTYPEOF(moo,fun,MOO_OBJ_TYPE_CHAR))
|
|
||||||
{
|
|
||||||
MOO_DEBUG0 (moo, "wrong function name...\n");
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!moo->vmprim.dl_getsym)
|
|
||||||
{
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
sym = moo->vmprim.dl_getsym (moo, (void*)MOO_OOP_TO_SMOOI(hnd), ((moo_oop_char_t)fun)->slot);
|
|
||||||
if (!sym)
|
|
||||||
{
|
|
||||||
return MOO_PF_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: how to hold an address? as an integer???? or a byte array? */
|
|
||||||
MOO_STACK_SETRET (moo, nargs, MOO_SMOOI_TO_OOP(sym));
|
|
||||||
|
|
||||||
return MOO_PF_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX_NARGS MOO_TYPE_MAX(moo_ooi_t)
|
#define MAX_NARGS MOO_TYPE_MAX(moo_ooi_t)
|
||||||
struct pf_t
|
struct pf_t
|
||||||
@ -3019,13 +2732,7 @@ static pf_t pftab[] =
|
|||||||
|
|
||||||
{ 0, 0, pf_error_as_character, "_error_as_character" },
|
{ 0, 0, pf_error_as_character, "_error_as_character" },
|
||||||
{ 0, 0, pf_error_as_integer, "_error_as_integer" },
|
{ 0, 0, pf_error_as_integer, "_error_as_integer" },
|
||||||
{ 0, 0, pf_error_as_string, "_error_as_string" },
|
{ 0, 0, pf_error_as_string, "_error_as_string" }
|
||||||
|
|
||||||
{ 1, 1, pf_ffi_open, "_ffi_open" },
|
|
||||||
{ 1, 1, pf_ffi_close, "_ffi_close" },
|
|
||||||
{ 2, 2, pf_ffi_getsym, "_ffi_getsym" },
|
|
||||||
{ 3, 3, pf_ffi_call, "_ffi_call" }
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int moo_getpfnum (moo_t* moo, const moo_ooch_t* ptr, moo_oow_t len)
|
int moo_getpfnum (moo_t* moo, const moo_ooch_t* ptr, moo_oow_t len)
|
||||||
|
@ -20,14 +20,10 @@ if ENABLE_STATIC_MODULE
|
|||||||
##################################################
|
##################################################
|
||||||
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
||||||
##################################################
|
##################################################
|
||||||
|
LDFLAGS_COMMON =
|
||||||
|
LIBADD_COMMON =
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libmoo-console.la libmoo-stdio.la
|
noinst_LTLIBRARIES = libmoo-console.la libmoo-ffi.la libmoo-stdio.la
|
||||||
|
|
||||||
libmoo_console_la_SOURCES = console.c
|
|
||||||
libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
|
|
||||||
libmoo_stdio_la_SOURCES = stdio.c
|
|
||||||
libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
@ -38,19 +34,22 @@ LDFLAGS_COMMON = -L$(abs_builddir)/../lib -L$(libdir) -version-info 1:0:0 -no-un
|
|||||||
LIBADD_COMMON = -lmoo
|
LIBADD_COMMON = -lmoo
|
||||||
|
|
||||||
pkgmodexecdir = $(libdir)
|
pkgmodexecdir = $(libdir)
|
||||||
|
pkgmodexec_LTLIBRARIES = libmoo-console.la libmoo-ffi.la libmoo-stdio.la
|
||||||
|
|
||||||
pkgmodexec_LTLIBRARIES = libmoo-stdio.la libmoo-console.la
|
endif
|
||||||
|
|
||||||
libmoo_stdio_la_SOURCES = stdio.c _stdio.h
|
|
||||||
libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
libmoo_stdio_la_LDFLAGS = $(LDFLAGS_COMMON)
|
|
||||||
libmoo_stdio_la_LIBADD = $(LIBADD_COMMON)
|
|
||||||
|
|
||||||
libmoo_console_la_SOURCES = console.c console.h
|
libmoo_console_la_SOURCES = console.c console.h
|
||||||
libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
libmoo_console_la_LDFLAGS = $(LDFLAGS_COMMON)
|
libmoo_console_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
libmoo_console_la_LIBADD = $(LIBADD_COMMON) -ltermcap
|
libmoo_console_la_LIBADD = $(LIBADD_COMMON) -ltermcap
|
||||||
|
|
||||||
endif
|
libmoo_ffi_la_SOURCES = ffi.c _ffi.h
|
||||||
|
libmoo_ffi_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
|
libmoo_ffi_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
|
libmoo_ffi_la_LIBADD = $(LIBADD_COMMON) -ldyncall_s
|
||||||
|
|
||||||
|
libmoo_stdio_la_SOURCES = stdio.c _stdio.h
|
||||||
|
libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
|
libmoo_stdio_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
|
libmoo_stdio_la_LIBADD = $(LIBADD_COMMON)
|
||||||
|
|
||||||
|
@ -129,13 +129,8 @@ am__uninstall_files_from_dir = { \
|
|||||||
am__installdirs = "$(DESTDIR)$(pkgmodexecdir)"
|
am__installdirs = "$(DESTDIR)$(pkgmodexecdir)"
|
||||||
LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkgmodexec_LTLIBRARIES)
|
LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkgmodexec_LTLIBRARIES)
|
||||||
am__DEPENDENCIES_1 =
|
am__DEPENDENCIES_1 =
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_console_la_DEPENDENCIES = \
|
libmoo_console_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
am_libmoo_console_la_OBJECTS = libmoo_console_la-console.lo
|
||||||
am__libmoo_console_la_SOURCES_DIST = console.c console.h
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@am_libmoo_console_la_OBJECTS = \
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@ libmoo_console_la-console.lo
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am_libmoo_console_la_OBJECTS = \
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@ libmoo_console_la-console.lo
|
|
||||||
libmoo_console_la_OBJECTS = $(am_libmoo_console_la_OBJECTS)
|
libmoo_console_la_OBJECTS = $(am_libmoo_console_la_OBJECTS)
|
||||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
@ -148,13 +143,17 @@ libmoo_console_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
|||||||
@ENABLE_STATIC_MODULE_FALSE@am_libmoo_console_la_rpath = -rpath \
|
@ENABLE_STATIC_MODULE_FALSE@am_libmoo_console_la_rpath = -rpath \
|
||||||
@ENABLE_STATIC_MODULE_FALSE@ $(pkgmodexecdir)
|
@ENABLE_STATIC_MODULE_FALSE@ $(pkgmodexecdir)
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am_libmoo_console_la_rpath =
|
@ENABLE_STATIC_MODULE_TRUE@am_libmoo_console_la_rpath =
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_stdio_la_DEPENDENCIES = \
|
libmoo_ffi_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
am_libmoo_ffi_la_OBJECTS = libmoo_ffi_la-ffi.lo
|
||||||
am__libmoo_stdio_la_SOURCES_DIST = stdio.c _stdio.h
|
libmoo_ffi_la_OBJECTS = $(am_libmoo_ffi_la_OBJECTS)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@am_libmoo_stdio_la_OBJECTS = \
|
libmoo_ffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||||
@ENABLE_STATIC_MODULE_FALSE@ libmoo_stdio_la-stdio.lo
|
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am_libmoo_stdio_la_OBJECTS = \
|
$(libmoo_ffi_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
@ENABLE_STATIC_MODULE_TRUE@ libmoo_stdio_la-stdio.lo
|
@ENABLE_STATIC_MODULE_FALSE@am_libmoo_ffi_la_rpath = -rpath \
|
||||||
|
@ENABLE_STATIC_MODULE_FALSE@ $(pkgmodexecdir)
|
||||||
|
@ENABLE_STATIC_MODULE_TRUE@am_libmoo_ffi_la_rpath =
|
||||||
|
libmoo_stdio_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
|
am_libmoo_stdio_la_OBJECTS = libmoo_stdio_la-stdio.lo
|
||||||
libmoo_stdio_la_OBJECTS = $(am_libmoo_stdio_la_OBJECTS)
|
libmoo_stdio_la_OBJECTS = $(am_libmoo_stdio_la_OBJECTS)
|
||||||
libmoo_stdio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
libmoo_stdio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||||
@ -197,9 +196,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
|||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||||
am__v_CCLD_1 =
|
am__v_CCLD_1 =
|
||||||
SOURCES = $(libmoo_console_la_SOURCES) $(libmoo_stdio_la_SOURCES)
|
SOURCES = $(libmoo_console_la_SOURCES) $(libmoo_ffi_la_SOURCES) \
|
||||||
DIST_SOURCES = $(am__libmoo_console_la_SOURCES_DIST) \
|
$(libmoo_stdio_la_SOURCES)
|
||||||
$(am__libmoo_stdio_la_SOURCES_DIST)
|
DIST_SOURCES = $(libmoo_console_la_SOURCES) $(libmoo_ffi_la_SOURCES) \
|
||||||
|
$(libmoo_stdio_la_SOURCES)
|
||||||
am__can_run_installinfo = \
|
am__can_run_installinfo = \
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
n|no|NO) false;; \
|
n|no|NO) false;; \
|
||||||
@ -389,30 +389,32 @@ CPPFLAGS_COMMON = -I$(abs_builddir) -I$(abs_builddir)/../lib \
|
|||||||
-I$(abs_srcdir) -I$(abs_srcdir)/../lib -I$(includedir) -fPIC \
|
-I$(abs_srcdir) -I$(abs_srcdir)/../lib -I$(includedir) -fPIC \
|
||||||
$(am__append_1) $(am__append_2)
|
$(am__append_1) $(am__append_2)
|
||||||
|
|
||||||
##################################################
|
|
||||||
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
|
||||||
##################################################
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@noinst_LTLIBRARIES = libmoo-console.la libmoo-stdio.la
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_console_la_SOURCES = console.c console.h
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@libmoo_console_la_SOURCES = console.c
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_stdio_la_SOURCES = stdio.c _stdio.h
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@libmoo_stdio_la_SOURCES = stdio.c
|
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
@ENABLE_STATIC_MODULE_TRUE@libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# DYNAMIC MODULES
|
# DYNAMIC MODULES
|
||||||
##################################################
|
##################################################
|
||||||
@ENABLE_STATIC_MODULE_FALSE@LDFLAGS_COMMON = -L$(abs_builddir)/../lib -L$(libdir) -version-info 1:0:0 -no-undefined
|
@ENABLE_STATIC_MODULE_FALSE@LDFLAGS_COMMON = -L$(abs_builddir)/../lib -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
||||||
|
##################################################
|
||||||
|
@ENABLE_STATIC_MODULE_TRUE@LDFLAGS_COMMON =
|
||||||
@ENABLE_STATIC_MODULE_FALSE@LIBADD_COMMON = -lmoo
|
@ENABLE_STATIC_MODULE_FALSE@LIBADD_COMMON = -lmoo
|
||||||
|
@ENABLE_STATIC_MODULE_TRUE@LIBADD_COMMON =
|
||||||
|
@ENABLE_STATIC_MODULE_TRUE@noinst_LTLIBRARIES = libmoo-console.la libmoo-ffi.la libmoo-stdio.la
|
||||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexecdir = $(libdir)
|
@ENABLE_STATIC_MODULE_FALSE@pkgmodexecdir = $(libdir)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libmoo-stdio.la libmoo-console.la
|
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libmoo-console.la libmoo-ffi.la libmoo-stdio.la
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_stdio_la_LDFLAGS = $(LDFLAGS_COMMON)
|
libmoo_console_la_SOURCES = console.c console.h
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_stdio_la_LIBADD = $(LIBADD_COMMON)
|
libmoo_console_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_console_la_LDFLAGS = $(LDFLAGS_COMMON)
|
libmoo_console_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
@ENABLE_STATIC_MODULE_FALSE@libmoo_console_la_LIBADD = $(LIBADD_COMMON) -ltermcap
|
libmoo_console_la_LIBADD = $(LIBADD_COMMON) -ltermcap
|
||||||
|
libmoo_ffi_la_SOURCES = ffi.c _ffi.h
|
||||||
|
libmoo_ffi_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
|
libmoo_ffi_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
|
libmoo_ffi_la_LIBADD = $(LIBADD_COMMON) -ldyncall_s
|
||||||
|
libmoo_stdio_la_SOURCES = stdio.c _stdio.h
|
||||||
|
libmoo_stdio_la_CPPFLAGS = $(CPPFLAGS_COMMON)
|
||||||
|
libmoo_stdio_la_LDFLAGS = $(LDFLAGS_COMMON)
|
||||||
|
libmoo_stdio_la_LIBADD = $(LIBADD_COMMON)
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
@ -497,6 +499,9 @@ clean-pkgmodexecLTLIBRARIES:
|
|||||||
libmoo-console.la: $(libmoo_console_la_OBJECTS) $(libmoo_console_la_DEPENDENCIES) $(EXTRA_libmoo_console_la_DEPENDENCIES)
|
libmoo-console.la: $(libmoo_console_la_OBJECTS) $(libmoo_console_la_DEPENDENCIES) $(EXTRA_libmoo_console_la_DEPENDENCIES)
|
||||||
$(AM_V_CCLD)$(libmoo_console_la_LINK) $(am_libmoo_console_la_rpath) $(libmoo_console_la_OBJECTS) $(libmoo_console_la_LIBADD) $(LIBS)
|
$(AM_V_CCLD)$(libmoo_console_la_LINK) $(am_libmoo_console_la_rpath) $(libmoo_console_la_OBJECTS) $(libmoo_console_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
libmoo-ffi.la: $(libmoo_ffi_la_OBJECTS) $(libmoo_ffi_la_DEPENDENCIES) $(EXTRA_libmoo_ffi_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(libmoo_ffi_la_LINK) $(am_libmoo_ffi_la_rpath) $(libmoo_ffi_la_OBJECTS) $(libmoo_ffi_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
libmoo-stdio.la: $(libmoo_stdio_la_OBJECTS) $(libmoo_stdio_la_DEPENDENCIES) $(EXTRA_libmoo_stdio_la_DEPENDENCIES)
|
libmoo-stdio.la: $(libmoo_stdio_la_OBJECTS) $(libmoo_stdio_la_DEPENDENCIES) $(EXTRA_libmoo_stdio_la_DEPENDENCIES)
|
||||||
$(AM_V_CCLD)$(libmoo_stdio_la_LINK) $(am_libmoo_stdio_la_rpath) $(libmoo_stdio_la_OBJECTS) $(libmoo_stdio_la_LIBADD) $(LIBS)
|
$(AM_V_CCLD)$(libmoo_stdio_la_LINK) $(am_libmoo_stdio_la_rpath) $(libmoo_stdio_la_OBJECTS) $(libmoo_stdio_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
@ -507,6 +512,7 @@ distclean-compile:
|
|||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoo_console_la-console.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoo_console_la-console.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoo_ffi_la-ffi.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoo_stdio_la-stdio.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoo_stdio_la-stdio.Plo@am__quote@
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@ -540,6 +546,13 @@ libmoo_console_la-console.lo: console.c
|
|||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_console_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmoo_console_la-console.lo `test -f 'console.c' || echo '$(srcdir)/'`console.c
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_console_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmoo_console_la-console.lo `test -f 'console.c' || echo '$(srcdir)/'`console.c
|
||||||
|
|
||||||
|
libmoo_ffi_la-ffi.lo: ffi.c
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_ffi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmoo_ffi_la-ffi.lo -MD -MP -MF $(DEPDIR)/libmoo_ffi_la-ffi.Tpo -c -o libmoo_ffi_la-ffi.lo `test -f 'ffi.c' || echo '$(srcdir)/'`ffi.c
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmoo_ffi_la-ffi.Tpo $(DEPDIR)/libmoo_ffi_la-ffi.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ffi.c' object='libmoo_ffi_la-ffi.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_ffi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmoo_ffi_la-ffi.lo `test -f 'ffi.c' || echo '$(srcdir)/'`ffi.c
|
||||||
|
|
||||||
libmoo_stdio_la-stdio.lo: stdio.c
|
libmoo_stdio_la-stdio.lo: stdio.c
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_stdio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmoo_stdio_la-stdio.lo -MD -MP -MF $(DEPDIR)/libmoo_stdio_la-stdio.Tpo -c -o libmoo_stdio_la-stdio.lo `test -f 'stdio.c' || echo '$(srcdir)/'`stdio.c
|
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmoo_stdio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmoo_stdio_la-stdio.lo -MD -MP -MF $(DEPDIR)/libmoo_stdio_la-stdio.Tpo -c -o libmoo_stdio_la-stdio.lo `test -f 'stdio.c' || echo '$(srcdir)/'`stdio.c
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmoo_stdio_la-stdio.Tpo $(DEPDIR)/libmoo_stdio_la-stdio.Plo
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmoo_stdio_la-stdio.Tpo $(DEPDIR)/libmoo_stdio_la-stdio.Plo
|
||||||
|
43
moo/mod/_ffi.h
Normal file
43
moo/mod/_ffi.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
Copyright (c) 2006-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MOO_LIB_MOD_FFI_H_
|
||||||
|
#define _MOO_LIB_MOD_FFI_H_
|
||||||
|
|
||||||
|
#include <moo.h>
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MOO_EXPORT int moo_mod_ffi (moo_t* moo, moo_mod_t* mod);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
326
moo/mod/ffi.c
Normal file
326
moo/mod/ffi.c
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
Copyright (c) 2014-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
#include "_ffi.h"
|
||||||
|
#include <moo-utl.h>
|
||||||
|
|
||||||
|
#if defined(USE_DYNCALL)
|
||||||
|
/* TODO: defined dcAllocMem and dcFreeMeme before builing the dynload and dyncall library */
|
||||||
|
# include <dyncall.h> /* TODO: remove this. make dyXXXX calls to callbacks */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
{ 1, 1, pf_ffi_open, "_ffi_open" },
|
||||||
|
{ 1, 1, pf_ffi_close, "_ffi_close" },
|
||||||
|
{ 2, 2, pf_ffi_getsym, "_ffi_getsym" },
|
||||||
|
{ 3, 3, pf_ffi_call, "_ffi_call" }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_ffi_open (moo_t* moo, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
moo_oop_t rcv, arg;
|
||||||
|
void* handle;
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, nargs == 1);
|
||||||
|
|
||||||
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
|
arg = MOO_STACK_GETARG(moo, nargs, 0);
|
||||||
|
|
||||||
|
if (!MOO_ISTYPEOF(moo, arg, MOO_OBJ_TYPE_CHAR))
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!moo->vmprim.dl_open)
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: check null-termination... */
|
||||||
|
handle = moo->vmprim.dl_open (moo, ((moo_oop_char_t)arg)->slot);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOO_STACK_POP (moo);
|
||||||
|
/* TODO: how to hold an address? as an integer???? or a byte array? fix this not to loose accuracy*/
|
||||||
|
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(handle));
|
||||||
|
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_ffi_close (moo_t* moo, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
moo_oop_t rcv, arg;
|
||||||
|
void* handle;
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, nargs == 1);
|
||||||
|
|
||||||
|
rcv = MOO_STACK_GETRCV(moo, nargs);
|
||||||
|
arg = MOO_STACK_GETARG(moo, nargs, 0);
|
||||||
|
|
||||||
|
|
||||||
|
if (!MOO_OOP_IS_SMOOI(arg))
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOO_STACK_POP (moo);
|
||||||
|
|
||||||
|
handle = (void*)MOO_OOP_TO_SMOOI(arg); /* TODO: how to store void* ???. fix this not to loose accuracy */
|
||||||
|
if (moo->vmprim.dl_close) moo->vmprim.dl_close (moo, handle);
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_ffi_call (moo_t* moo, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
#if defined(USE_DYNCALL)
|
||||||
|
moo_oop_t rcv, fun, sig, args;
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, nargs == 3);
|
||||||
|
|
||||||
|
rcv = MOO_STACK_GET(moo, moo->sp - 3);
|
||||||
|
fun = MOO_STACK_GET(moo, moo->sp - 2);
|
||||||
|
sig = MOO_STACK_GET(moo, moo->sp - 1);
|
||||||
|
args = MOO_STACK_GET(moo, moo->sp);
|
||||||
|
|
||||||
|
if (!MOO_OOP_IS_SMOOI(fun)) /* TODO: how to store pointer */
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!MOO_ISTYPEOF(moo, sig, MOO_OBJ_TYPE_CHAR) || MOO_OBJ_GET_SIZE(sig) <= 0)
|
||||||
|
{
|
||||||
|
MOO_DEBUG0 (moo, "FFI: wrong signature...\n");
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MOO_CLASSOF(moo,args) != moo->_array) /* TODO: check if arr is a kind of array??? or check if it's indexed */
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
moo_oow_t i;
|
||||||
|
DCCallVM* dc;
|
||||||
|
void* f;
|
||||||
|
moo_oop_oop_t arr;
|
||||||
|
int mode_set;
|
||||||
|
|
||||||
|
f = MOO_OOP_TO_SMOOI(fun); /* TODO: decode pointer properly */
|
||||||
|
arr = (moo_oop_oop_t)args;
|
||||||
|
|
||||||
|
dc = dcNewCallVM (4096);
|
||||||
|
if (!dc) return MOO_PF_HARD_FAILURE; /* TODO: proper error handling */
|
||||||
|
|
||||||
|
MOO_DEBUG1 (moo, "FFI: CALLING............%p\n", f);
|
||||||
|
/*dcMode (dc, DC_CALL_C_DEFAULT);
|
||||||
|
dcReset (dc);*/
|
||||||
|
|
||||||
|
/*for (i = 2; i < MOO_OBJ_GET_SIZE(sig); i++)
|
||||||
|
{
|
||||||
|
if (((moo_oop_char_t)sig)->slot[i] == '|')
|
||||||
|
{
|
||||||
|
dcMode (dc, DC_CALL_C_ELLIPSIS);
|
||||||
|
MOO_DEBUG0 (moo, "CALL MODE 111 ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
||||||
|
mode_set = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!mode_set) */ dcMode (dc, DC_CALL_C_DEFAULT);
|
||||||
|
|
||||||
|
for (i = 2; i < MOO_OBJ_GET_SIZE(sig); i++)
|
||||||
|
{
|
||||||
|
MOO_DEBUG1 (moo, "FFI: CALLING ARG %c\n", ((moo_oop_char_t)sig)->slot[i]);
|
||||||
|
switch (((moo_oop_char_t)sig)->slot[i])
|
||||||
|
{
|
||||||
|
/* TODO: support more types... */
|
||||||
|
/*
|
||||||
|
case '|':
|
||||||
|
dcMode (dc, DC_CALL_C_ELLIPSIS_VARARGS);
|
||||||
|
MOO_DEBUG2 (moo, "CALL MODE 222 ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
/* TODO: sanity check on the argument type */
|
||||||
|
dcArgChar (dc, MOO_OOP_TO_CHAR(arr->slot[i - 2]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
dcArgInt (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
dcArgLong (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
dcArgLongLong (dc, MOO_OOP_TO_SMOOI(arr->slot[i - 2]));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
{
|
||||||
|
moo_oow_t bcslen, ucslen;
|
||||||
|
moo_bch_t bcs[1024];
|
||||||
|
|
||||||
|
ucslen = MOO_OBJ_GET_SIZE(arr->slot[i - 2]);
|
||||||
|
moo_convootobchars (moo, ((moo_oop_char_t)arr->slot[i - 2])->slot, &ucslen, bcs, &bcslen); /* proper string conversion */
|
||||||
|
|
||||||
|
bcs[bcslen] = '\0';
|
||||||
|
dcArgPointer (dc, bcs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* TODO: ERROR HANDLING */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MOO_STACK_POPS (moo, nargs);
|
||||||
|
|
||||||
|
switch (((moo_oop_char_t)sig)->slot[0])
|
||||||
|
{
|
||||||
|
/* TODO: support more types... */
|
||||||
|
/* TODO: proper return value conversion */
|
||||||
|
case 'c':
|
||||||
|
{
|
||||||
|
char r = dcCallChar (dc, f);
|
||||||
|
MOO_STACK_SETTOP (moo, MOO_CHAR_TO_OOP(r));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
{
|
||||||
|
int r = dcCallInt (dc, f);
|
||||||
|
MOO_DEBUG1 (moo, "CALLED... %d\n", r);
|
||||||
|
MOO_DEBUG2 (moo, "CALL ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
|
||||||
|
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
{
|
||||||
|
long r = dcCallLong (dc, f);
|
||||||
|
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
{
|
||||||
|
long long r = dcCallLongLong (dc, f);
|
||||||
|
MOO_STACK_SETTOP (moo, MOO_SMOOI_TO_OOP(r));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
{
|
||||||
|
moo_oow_t bcslen, ucslen;
|
||||||
|
moo_ooch_t ucs[1024];
|
||||||
|
moo_oop_t s;
|
||||||
|
char* r = dcCallPointer (dc, f);
|
||||||
|
|
||||||
|
bcslen = strlen(r);
|
||||||
|
moo_convbtooochars (moo, r, &bcslen, ucs, &ucslen); /* proper string conversion */
|
||||||
|
|
||||||
|
s = moo_makestring(moo, ucs, ucslen)
|
||||||
|
if (!s)
|
||||||
|
{
|
||||||
|
dcFree (dc);
|
||||||
|
return MOO_PF_HARD_FAILURE; /* TODO: proper error h andling */
|
||||||
|
}
|
||||||
|
|
||||||
|
MOO_STACK_SETTOP (moo, s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* TOOD: ERROR HANDLING */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dcFree (dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
#else
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static moo_pfrc_t pf_ffi_getsym (moo_t* moo, moo_ooi_t nargs)
|
||||||
|
{
|
||||||
|
moo_oop_t rcv, hnd, fun;
|
||||||
|
void* sym;
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, nargs == 2);
|
||||||
|
|
||||||
|
rcv = MOO_STACK_GET(moo, moo->sp - 2);
|
||||||
|
fun = MOO_STACK_GET(moo, moo->sp - 1);
|
||||||
|
hnd = MOO_STACK_GET(moo, moo->sp);
|
||||||
|
|
||||||
|
if (!MOO_OOP_IS_SMOOI(hnd)) /* TODO: how to store pointer */
|
||||||
|
{
|
||||||
|
/* TODO: more info on error */
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!MOO_ISTYPEOF(moo,fun,MOO_OBJ_TYPE_CHAR))
|
||||||
|
{
|
||||||
|
MOO_DEBUG0 (moo, "wrong function name...\n");
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!moo->vmprim.dl_getsym)
|
||||||
|
{
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym = moo->vmprim.dl_getsym (moo, (void*)MOO_OOP_TO_SMOOI(hnd), ((moo_oop_char_t)fun)->slot);
|
||||||
|
if (!sym)
|
||||||
|
{
|
||||||
|
return MOO_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: how to hold an address? as an integer???? or a byte array? */
|
||||||
|
MOO_STACK_SETRET (moo, nargs, MOO_SMOOI_TO_OOP(sym));
|
||||||
|
|
||||||
|
return MOO_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user