static void knh_write_Method(CTX ctx, knh_OutputStream_t *w, const knh_ClassTBL_t *ct, knh_Method_t *o) { knh_write_TAB(ctx, w); if(Method_isAbstract(o)) { knh_write_ascii(ctx, w, "@Abstract "); } knh_write_type(ctx, w, knh_type_tocid(ctx, knh_ParamArray_rtype(DP(o)->mp), ct->cid)); knh_putc(ctx, w, ' '); if(Method_isStatic(o)) { knh_write_ascii(ctx, w, S_tochar(ct->sname)); knh_putc(ctx, w, '.'); } knh_write_mn(ctx, w, SP(o)->mn); knh_putc(ctx, w, '('); size_t i; for(i = 0; i < knh_Method_psize(o); i++) { knh_param_t *p = knh_ParamArray_get(DP(o)->mp, i); if(i > 0) { knh_write_delim(ctx, w); } knh_write_type(ctx, w, knh_type_tocid(ctx, p->type, ct->cid)); knh_putc(ctx, w, ' '); knh_write_ascii(ctx, w, FN__(p->fn)); } if(ParamArray_isVARGs(DP(o)->mp)) { knh_write_delim(ctx, w); knh_write_dots(ctx, w); } knh_putc(ctx, w, ')'); knh_write_EOL(ctx, w); }
} /* ------------------------------------------------------------------------ */ //@Native Clib Clib.new(String libname, Clib _); METHOD Clib_new(CTX ctx, knh_sfp_t *sfp _RIX) { const char *libname = String_to(const char *, sfp[1]); knh_CLib_t *clib = (knh_CLib_t*)KNH_MALLOC(ctx, sizeof(knh_CLib_t)); clib->handler = knh_dlopen(ctx, libname); knh_RawPtr_t *po = new_RawPtr(ctx, sfp[2].p, clib); RETURN_(po); } static METHOD Fmethod_wrapCLib(CTX ctx, knh_sfp_t *sfp _RIX) { knh_type_t rtype = knh_ParamArray_rtype(DP(sfp[K_MTDIDX].mtdNC)->mp); knh_Func_t *fo = sfp[0].fo; knh_ClibGlue_t *cglue = (knh_ClibGlue_t*)(((fo->mtd)->b)->cfunc); // fprintf(stderr, "fptr:%p, %p, %d, %p, %p\n", // dg->fptr, // &(dg->cif), dg->argCount, // dg->retT, dg->argT); int idx = 0; for (idx = 0; idx < cglue->argCount; idx++) { if (cglue->argT_isUnboxed[idx] == DGLUE_UNBOXED) { cglue->argV[idx] = &(sfp[idx+1].ndata); } else { //TODO: now, we cannot distinguish object from string if (cglue->argT[idx] == &ffi_type_pointer) { cglue->argV[idx] = &((sfp[idx+1].s)->str.text);