// load objects from fp static void _a2_io_load(struct a2_io* io_p){ memcpy(io_p->buf, &(io_p->buf[io_p->seek]), io_p->size-io_p->seek); size_t len= fread( &(io_p->buf[io_p->size-io_p->seek]), sizeof(byte), io_p->seek, io_p->fp); if(len<=0) a2_error(io_p->env_p, e_io_error, "io error.\n"); io_p->rsize += io_p->seek; io_p->seek = io_p->size-io_p->seek; }
//get global varable static inline void _vm_getglobal(struct a2_vm* vm_p){ int bx = ir_gbx(curr_ir); struct a2_obj* _dobj = callinfo_sfreg(curr_ci, ir_ga(curr_ir)); struct a2_obj* _k = _getvalue(vm_p, bx); struct a2_obj* _obj = a2_get_envglobal(vm_p->env_p, _k); if(_obj==NULL){ char _buf[64] = {0}; a2_error(vm_p->env_p, e_vm_error, "[vm error@%zd]: the global \'%s\' is not find.\n", curr_line, obj2str(_k, _buf, sizeof(_buf))); } *_dobj = *_obj; curr_pc++; }
// set array A2_API inline void a2_setarray(struct a2_state* state){ int top = a2_top(state)-1; struct a2_obj* v = a2_getcstack(state->env_p, top); struct a2_obj* k = a2_getcstack(state->env_p, top-1); struct a2_obj* array = a2_getcstack(state->env_p, top-2); struct a2_obj* _v = NULL; check_array(array); check_num(k); _v = a2_array_get(a2_gcobj2array(obj_vX(array, obj)), k); if(_v==NULL) a2_error(state->env_p, e_run_error, "the error index at array.\n"); else *_v = *v; a2_topset(state, top-1); }
A2_API inline void a2_len(struct a2_state* state, int idx){ struct a2_obj* obj = a2_getcstack(state->env_p, idx); size_t len =0; struct a2_obj len_obj; switch(obj_t(obj)){ case A2_TMAP: len = a2_map_len(a2_gcobj2map(obj_vX(obj, obj))); break; case A2_TARRAY: len = a2_array_len(a2_gcobj2array(obj_vX(obj, obj))); break; case A2_TSTRING: len = a2_string_len(a2_gcobj2string(obj_vX(obj, obj))); break; default: a2_error(state->env_p, e_run_error, "the type is not map or array at len function."); } len_obj = a2_number2obj((a2_number)len); a2_pushstack(state->env_p, &len_obj); }