added MOO_VMPRIM_OPENDL_PFMOD.

started refactoring ffi handling code
This commit is contained in:
hyunghwan.chung
2017-01-10 10:50:26 +00:00
parent 95885e4dec
commit faf6ca28e5
16 changed files with 419 additions and 219 deletions

View File

@ -60,7 +60,7 @@ libmoo_la_LIBADD = $(LIBADD_LIB_COMMON)
if ENABLE_STATIC_MODULE
libmoo_la_LDFLAGS += -L$(abs_builddir)/../mod
libmoo_la_LIBADD += -lmoo-console -lmoo-stdio #-ltermcap
libmoo_la_LIBADD += -lmoo-ffi -lmoo-console -lmoo-stdio
endif
bin_PROGRAMS = moo

View File

@ -84,7 +84,7 @@ host_triplet = @host@
@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=\"\"
@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-ffi -lmoo-console -lmoo-stdio
bin_PROGRAMS = moo$(EXEEXT)
subdir = lib
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \

38
moo/lib/icc.mak Normal file
View File

@ -0,0 +1,38 @@
#
# Intel 386(tm)/486(tm) C Code Builder(tm) Kit, Version 1.0
#
CFLAGS := /D__DOS__ /DMOO_ENABLE_STATIC_MODULE /DNDEBUG
LDFLAGS := /xnovm /xregion=12m
SRCS := \
bigint.c \
comp.c \
debug.c \
decode.c \
dic.c \
err.c \
exec.c \
gc.c \
heap.c \
logfmt.c \
moo.c \
obj.c \
proc.c \
rbt.c \
sym.c \
utf8.c \
utl.c \
main.c \
OBJS := $(SRCS:.c=.obj)
EXEFILE=moo.exe
MODFILE=..\mod\moomod.lib
RSPFILE := $(EXEFILE,B,S/.*/&.RSP/)
all: $(OBJS)
echo $(OBJS) > $(RSPFILE)
echo $(MODFILE) >> $(RSPFILE)
echo $(LDFLAGS) >> $(RSPFILE)
$(CC) @$(RSPFILE) /e $(EXEFILE)

View File

@ -66,27 +66,27 @@
# endif
#endif
#if !defined(MOO_DEFAULT_MODPREFIX)
#if !defined(MOO_DEFAULT_PFMODPREFIX)
# if defined(_WIN32)
# define MOO_DEFAULT_MODPREFIX "moo-"
# define MOO_DEFAULT_PFMODPREFIX "moo-"
# elif defined(__OS2__)
# define MOO_DEFAULT_MODPREFIX "moo"
# define MOO_DEFAULT_PFMODPREFIX "moo"
# elif defined(__DOS__)
# define MOO_DEFAULT_MODPREFIX "moo"
# define MOO_DEFAULT_PFMODPREFIX "moo"
# else
# define MOO_DEFAULT_MODPREFIX "libmoo-"
# define MOO_DEFAULT_PFMODPREFIX "libmoo-"
# endif
#endif
#if !defined(MOO_DEFAULT_MODPOSTFIX)
#if !defined(MOO_DEFAULT_PFMODPOSTFIX)
# if defined(_WIN32)
# define MOO_DEFAULT_MODPOSTFIX ""
# define MOO_DEFAULT_PFMODPOSTFIX ""
# elif defined(__OS2__)
# define MOO_DEFAULT_MODPOSTFIX ""
# define MOO_DEFAULT_PFMODPOSTFIX ""
# elif defined(__DOS__)
# define MOO_DEFAULT_MODPOSTFIX ""
# define MOO_DEFAULT_PFMODPOSTFIX ""
# else
# define MOO_DEFAULT_MODPOSTFIX ""
# define MOO_DEFAULT_PFMODPOSTFIX ""
# endif
#endif
@ -286,43 +286,54 @@ static moo_ooi_t input_handler (moo_t* moo, moo_iocmd_t cmd, moo_ioarg_t* arg)
}
/* ========================================================================= */
static void* dl_open (moo_t* moo, const moo_ooch_t* name)
static void* dl_open (moo_t* moo, const moo_ooch_t* name, int flags)
{
#if defined(USE_LTDL)
/* TODO: support various platforms */
moo_bch_t buf[1024]; /* TODO: use a proper path buffer */
moo_oow_t ucslen, bcslen;
moo_oow_t len;
void* handle;
/* TODO: using MODPREFIX isn't a good idea for all kind of modules.
* OK to use it for a primitive module.
* NOT OK to use it for a FFI target.
* Attempting /home/hyung-hwan/xxx/lib/libmoo-libc.so.6 followed by libc.so.6 is bad.
* Need to accept the type or flags?
*
* dl_open (moo, "xxxx", MOO_MOD_EXTERNAL);
* if external, don't use DEFAULT_MODPERFIX and MODPOSTFIX???
*/
len = moo_copybcstr (buf, MOO_COUNTOF(buf), MOO_DEFAULT_MODPREFIX);
/* TODO: proper error checking and overflow checking */
bcslen = MOO_COUNTOF(buf) - len;
moo_convootobcstr (moo, name, &ucslen, &buf[len], &bcslen);
moo_copybcstr (&buf[bcslen + len], MOO_COUNTOF(buf) - bcslen - len, MOO_DEFAULT_MODPOSTFIX);
handle = lt_dlopenext (buf);
if (!handle)
if (flags & MOO_VMPRIM_OPENDL_PFMOD)
{
buf[bcslen + len] = '\0';
handle = lt_dlopenext (&buf[len]);
if (handle) MOO_DEBUG2 (moo, "Opened module file %s handle %p\n", &buf[len], handle);
moo_oow_t len;
/* opening a primitive function module */
len = moo_copybcstr (buf, MOO_COUNTOF(buf), MOO_DEFAULT_PFMODPREFIX);
bcslen = MOO_COUNTOF(buf) - len;
if (moo_convootobcstr (moo, name, &ucslen, &buf[len], &bcslen) <= -1) return MOO_NULL;
moo_copybcstr (&buf[bcslen + len], MOO_COUNTOF(buf) - bcslen - len, MOO_DEFAULT_PFMODPOSTFIX);
handle = lt_dlopenext (buf);
if (!handle)
{
MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %hs\n", buf, name, lt_dlerror());
buf[bcslen + len] = '\0';
handle = lt_dlopenext (&buf[len]);
if (!handle) MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %s\n", &buf[len], name, lt_dlerror());
else MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", &buf[len], name, handle);
}
else
{
MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", buf, name, handle);
}
}
else
{
MOO_DEBUG2 (moo, "Opened module file %s handle %p\n", buf, handle);
/* opening a raw shared object */
bcslen = MOO_COUNTOF(buf);
if (moo_convootobcstr (moo, name, &ucslen, buf, &bcslen) <= -1) return MOO_NULL;
handle = lt_dlopenext (buf);
if (!handle)
{
MOO_DEBUG2 (moo, "Failed to open(ext) DL %hs - %hs\n", buf, lt_dlerror());
handle = lt_dlopen (buf);
if (!handle) MOO_DEBUG2 (moo, "Failed to open DL %hs - %s\n", buf, lt_dlerror());
else MOO_DEBUG2 (moo, "Opened DL %hs handle %p\n", buf, handle);
}
else MOO_DEBUG2 (moo, "Opened(ext) DL %hs handle %p\n", buf, handle);
}
return handle;
@ -335,7 +346,7 @@ static void* dl_open (moo_t* moo, const moo_ooch_t* name)
static void dl_close (moo_t* moo, void* handle)
{
MOO_DEBUG1 (moo, "Closed module handle %p\n", handle);
MOO_DEBUG1 (moo, "Closed DL handle %p\n", handle);
#if defined(USE_LTDL)
lt_dlclose (handle);
#elif defined(_WIN32)

View File

@ -44,6 +44,7 @@
* PUSH_CONTEXT, PUSH_INTLIT, PUSH_INTLIT, SEND_BLOCK_COPY */
#define MOO_USE_MAKE_BLOCK
#if !defined(NDEBUG)
/* this is for gc debugging */
#define MOO_DEBUG_GC
#define MOO_DEBUG_COMPILER
@ -51,6 +52,7 @@
/*#define MOO_DEBUG_VM_EXEC*/
#define MOO_DEBUG_BIGINT
#define MOO_PROFILE_VM
#endif
/* allow the caller to drive process switching by calling
* moo_switchprocess(). */
@ -929,25 +931,12 @@ moo_oop_t moo_instantiatewithtrailer (
/* ========================================================================= */
/* sym.c */
/* ========================================================================= */
moo_oop_t moo_makesymbol (
moo_t* moo,
const moo_ooch_t* ptr,
moo_oow_t len
);
moo_oop_t moo_findsymbol (
moo_t* moo,
const moo_ooch_t* ptr,
moo_oow_t len
);
moo_oop_t moo_makestring (
moo_t* moo,
const moo_ooch_t* ptr,
moo_oow_t len
);
/* ========================================================================= */
/* dic.c */
/* ========================================================================= */

View File

@ -350,6 +350,7 @@ void moo_freemem (moo_t* moo, void* ptr)
#if defined(MOO_ENABLE_STATIC_MODULE)
#include "../mod/console.h"
#include "../mod/_ffi.h"
#include "../mod/_stdio.h"
static struct
@ -360,7 +361,8 @@ static struct
static_modtab[] =
{
{ "console", moo_mod_console },
{ "stdio", moo_mod_stdio },
{ "ffi", moo_mod_ffi },
{ "stdio", moo_mod_stdio },
};
#endif
@ -450,7 +452,7 @@ moo_mod_data_t* moo_openmod (moo_t* moo, const moo_ooch_t* name, moo_oow_t namel
moo_copyoochars ((moo_ooch_t*)md.mod.name, name, namelen);
if (moo->vmprim.dl_open && moo->vmprim.dl_getsym && moo->vmprim.dl_close)
{
md.handle = moo->vmprim.dl_open (moo, &buf[MOD_PREFIX_LEN]);
md.handle = moo->vmprim.dl_open (moo, &buf[MOD_PREFIX_LEN], MOO_VMPRIM_OPENDL_PFMOD);
}
if (md.handle == MOO_NULL)

View File

@ -703,7 +703,13 @@ struct moo_heap_t
/* =========================================================================
* VIRTUAL MACHINE PRIMITIVES
* ========================================================================= */
typedef void* (*moo_vmprim_opendl_t) (moo_t* moo, const moo_ooch_t* name);
enum moo_vmprim_opendl_flag_t
{
MOO_VMPRIM_OPENDL_PFMOD = (1 << 0)
};
typedef enum moo_vmprim_opendl_flag_t moo_vmprim_opendl_flag_t;
typedef void* (*moo_vmprim_opendl_t) (moo_t* moo, const moo_ooch_t* name, int flags);
typedef void (*moo_vmprim_closedl_t) (moo_t* moo, void* handle);
typedef void* (*moo_vmprim_getdlsym_t) (moo_t* moo, void* handle, const moo_ooch_t* name);
@ -1277,7 +1283,24 @@ MOO_EXPORT int moo_invoke (
const moo_oocs_t* mthname
);
/* Temporary OOP management */
/* =========================================================================
* COMMON OBJECT MANAGEMENT FUNCTIONS
* ========================================================================= */
MOO_EXPORT moo_oop_t moo_makesymbol (
moo_t* moo,
const moo_ooch_t* ptr,
moo_oow_t len
);
MOO_EXPORT moo_oop_t moo_makestring (
moo_t* moo,
const moo_ooch_t* ptr,
moo_oow_t len
);
/* =========================================================================
* TEMPORARY OOP MANAGEMENT FUNCTIONS
* ========================================================================= */
MOO_EXPORT void moo_pushtmp (
moo_t* moo,
moo_oop_t* oop_ptr