added MOO_VMPRIM_OPENDL_PFMOD.
started refactoring ffi handling code
This commit is contained in:
@ -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
|
||||
|
@ -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
38
moo/lib/icc.mak
Normal 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)
|
@ -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)
|
||||
|
@ -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 */
|
||||
/* ========================================================================= */
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user