99 lines
2.6 KiB
C
99 lines
2.6 KiB
C
/**
|
|
** @file mruby/irep.h - mrc_irep structure
|
|
**
|
|
** See Copyright Notice in mruby.h
|
|
*/
|
|
|
|
#ifndef MRC_IREP_H
|
|
#define MRC_IREP_H
|
|
|
|
#include "mrc_ccontext.h"
|
|
|
|
/**
|
|
* Compiled mruby scripts.
|
|
*/
|
|
MRC_BEGIN_DECL
|
|
|
|
#define IREP_TT_NFLAG 1 /* number (non string) flag */
|
|
#define IREP_TT_SFLAG 2 /* static string flag */
|
|
|
|
typedef struct mrc_pool_value {
|
|
uint32_t tt; /* packed type and length (for string) */
|
|
union {
|
|
const char *str;
|
|
int32_t i32;
|
|
int64_t i64;
|
|
#ifndef MRC_NO_FLOAT
|
|
mrc_float f;
|
|
#endif
|
|
} u;
|
|
} mrc_pool_value;
|
|
|
|
enum mrc_catch_type {
|
|
MRC_CATCH_RESCUE = 0,
|
|
MRC_CATCH_ENSURE = 1,
|
|
};
|
|
|
|
struct mrc_irep_catch_handler {
|
|
uint8_t type; /* enum mrc_catch_type */
|
|
uint8_t begin[4]; /* The starting address to match the handler. Includes this. */
|
|
uint8_t end[4]; /* The endpoint address that matches the handler. Not Includes this. */
|
|
uint8_t target[4]; /* The address to jump to if a match is made. */
|
|
};
|
|
|
|
/* Program data array struct */
|
|
typedef struct mrc_irep {
|
|
uint16_t nlocals; /* Number of local variables */
|
|
uint16_t nregs; /* Number of register variables */
|
|
uint16_t clen; /* Number of catch handlers */
|
|
uint8_t flags;
|
|
|
|
const mrc_code *iseq;
|
|
/*
|
|
* A catch handler table is placed after the iseq entity.
|
|
* The reason it doesn't add fields to the structure is to keep the mrc_irep structure from bloating.
|
|
* The catch handler table can be obtained with `mrc_irep_catch_handler_table(irep)`.
|
|
*/
|
|
const mrc_pool_value *pool;
|
|
const mrc_sym *syms;
|
|
const struct mrc_irep * const *reps;
|
|
|
|
mrc_sym *lv; // Remove const for mrc_resolve_intern
|
|
/* debug info */
|
|
struct mrc_irep_debug_info* debug_info;
|
|
|
|
uint32_t ilen;
|
|
uint16_t plen, slen;
|
|
uint16_t rlen;
|
|
uint16_t refcnt;
|
|
} mrc_irep;
|
|
|
|
#define MRC_ISEQ_NO_FREE 1
|
|
#define MRC_IREP_NO_FREE 2
|
|
|
|
struct mrc_insn_data {
|
|
uint8_t insn;
|
|
uint32_t a;
|
|
uint16_t b;
|
|
uint16_t cc;
|
|
const mrc_code *addr;
|
|
};
|
|
|
|
#define mrc_irep_catch_handler_pack(n, v) mrc_uint32_to_bin(n, v)
|
|
#define mrc_irep_catch_handler_unpack(v) mrc_bin_to_uint32(v)
|
|
|
|
void mrc_irep_remove_lv(mrc_ccontext *c, mrc_irep *irep);
|
|
void mrc_irep_free(mrc_ccontext *c, mrc_irep *irep);
|
|
|
|
#define MRC_ASPEC_REQ(a) (((a) >> 18) & 0x1f)
|
|
#define MRC_ASPEC_OPT(a) (((a) >> 13) & 0x1f)
|
|
#define MRC_ASPEC_REST(a) (((a) >> 12) & 0x1)
|
|
#define MRC_ASPEC_POST(a) (((a) >> 7) & 0x1f)
|
|
#define MRC_ASPEC_KEY(a) (((a) >> 2) & 0x1f)
|
|
#define MRC_ASPEC_KDICT(a) (((a) >> 1) & 0x1)
|
|
#define MRC_ASPEC_BLOCK(a) ((a) & 1)
|
|
|
|
MRC_END_DECL
|
|
|
|
#endif /* MRC_IREP_H */
|