started adding byte-code decoder
This commit is contained in:
parent
7ccd2dad86
commit
037bbff42c
@ -250,7 +250,8 @@
|
||||
|
||||
#class(#pointer) CompiledMethod(Object)
|
||||
{
|
||||
#dcl owner name preamble preamble_data_1 preamble_data_2 ntmprs nargs code source.
|
||||
## #dcl owner name preamble preamble_data_1 preamble_data_2 ntmprs nargs code source.
|
||||
#dcl owner name preamble preamble_data_1 preamble_data_2 ntmprs nargs source.
|
||||
|
||||
#method preamble
|
||||
{
|
||||
|
@ -40,6 +40,7 @@ libstix_la_SOURCES = \
|
||||
bigint.c \
|
||||
comp.c \
|
||||
debug.c \
|
||||
decode.c \
|
||||
dic.c \
|
||||
exec.c \
|
||||
gc.c \
|
||||
@ -82,12 +83,18 @@ LIBADD_MOD_COMMON = -lstix
|
||||
|
||||
pkgmodexecdir = $(libdir)
|
||||
|
||||
pkgmodexec_LTLIBRARIES = libstix-snd.la
|
||||
pkgmodexec_LTLIBRARIES = libstix-snd.la libstix-con.la
|
||||
|
||||
libstix_snd_la_SOURCES = mod-snd.c mod-snd.h
|
||||
libstix_snd_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
libstix_snd_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
libstix_snd_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
|
||||
libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
@ -133,16 +133,28 @@ am__installdirs = "$(DESTDIR)$(pkglibdir)" \
|
||||
"$(DESTDIR)$(pkgincludedir)"
|
||||
LTLIBRARIES = $(pkglib_LTLIBRARIES) $(pkgmodexec_LTLIBRARIES)
|
||||
am__DEPENDENCIES_1 =
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_DEPENDENCIES = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__libstix_con_la_SOURCES_DIST = mod-con.c mod-con.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_con_la_OBJECTS = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ libstix_con_la-mod-con.lo
|
||||
libstix_con_la_OBJECTS = $(am_libstix_con_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
libstix_con_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||
$(AM_CFLAGS) $(CFLAGS) $(libstix_con_la_LDFLAGS) $(LDFLAGS) -o \
|
||||
$@
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_con_la_rpath = -rpath \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(pkgmodexecdir)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_DEPENDENCIES = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ $(am__DEPENDENCIES_1)
|
||||
am__libstix_snd_la_SOURCES_DIST = mod-snd.c mod-snd.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@am_libstix_snd_la_OBJECTS = \
|
||||
@ENABLE_STATIC_MODULE_FALSE@ libstix_snd_la-mod-snd.lo
|
||||
libstix_snd_la_OBJECTS = $(am_libstix_snd_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
libstix_snd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||
$(AM_CFLAGS) $(CFLAGS) $(libstix_snd_la_LDFLAGS) $(LDFLAGS) -o \
|
||||
@ -152,11 +164,11 @@ libstix_snd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||
am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
|
||||
libstix_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
|
||||
am_libstix_la_OBJECTS = libstix_la-bigint.lo libstix_la-comp.lo \
|
||||
libstix_la-debug.lo libstix_la-dic.lo libstix_la-exec.lo \
|
||||
libstix_la-gc.lo libstix_la-heap.lo libstix_la-ignite.lo \
|
||||
libstix_la-obj.lo libstix_la-proc.lo libstix_la-rbt.lo \
|
||||
libstix_la-stix.lo libstix_la-sym.lo libstix_la-utf8.lo \
|
||||
libstix_la-utl.lo
|
||||
libstix_la-debug.lo libstix_la-decode.lo libstix_la-dic.lo \
|
||||
libstix_la-exec.lo libstix_la-gc.lo libstix_la-heap.lo \
|
||||
libstix_la-ignite.lo libstix_la-obj.lo libstix_la-proc.lo \
|
||||
libstix_la-rbt.lo libstix_la-stix.lo libstix_la-sym.lo \
|
||||
libstix_la-utf8.lo libstix_la-utl.lo
|
||||
libstix_la_OBJECTS = $(am_libstix_la_OBJECTS)
|
||||
libstix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
@ -202,10 +214,11 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(libstix_snd_la_SOURCES) $(libstix_la_SOURCES) \
|
||||
$(stix_SOURCES)
|
||||
DIST_SOURCES = $(am__libstix_snd_la_SOURCES_DIST) \
|
||||
SOURCES = $(libstix_con_la_SOURCES) $(libstix_snd_la_SOURCES) \
|
||||
$(libstix_la_SOURCES) $(stix_SOURCES)
|
||||
DIST_SOURCES = $(am__libstix_con_la_SOURCES_DIST) \
|
||||
$(am__libstix_snd_la_SOURCES_DIST) $(libstix_la_SOURCES) \
|
||||
$(stix_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -422,6 +435,7 @@ libstix_la_SOURCES = \
|
||||
bigint.c \
|
||||
comp.c \
|
||||
debug.c \
|
||||
decode.c \
|
||||
dic.c \
|
||||
exec.c \
|
||||
gc.c \
|
||||
@ -457,11 +471,15 @@ stix_LDADD = $(LIBADD_LIB_COMMON) -lstix #-ldyncall_s
|
||||
@ENABLE_STATIC_MODULE_FALSE@LDFLAGS_MOD_COMMON = $(LDFLAGS_LIB_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@LIBADD_MOD_COMMON = -lstix
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexecdir = $(libdir)
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libstix-snd.la
|
||||
@ENABLE_STATIC_MODULE_FALSE@pkgmodexec_LTLIBRARIES = libstix-snd.la libstix-con.la
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_SOURCES = mod-snd.c mod-snd.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_snd_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_SOURCES = mod-con.c mod-con.h
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_CPPFLAGS = $(CPPFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LDFLAGS = $(LDFLAGS_MOD_COMMON)
|
||||
@ENABLE_STATIC_MODULE_FALSE@libstix_con_la_LIBADD = $(LIBADD_MOD_COMMON)
|
||||
all: stix-cfg.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
@ -583,6 +601,9 @@ clean-pkgmodexecLTLIBRARIES:
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libstix-con.la: $(libstix_con_la_OBJECTS) $(libstix_con_la_DEPENDENCIES) $(EXTRA_libstix_con_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libstix_con_la_LINK) $(am_libstix_con_la_rpath) $(libstix_con_la_OBJECTS) $(libstix_con_la_LIBADD) $(LIBS)
|
||||
|
||||
libstix-snd.la: $(libstix_snd_la_OBJECTS) $(libstix_snd_la_DEPENDENCIES) $(EXTRA_libstix_snd_la_DEPENDENCIES)
|
||||
$(AM_V_CCLD)$(libstix_snd_la_LINK) $(am_libstix_snd_la_rpath) $(libstix_snd_la_OBJECTS) $(libstix_snd_la_LIBADD) $(LIBS)
|
||||
|
||||
@ -648,9 +669,11 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_con_la-mod-con.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-bigint.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-comp.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-debug.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-decode.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-dic.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-exec.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstix_la-gc.Plo@am__quote@
|
||||
@ -690,6 +713,13 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
libstix_con_la-mod-con.lo: mod-con.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_con_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_con_la-mod-con.lo -MD -MP -MF $(DEPDIR)/libstix_con_la-mod-con.Tpo -c -o libstix_con_la-mod-con.lo `test -f 'mod-con.c' || echo '$(srcdir)/'`mod-con.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_con_la-mod-con.Tpo $(DEPDIR)/libstix_con_la-mod-con.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mod-con.c' object='libstix_con_la-mod-con.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_con_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_con_la-mod-con.lo `test -f 'mod-con.c' || echo '$(srcdir)/'`mod-con.c
|
||||
|
||||
libstix_snd_la-mod-snd.lo: mod-snd.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_snd_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_snd_la-mod-snd.lo -MD -MP -MF $(DEPDIR)/libstix_snd_la-mod-snd.Tpo -c -o libstix_snd_la-mod-snd.lo `test -f 'mod-snd.c' || echo '$(srcdir)/'`mod-snd.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_snd_la-mod-snd.Tpo $(DEPDIR)/libstix_snd_la-mod-snd.Plo
|
||||
@ -718,6 +748,13 @@ libstix_la-debug.lo: debug.c
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_la-debug.lo `test -f 'debug.c' || echo '$(srcdir)/'`debug.c
|
||||
|
||||
libstix_la-decode.lo: decode.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_la-decode.lo -MD -MP -MF $(DEPDIR)/libstix_la-decode.Tpo -c -o libstix_la-decode.lo `test -f 'decode.c' || echo '$(srcdir)/'`decode.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_la-decode.Tpo $(DEPDIR)/libstix_la-decode.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='decode.c' object='libstix_la-decode.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstix_la-decode.lo `test -f 'decode.c' || echo '$(srcdir)/'`decode.c
|
||||
|
||||
libstix_la-dic.lo: dic.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstix_la-dic.lo -MD -MP -MF $(DEPDIR)/libstix_la-dic.Tpo -c -o libstix_la-dic.lo `test -f 'dic.c' || echo '$(srcdir)/'`dic.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstix_la-dic.Tpo $(DEPDIR)/libstix_la-dic.Plo
|
||||
|
@ -159,7 +159,6 @@ typedef enum voca_id_t voca_id_t;
|
||||
# define DBGOUT_COMP_3(fmt,a1,a2,a3)
|
||||
#endif
|
||||
|
||||
|
||||
static int compile_block_statement (stix_t* stix);
|
||||
static int compile_method_statement (stix_t* stix);
|
||||
static int compile_method_expression (stix_t* stix, int pop);
|
||||
@ -1547,13 +1546,13 @@ static const stix_ooch_t* add_io_name (stix_t* stix, const stix_oocs_t* name)
|
||||
|
||||
static int begin_include (stix_t* stix)
|
||||
{
|
||||
stix_io_arg_t* arg;
|
||||
stix_ioarg_t* arg;
|
||||
const stix_ooch_t* io_name;
|
||||
|
||||
io_name = add_io_name (stix, &stix->c->tok.name);
|
||||
if (!io_name) return -1;
|
||||
|
||||
arg = (stix_io_arg_t*) stix_callocmem (stix, STIX_SIZEOF(*arg));
|
||||
arg = (stix_ioarg_t*) stix_callocmem (stix, STIX_SIZEOF(*arg));
|
||||
if (!arg) goto oops;
|
||||
|
||||
arg->name = io_name;
|
||||
@ -1600,7 +1599,7 @@ oops:
|
||||
static int end_include (stix_t* stix)
|
||||
{
|
||||
int x;
|
||||
stix_io_arg_t* cur;
|
||||
stix_ioarg_t* cur;
|
||||
|
||||
if (stix->c->curinp == &stix->c->arg) return 0; /* no include */
|
||||
|
||||
@ -2633,7 +2632,7 @@ static int compile_method_primitive (stix_t* stix)
|
||||
while (ptr < end && is_digitchar(*ptr))
|
||||
{
|
||||
prim_no = prim_no * 10 + (*ptr - '0');
|
||||
if (!STIX_OOI_IN_PREAMBLE_INDEX_RANGE(prim_no))
|
||||
if (!STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(prim_no))
|
||||
{
|
||||
set_syntax_error (stix, STIX_SYNERR_PRIMNO, &stix->c->tok.loc, &stix->c->tok.name);
|
||||
return -1;
|
||||
@ -2658,7 +2657,7 @@ static int compile_method_primitive (stix_t* stix)
|
||||
/* the symbol literal contains an underscore.
|
||||
* and it is none of the first of the last character */
|
||||
if (add_symbol_literal(stix, &stix->c->tok.name, &lit_idx) >= 0 &&
|
||||
STIX_OOI_IN_PREAMBLE_INDEX_RANGE(lit_idx))
|
||||
STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(lit_idx))
|
||||
{
|
||||
stix->c->mth.prim_type = 2; /* named primitive */
|
||||
stix->c->mth.prim_no = lit_idx;
|
||||
@ -2669,7 +2668,7 @@ static int compile_method_primitive (stix_t* stix)
|
||||
set_syntax_error (stix, STIX_SYNERR_PRIMNO, &stix->c->tok.loc, &stix->c->tok.name);
|
||||
return -1;
|
||||
}
|
||||
else if (!STIX_OOI_IN_PREAMBLE_INDEX_RANGE(prim_no))
|
||||
else if (!STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(prim_no))
|
||||
{
|
||||
set_syntax_error (stix, STIX_SYNERR_PRIMNO, &stix->c->tok.loc, &stix->c->tok.name);
|
||||
return -1;
|
||||
@ -4263,7 +4262,7 @@ static int add_compiled_method (stix_t* stix)
|
||||
preamble_index = (preamble_index << 8) | stix->c->mth.code.ptr[i];
|
||||
}
|
||||
|
||||
if (!STIX_OOI_IN_PREAMBLE_INDEX_RANGE(preamble_index))
|
||||
if (!STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(preamble_index))
|
||||
{
|
||||
/* the index got out of the range */
|
||||
preamble_code = STIX_METHOD_PREAMBLE_NONE;
|
||||
@ -4290,7 +4289,7 @@ static int add_compiled_method (stix_t* stix)
|
||||
preamble_index = 0;
|
||||
}
|
||||
|
||||
STIX_ASSERT (STIX_OOI_IN_PREAMBLE_INDEX_RANGE(preamble_index));
|
||||
STIX_ASSERT (STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(preamble_index));
|
||||
|
||||
mth->owner = stix->c->cls.self_oop;
|
||||
mth->name = name;
|
||||
@ -4311,9 +4310,15 @@ the compiler must collect all source method string collected so far.
|
||||
need to write code to collect string.
|
||||
*/
|
||||
|
||||
/* TODO: if (decoding is enabled... */
|
||||
printf (">>>> BYTE CODE.....\n");
|
||||
stix_decode (stix, mth);
|
||||
|
||||
|
||||
stix_poptmps (stix, tmp_count); tmp_count = 0;
|
||||
|
||||
if (!stix_putatdic(stix, stix->c->cls.mthdic_oop[stix->c->mth.type], (stix_oop_t)name, (stix_oop_t)mth)) goto oops;
|
||||
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
@ -5190,7 +5195,7 @@ static void fini_compiler (stix_t* stix)
|
||||
}
|
||||
}
|
||||
|
||||
int stix_compile (stix_t* stix, stix_io_impl_t io)
|
||||
int stix_compile (stix_t* stix, stix_ioimpl_t io)
|
||||
{
|
||||
int n;
|
||||
|
||||
@ -5259,7 +5264,7 @@ oops:
|
||||
* closed. close them */
|
||||
while (stix->c->curinp != &stix->c->arg)
|
||||
{
|
||||
stix_io_arg_t* prev;
|
||||
stix_ioarg_t* prev;
|
||||
|
||||
/* nothing much to do about a close error */
|
||||
stix->c->impl (stix, STIX_IO_CLOSE, stix->c->curinp);
|
||||
@ -5279,3 +5284,5 @@ void stix_getsynerr (stix_t* stix, stix_synerr_t* synerr)
|
||||
STIX_ASSERT (stix->c != STIX_NULL);
|
||||
if (synerr) *synerr = stix->c->synerr;
|
||||
}
|
||||
|
||||
|
||||
|
503
stix/lib/decode.c
Normal file
503
stix/lib/decode.c
Normal file
@ -0,0 +1,503 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2014-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAfRRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "stix-prv.h"
|
||||
|
||||
# define DECODE_OUT_0(fmt) printf("\t" fmt "\n")
|
||||
# define DECODE_OUT_1(fmt,a1) printf("\t" fmt "\n",a1)
|
||||
# define DECODE_OUT_2(fmt,a1,a2) printf("\t" fmt "\n", a1, a2)
|
||||
# define DECODE_OUT_3(fmt,a1,a2,a3) printf("\t" fmt "\n", a1, a2, a3)
|
||||
|
||||
|
||||
#define FETCH_BYTE_CODE(stix) (cdptr[ip++])
|
||||
#define FETCH_BYTE_CODE_TO(stix,v_ooi) (v_ooi = FETCH_BYTE_CODE(stix))
|
||||
#if (STIX_BCODE_LONG_PARAM_SIZE == 2)
|
||||
# define FETCH_PARAM_CODE_TO(stix,v_ooi) \
|
||||
do { \
|
||||
v_ooi = FETCH_BYTE_CODE(stix); \
|
||||
v_ooi = (v_ooi << 8) | FETCH_BYTE_CODE(stix); \
|
||||
} while (0)
|
||||
#else
|
||||
# define FETCH_PARAM_CODE_TO(stix,v_ooi) (v_ooi = FETCH_BYTE_CODE(stix))
|
||||
#endif
|
||||
|
||||
/* TODO: check if ip shoots beyond the maximum length in fetching code and parameters */
|
||||
static int decode (stix_t* stix, stix_oop_method_t mth)
|
||||
{
|
||||
stix_oob_t bcode, * cdptr;
|
||||
stix_oow_t ip = 0, cdlen;
|
||||
stix_ooi_t b1, b2;
|
||||
|
||||
cdptr = STIX_METHOD_GET_CODE_BYTE(mth);
|
||||
cdlen = STIX_METHOD_GET_CODE_SIZE(mth);
|
||||
|
||||
/* TODO: check if ip increases beyon bcode when fetching parameters too */
|
||||
while (ip < cdlen)
|
||||
{
|
||||
FETCH_BYTE_CODE_TO(stix, bcode);
|
||||
|
||||
switch (bcode)
|
||||
{
|
||||
case BCODE_PUSH_INSTVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto push_instvar;
|
||||
case BCODE_PUSH_INSTVAR_0:
|
||||
case BCODE_PUSH_INSTVAR_1:
|
||||
case BCODE_PUSH_INSTVAR_2:
|
||||
case BCODE_PUSH_INSTVAR_3:
|
||||
case BCODE_PUSH_INSTVAR_4:
|
||||
case BCODE_PUSH_INSTVAR_5:
|
||||
case BCODE_PUSH_INSTVAR_6:
|
||||
case BCODE_PUSH_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
push_instvar:
|
||||
DECODE_OUT_1 ("push_instvar %lu", (unsigned long int)b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
|
||||
case BCODE_STORE_INTO_INSTVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto store_instvar;
|
||||
case BCODE_STORE_INTO_INSTVAR_0:
|
||||
case BCODE_STORE_INTO_INSTVAR_1:
|
||||
case BCODE_STORE_INTO_INSTVAR_2:
|
||||
case BCODE_STORE_INTO_INSTVAR_3:
|
||||
case BCODE_STORE_INTO_INSTVAR_4:
|
||||
case BCODE_STORE_INTO_INSTVAR_5:
|
||||
case BCODE_STORE_INTO_INSTVAR_6:
|
||||
case BCODE_STORE_INTO_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
store_instvar:
|
||||
DECODE_OUT_1 ("store_into_instvar %lu", (unsigned long int)b1);
|
||||
break;
|
||||
|
||||
case BCODE_POP_INTO_INSTVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto pop_into_instvar;
|
||||
case BCODE_POP_INTO_INSTVAR_0:
|
||||
case BCODE_POP_INTO_INSTVAR_1:
|
||||
case BCODE_POP_INTO_INSTVAR_2:
|
||||
case BCODE_POP_INTO_INSTVAR_3:
|
||||
case BCODE_POP_INTO_INSTVAR_4:
|
||||
case BCODE_POP_INTO_INSTVAR_5:
|
||||
case BCODE_POP_INTO_INSTVAR_6:
|
||||
case BCODE_POP_INTO_INSTVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
pop_into_instvar:
|
||||
DECODE_OUT_1 ("pop_into_instvar %lu", (unsigned long int)b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
case BCODE_PUSH_TEMPVAR_X:
|
||||
case BCODE_STORE_INTO_TEMPVAR_X:
|
||||
case BCODE_POP_INTO_TEMPVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto handle_tempvar;
|
||||
|
||||
case BCODE_PUSH_TEMPVAR_0:
|
||||
case BCODE_PUSH_TEMPVAR_1:
|
||||
case BCODE_PUSH_TEMPVAR_2:
|
||||
case BCODE_PUSH_TEMPVAR_3:
|
||||
case BCODE_PUSH_TEMPVAR_4:
|
||||
case BCODE_PUSH_TEMPVAR_5:
|
||||
case BCODE_PUSH_TEMPVAR_6:
|
||||
case BCODE_PUSH_TEMPVAR_7:
|
||||
case BCODE_STORE_INTO_TEMPVAR_0:
|
||||
case BCODE_STORE_INTO_TEMPVAR_1:
|
||||
case BCODE_STORE_INTO_TEMPVAR_2:
|
||||
case BCODE_STORE_INTO_TEMPVAR_3:
|
||||
case BCODE_STORE_INTO_TEMPVAR_4:
|
||||
case BCODE_STORE_INTO_TEMPVAR_5:
|
||||
case BCODE_STORE_INTO_TEMPVAR_6:
|
||||
case BCODE_STORE_INTO_TEMPVAR_7:
|
||||
case BCODE_POP_INTO_TEMPVAR_0:
|
||||
case BCODE_POP_INTO_TEMPVAR_1:
|
||||
case BCODE_POP_INTO_TEMPVAR_2:
|
||||
case BCODE_POP_INTO_TEMPVAR_3:
|
||||
case BCODE_POP_INTO_TEMPVAR_4:
|
||||
case BCODE_POP_INTO_TEMPVAR_5:
|
||||
case BCODE_POP_INTO_TEMPVAR_6:
|
||||
case BCODE_POP_INTO_TEMPVAR_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
handle_tempvar:
|
||||
|
||||
if ((bcode >> 4) & 1)
|
||||
{
|
||||
/* push - bit 4 on */
|
||||
DECODE_OUT_1 ("push_tempvar %d", (int)b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* store or pop - bit 5 off */
|
||||
if ((bcode >> 3) & 1)
|
||||
{
|
||||
/* pop - bit 3 on */
|
||||
DECODE_OUT_1 ("pop_into_tempvar %d", (int)b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1 ("store_into_tempvar %d", (int)b1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
case BCODE_PUSH_LITERAL_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto push_literal;
|
||||
|
||||
case BCODE_PUSH_LITERAL_0:
|
||||
case BCODE_PUSH_LITERAL_1:
|
||||
case BCODE_PUSH_LITERAL_2:
|
||||
case BCODE_PUSH_LITERAL_3:
|
||||
case BCODE_PUSH_LITERAL_4:
|
||||
case BCODE_PUSH_LITERAL_5:
|
||||
case BCODE_PUSH_LITERAL_6:
|
||||
case BCODE_PUSH_LITERAL_7:
|
||||
b1 = bcode & 0x7; /* low 3 bits */
|
||||
push_literal:
|
||||
DECODE_OUT_1 ("push_literal %d", (int)b1);
|
||||
break;
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
case BCODE_PUSH_OBJECT_X:
|
||||
case BCODE_STORE_INTO_OBJECT_X:
|
||||
case BCODE_POP_INTO_OBJECT_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
goto handle_object;
|
||||
|
||||
case BCODE_PUSH_OBJECT_0:
|
||||
case BCODE_PUSH_OBJECT_1:
|
||||
case BCODE_PUSH_OBJECT_2:
|
||||
case BCODE_PUSH_OBJECT_3:
|
||||
case BCODE_STORE_INTO_OBJECT_0:
|
||||
case BCODE_STORE_INTO_OBJECT_1:
|
||||
case BCODE_STORE_INTO_OBJECT_2:
|
||||
case BCODE_STORE_INTO_OBJECT_3:
|
||||
case BCODE_POP_INTO_OBJECT_0:
|
||||
case BCODE_POP_INTO_OBJECT_1:
|
||||
case BCODE_POP_INTO_OBJECT_2:
|
||||
case BCODE_POP_INTO_OBJECT_3:
|
||||
b1 = bcode & 0x3; /* low 2 bits */
|
||||
handle_object:
|
||||
if ((bcode >> 3) & 1)
|
||||
{
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_1("pop_into_object %d", (int)b1);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1("store_into_object %d", (int)b1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_1("push_object %d", (int)b1);
|
||||
}
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_JUMP_FORWARD_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump_forward %d", (int)b1);
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_FORWARD_0:
|
||||
case BCODE_JUMP_FORWARD_1:
|
||||
case BCODE_JUMP_FORWARD_2:
|
||||
case BCODE_JUMP_FORWARD_3:
|
||||
DECODE_OUT_1 ("jump_forward %d", (int)(bcode & 0x3)); /* low 2 bits */
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_BACKWARD_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump_backward %d", (int)b1);
|
||||
stix->ip += b1;
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_BACKWARD_0:
|
||||
case BCODE_JUMP_BACKWARD_1:
|
||||
case BCODE_JUMP_BACKWARD_2:
|
||||
case BCODE_JUMP_BACKWARD_3:
|
||||
DECODE_OUT_1 ("jump_backward %d", (int)(bcode & 0x3)); /* low 2 bits */
|
||||
break;
|
||||
|
||||
case BCODE_JUMP_IF_TRUE_X:
|
||||
case BCODE_JUMP_IF_FALSE_X:
|
||||
case BCODE_JUMP_IF_TRUE_0:
|
||||
case BCODE_JUMP_IF_TRUE_1:
|
||||
case BCODE_JUMP_IF_TRUE_2:
|
||||
case BCODE_JUMP_IF_TRUE_3:
|
||||
case BCODE_JUMP_IF_FALSE_0:
|
||||
case BCODE_JUMP_IF_FALSE_1:
|
||||
case BCODE_JUMP_IF_FALSE_2:
|
||||
case BCODE_JUMP_IF_FALSE_3:
|
||||
printf ("<<<<<<<<<<<<<< JUMP NOT IMPLEMENTED YET >>>>>>>>>>>> \n");
|
||||
stix->errnum = STIX_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
case BCODE_JUMP2_FORWARD:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump2_forward %d", (int)b1);
|
||||
break;
|
||||
|
||||
case BCODE_JUMP2_BACKWARD:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("jump2_backward %d", (int)b1);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_PUSH_CTXTEMPVAR_X:
|
||||
case BCODE_STORE_INTO_CTXTEMPVAR_X:
|
||||
case BCODE_POP_INTO_CTXTEMPVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
FETCH_PARAM_CODE_TO (stix, b2);
|
||||
goto handle_ctxtempvar;
|
||||
case BCODE_PUSH_CTXTEMPVAR_0:
|
||||
case BCODE_PUSH_CTXTEMPVAR_1:
|
||||
case BCODE_PUSH_CTXTEMPVAR_2:
|
||||
case BCODE_PUSH_CTXTEMPVAR_3:
|
||||
case BCODE_STORE_INTO_CTXTEMPVAR_0:
|
||||
case BCODE_STORE_INTO_CTXTEMPVAR_1:
|
||||
case BCODE_STORE_INTO_CTXTEMPVAR_2:
|
||||
case BCODE_STORE_INTO_CTXTEMPVAR_3:
|
||||
case BCODE_POP_INTO_CTXTEMPVAR_0:
|
||||
case BCODE_POP_INTO_CTXTEMPVAR_1:
|
||||
case BCODE_POP_INTO_CTXTEMPVAR_2:
|
||||
case BCODE_POP_INTO_CTXTEMPVAR_3:
|
||||
b1 = bcode & 0x3; /* low 2 bits */
|
||||
FETCH_BYTE_CODE_TO (stix, b2);
|
||||
|
||||
handle_ctxtempvar:
|
||||
if ((bcode >> 3) & 1)
|
||||
{
|
||||
/* store or pop */
|
||||
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_2 ("pop_into_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("store_into_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* push */
|
||||
DECODE_OUT_2 ("push_ctxtempvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
|
||||
break;
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_PUSH_OBJVAR_X:
|
||||
case BCODE_STORE_INTO_OBJVAR_X:
|
||||
case BCODE_POP_INTO_OBJVAR_X:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
FETCH_PARAM_CODE_TO (stix, b2);
|
||||
goto handle_objvar;
|
||||
|
||||
case BCODE_PUSH_OBJVAR_0:
|
||||
case BCODE_PUSH_OBJVAR_1:
|
||||
case BCODE_PUSH_OBJVAR_2:
|
||||
case BCODE_PUSH_OBJVAR_3:
|
||||
case BCODE_STORE_INTO_OBJVAR_0:
|
||||
case BCODE_STORE_INTO_OBJVAR_1:
|
||||
case BCODE_STORE_INTO_OBJVAR_2:
|
||||
case BCODE_STORE_INTO_OBJVAR_3:
|
||||
case BCODE_POP_INTO_OBJVAR_0:
|
||||
case BCODE_POP_INTO_OBJVAR_1:
|
||||
case BCODE_POP_INTO_OBJVAR_2:
|
||||
case BCODE_POP_INTO_OBJVAR_3:
|
||||
/* b1 -> variable index to the object indicated by b2.
|
||||
* b2 -> object index stored in the literal frame. */
|
||||
b1 = bcode & 0x3; /* low 2 bits */
|
||||
FETCH_BYTE_CODE_TO (stix, b2);
|
||||
|
||||
handle_objvar:
|
||||
if ((bcode >> 3) & 1)
|
||||
{
|
||||
/* store or pop */
|
||||
if ((bcode >> 2) & 1)
|
||||
{
|
||||
DECODE_OUT_2 ("pop_into_objvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("store_into_objvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DECODE_OUT_2 ("push_objvar %d %d", (int)b1, (int)b2);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
case BCODE_SEND_MESSAGE_X:
|
||||
case BCODE_SEND_MESSAGE_TO_SUPER_X:
|
||||
/* b1 -> number of arguments
|
||||
* b2 -> selector index stored in the literal frame */
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
FETCH_PARAM_CODE_TO (stix, b2);
|
||||
goto handle_send_message;
|
||||
|
||||
case BCODE_SEND_MESSAGE_0:
|
||||
case BCODE_SEND_MESSAGE_1:
|
||||
case BCODE_SEND_MESSAGE_2:
|
||||
case BCODE_SEND_MESSAGE_3:
|
||||
case BCODE_SEND_MESSAGE_TO_SUPER_0:
|
||||
case BCODE_SEND_MESSAGE_TO_SUPER_1:
|
||||
case BCODE_SEND_MESSAGE_TO_SUPER_2:
|
||||
case BCODE_SEND_MESSAGE_TO_SUPER_3:
|
||||
b1 = bcode & 0x3; /* low 2 bits */
|
||||
FETCH_BYTE_CODE_TO (stix, b2);
|
||||
|
||||
handle_send_message:
|
||||
DECODE_OUT_3 ("send_message%s nargs=%d selector=%d", (((bcode >> 2) & 1)? "_to_super": ""), (int)b1, (int)b2);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_PUSH_RECEIVER:
|
||||
DECODE_OUT_0 ("push_receiver");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NIL:
|
||||
DECODE_OUT_0 ("push_nil");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_TRUE:
|
||||
DECODE_OUT_0 ("push_true");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_FALSE:
|
||||
DECODE_OUT_0 ("push_false");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_CONTEXT:
|
||||
DECODE_OUT_0 ("push_context");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NEGONE:
|
||||
DECODE_OUT_0 ("push_negone");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_ZERO:
|
||||
DECODE_OUT_0 ("push_zero");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_ONE:
|
||||
DECODE_OUT_0 ("push_one");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_TWO:
|
||||
DECODE_OUT_0 ("push_two");
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_INTLIT:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("push_intlit %d", (int)b1);
|
||||
break;
|
||||
|
||||
case BCODE_PUSH_NEGINTLIT:
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
DECODE_OUT_1 ("push_negintlit %d", (int)-b1);
|
||||
break;
|
||||
|
||||
/* -------------------------------------------------------- */
|
||||
|
||||
case BCODE_DUP_STACKTOP:
|
||||
DECODE_OUT_0 ("dup_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_POP_STACKTOP:
|
||||
DECODE_OUT_0 ("pop_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_STACKTOP:
|
||||
DECODE_OUT_0 ("return_stacktop");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_RECEIVER:
|
||||
DECODE_OUT_0 ("return_receiver");
|
||||
break;
|
||||
|
||||
case BCODE_RETURN_FROM_BLOCK:
|
||||
DECODE_OUT_0 ("return_from_block");
|
||||
break;
|
||||
|
||||
case BCODE_MAKE_BLOCK:
|
||||
/* b1 - number of block arguments
|
||||
* b2 - number of block temporaries */
|
||||
FETCH_PARAM_CODE_TO (stix, b1);
|
||||
FETCH_PARAM_CODE_TO (stix, b2);
|
||||
|
||||
DECODE_OUT_2 ("make_block %d %d", (int)b1, (int)b2);
|
||||
|
||||
STIX_ASSERT (b1 >= 0);
|
||||
STIX_ASSERT (b2 >= b1);
|
||||
break;
|
||||
|
||||
|
||||
case BCODE_SEND_BLOCK_COPY:
|
||||
DECODE_OUT_0 ("send_block_copy");
|
||||
break;
|
||||
|
||||
case BCODE_NOOP:
|
||||
/* do nothing */
|
||||
DECODE_OUT_0 ("noop");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("UNKNOWN BYTE CODE ENCOUNTERED %x\n", (int)bcode);
|
||||
stix->errnum = STIX_EINTERN;
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* print literal frame contents */
|
||||
for (ip = 0; ip < STIX_OBJ_GET_SIZE(mth) - STIX_METHOD_NAMED_INSTVARS; ip++)
|
||||
{
|
||||
printf (" %8lu ", (unsigned long int)ip);
|
||||
print_object (stix, mth->slot[ip]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stix_decode (stix_t* stix, stix_oop_method_t mth)
|
||||
{
|
||||
return decode (stix, mth);
|
||||
}
|
518
stix/lib/exec.c
518
stix/lib/exec.c
File diff suppressed because it is too large
Load Diff
@ -98,6 +98,8 @@ struct xtn_t
|
||||
stix_oow_t bchar_len;
|
||||
};
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static void* sys_alloc (stix_mmgr_t* mmgr, stix_oow_t size)
|
||||
{
|
||||
return malloc (size);
|
||||
@ -121,8 +123,9 @@ static stix_mmgr_t sys_mmgr =
|
||||
STIX_NULL
|
||||
};
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static STIX_INLINE stix_ooi_t open_input (stix_t* stix, stix_io_arg_t* arg)
|
||||
static STIX_INLINE stix_ooi_t open_input (stix_t* stix, stix_ioarg_t* arg)
|
||||
{
|
||||
if (arg->includer)
|
||||
{
|
||||
@ -165,7 +168,7 @@ static STIX_INLINE stix_ooi_t open_input (stix_t* stix, stix_io_arg_t* arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static STIX_INLINE stix_ooi_t read_input (stix_t* stix, stix_io_arg_t* arg)
|
||||
static STIX_INLINE stix_ooi_t read_input (stix_t* stix, stix_ioarg_t* arg)
|
||||
{
|
||||
xtn_t* xtn = stix_getxtn(stix);
|
||||
stix_oow_t n, bcslen, ucslen, remlen;
|
||||
@ -198,14 +201,14 @@ static STIX_INLINE stix_ooi_t read_input (stix_t* stix, stix_io_arg_t* arg)
|
||||
return ucslen;
|
||||
}
|
||||
|
||||
static STIX_INLINE stix_ooi_t close_input (stix_t* stix, stix_io_arg_t* arg)
|
||||
static STIX_INLINE stix_ooi_t close_input (stix_t* stix, stix_ioarg_t* arg)
|
||||
{
|
||||
STIX_ASSERT (arg->handle != STIX_NULL);
|
||||
fclose ((FILE*)arg->handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static stix_ooi_t input_handler (stix_t* stix, stix_io_cmd_t cmd, stix_io_arg_t* arg)
|
||||
static stix_ooi_t input_handler (stix_t* stix, stix_iocmd_t cmd, stix_ioarg_t* arg)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
@ -223,6 +226,7 @@ static stix_ooi_t input_handler (stix_t* stix, stix_io_cmd_t cmd, stix_io_arg_t*
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* ========================================================================= */
|
||||
|
||||
static void* mod_open (stix_t* stix, const stix_ooch_t* name)
|
||||
{
|
||||
@ -324,6 +328,49 @@ printf ("MOD_GETSYM [%s]\n", &buf[0]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static void log_write (stix_t* stix, int mask, const stix_ooch_t* msg, stix_oow_t len)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
# error NOT IMPLEMENTED
|
||||
|
||||
#else
|
||||
stix_bch_t buf[10];
|
||||
stix_oow_t ucslen, bcslen, msgidx;
|
||||
int n;
|
||||
|
||||
msgidx = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
ucslen = len;
|
||||
bcslen = STIX_COUNTOF(buf) - len;
|
||||
|
||||
n = stix_ucstoutf8 (&msg[msgidx], &ucslen, buf, &bcslen);
|
||||
if (n == 0)
|
||||
{
|
||||
write (1, buf, bcslen); /* TODO: write all */
|
||||
break;
|
||||
}
|
||||
else if (n == -2)
|
||||
{
|
||||
STIX_ASSERT (ucslen > 0); /* if this fails, the buffer size must be increased */
|
||||
write (1, buf, bcslen); /* TODO: write all */
|
||||
msgidx += ucslen;
|
||||
len -= ucslen;
|
||||
}
|
||||
else if (n <= -1)
|
||||
{
|
||||
/* conversion error */
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
static char* syntax_error_msg[] =
|
||||
{
|
||||
"no error",
|
||||
@ -380,12 +427,17 @@ static char* syntax_error_msg[] =
|
||||
"literal expected"
|
||||
};
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
stix_ooch_t str_my_object[] = { 'M', 'y', 'O', 'b','j','e','c','t' };
|
||||
stix_ooch_t str_main[] = { 'm', 'a', 'i', 'n' };
|
||||
|
||||
|
||||
stix_t* g_stix = STIX_NULL;
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
|
||||
#if defined(__MSDOS__) && defined(_INTELC32_)
|
||||
static void (*prev_timer_intr_handler) (void);
|
||||
|
||||
@ -491,6 +543,8 @@ static void cancel_tick (void)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
stix_t* stix;
|
||||
@ -524,6 +578,8 @@ int main (int argc, char* argv[])
|
||||
vmprim.mod_open = mod_open;
|
||||
vmprim.mod_close = mod_close;
|
||||
vmprim.mod_getsym = mod_getsym;
|
||||
vmprim.log_write = log_write;
|
||||
|
||||
|
||||
#if defined(USE_LTDL)
|
||||
lt_dlinit ();
|
||||
|
@ -29,36 +29,17 @@
|
||||
#include <stix-utl.h>
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* TODO: don't use these macros... */
|
||||
#define ACTIVE_STACK_PUSH(stix,v) \
|
||||
do { \
|
||||
(stix)->sp = (stix)->sp + 1; \
|
||||
(stix)->active_context->slot[(stix)->sp] = v; \
|
||||
} while (0)
|
||||
|
||||
#define ACTIVE_STACK_POP(stix) ((stix)->sp = (stix)->sp - 1)
|
||||
#define ACTIVE_STACK_UNPOP(stix) ((stix)->sp = (stix)->sp + 1)
|
||||
#define ACTIVE_STACK_POPS(stix,count) ((stix)->sp = (stix)->sp - (count))
|
||||
|
||||
#define ACTIVE_STACK_GET(stix,v_sp) ((stix)->active_context->slot[v_sp])
|
||||
#define ACTIVE_STACK_SET(stix,v_sp,v_obj) ((stix)->active_context->slot[v_sp] = v_obj)
|
||||
#define ACTIVE_STACK_GETTOP(stix) ACTIVE_STACK_GET(stix, (stix)->sp)
|
||||
#define ACTIVE_STACK_SETTOP(stix,v_obj) ACTIVE_STACK_SET(stix, (stix)->sp, v_obj)
|
||||
|
||||
|
||||
|
||||
static int prim_open (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
printf ("<<<<<<<<<<<SND OPEN>>>>>>>>>>>>>>>>>>\n");
|
||||
ACTIVE_STACK_POPS (stix, nargs);
|
||||
STIX_STACK_POPS (stix, nargs);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int prim_close (stix_t* stix, stix_ooi_t nargs)
|
||||
{
|
||||
printf ("<<<<<<<<<<<<<<<<<<<<SND CLOSE>>>>>>>>>>>>>>>>>>>>>>\n");
|
||||
ACTIVE_STACK_POPS (stix, nargs);
|
||||
STIX_STACK_POPS (stix, nargs);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||
Copyright (c) 2006-2016 Chung, Hyung-Hwan. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
|
@ -44,14 +44,6 @@
|
||||
* PUSH_CONTEXT, PUSH_INTLIT, PUSH_INTLIT, SEND_BLOCK_COPY */
|
||||
#define STIX_USE_MAKE_BLOCK
|
||||
|
||||
/* define this to allow an pointer(OOP) object to have trailing bytes
|
||||
* this is used to embed bytes codes into the back of a compile method
|
||||
* object instead of putting in in a separate byte array. */
|
||||
#define STIX_USE_OBJECT_TRAILER
|
||||
|
||||
/* define this to use the stack allocated inside process stack */
|
||||
#define STIX_USE_PROCSTK
|
||||
|
||||
/* this is for gc debugging */
|
||||
/*#define STIX_DEBUG_PROCESSOR*/
|
||||
/*#define STIX_DEBUG_GC_001*/
|
||||
@ -244,13 +236,13 @@
|
||||
/* SOURCE CODE I/O FOR COMPILER */
|
||||
/* ========================================================================= */
|
||||
|
||||
enum stix_io_cmd_t
|
||||
enum stix_iocmd_t
|
||||
{
|
||||
STIX_IO_OPEN,
|
||||
STIX_IO_CLOSE,
|
||||
STIX_IO_READ
|
||||
};
|
||||
typedef enum stix_io_cmd_t stix_io_cmd_t;
|
||||
typedef enum stix_iocmd_t stix_iocmd_t;
|
||||
|
||||
struct stix_ioloc_t
|
||||
{
|
||||
@ -268,14 +260,14 @@ struct stix_iolxc_t
|
||||
typedef struct stix_iolxc_t stix_iolxc_t;
|
||||
|
||||
/*
|
||||
enum stix_io_arg_flag_t
|
||||
enum stix_ioarg_flag_t
|
||||
{
|
||||
STIX_IO_INCLUDED = (1 << 0)
|
||||
};
|
||||
typedef enum stix_io_arg_flag_t stix_io_arg_flag_t; */
|
||||
typedef enum stix_ioarg_flag_t stix_ioarg_flag_t; */
|
||||
|
||||
typedef struct stix_io_arg_t stix_io_arg_t;
|
||||
struct stix_io_arg_t
|
||||
typedef struct stix_ioarg_t stix_ioarg_t;
|
||||
struct stix_ioarg_t
|
||||
{
|
||||
/**
|
||||
* [IN] I/O object name.
|
||||
@ -285,7 +277,8 @@ struct stix_io_arg_t
|
||||
const stix_ooch_t* name;
|
||||
|
||||
/**
|
||||
* [OUT] I/O handle set by a handler.
|
||||
* [OUT] I/O handle set by an open handler.
|
||||
* [IN] I/O handle referenced in read and close handler.
|
||||
* The source stream handler can set this field when it opens a stream.
|
||||
* All subsequent operations on the stream see this field as set
|
||||
* during opening.
|
||||
@ -301,7 +294,7 @@ struct stix_io_arg_t
|
||||
* [IN] points to the data of the includer. It is #STIX_NULL for the
|
||||
* main stream.
|
||||
*/
|
||||
stix_io_arg_t* includer;
|
||||
stix_ioarg_t* includer;
|
||||
|
||||
/*-----------------------------------------------------------------*/
|
||||
/*----------- from here down, internal use only -------------------*/
|
||||
@ -317,10 +310,10 @@ struct stix_io_arg_t
|
||||
/*-----------------------------------------------------------------*/
|
||||
};
|
||||
|
||||
typedef stix_ooi_t (*stix_io_impl_t) (
|
||||
typedef stix_ooi_t (*stix_ioimpl_t) (
|
||||
stix_t* stix,
|
||||
stix_io_cmd_t cmd,
|
||||
stix_io_arg_t* arg
|
||||
stix_iocmd_t cmd,
|
||||
stix_ioarg_t* arg
|
||||
);
|
||||
|
||||
struct stix_iotok_t
|
||||
@ -447,7 +440,7 @@ typedef struct stix_code_t stix_code_t;
|
||||
struct stix_compiler_t
|
||||
{
|
||||
/* input handler */
|
||||
stix_io_impl_t impl;
|
||||
stix_ioimpl_t impl;
|
||||
|
||||
/* information about the last meaningful character read.
|
||||
* this is a copy of curinp->lxc if no ungetting is performed.
|
||||
@ -461,10 +454,10 @@ struct stix_compiler_t
|
||||
int nungots;
|
||||
|
||||
/* static input data buffer */
|
||||
stix_io_arg_t arg;
|
||||
stix_ioarg_t arg;
|
||||
|
||||
/* pointer to the current input data. initially, it points to &arg */
|
||||
stix_io_arg_t* curinp;
|
||||
stix_ioarg_t* curinp;
|
||||
|
||||
/* the last token read */
|
||||
stix_iotok_t tok;
|
||||
@ -1080,6 +1073,35 @@ stix_oow_t stix_utf8touc (
|
||||
stix_uch_t* uc
|
||||
);
|
||||
|
||||
/**
|
||||
* The stix_ucstoutf8() function converts a unicode character string \a ucs
|
||||
* to a UTF8 string and writes it into the buffer pointed to by \a bcs, but
|
||||
* not more than \a bcslen bytes including the terminating null.
|
||||
*
|
||||
* Upon return, \a bcslen is modified to the actual number of bytes written to
|
||||
* \a bcs excluding the terminating null; \a ucslen is modified to the number of
|
||||
* wide characters converted.
|
||||
*
|
||||
* You may pass #STIX_NULL for \a bcs to dry-run conversion or to get the
|
||||
* required buffer size for conversion. -2 is never returned in this case.
|
||||
*
|
||||
* \return
|
||||
* - 0 on full conversion,
|
||||
* - -1 on no or partial conversion for an illegal character encountered,
|
||||
* - -2 on no or partial conversion for a small buffer.
|
||||
*
|
||||
* \code
|
||||
* const stix_uch_t ucs[] = { 'H', 'e', 'l', 'l', 'o' };
|
||||
* stix_bch_t bcs[10];
|
||||
* stix_oow_t ucslen = 5;
|
||||
* stix_oow_t bcslen = STIX_COUNTOF(bcs);
|
||||
* n = stix_ucstoutf8 (ucs, &ucslen, bcs, &bcslen);
|
||||
* if (n <= -1)
|
||||
* {
|
||||
* // conversion error
|
||||
* }
|
||||
* \endcode
|
||||
*/
|
||||
int stix_ucstoutf8 (
|
||||
const stix_uch_t* ucs,
|
||||
stix_oow_t* ucslen,
|
||||
@ -1261,7 +1283,7 @@ stix_oop_t stix_inttostr (
|
||||
/* ========================================================================= */
|
||||
STIX_EXPORT int stix_compile (
|
||||
stix_t* stix,
|
||||
stix_io_impl_t io
|
||||
stix_ioimpl_t io
|
||||
);
|
||||
|
||||
STIX_EXPORT void stix_getsynerr (
|
||||
|
@ -252,7 +252,6 @@ int stix_getoption (stix_t* stix, stix_option_t id, void* value)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
stix_cb_t* stix_regcb (stix_t* stix, stix_cb_t* tmpl)
|
||||
{
|
||||
stix_cb_t* actual;
|
||||
|
@ -33,6 +33,13 @@
|
||||
/* TODO: move this macro out to the build files.... */
|
||||
#define STIX_INCLUDE_COMPILER
|
||||
|
||||
/* define this to use the stack allocated inside process stack */
|
||||
#define STIX_USE_PROCSTK
|
||||
|
||||
/* define this to allow an pointer(OOP) object to have trailing bytes
|
||||
* this is used to embed bytes codes into the back of a compile method
|
||||
* object instead of putting in in a separate byte array. */
|
||||
#define STIX_USE_OBJECT_TRAILER
|
||||
/* ========================================================================== */
|
||||
|
||||
/**
|
||||
@ -454,6 +461,19 @@ struct stix_method_t
|
||||
stix_oop_t slot[1]; /* it stores literals */
|
||||
};
|
||||
|
||||
#if defined(STIX_USE_OBJECT_TRAILER)
|
||||
|
||||
/* if m is to be type-cast to stix_oop_method_t, the macro must be
|
||||
* redefined to this:
|
||||
* (&((stix_oop_method_t)m)>slot[STIX_OBJ_GET_SIZE(m) + 1 - STIX_METHOD_NAMED_INSTVARS])
|
||||
*/
|
||||
# define STIX_METHOD_GET_CODE_BYTE(m) ((stix_oob_t*)&((stix_oop_oop_t)m)->slot[STIX_OBJ_GET_SIZE(m) + 1])
|
||||
# define STIX_METHOD_GET_CODE_SIZE(m) ((stix_oow_t)((stix_oop_oop_t)m)->slot[STIX_OBJ_GET_SIZE(m)])
|
||||
#else
|
||||
# define STIX_METHOD_GET_CODE_BYTE(m) ((m)->code->slot)
|
||||
# define STIX_METHOD_GET_CODE_SIZE(m) STIX_OBJ_GET_SIZE((m)->code)
|
||||
#endif
|
||||
|
||||
/* The preamble field is composed of a 8-bit code and a 16-bit
|
||||
* index.
|
||||
*
|
||||
@ -489,7 +509,7 @@ struct stix_method_t
|
||||
/* the index is an 16-bit unsigned integer. */
|
||||
#define STIX_METHOD_PREAMBLE_INDEX_MIN 0x0000
|
||||
#define STIX_METHOD_PREAMBLE_INDEX_MAX 0xFFFF
|
||||
#define STIX_OOI_IN_PREAMBLE_INDEX_RANGE(num) ((num) >= STIX_METHOD_PREAMBLE_INDEX_MIN && (num) <= STIX_METHOD_PREAMBLE_INDEX_MAX)
|
||||
#define STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(num) ((num) >= STIX_METHOD_PREAMBLE_INDEX_MIN && (num) <= STIX_METHOD_PREAMBLE_INDEX_MAX)
|
||||
|
||||
#define STIX_CONTEXT_NAMED_INSTVARS 8
|
||||
typedef struct stix_context_t stix_context_t;
|
||||
@ -637,15 +657,18 @@ typedef struct stix_t stix_t;
|
||||
* ========================================================================= */
|
||||
#define STIX_MOD_NAME_LEN_MAX 120
|
||||
|
||||
typedef void* (*stix_mod_open_t) (stix_t* stix, const stix_uch_t* name);
|
||||
typedef void* (*stix_mod_open_t) (stix_t* stix, const stix_ooch_t* name);
|
||||
typedef void (*stix_mod_close_t) (stix_t* stix, void* handle);
|
||||
typedef void* (*stix_mod_getsym_t) (stix_t* stix, void* handle, const stix_uch_t* name);
|
||||
typedef void* (*stix_mod_getsym_t) (stix_t* stix, void* handle, const stix_ooch_t* name);
|
||||
|
||||
typedef void (*stix_log_write_t) (stix_t* stix, int mask, const stix_ooch_t* msg, stix_oow_t len);
|
||||
|
||||
struct stix_vmprim_t
|
||||
{
|
||||
stix_mod_open_t mod_open;
|
||||
stix_mod_close_t mod_close;
|
||||
stix_mod_getsym_t mod_getsym;
|
||||
stix_log_write_t log_write;
|
||||
};
|
||||
|
||||
typedef struct stix_vmprim_t stix_vmprim_t;
|
||||
@ -654,18 +677,18 @@ typedef struct stix_vmprim_t stix_vmprim_t;
|
||||
* IO MANIPULATION
|
||||
* ========================================================================= */
|
||||
|
||||
/* TODO: MOVE stix_io_impl_t HERE */
|
||||
/* TODO: MOVE stix_ioimpl_t HERE */
|
||||
|
||||
/* =========================================================================
|
||||
* CALLBACK MANIPULATION
|
||||
* ========================================================================= */
|
||||
typedef void (*stix_cb_impl_t) (stix_t* stix);
|
||||
typedef void (*stix_cbimpl_t) (stix_t* stix);
|
||||
|
||||
typedef struct stix_cb_t stix_cb_t;
|
||||
struct stix_cb_t
|
||||
{
|
||||
stix_cb_impl_t gc;
|
||||
stix_cb_impl_t fini;
|
||||
stix_cbimpl_t gc;
|
||||
stix_cbimpl_t fini;
|
||||
|
||||
/* private below */
|
||||
stix_cb_t* prev;
|
||||
@ -821,6 +844,37 @@ struct stix_t
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if defined(STIX_USE_PROCSTK)
|
||||
/* TODO: stack bound check when pushing */
|
||||
#define STIX_STACK_PUSH(stix,v) \
|
||||
do { \
|
||||
(stix)->sp = (stix)->sp + 1; \
|
||||
(stix)->processor->active->slot[(stix)->sp] = v; \
|
||||
} while (0)
|
||||
|
||||
#define STIX_STACK_GET(stix,v_sp) ((stix)->processor->active->slot[v_sp])
|
||||
#define STIX_STACK_SET(stix,v_sp,v_obj) ((stix)->processor->active->slot[v_sp] = v_obj)
|
||||
|
||||
#else
|
||||
#define STIX_STACK_PUSH(stix,v) \
|
||||
do { \
|
||||
(stix)->sp = (stix)->sp + 1; \
|
||||
(stix)->active_context->slot[(stix)->sp] = v; \
|
||||
} while (0)
|
||||
|
||||
#define STIX_STACK_GET(stix,v_sp) ((stix)->active_context->slot[v_sp])
|
||||
#define STIX_STACK_SET(stix,v_sp,v_obj) ((stix)->active_context->slot[v_sp] = v_obj)
|
||||
#endif
|
||||
|
||||
#define STIX_STACK_GETTOP(stix) STIX_STACK_GET(stix, (stix)->sp)
|
||||
#define STIX_STACK_SETTOP(stix,v_obj) STIX_STACK_SET(stix, (stix)->sp, v_obj)
|
||||
|
||||
#define STIX_STACK_POP(stix) ((stix)->sp = (stix)->sp - 1)
|
||||
#define STIX_STACK_POPS(stix,count) ((stix)->sp = (stix)->sp - (count))
|
||||
#define STIX_STACK_ISEMPTY(stix) ((stix)->sp <= -1)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
@ -978,6 +1032,10 @@ STIX_EXPORT void stix_poptmps (
|
||||
stix_oow_t count
|
||||
);
|
||||
|
||||
STIX_EXPORT int stix_decode (
|
||||
stix_t* stix,
|
||||
stix_oop_method_t mth
|
||||
);
|
||||
|
||||
/* Memory allocation/deallocation functions using stix's MMGR */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user