experiment with unaligned address in ffi

This commit is contained in:
hyunghwan.chung 2019-09-05 08:45:04 +00:00
parent 00969032ff
commit dd6186d1f2
5 changed files with 35 additions and 11 deletions

View File

@ -408,3 +408,7 @@ class SmallPointer(Object)
method(#primitive) free. method(#primitive) free.
} }
class LargePointer(Object)
{
}

View File

@ -40,7 +40,8 @@ class MyObject(Object)
| ffi now | | ffi now |
ffi := FFI new: 'libc.so.6'. [ ffi := FFI new: 'libc.so.6'. ] on: Exception do: [:ex | ffi := FFI new: 'libc.so' ].
now := ffi call: #time signature: 'l>i' arguments: #(0). now := ffi call: #time signature: 'l>i' arguments: #(0).
////ffi call: #srand signature: 'i>' arguments: ##(now). ////ffi call: #srand signature: 'i>' arguments: ##(now).
ffi call: #srandom signature: 'i>' arguments: ##(now). ffi call: #srandom signature: 'i>' arguments: ##(now).

View File

@ -840,7 +840,7 @@ int moo_genpfmethod (moo_t* moo, moo_mod_t* mod, moo_oop_class_t _class, moo_met
goto oops; goto oops;
} }
mnsym = (moo_oop_char_t)moo_makesymbol (moo, mthname, i); mnsym = (moo_oop_char_t)moo_makesymbol(moo, mthname, i);
if (!mnsym) goto oops; if (!mnsym) goto oops;
moo_pushvolat (moo, (moo_oop_t*)&mnsym); tmp_count++; moo_pushvolat (moo, (moo_oop_t*)&mnsym); tmp_count++;

View File

@ -282,7 +282,7 @@ static MOO_INLINE moo_oop_t _fetch_raw_uint (moo_t* moo, moo_uint8_t* rawptr, mo
return MOO_NULL; return MOO_NULL;
} }
return moo_oowtoint (moo, v); return moo_oowtoint(moo, v);
} }
@ -1093,7 +1093,7 @@ moo_pfrc_t moo_pf_smptr_as_string (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
ptr = MOO_OOP_TO_SMPTR(rcv); ptr = MOO_OOP_TO_SMPTR(rcv);
sprintptr (buf, (moo_oow_t)ptr, &len); sprintptr (buf, (moo_oow_t)ptr, &len);
ss = moo_makestring (moo, buf, len); ss = moo_makestring(moo, buf, len);
if (!ss) return MOO_PF_FAILURE; if (!ss) return MOO_PF_FAILURE;
MOO_STACK_SETRET (moo, nargs, ss); MOO_STACK_SETRET (moo, nargs, ss);

View File

@ -542,7 +542,8 @@ static moo_pfrc_t pf_call (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
sig = MOO_STACK_GETARG(moo, nargs, 1); sig = MOO_STACK_GETARG(moo, nargs, 1);
args = MOO_STACK_GETARG(moo, nargs, 2); args = MOO_STACK_GETARG(moo, nargs, 2);
if (!MOO_OOP_IS_SMPTR(fun)) goto inval; if (MOO_OOP_IS_SMPTR(fun)) f = MOO_OOP_TO_SMPTR(fun);
else if (moo_inttooow(moo, fun, (moo_oow_t*)&f) <= -1) goto softfail;
/* the signature must not be empty. at least the return type must be /* the signature must not be empty. at least the return type must be
* specified */ * specified */
@ -553,9 +554,7 @@ static moo_pfrc_t pf_call (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
if (MOO_OBJ_GET_SIZE(sig) > 1 && MOO_CLASSOF(moo,args) != moo->_array) goto inval; if (MOO_OBJ_GET_SIZE(sig) > 1 && MOO_CLASSOF(moo,args) != moo->_array) goto inval;
#endif #endif
f = MOO_OOP_TO_SMPTR(fun);
arr = (moo_oop_oop_t)args; arr = (moo_oop_oop_t)args;
/*MOO_DEBUG2 (moo, "<ffi.call> %p in %p\n", f, ffi->handle);*/ /*MOO_DEBUG2 (moo, "<ffi.call> %p in %p\n", f, ffi->handle);*/
#if defined(USE_DYNCALL) #if defined(USE_DYNCALL)
@ -782,7 +781,7 @@ static moo_pfrc_t pf_call (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
if (!MOO_IN_SMPTR_RANGE(r)) if (!MOO_IN_SMPTR_RANGE(r))
{ {
/* the returned pointer is not aligned */ /* the returned pointer is not aligned */
goto softfail; goto inval;
} }
MOO_STACK_SETRET (moo, nargs, MOO_SMPTR_TO_OOP(r)); MOO_STACK_SETRET (moo, nargs, MOO_SMPTR_TO_OOP(r));
@ -827,7 +826,7 @@ hardfail:
static moo_pfrc_t pf_getsym (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) static moo_pfrc_t pf_getsym (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
{ {
ffi_t* ffi; ffi_t* ffi;
moo_oop_t name; moo_oop_t name, ret;
void* sym; void* sym;
MOO_ASSERT (moo, nargs == 1); MOO_ASSERT (moo, nargs == 1);
@ -852,8 +851,28 @@ static moo_pfrc_t pf_getsym (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
MOO_DEBUG4 (moo, "<ffi.getsym> %.*js => %p in %p\n", MOO_OBJ_GET_SIZE(name), MOO_OBJ_GET_CHAR_SLOT(name), sym, ffi->handle); MOO_DEBUG4 (moo, "<ffi.getsym> %.*js => %p in %p\n", MOO_OBJ_GET_SIZE(name), MOO_OBJ_GET_CHAR_SLOT(name), sym, ffi->handle);
MOO_ASSERT (moo, MOO_IN_SMPTR_RANGE(sym)); #if 0
MOO_STACK_SETRET (moo, nargs, MOO_SMPTR_TO_OOP(sym)); ret = moo_oowtoptr(moo, (moo_oow_t)sym);
if (!ret) goto softfail;
#else
if (MOO_IN_SMPTR_RANGE(sym))
{
ret = MOO_SMPTR_TO_OOP(sym);
}
else
{
ret = moo_oowtoint(moo, (moo_oow_t)sym);
if (!ret) goto softfail;
/*
MOO_DEBUG1 (moo, "<ffi.getsym> unaligned symbol address - %p\n", sym);
moo_seterrnum (moo, MOO_EINVAL);
goto softfail;
*/
}
#endif
MOO_STACK_SETRET (moo, nargs, ret);
return MOO_PF_SUCCESS; return MOO_PF_SUCCESS;
softfail: softfail: