Ejemplo n.º 1
0
// add array
A2_API inline void a2_addarray(struct a2_state* state){
	int top = a2_top(state)-1;
	struct a2_obj* v = a2_getcstack(state->env_p, top);
	struct a2_obj* array = a2_getcstack(state->env_p, top-1);

	check_array(array);
	a2_array_add(a2_gcobj2array(obj_vX(array, obj)), v);
}
Ejemplo n.º 2
0
A2_API int a2_pcall(struct a2_state* state, int args){
	struct a2_obj* cls_obj = a2_getcstack(state->env_p, a2_top(state)-args-1);
	struct a2_obj* args_obj = a2_getcstack(state->env_p, a2_top(state)-args);

	if(obj_t(cls_obj) !=A2_TCLOSURE)
		a2_error(state->env_p, e_run_error, "the type is not closure at pcall.\n");

	return a2_vm_pcall(a2_envvm(state->env_p), cls_obj, args_obj, args);
}
Ejemplo n.º 3
0
// set global
A2_API inline void a2_setglobal(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);

	check_key(k);
	a2_set_envglobal(state->env_p, k, v);
	a2_topset(state, top-1);
}
Ejemplo n.º 4
0
// del key/value
A2_API inline void a2_delmap(struct a2_state* state){
	int top = a2_top(state)-1;
	struct a2_obj* k = a2_getcstack(state->env_p, top);
	struct a2_obj* map = a2_getcstack(state->env_p, top-1);

	check_map(map);
	check_key(k);
	a2_map_del(a2_gcobj2map(obj_vX(map, obj)), k);
	a2_pop(state, 1);
}
Ejemplo n.º 5
0
A2_API void a2_setmeta(struct a2_state* state){
	int top = a2_top(state)-1;
	struct a2_obj* m = a2_getcstack(state->env_p, top);
	struct a2_obj* v = a2_getcstack(state->env_p, top-1);

	if(obj_t(v)!=A2_TMAP || obj_t(m)!=A2_TMAP)
		a2_err(state, "the value and meta should map type.");

	a2_gc_setmeta(obj_vX(v, obj), obj_vX(m, obj));
	a2_topset(state, top-1);
}
Ejemplo n.º 6
0
// get array
A2_API inline void a2_getarray(struct a2_state* state){
	int top = a2_top(state)-1;
	struct a2_obj* k = a2_getcstack(state->env_p, top);
	struct a2_obj* array = a2_getcstack(state->env_p, top-1);
	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)
		obj_setX(k, A2_TNIL, point, NULL);
	else
		*k = *_v;
}
Ejemplo n.º 7
0
// get map
A2_API inline void a2_getmap(struct a2_state* state){
	int top = a2_top(state)-1;
	struct a2_obj* k = a2_getcstack(state->env_p, top);
	struct a2_obj* map = a2_getcstack(state->env_p, top-1);
	struct a2_obj* v = NULL;

	check_map(map);
	check_key(k);
	v = a2_map_query(a2_gcobj2map(obj_vX(map, obj)), k);
	if(v==NULL)
		obj_setX(map, A2_TNIL, point, NULL);
	else
		*map = *v;
}
Ejemplo n.º 8
0
A2_API inline a2_number a2_tonumber(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	if(obj_t(obj)!=A2_TNUMBER)
		return 0.0;
	else 
		return obj_vNum(obj);
}
Ejemplo n.º 9
0
A2_API inline a2_cfunction a2_tocfunction(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	if(obj_t(obj)!=A2_TCFUNCTION)
		return NULL;
	else
		return obj_vX(obj, cfunction);
}
Ejemplo n.º 10
0
A2_API inline char* a2_tostring(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	if(obj_t(obj)!=A2_TSTRING)
		return "";
	else
		return  a2_gcobj2string(obj_vX(obj, obj));
}
Ejemplo n.º 11
0
// 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);
}
Ejemplo n.º 12
0
// get global
A2_API inline void a2_getglobal(struct a2_state* state){
	struct a2_obj* k = a2_getcstack(state->env_p, a2_top(state)-1);
	check_key(k);
	struct a2_obj* v = a2_get_envglobal(state->env_p, k);
	if(v==NULL)
		obj_setX(k, A2_TNIL, point, NULL);
	else
		*k = *v;
}
Ejemplo n.º 13
0
A2_API inline int a2_tobool(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	if(obj_t(obj)!=A2_TBOOL)
		a2_error(state->env_p, e_run_error, 
			"the type is not bool.");
	else
		return  (int)(obj_vX(obj, uinteger));
	return 0;
}
Ejemplo n.º 14
0
A2_API inline void a2_require(struct a2_state* state){
	struct a2_obj* k = a2_getcstack(state->env_p, a2_top(state)-1);
	check_key(k);
	struct a2_obj* v = a2_get_envreg(state->env_p, k);
	if(v) // return obj
		a2_pushstack(state->env_p, v);
	else{ // load obj
		const char* name = a2_gcobj2string(obj_vX(k, obj));
		int len = strlen(name);
		char tmp[len+8];
		memcpy(tmp, name, len);
		memcpy(tmp+len, ".a2", 4);
		int top = a2_top(state);
		a2_loadfile(state, tmp);
		if(a2_top(state)>top)
			a2_pushvalue(state, top);
		else
			a2_pushnil(state);
		a2_set_envreg(state->env_p, k, a2_getcstack(state->env_p, top));
	}
}
Ejemplo n.º 15
0
A2_API inline void* a2_topoint(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	switch(obj_t(obj)){
		case A2_TARRAY:
			return a2_gcobj2array(obj_vX(obj, obj));
		case A2_TMAP:
			return a2_gcobj2map(obj_vX(obj, obj));
		case A2_TCLOSURE:
			return a2_gcobj2closure(obj_vX(obj, obj));
		default:
			return NULL;			
	}
}
Ejemplo n.º 16
0
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);
}	
Ejemplo n.º 17
0
Archivo: a2_vm.c Proyecto: eagles125/A2
// call c function
static inline void __vm_call_cfunction(struct a2_vm* vm_p, struct a2_obj* _func){
	assert(obj_t(_func)==A2_TCFUNCTION);
	int i, j;
	struct a2_obj* _obj = NULL;

	// back bottom
	int _b = a2_getbottom(vm_p->env_p);
	int _top = a2_gettop(vm_p->env_p);

	a2_setbottom(vm_p->env_p, a2_gettop(vm_p->env_p));

	// closure arg to cstack
	for(i=ir_ga(curr_ir)+1; i<=ir_ga(curr_ir)+ir_gb(curr_ir); i++){
		_obj = callinfo_sfreg(curr_ci, i);
		a2_pushstack(vm_p->env_p, _obj);
	}

	// call c function
	callinfo_new(vm_p, NULL, 0, 0);
	int ret = obj_vX(_func, cfunction)(a2_env2state(vm_p->env_p));
	callinfo_free(vm_p);

	int size = a2_gettop(vm_p->env_p)-a2_getbottom(vm_p->env_p);
	// set return value
	for(i=size-ret, j=ir_ga(curr_ir); 
		i<size && j<ir_ga(curr_ir)+ir_gc(curr_ir);
		j++,i++){
		_obj = callinfo_sfreg(curr_ci, j);
		*_obj = *a2_getcstack(vm_p->env_p, i);
	}

	for(; j<ir_ga(curr_ir)+ir_gc(curr_ir); j++){
		_obj = callinfo_sfreg(curr_ci, j);
		obj_setX(_obj, A2_TNIL, point, NULL);
	}

	a2_setbottom(vm_p->env_p, _b);
	a2_settop(vm_p->env_p, _top);
	curr_pc++;
}
Ejemplo n.º 18
0
A2_API inline int a2_type(struct a2_state* state, int idx){
	struct a2_obj* obj = a2_getcstack(state->env_p, idx);
	return obj_t(obj);
}
Ejemplo n.º 19
0
A2_API inline void a2_pushvalue(struct a2_state* state, int idx){
	struct a2_obj* _v = a2_getcstack(state->env_p, idx);
	a2_pushstack(state->env_p, _v);
}