Hello Mono lists - I'm emailing both lists in hopes
someone has a tip or two.

some background - I'm in a situation where i can't
generate code at runtime.  so I'm trying to use the
interp package, by embedding it into my application. 
my current test case is pretty simple:

           
System.Diagnostics.Trace.WriteLine("Hello");

that one line is sooo deceptively simple...

one challenge that I have to solve is that even the
interp package wants to generate code at runtime - for
each native function called (internal calls and
PInvoke) a little bit of ASM gets generated to allow
variables on the managed interp stack to flow to the
native function, as well as a return value. 
currently, based on the sig of the function being
called, I'm looking up a hand-written function to
replace the little bit of ASM that would normally be
generated.  This is (for the most part) working great,
and I get 41 native calls in before things go wrong. 
:(

like I said, that one line is deceptively simple...

So, I'm hoping the lists have an idea about how those
hand-written functions should look?  for example, take
the native function GetDataTablePointers.  it returns
void, and it's sig is:

System.Char.GetDataTablePointers(byte*&,byte*&,double*&,uint16*&,uint16*&,uint16*&,uint16*&)

my first thought was to do this:

    void
Thunk_void_refintptr_refintptr_refintptr_refintptr_refintptr_refintptr_refintptr(MonoFunc
callMe, void *pRetval, void *this_obj, stackval
*arguments)
    {
        typedef void (*Func)(void**, void**, void**,
void**, void**, void**, void**);
        (*(Func)(callMe))((void**)arguments[0].data.p,
(void**)arguments[1].data.p,
(void**)arguments[2].data.p,
(void**)arguments[3].data.p,
(void**)arguments[4].data.p,
(void**)arguments[5].data.p,
(void**)arguments[6].data.p);
    }


and the native function it calls is:

static void
ves_icall_System_Char_GetDataTablePointers (guint8
const **category_data,
                        guint8 const **numeric_data,
                        gdouble const
**numeric_data_values,
                        guint16 const
**to_lower_data_low,
                        guint16 const
**to_lower_data_high,
                        guint16 const
**to_upper_data_low,
                        guint16 const
**to_upper_data_high)
.
.
.

another example, InternalTrim.  It returns a
MonoString*, and it's sig is:

System.String.InternalTrim(char[],int)

my thought was to do this:

    void Thunk_intptr_thisobj_intptr_int(MonoFunc
callMe, void *pRetval, void *this_obj, stackval
*arguments)
    {
        stackval* retval = (stackval*)pRetval;

        typedef void* (*Func)(void*, void*, int);
        retval->data.p = (*(Func)(callMe))(this_obj,
arguments[0].data.p, arguments[1].data.i);
    }


and the native function it calls is:

MonoString * 
ves_icall_System_String_InternalTrim (MonoString *me,
MonoArray *chars, gint32 typ)
.
.
.

again - most everything works.  I'm prototyping all
this on the PC first.  When I enable original
mono_arch_create_trampoline function (it generates
code at runtime), everything is fine - I see "Hello". 
when I enable my version of
mono_arch_create_trampoline, that looks up sigs and
gives back hand-written thunks, I end up dying in
ves_icall_System_String_InternalJoin, because the
first arg being passed is junk.  :(  this is all with
the interp engine, so i can step almost everything if
someone has a pointer what to look for.  please feel
free to offlist email me for more details if you think
you can help but have more questions.

thanks in advance lists!
bruce


_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to