Przeglądaj źródła

added hl_dyn_call_obj, removed hlc version

Nicolas Cannasse 9 lat temu
rodzic
commit
a2fc81afe5
3 zmienionych plików z 39 dodań i 27 usunięć
  1. 1 0
      src/hl.h
  2. 0 27
      src/hlc.h
  3. 38 0
      src/std/fun.c

+ 1 - 0
src/hl.h

@@ -474,6 +474,7 @@ HL_API vclosure *hl_alloc_closure_void( hl_type *t, void *fvalue );
 HL_API vclosure *hl_alloc_closure_ptr( hl_type *fullt, void *fvalue, void *ptr );
 HL_API vclosure *hl_make_fun_wrapper( vclosure *c, hl_type *to );
 HL_API void *hl_wrapper_call( void *value, void **args, vdynamic *ret );
+HL_API void *hl_dyn_call_obj( vdynamic *obj, hl_type *ft, int hfield, void **args, vdynamic *ret );
 
 // ----------------------- ALLOC --------------------------------------------------
 

+ 0 - 27
src/hlc.h

@@ -88,33 +88,6 @@ 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;
-}
-
 #endif
 
 extern void *hlc_static_call(void *fun, hl_type *t, void **args, vdynamic *out);

+ 38 - 0
src/std/fun.c

@@ -251,6 +251,44 @@ HL_PRIM void *hl_wrapper_call( void *_c, void **args, vdynamic *ret ) {
 	return pret;
 }
 
+HL_PRIM void *hl_dyn_call_obj( vdynamic *o, hl_type *ft, int hfield, void **args, vdynamic *ret ) {
+	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 tmp;
+					vclosure_wrapper w;
+					tmp.t = hl_get_closure_type(l->t);
+					tmp.fun = rt->methods[-l->field_index-1];
+					tmp.hasValue = 1;
+					tmp.value = o;
+					w.cl.t = ft;
+					w.cl.fun = hlc_get_wrapper(ft);
+					w.cl.hasValue = 2;
+					w.cl.value = &w;
+					w.wrappedFun = &tmp;
+					return hl_wrapper_call(&w,args,ret);
+				}
+				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;
+}
+
+
 HL_PRIM vclosure *hl_make_fun_wrapper( vclosure *v, hl_type *to ) {
 	vclosure_wrapper *c;
 	void *wrap = hlc_get_wrapper(to);