diff --git a/moo/mod/con.c b/moo/mod/con.c index bda80d9..b84a0b4 100644 --- a/moo/mod/con.c +++ b/moo/mod/con.c @@ -52,7 +52,7 @@ struct console_t }; /* ------------------------------------------------------------------------ */ -static moo_pfrc_t pf_open (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_open (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(_WIN32) HANDLE h; @@ -127,7 +127,7 @@ static moo_pfrc_t pf_open (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_close (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_close (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(_WIN32) HANDLE h; @@ -149,7 +149,7 @@ static moo_pfrc_t pf_close (moo_t* moo, moo_ooi_t nargs) #endif } -static moo_pfrc_t pf_write (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_write (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(_WIN32) #elif defined(__DOS__) @@ -197,7 +197,7 @@ einval: #endif } -static moo_pfrc_t pf_clear (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_clear (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(_WIN32) #elif defined(__DOS__) @@ -214,7 +214,7 @@ static moo_pfrc_t pf_clear (moo_t* moo, moo_ooi_t nargs) #endif } -static moo_pfrc_t pf_setcursor (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_setcursor (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(_WIN32) #elif defined(__DOS__) diff --git a/moo/mod/ffi.c b/moo/mod/ffi.c index 33b9579..401c53a 100644 --- a/moo/mod/ffi.c +++ b/moo/mod/ffi.c @@ -74,7 +74,7 @@ static void free_linked_cas (moo_t* moo, ffi_t* ffi) } } -static moo_pfrc_t pf_open (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_open (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { ffi_t* ffi; moo_oop_t name; @@ -134,7 +134,7 @@ softfail: return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_close (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_close (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { ffi_t* ffi; @@ -168,7 +168,7 @@ softfail: return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_call (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_call (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { #if defined(USE_DYNCALL) ffi_t* ffi; @@ -476,7 +476,7 @@ hardfail: #endif } -static moo_pfrc_t pf_getsym (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_getsym (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { ffi_t* ffi; moo_oop_t name; @@ -541,7 +541,7 @@ static moo_pfinfo_t pfinfos[] = static int import (moo_t* moo, moo_mod_t* mod, moo_oop_class_t _class) { - if (moo_setclasstrsize (moo, _class, MOO_SIZEOF(ffi_t), MOO_NULL) <= -1) return -1; + if (moo_setclasstrsize(moo, _class, MOO_SIZEOF(ffi_t), MOO_NULL) <= -1) return -1; return 0; } diff --git a/moo/mod/sck-addr.c b/moo/mod/sck-addr.c index 9e56b25..a0f86d1 100644 --- a/moo/mod/sck-addr.c +++ b/moo/mod/sck-addr.c @@ -483,7 +483,7 @@ no_rbrack: } -static moo_pfrc_t pf_from_string (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_from_string (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { moo_oop_t rcv; moo_oop_t str; diff --git a/moo/mod/sck.c b/moo/mod/sck.c index 3ffdf95..64c1527 100644 --- a/moo/mod/sck.c +++ b/moo/mod/sck.c @@ -40,7 +40,13 @@ #include #include -static moo_pfrc_t pf_open_socket (moo_t* moo, moo_ooi_t nargs) +typedef struct sck_modctx_t sck_modctx_t; +struct sck_modctx_t +{ + moo_oop_class_t sck_class; +}; + +static moo_pfrc_t pf_open_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; moo_oop_t dom, type, proto; @@ -117,7 +123,7 @@ oops: return MOO_PF_FAILURE; } -static moo_pfrc_t pf_close_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_close_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; int fd; @@ -150,7 +156,7 @@ static moo_pfrc_t pf_close_socket (moo_t* moo, moo_ooi_t nargs) return MOO_PF_FAILURE; } -static moo_pfrc_t pf_bind_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_bind_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; moo_oop_t arg; @@ -184,7 +190,7 @@ static moo_pfrc_t pf_bind_socket (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_accept_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_accept_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck, newsck; moo_oop_t arg; @@ -245,7 +251,8 @@ static moo_pfrc_t pf_accept_socket (moo_t* moo, moo_ooi_t nargs) if (fcntl(newfd, F_SETFL, fl) == -1) goto fcntl_failure; accept_done: - newsck = (oop_sck_t)moo_instantiate (moo, MOO_OBJ_GET_CLASS(sck), MOO_NULL, 0); + /*newsck = (oop_sck_t)moo_instantiate(moo, MOO_OBJ_GET_CLASS(sck), MOO_NULL, 0);*/ + newsck = (oop_sck_t)moo_instantiate(moo, ((sck_modctx_t*)mod->ctx)->sck_class, MOO_NULL, 0); if (!newsck) { close (newfd); @@ -261,11 +268,14 @@ accept_done: } newsck->handle = MOO_SMOOI_TO_OOP(newfd); + /* return the partially initialized socket object. the handle field is set to the new file + * descriptor. however all other fields are just set to nil. so the user of this primitive + * method should call application-level initializer. */ MOO_STACK_SETRET (moo, nargs, (moo_oop_t)newsck); return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_listen_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_listen_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; moo_oop_t arg; @@ -277,7 +287,7 @@ static moo_pfrc_t pf_listen_socket (moo_t* moo, moo_ooi_t nargs) MOO_PF_CHECK_RCV (moo, MOO_OOP_IS_POINTER(sck) && MOO_OBJ_BYTESOF(sck) >= (MOO_SIZEOF(*sck) - MOO_SIZEOF(moo_obj_t)) && - MOO_OOP_IS_SMOOI(sck->handle)); + MOO_OOP_IS_SMOOI(sck->handle));/*newsck = (oop_sck_t)moo_instantiate (moo, MOO_OBJ_GET_CLASS(sck), MOO_NULL, 0);*/ MOO_PF_CHECK_ARGS (moo, nargs, MOO_OOP_IS_SMOOI(arg)); fd = MOO_OOP_TO_SMOOI(sck->handle); @@ -299,7 +309,7 @@ static moo_pfrc_t pf_listen_socket (moo_t* moo, moo_ooi_t nargs) } -static moo_pfrc_t pf_connect_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_connect_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; int fd, n; @@ -341,7 +351,7 @@ static moo_pfrc_t pf_connect_socket (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_get_socket_error (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_get_socket_error (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; int fd, ret; @@ -374,7 +384,7 @@ static moo_pfrc_t pf_get_socket_error (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_read_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_read_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; moo_oop_byte_t buf; @@ -417,7 +427,7 @@ static moo_pfrc_t pf_read_socket (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_write_socket (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_write_socket (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_sck_t sck; moo_oop_byte_t buf; @@ -523,25 +533,62 @@ static moo_pfinfo_t pfinfos[] = static int import (moo_t* moo, moo_mod_t* mod, moo_oop_class_t _class) { - /*if (moo_setclasstrsize (moo, _class, MOO_SIZEOF(sck_t), MOO_NULL) <= -1) return -1;*/ + /*if (moo_setclasstrsize(moo, _class, MOO_SIZEOF(sck_t), MOO_NULL) <= -1) return -1;*/ return 0; } static moo_pfbase_t* query (moo_t* moo, moo_mod_t* mod, const moo_ooch_t* name, moo_oow_t namelen) { - return moo_findpfbase (moo, pfinfos, MOO_COUNTOF(pfinfos), name, namelen); + return moo_findpfbase(moo, pfinfos, MOO_COUNTOF(pfinfos), name, namelen); } static void unload (moo_t* moo, moo_mod_t* mod) { /* TODO: anything? close open open dll handles? For that, pf_open must store the value it returns to mod->ctx or somewhere..*/ + if (mod->ctx) moo_freemem (moo, mod->ctx); +} + +static void gc_mod_sck (moo_t* moo, moo_mod_t* mod) +{ + sck_modctx_t* ctx = mod->ctx; + + MOO_ASSERT (moo, ctx != MOO_NULL); + if (ctx->sck_class) + { + ctx->sck_class = (moo_oop_class_t)moo_moveoop(moo, (moo_oop_t)ctx->sck_class); + } } int moo_mod_sck (moo_t* moo, moo_mod_t* mod) { + if (mod->hints & MOO_MOD_LOAD_FOR_IMPORT) + { + mod->gc = MOO_NULL; + mod->ctx = MOO_NULL; + } + else + { + sck_modctx_t* ctx; + + static moo_ooch_t name_sck[] = { 'S','o','c','k','e','t','\0' }; + + ctx = moo_callocmem(moo, MOO_SIZEOF(*ctx)); + if (!ctx) return -1; + + ctx->sck_class = (moo_oop_class_t)moo_findclass(moo, moo->sysdic, name_sck); + if (!ctx->sck_class) + { + MOO_DEBUG0 (moo, "Socket class not found\n"); + moo_freemem (moo, ctx); + return -1; + } + + mod->gc = gc_mod_sck; + mod->ctx = ctx; + } + mod->import = import; mod->query = query; mod->unload = unload; - mod->ctx = MOO_NULL; return 0; } diff --git a/moo/mod/stdio.c b/moo/mod/stdio.c index 0d97427..b3a0d49 100644 --- a/moo/mod/stdio.c +++ b/moo/mod/stdio.c @@ -42,7 +42,7 @@ struct stdio_t FILE* fp; }; -static moo_pfrc_t pf_open (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_open (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { moo_oop_char_t name; moo_oop_char_t mode; @@ -87,7 +87,7 @@ softfail: return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_close (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_close (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { stdio_t* stdio; @@ -102,7 +102,7 @@ static moo_pfrc_t pf_close (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_gets (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_gets (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { /* TODO: ...*/ MOO_STACK_SETRETTORCV (moo, nargs); @@ -189,12 +189,12 @@ softfail: return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_putc (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_putc (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { return __pf_puts (moo, nargs, 1); } -static moo_pfrc_t pf_puts (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_puts (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { return __pf_puts (moo, nargs, MOO_TYPE_MAX(moo_oow_t)); } diff --git a/moo/mod/x11.c b/moo/mod/x11.c index ff949a5..1f36e7e 100644 --- a/moo/mod/x11.c +++ b/moo/mod/x11.c @@ -71,7 +71,7 @@ static XChar2b* uchars_to_xchar2bstr (moo_t* moo, const moo_uch_t* inptr, moo_oo } /* ------------------------------------------------------------------------ */ -static moo_pfrc_t pf_open_display (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_open_display (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; x11_trailer_t* tr; @@ -160,7 +160,7 @@ oops: return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_close_display (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_close_display (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; x11_trailer_t* tr; @@ -187,7 +187,7 @@ static moo_pfrc_t pf_close_display (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_get_fd (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_get_fd (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { x11_trailer_t* tr; // TODO: CHECK if the receiver is an X11 object @@ -196,7 +196,7 @@ static moo_pfrc_t pf_get_fd (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_get_llevent (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_get_llevent (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; x11_trailer_t* tr; @@ -298,7 +298,7 @@ MOO_DEBUG0 (moo, "NO PENDING EVENT....\n"); return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_create_window (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_create_window (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { Display* disp; Window wind; /* Window -> XID, unsigned long */ @@ -391,7 +391,7 @@ static moo_pfrc_t pf_create_window (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_destroy_window (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_destroy_window (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; moo_oop_t a0; @@ -420,7 +420,7 @@ static moo_pfrc_t pf_destroy_window (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_create_gc (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_create_gc (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { Display* disp; Window wind; @@ -459,7 +459,7 @@ static moo_pfrc_t pf_create_gc (moo_t* moo, moo_ooi_t nargs) return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_destroy_gc (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_destroy_gc (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; oop_x11_gc_t gc; @@ -492,7 +492,7 @@ MOO_DEBUG0 (moo, "Freed Font Set\n"); return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_apply_gc (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_apply_gc (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; oop_x11_gc_t a0; @@ -613,7 +613,7 @@ MOO_DEBUG0 (moo, "XCreateFontSet ok....\n"); return MOO_PF_SUCCESS; } -static moo_pfrc_t pf_draw_rectangle (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_draw_rectangle (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; Display* disp; @@ -645,7 +645,7 @@ static moo_pfrc_t pf_draw_rectangle (moo_t* moo, moo_ooi_t nargs) } -static moo_pfrc_t pf_fill_rectangle (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_fill_rectangle (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; Display* disp; @@ -677,7 +677,7 @@ static moo_pfrc_t pf_fill_rectangle (moo_t* moo, moo_ooi_t nargs) } -static moo_pfrc_t pf_draw_string (moo_t* moo, moo_ooi_t nargs) +static moo_pfrc_t pf_draw_string (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { oop_x11_t x11; oop_x11_gc_t gc;