added MOO_IN_SMPTR_RANGE(), MOO_SMPTR_TO_OOP(), MOO_OOP_TO_SMPTR().
refactored ffi a bit more
This commit is contained in:
@ -488,6 +488,18 @@ moo_oop_t moo_oowtoint (moo_t* moo, moo_oow_t w)
|
||||
}
|
||||
}
|
||||
|
||||
moo_oop_t moo_ooitoint (moo_t* moo, moo_ooi_t i)
|
||||
{
|
||||
if (MOO_IN_SMOOI_RANGE(i))
|
||||
{
|
||||
return MOO_SMOOI_TO_OOP(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return make_bigint_with_ooi (moo, i);
|
||||
}
|
||||
}
|
||||
|
||||
static MOO_INLINE moo_oop_t expand_bigint (moo_t* moo, moo_oop_t oop, moo_oow_t inc)
|
||||
{
|
||||
moo_oop_t z;
|
||||
|
@ -1337,7 +1337,7 @@ static moo_pfrc_t _equal_objects (moo_t* moo, moo_ooi_t nargs)
|
||||
|
||||
switch (MOO_OOP_GET_TAG(rcv))
|
||||
{
|
||||
case MOO_OOP_TAG_SMINT:
|
||||
case MOO_OOP_TAG_SMOOI:
|
||||
return MOO_OOP_TO_SMOOI(rcv) == MOO_OOP_TO_SMOOI(arg)? 1: 0;
|
||||
|
||||
case MOO_OOP_TAG_CHAR:
|
||||
@ -1700,7 +1700,7 @@ static moo_pfrc_t pf_hash (moo_t* moo, moo_ooi_t nargs)
|
||||
|
||||
switch (MOO_OOP_GET_TAG(rcv))
|
||||
{
|
||||
case MOO_OOP_TAG_SMINT:
|
||||
case MOO_OOP_TAG_SMOOI:
|
||||
hv = MOO_OOP_TO_SMOOI(rcv);
|
||||
break;
|
||||
|
||||
|
@ -325,15 +325,19 @@ static void* dl_open (moo_t* moo, const moo_ooch_t* name, int flags)
|
||||
/* 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)
|
||||
|
||||
if (moo_findbchar (buf, bcslen, '.'))
|
||||
{
|
||||
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);
|
||||
else
|
||||
{
|
||||
handle = lt_dlopenext (buf);
|
||||
if (!handle) MOO_DEBUG2 (moo, "Failed to open(ext) DL %hs - %s\n", buf, lt_dlerror());
|
||||
else MOO_DEBUG2 (moo, "Opened(ext) DL %hs handle %p\n", buf, handle);
|
||||
}
|
||||
}
|
||||
|
||||
return handle;
|
||||
@ -755,7 +759,7 @@ int main (int argc, char* argv[])
|
||||
}
|
||||
}
|
||||
|
||||
printf ("COMPILE OK. STARTING EXECUTION ...\n");
|
||||
MOO_DEBUG0 (moo, "COMPILE OK. STARTING EXECUTION...\n");
|
||||
xret = 0;
|
||||
g_moo = moo;
|
||||
setup_tick ();
|
||||
|
@ -1009,11 +1009,6 @@ int moo_inttooow (
|
||||
moo_oow_t* w
|
||||
);
|
||||
|
||||
moo_oop_t moo_oowtoint (
|
||||
moo_t* moo,
|
||||
moo_oow_t w
|
||||
);
|
||||
|
||||
moo_oop_t moo_addints (
|
||||
moo_t* moo,
|
||||
moo_oop_t x,
|
||||
|
@ -110,7 +110,7 @@ int moo_init (moo_t* moo, moo_mmgr_t* mmgr, moo_oow_t heapsz, const moo_vmprim_t
|
||||
|
||||
fill_bigint_tables (moo);
|
||||
|
||||
moo->tagged_classes[MOO_OOP_TAG_SMINT] = &moo->_small_integer;
|
||||
moo->tagged_classes[MOO_OOP_TAG_SMOOI] = &moo->_small_integer;
|
||||
moo->tagged_classes[MOO_OOP_TAG_CHAR] = &moo->_character;
|
||||
moo->tagged_classes[MOO_OOP_TAG_ERROR] = &moo->_error_class;
|
||||
|
||||
|
@ -196,7 +196,7 @@ typedef enum moo_method_type_t moo_method_type_t;
|
||||
*/
|
||||
|
||||
#define MOO_OOP_TAG_BITS 2
|
||||
#define MOO_OOP_TAG_SMINT 1
|
||||
#define MOO_OOP_TAG_SMOOI 1
|
||||
#define MOO_OOP_TAG_CHAR 2
|
||||
#define MOO_OOP_TAG_ERROR 3
|
||||
|
||||
@ -204,11 +204,11 @@ typedef enum moo_method_type_t moo_method_type_t;
|
||||
#define MOO_OOP_IS_NUMERIC(oop) (MOO_OOP_GET_TAG(oop) != 0)
|
||||
#define MOO_OOP_IS_POINTER(oop) (MOO_OOP_GET_TAG(oop) == 0)
|
||||
|
||||
#define MOO_OOP_IS_SMOOI(oop) (MOO_OOP_GET_TAG(oop) == MOO_OOP_TAG_SMINT)
|
||||
#define MOO_OOP_IS_SMOOI(oop) (MOO_OOP_GET_TAG(oop) == MOO_OOP_TAG_SMOOI)
|
||||
#define MOO_OOP_IS_CHAR(oop) (MOO_OOP_GET_TAG(oop) == MOO_OOP_TAG_CHAR)
|
||||
#define MOO_OOP_IS_ERROR(oop) (MOO_OOP_GET_TAG(oop) == MOO_OOP_TAG_ERROR)
|
||||
|
||||
#define MOO_SMOOI_TO_OOP(num) ((moo_oop_t)((((moo_ooi_t)(num)) << MOO_OOP_TAG_BITS) | MOO_OOP_TAG_SMINT))
|
||||
#define MOO_SMOOI_TO_OOP(num) ((moo_oop_t)((((moo_ooi_t)(num)) << MOO_OOP_TAG_BITS) | MOO_OOP_TAG_SMOOI))
|
||||
#define MOO_OOP_TO_SMOOI(oop) (((moo_ooi_t)oop) >> MOO_OOP_TAG_BITS)
|
||||
#define MOO_CHAR_TO_OOP(num) ((moo_oop_t)((((moo_oow_t)(num)) << MOO_OOP_TAG_BITS) | MOO_OOP_TAG_CHAR))
|
||||
#define MOO_OOP_TO_CHAR(oop) (((moo_oow_t)oop) >> MOO_OOP_TAG_BITS)
|
||||
@ -227,6 +227,17 @@ typedef enum moo_method_type_t moo_method_type_t;
|
||||
#define MOO_SMOOI_MIN (-MOO_SMOOI_MAX)
|
||||
#define MOO_IN_SMOOI_RANGE(ooi) ((ooi) >= MOO_SMOOI_MIN && (ooi) <= MOO_SMOOI_MAX)
|
||||
|
||||
|
||||
/* SMPTR is a special SMOOI value which has been devised to
|
||||
* encode an address value whose low MOO_OOP_TAG_BITS bits are 0.
|
||||
* its class is still SmallInteger. A pointer returned by most of
|
||||
* system functions would be aligned to the pointer size.
|
||||
* you can use tthe followings macros when storing such a pointer
|
||||
* in a small integer without loss. */
|
||||
#define MOO_IN_SMPTR_RANGE(ptr) ((((moo_oow_t)ptr) & MOO_LBMASK(moo_oow_t, MOO_OOP_TAG_BITS)) == 0)
|
||||
#define MOO_SMPTR_TO_OOP(ptr) ((moo_oop_t)(((moo_oow_t)ptr) | MOO_OOP_TAG_SMOOI))
|
||||
#define MOO_OOP_TO_SMPTR(oop) ((void*)(((moo_oow_t)oop) & ~MOO_LBMASK(moo_oow_t, MOO_OOP_TAG_BITS)))
|
||||
|
||||
/* TODO: There are untested code where a small integer is converted to moo_oow_t.
|
||||
* for example, the spec making macro treats the number as moo_oow_t instead of moo_ooi_t.
|
||||
* as of this writing, i skip testing that part with the spec value exceeding MOO_SMOOI_MAX.
|
||||
@ -1298,6 +1309,17 @@ MOO_EXPORT moo_oop_t moo_makestring (
|
||||
moo_oow_t len
|
||||
);
|
||||
|
||||
|
||||
MOO_EXPORT moo_oop_t moo_oowtoint (
|
||||
moo_t* moo,
|
||||
moo_oow_t w
|
||||
);
|
||||
|
||||
MOO_EXPORT moo_oop_t moo_ooitoint (
|
||||
moo_t* moo,
|
||||
moo_ooi_t i
|
||||
);
|
||||
|
||||
/* =========================================================================
|
||||
* TEMPORARY OOP MANAGEMENT FUNCTIONS
|
||||
* ========================================================================= */
|
||||
|
Reference in New Issue
Block a user