fixed a bug in passing a wrong number of arguments to a primitive function handler
This commit is contained in:
parent
45694df56b
commit
125eee9bec
@ -126,7 +126,8 @@
|
|||||||
|
|
||||||
##v1 := Stdio2 open: '/tmp/1.txt' for: 'w+'.
|
##v1 := Stdio2 open: '/tmp/1.txt' for: 'w+'.
|
||||||
v1 := Stdio2 new open: '/tmp/1.txt' for: 'w+'.
|
v1 := Stdio2 new open: '/tmp/1.txt' for: 'w+'.
|
||||||
v1 xxxx.
|
## v1 puts: 'hello'.
|
||||||
|
v1 puts ('hello', 'world', 'good', C'\n', C'\t', 'under my umbrella', C'\n').
|
||||||
v1 close.
|
v1 close.
|
||||||
nil isNil ifTrue: [ 'NIL NIL NIL' dump. ].
|
nil isNil ifTrue: [ 'NIL NIL NIL' dump. ].
|
||||||
(Apex new) notNil ifTrue: [ 'APEX NIL NIL NIL' dump. ].
|
(Apex new) notNil ifTrue: [ 'APEX NIL NIL NIL' dump. ].
|
||||||
|
@ -2915,10 +2915,9 @@ static int start_method (stix_t* stix, stix_oop_method_t method, stix_oow_t narg
|
|||||||
stix_oop_t name;
|
stix_oop_t name;
|
||||||
stix_pfimpl_t handler;
|
stix_pfimpl_t handler;
|
||||||
stix_oow_t w;
|
stix_oow_t w;
|
||||||
stix_ooi_t /*sp,*/ nargs, sb;
|
stix_ooi_t /*sp,*/ sb;
|
||||||
|
|
||||||
/*sp = stix->sp;*/
|
/*sp = stix->sp;*/
|
||||||
nargs = STIX_OOP_TO_SMOOI(method->tmpr_nargs);
|
|
||||||
sb = stix->sp - nargs - 1; /* stack base before receiver and arguments */
|
sb = stix->sp - nargs - 1; /* stack base before receiver and arguments */
|
||||||
|
|
||||||
pf_name_index = STIX_METHOD_GET_PREAMBLE_INDEX(preamble);
|
pf_name_index = STIX_METHOD_GET_PREAMBLE_INDEX(preamble);
|
||||||
@ -2957,6 +2956,7 @@ static int start_method (stix_t* stix, stix_oop_method_t method, stix_oow_t narg
|
|||||||
* invocation is that the primitive function handler should access arguments
|
* invocation is that the primitive function handler should access arguments
|
||||||
* directly in the stack unlik a normal activated method context where the
|
* directly in the stack unlik a normal activated method context where the
|
||||||
* arguments are copied to the back. */
|
* arguments are copied to the back. */
|
||||||
|
|
||||||
n = handler (stix, nargs);
|
n = handler (stix, nargs);
|
||||||
|
|
||||||
stix_poptmp (stix);
|
stix_poptmp (stix);
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* TODO: remvoe this assert use one defined in stix.h */
|
||||||
|
#include <assert.h>
|
||||||
|
#define STIX_ASSERT(x) assert(x)
|
||||||
|
|
||||||
typedef struct stdio_t stdio_t;
|
typedef struct stdio_t stdio_t;
|
||||||
struct stdio_t
|
struct stdio_t
|
||||||
{
|
{
|
||||||
@ -113,7 +117,80 @@ static int pf_gets (stix_t* stix, stix_ooi_t nargs)
|
|||||||
|
|
||||||
static int pf_puts (stix_t* stix, stix_ooi_t nargs)
|
static int pf_puts (stix_t* stix, stix_ooi_t nargs)
|
||||||
{
|
{
|
||||||
/* return how many bytes have been written.. */
|
stdio_t* rcv;
|
||||||
|
stix_ooi_t i;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
rcv = (stdio_t*)STIX_STACK_GETRCV(stix, nargs);
|
||||||
|
|
||||||
|
for (i = 0; i < nargs; i++)
|
||||||
|
{
|
||||||
|
stix_oop_char_t x;
|
||||||
|
stix_obj_char_t tmpc;
|
||||||
|
|
||||||
|
x = (stix_oop_char_t)STIX_STACK_GETARG(stix, nargs, i);
|
||||||
|
if (STIX_OOP_IS_CHAR(x))
|
||||||
|
{
|
||||||
|
/* do some faking. */
|
||||||
|
STIX_ASSERT (STIX_SIZEOF(tmpc) >= STIX_SIZEOF(stix_obj_t) + STIX_SIZEOF(stix_ooch_t));
|
||||||
|
|
||||||
|
tmpc.slot[0] = STIX_OOP_TO_CHAR(x);
|
||||||
|
x = (stix_oop_char_t)&tmpc;
|
||||||
|
STIX_OBJ_SET_SIZE(x, 1);
|
||||||
|
goto puts_string;
|
||||||
|
}
|
||||||
|
else if (STIX_OOP_IS_POINTER(x) && STIX_OBJ_GET_FLAGS_TYPE(x) == STIX_OBJ_TYPE_CHAR)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
stix_oow_t ucspos, ucsrem, ucslen, bcslen;
|
||||||
|
stix_bch_t bcs[1024]; /* TODO: choose a better buffer size */
|
||||||
|
|
||||||
|
puts_string:
|
||||||
|
ucspos = 0;
|
||||||
|
ucsrem = STIX_OBJ_GET_SIZE(x);
|
||||||
|
while (ucsrem > 0)
|
||||||
|
{
|
||||||
|
ucslen = ucsrem;
|
||||||
|
bcslen = STIX_COUNTOF(bcs);
|
||||||
|
/* TODO: implement character conversion into stdio and use it */
|
||||||
|
if ((n = stix_oocstobcs (stix, &x->slot[ucspos], &ucslen, bcs, &bcslen)) <= -1)
|
||||||
|
{
|
||||||
|
if (n != -2 || ucslen <= 0)
|
||||||
|
{
|
||||||
|
/* TODO:
|
||||||
|
*
|
||||||
|
STIX_STACK_SETRET (stix, nargs, stix->_error);
|
||||||
|
return 1;
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
stix_seterrnum (stix, STIX_EECERR);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite (bcs, bcslen, 1, rcv->fp);
|
||||||
|
/* TODO; error handling...
|
||||||
|
STIX_STACK_SETRET (stix, nargs, stix->_error);
|
||||||
|
return 1;
|
||||||
|
*/
|
||||||
|
/* TODO: abort looping for async processing???? */
|
||||||
|
ucspos += ucslen;
|
||||||
|
ucsrem -= ucslen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO;
|
||||||
|
STIX_STACK_SETRET (stix, nargs, stix->_error);
|
||||||
|
return 1;
|
||||||
|
*/
|
||||||
|
STIX_DEBUG1 (stix, "ARGUMETN ISN INVALID...[%O]\n", x);
|
||||||
|
stix_seterrnum (stix, STIX_EINVAL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
STIX_STACK_SETRETTORCV (stix, nargs);
|
STIX_STACK_SETRETTORCV (stix, nargs);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -136,15 +213,16 @@ static fnctab_t fnctab[] =
|
|||||||
{ "close", STIX_NULL, 0, pf_close },
|
{ "close", STIX_NULL, 0, pf_close },
|
||||||
{ "gets", STIX_NULL, 0, pf_gets },
|
{ "gets", STIX_NULL, 0, pf_gets },
|
||||||
{ "open:for:", STIX_NULL, 0, pf_open },
|
{ "open:for:", STIX_NULL, 0, pf_open },
|
||||||
{ "puts", STIX_NULL, 1, pf_puts }
|
{ "puts", STIX_NULL, 1, pf_puts },
|
||||||
|
{ "puts:", STIX_NULL, 0, pf_puts }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static stix_ooch_t voca_open_for[] = { 'o','p','e','n',':','f','o','r',':','\0' };
|
static stix_ooch_t voca_open_for[] = { 'o','p','e','n',':','f','o','r',':','\0' };
|
||||||
static stix_ooch_t voca_open[] = { 'o','p','e','n','\0' };
|
|
||||||
static stix_ooch_t voca_close[] = { 'c','l','o','s','e','\0' };
|
static stix_ooch_t voca_close[] = { 'c','l','o','s','e','\0' };
|
||||||
static stix_ooch_t voca_newInstSize[] = { '_','n','e','w','I','n','s','t','S','i','z','e','\0' };
|
static stix_ooch_t voca_newInstSize[] = { '_','n','e','w','I','n','s','t','S','i','z','e','\0' };
|
||||||
|
static stix_ooch_t voca_puts_v[] = { 'p','u','t','s','\0' };
|
||||||
|
static stix_ooch_t voca_puts[] = { 'p','u','t','s',':','\0' };
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int import (stix_t* stix, stix_mod_t* mod, stix_oop_t _class)
|
static int import (stix_t* stix, stix_mod_t* mod, stix_oop_t _class)
|
||||||
@ -153,6 +231,8 @@ stix_pushtmp (stix, &_class);
|
|||||||
stix_genpfmethod (stix, mod, _class, STIX_METHOD_CLASS, voca_newInstSize, 0, STIX_NULL);
|
stix_genpfmethod (stix, mod, _class, STIX_METHOD_CLASS, voca_newInstSize, 0, STIX_NULL);
|
||||||
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_open_for, 0, STIX_NULL);
|
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_open_for, 0, STIX_NULL);
|
||||||
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_close, 0, voca_close);
|
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_close, 0, voca_close);
|
||||||
|
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_puts, 0, STIX_NULL);
|
||||||
|
stix_genpfmethod (stix, mod, _class, STIX_METHOD_INSTANCE, voca_puts_v, 1, STIX_NULL);
|
||||||
stix_poptmp (stix);
|
stix_poptmp (stix);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -168,6 +248,7 @@ static stix_pfimpl_t query (stix_t* stix, stix_mod_t* mod, const stix_ooch_t* na
|
|||||||
mid = (left + right) / 2;
|
mid = (left + right) / 2;
|
||||||
|
|
||||||
n = stix_compoocbcstr (name, fnctab[mid].mthname);
|
n = stix_compoocbcstr (name, fnctab[mid].mthname);
|
||||||
|
STIX_DEBUG2 (stix, "%S %s\n", name, fnctab[mid].mthname);
|
||||||
if (n < 0) right = mid - 1;
|
if (n < 0) right = mid - 1;
|
||||||
else if (n > 0) left = mid + 1;
|
else if (n > 0) left = mid + 1;
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user