Browse Source

minor fixes

Nicolas Cannasse 9 years ago
parent
commit
9527a5cbe0
3 changed files with 25 additions and 2 deletions
  1. 22 0
      src/std/cast.c
  2. 2 1
      src/std/fun.c
  3. 1 1
      src/std/obj.c

+ 22 - 0
src/std/cast.c

@@ -168,6 +168,28 @@ void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ) {
 	if( to->kind == HNULL ) {
 		if( to->tparam->kind == t->kind )
 			return hl_make_dyn(data,t);
+		switch( to->tparam->kind ) {
+		case HI8:
+		case HI16:
+		case HI32:
+		case HBOOL:
+			{
+				int v = hl_dyn_casti(data,t,to->tparam);
+				return hl_make_dyn(&v,to->tparam);
+			}
+		case HF32:
+			{
+				float f = hl_dyn_castf(data,t);
+				return hl_make_dyn(&f,to->tparam);
+			}
+		case HF64:
+			{
+				double d = hl_dyn_castd(data,t);
+				return hl_make_dyn(&d,to->tparam);
+			}
+		default:
+			break;
+		}
 	}
 	hl_error_msg(USTR("Can't cast %s(%s) to %s"),hl_to_string(hl_make_dyn(data,t)),hl_type_str(t),hl_type_str(to));
 	return 0;

+ 2 - 1
src/std/fun.c

@@ -102,7 +102,8 @@ HL_PRIM vdynamic* hl_call_method( vdynamic *c, varray *args ) {
 	vdynamic *dret;
 	vdynamic out;
 	int i;
-	if( cl->hasValue ) hl_error("Can't call closure with value");
+	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++) {

+ 1 - 1
src/std/obj.c

@@ -507,7 +507,7 @@ static void *hl_obj_lookup_set( vdynamic *d, int hfield, hl_type *t, hl_type **f
 		}
 		break;
 	case HVIRTUAL:
-		return hl_obj_lookup_set(d, hfield, t, ft);
+		return hl_obj_lookup_set(((vvirtual*)d)->value, hfield, t, ft);
 	default:
 		hl_error("Invalid field access");
 		break;