Nicolas Cannasse 9 rokov pred
rodič
commit
ff515ce129
5 zmenil súbory, kde vykonal 80 pridanie a 45 odobranie
  1. 27 0
      src/hlc.h
  2. 10 1
      src/std/fun.c
  3. 6 24
      src/std/maps.c
  4. 2 8
      src/std/obj.c
  5. 35 12
      src/std/types.c

+ 27 - 0
src/hlc.h

@@ -78,6 +78,33 @@ static vdynamic *hlc_dyn_call_args( vclosure *c, vdynamic **args, int nargs ) {
 	return hl_call_method((vdynamic*)c,&tmp.a);
 }
 
+static vdynamic *hlc_dyn_call_obj( vdynamic *o, int hfield, vdynamic **args, int nargs ) {
+	switch( o->t->kind ) {
+	case HDYNOBJ:
+		hl_fatal("TODO");
+		break;
+	case HOBJ:
+		{
+			hl_runtime_obj *rt = o->t->obj->rt;
+			while( true ) {
+				hl_field_lookup *l = hl_lookup_find(rt->lookup,rt->nlookup, hfield);
+				if( l != NULL && l->field_index < 0 ) {
+					vclosure *ctmp = hl_alloc_closure_ptr(l->t,rt->methods[-l->field_index-1],o);
+					return hlc_dyn_call_args(ctmp,args,nargs);
+				}
+				rt = rt->parent;
+				if( rt == NULL ) break;
+			}
+			hl_error_msg(USTR("%s has no method %s"),o->t->obj->name,hl_field_name(hfield));
+		}
+		break;
+	default:
+		hl_error("Invalid field access");
+		break;
+	}
+	return NULL;
+}
+
 #include <setjmp.h>
 
 typedef struct _hl_trap_ctx hl_trap_ctx;

+ 10 - 1
src/std/fun.c

@@ -65,6 +65,9 @@ HL_PRIM vdynamic* hl_call_method( vdynamic *c, varray *args ) {
 	vclosure *cl = (vclosure*)c;
 	int i;
 	vdynamic **vargs = (vdynamic**)(args + 1);
+	void *ret;
+	hl_type *tret;
+	vdynamic *tmp;
 	if( cl->hasValue ) hl_error("Can't call closure with value");
 	if( args->size != cl->t->fun->nargs || args->at->kind != HDYN ) hl_error("Invalid args");
 	for(i=0;i<args->size;i++) {
@@ -79,7 +82,13 @@ HL_PRIM vdynamic* hl_call_method( vdynamic *c, varray *args ) {
 		} else if( !hl_safe_cast(v->t,t) )
 			hl_write_dyn(vargs + i, t, v);
 	}
-	return (vdynamic*)hlc_dyn_call(cl->fun,cl->t,vargs);
+	ret = hlc_dyn_call(cl->fun,cl->t,vargs);
+	tret = cl->t->fun->ret;
+	if( ret == NULL || !hl_is_ptr(tret) || hl_is_dynamic(tret) )
+		return (vdynamic*)ret;
+	tmp = hl_alloc_dynamic(tret);
+	tmp->v.ptr = ret;
+	return tmp;
 }
 
 bool hl_fun_compare( vdynamic *a, vdynamic *b ) {

+ 6 - 24
src/std/maps.c

@@ -182,13 +182,10 @@ HL_PRIM bool hl_hbremove( hl_bytes_map *m, vbyte *_key ) {
 }
 
 HL_PRIM varray* hl_hbkeys( hl_bytes_map *m ) {
-	varray *a = (varray*)hl_gc_alloc_noptr(sizeof(varray)+sizeof(uchar*)*m->nentries);
+	varray *a = hl_aalloc(&hlt_bytes,m->nentries);
 	uchar **keys = (uchar**)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_bytes;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_bytes_cell *c = m->cells[i];
@@ -202,13 +199,10 @@ HL_PRIM varray* hl_hbkeys( hl_bytes_map *m ) {
 }
 
 HL_PRIM varray* hl_hbvalues( hl_bytes_map *m ) {
-	varray *a = (varray*)hl_gc_alloc(sizeof(varray)+sizeof(void*)*m->nentries);
+	varray *a = hl_aalloc(&hlt_dyn,m->nentries);
 	vdynamic **values = (vdynamic**)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_dyn;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_bytes_cell *c = m->cells[i];
@@ -386,13 +380,10 @@ HL_PRIM bool hl_hiremove( hl_int_map *m, int key ) {
 }
 
 HL_PRIM varray* hl_hikeys( hl_int_map *m ) {
-	varray *a = (varray*)hl_gc_alloc_noptr(sizeof(varray)+sizeof(int)*m->nentries);
+	varray *a = hl_aalloc(&hlt_i32,m->nentries);
 	int *keys = (int*)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_i32;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_int_cell *c = m->cells[i];
@@ -406,13 +397,10 @@ HL_PRIM varray* hl_hikeys( hl_int_map *m ) {
 }
 
 HL_PRIM varray* hl_hivalues( hl_int_map *m ) {
-	varray *a = (varray*)hl_gc_alloc(sizeof(varray)+sizeof(void*)*m->nentries);
+	varray *a = hl_aalloc(&hlt_dyn,m->nentries);
 	vdynamic **values = (vdynamic**)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_dyn;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_int_cell *c = m->cells[i];
@@ -595,13 +583,10 @@ HL_PRIM bool hl_horemove( hl_obj_map *m, vdynamic *key ) {
 }
 
 HL_PRIM varray* hl_hokeys( hl_obj_map *m ) {
-	varray *a = (varray*)hl_gc_alloc_noptr(sizeof(varray)+sizeof(vdynamic*)*m->nentries);
+	varray *a = hl_aalloc(&hlt_dyn,m->nentries);
 	vdynamic **keys = (vdynamic**)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_dyn;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_obj_cell *c = m->cells[i];
@@ -615,13 +600,10 @@ HL_PRIM varray* hl_hokeys( hl_obj_map *m ) {
 }
 
 HL_PRIM varray* hl_hovalues( hl_obj_map *m ) {
-	varray *a = (varray*)hl_gc_alloc(sizeof(varray)+sizeof(void*)*m->nentries);
+	varray *a = hl_aalloc(&hlt_dyn, m->nentries);
 	vdynamic **values = (vdynamic**)(a+1);
 	int p = 0;
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_dyn;
-	a->size = m->nentries;
 	for(i=0;i<m->ncells;i++) {
 		int j;
 		hl_obj_cell *c = m->cells[i];

+ 2 - 8
src/std/obj.c

@@ -656,10 +656,7 @@ HL_PRIM varray *hl_obj_fields( vdynamic *obj ) {
 		{
 			vdynobj *o = (vdynobj*)obj;
 			int i;
-			a = (varray*)hl_gc_alloc(sizeof(varray)+sizeof(void*)*o->nfields);
-			a->t = &hlt_array;
-			a->at = &hlt_bytes;
-			a->size = o->nfields;
+			a = hl_aalloc(&hlt_bytes,o->nfields);
 			for(i=0;i<o->nfields;i++)
 				((vbyte**)(a + 1))[i] = (vbyte*)hl_field_name((&o->dproto->fields + i)->hashed_name);
 		}
@@ -669,10 +666,7 @@ HL_PRIM varray *hl_obj_fields( vdynamic *obj ) {
 			hl_type_obj *tobj = obj->t->obj;
 			hl_runtime_obj *o = tobj->rt;
 			int i, p = 0;
-			a = (varray*)hl_gc_alloc(sizeof(varray)+sizeof(void*)*o->nfields);
-			a->t = &hlt_array;
-			a->at = &hlt_bytes;
-			a->size = o->nfields;
+			a = hl_aalloc(&hlt_bytes,o->nfields);
 			while( true ) {
 				for(i=0;i<tobj->nfields;i++) {
 					hl_obj_field *f = tobj->fields + i;

+ 35 - 12
src/std/types.c

@@ -258,11 +258,8 @@ HL_PRIM vbyte* hl_type_name( hl_type *t ) {
 }
 
 HL_PRIM varray* hl_type_enum_fields( hl_type *t ) {
-	varray *a = (varray*)hl_gc_alloc_noptr(sizeof(varray) + t->tenum->nconstructs * sizeof(void*));
+	varray *a = hl_aalloc(&hlt_bytes,t->tenum->nconstructs);
 	int i;
-	a->t = &hlt_array;
-	a->at = &hlt_bytes;
-	a->size = t->tenum->nconstructs;
 	for( i=0; i<t->tenum->nconstructs;i++)
 		((void**)(a+1))[i] = (vbyte*)t->tenum->constructs[i].name;
 	return a;
@@ -276,14 +273,43 @@ HL_PRIM int hl_type_args_count( hl_type *t ) {
 
 HL_PRIM varray *hl_type_instance_fields( hl_type *t ) {
 	varray *a;
-	int i;
+	const uchar **names;
+	int mcount = 0;
+	int out = 0;
 	hl_type_obj *o;
+	hl_runtime_obj *rt;
 	if( t->kind != HOBJ )
 		return NULL;
 	o = t->obj;
-	a = hl_aalloc(&hlt_bytes,o->rt->nlookup);
-	for(i=0;i<o->rt->nlookup;i++)
-		((vbyte**)(a+1))[i] = (vbyte*)hl_field_name(o->rt->lookup[i].hashed_name);
+	while( true ) {
+		int i;
+		for(i=0;i<o->nproto;i++) {
+			hl_obj_proto *p = o->proto + i;
+			if( p->pindex < 0 ) mcount++;
+		}
+		if( o->super == NULL ) break;
+		o = o->super->obj;
+	}
+	rt = hl_get_obj_rt(t);
+	a = hl_aalloc(&hlt_bytes,mcount + rt->nproto + rt->nfields);
+	names = (uchar**)(a + 1);
+	o = t->obj;
+	while( true ) {
+		int i;
+		int pproto = rt->parent ? rt->parent->nproto : 0;
+		for(i=0;i<o->nproto;i++) {
+			hl_obj_proto *p = o->proto + i;
+			if( p->pindex < 0 || p->pindex >= pproto )
+				names[out++] = p->name;
+		}
+		for(i=0;i<o->nfields;i++) {
+			hl_obj_field *f = o->fields + i;
+			names[out++] = f->name;
+		}
+		if( o->super == NULL ) break;
+		o = o->super->obj;
+		rt = o->rt;
+	}
 	return a;
 }
 
@@ -361,10 +387,7 @@ HL_PRIM varray *hl_enum_parameters( vdynamic *v ) {
 	venum *e = (venum*)v->v.ptr;
 	hl_enum_construct *c = v->t->tenum->constructs + e->index;
 	int i;
-	a = (varray*)hl_gc_alloc(sizeof(varray)+c->nparams*sizeof(void*));
-	a->t = &hlt_array;
-	a->at = &hlt_dyn;
-	a->size = c->nparams;
+	a = hl_aalloc(&hlt_dyn,c->nparams);
 	for(i=0;i<c->nparams;i++)
 		((vdynamic**)(a+1))[i] = hl_make_dyn((char*)e+c->offsets[i],c->params[i]);
 	return a;