diff --git a/moo/lib/comp.c b/moo/lib/comp.c index 852e446..fceb011 100644 --- a/moo/lib/comp.c +++ b/moo/lib/comp.c @@ -2352,7 +2352,7 @@ retry: return 0; } -static void clear_io_names (moo_t* moo) +void moo_clearcionames (moo_t* moo) { moo_iolink_t* cur; @@ -7026,7 +7026,13 @@ static int add_compiled_method (moo_t* moo) if (moo_addmethodtodbgi(moo, file_offset, cc->dbgi_class_offset, cc->mth.name.ptr, cc->mth.code.locptr, cc->mth.code.len, &method_offset) <= -1) { /* TODO: warning. no debug information about this method will be available */ + method_offset = 0; } + else if (method_offset > MOO_SMOOI_MAX) + { + method_offset = 90; + } + /* TODO mth->code_sline = MOO_SMOOI_TO_OOP(method_offset); */ } /*TODO: preserve source??? mth->text = cc->mth.text @@ -9681,7 +9687,7 @@ static void fini_compiler (moo_t* moo) /* called before the moo object is closed */ if (moo->c) { - clear_io_names (moo); + moo_clearcionames (moo); if (moo->c->tok.name.ptr) moo_freemem (moo, moo->c->tok.name.ptr); if (moo->c->balit.ptr) moo_freemem (moo, moo->c->balit.ptr); @@ -9731,7 +9737,7 @@ static MOO_INLINE int _compile (moo_t* moo, moo_ioimpl_t io) * I clear such names before i begin this function. i don't clear it * at the end of this function because i may be referenced as an error * location */ - clear_io_names (moo); + moo_clearcionames (moo); /* reset pragma flags */ moo->c->pragma_flags = 0; diff --git a/moo/lib/exec.c b/moo/lib/exec.c index 63d7d2e..452b8f4 100644 --- a/moo/lib/exec.c +++ b/moo/lib/exec.c @@ -2218,14 +2218,15 @@ static moo_pfrc_t pf_context_find_exception_handler (moo_t* moo, moo_mod_t* mod, /* ------------------------------------------------------------------ */ static moo_pfrc_t pf_method_get_source_file (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) { + moo_oop_method_t rcv; moo_oop_t retv = moo->_nil; +/* TODO: return something else lighter-weight than a string? */ + rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs); + MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method); + if (moo->dbgi) { - moo_oop_method_t rcv; - -/* TODO: return something else lighter-weight than a string? */ - rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs); if (MOO_OOP_IS_SMOOI(rcv->source_file) && MOO_OOP_TO_SMOOI(rcv->source_file) > 0) { moo_dbgi_file_t* di; @@ -2246,6 +2247,38 @@ static moo_pfrc_t pf_method_get_source_file (moo_t* moo, moo_mod_t* mod, moo_ooi return MOO_PF_SUCCESS; } +static moo_pfrc_t pf_method_get_code_source_line (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) +{ + /* get source line of the given instruction pointer */ + moo_oop_method_t rcv; + + rcv = (moo_oop_method_t)MOO_STACK_GETRCV(moo, nargs); + MOO_PF_CHECK_RCV (moo, MOO_CLASSOF(moo, rcv) == moo->_method); + + if (moo->dbgi && MOO_OOP_IS_SMOOI(rcv->source_line)) + { + moo_oop_t ip; + moo_ooi_t source_line, ipv; + + ip = MOO_STACK_GETARG(moo, nargs, 0); + MOO_PF_CHECK_ARGS (moo, nargs, MOO_OOP_IS_SMOOI(ip)); + + source_line = MOO_OOP_TO_SMOOI(rcv->source_line); + ipv = MOO_OOP_TO_SMOOI(ip); +#if 0 + if (MOO_OOP_IS_SMOOI(rcv->code_sline)) + { + moo_dbgi_method_t* di; + + di = (moo_dbgi_method_t*)&((moo_uint8_t*)moo->dbgi)[MOO_OOP_TO_SMOOI(rcv->code_sline)]; + /* ... TODO .. */ + } +#endif + } + + return MOO_PF_SUCCESS; +} + /* ------------------------------------------------------------------ */ static moo_pfrc_t __block_value (moo_t* moo, moo_oop_context_t rcv_blkctx, moo_ooi_t nargs, moo_ooi_t num_first_arg_elems, moo_oop_context_t* pblkctx) diff --git a/moo/lib/moo-prv.h b/moo/lib/moo-prv.h index 5f3fbf1..91ae0a4 100644 --- a/moo/lib/moo-prv.h +++ b/moo/lib/moo-prv.h @@ -1679,6 +1679,7 @@ int moo_addmethodtodbgi (moo_t* moo, moo_oow_t file_offset, moo_oow_t class_offs /* ========================================================================= */ #if defined(MOO_INCLUDE_COMPILER) const moo_ooch_t* moo_addcioname (moo_t* moo, const moo_oocs_t* name); +void moo_clearcionames (moo_t* moo); #endif #if defined(__cplusplus) diff --git a/moo/lib/moo.h b/moo/lib/moo.h index 8df9563..96ec7c4 100644 --- a/moo/lib/moo.h +++ b/moo/lib/moo.h @@ -586,8 +586,9 @@ struct moo_method_t #endif moo_oop_t source_text; /* source text. String if available. nil if not */ - moo_oop_t source_file; /* SmallInteger. source file path that contains the definition of this method. offset from moo->dbgi. 0 for the main stream. */ - moo_oop_t source_line; /* SmallInteger. line of the source file where the method definition begins. valid only if source_file is not nil */ + moo_oop_t source_file; /* SmallInteger. source file path that contains the definition of this method. offset from moo->dbgi. 0 if unavailable */ + moo_oop_t source_line; /* SmallInteger. line of the source file where the method definition begins. valid only if source_file is greater than 0 */ + //moo_oop_t code_line; /* SmallInteger */ /* == variable indexed part == */ moo_oop_t literal_frame[1]; /* it stores literals */