Ver código fonte

interfaces support

Nicolas Cannasse 9 anos atrás
pai
commit
561b501c15
2 arquivos alterados com 8 adições e 20 exclusões
  1. 8 19
      src/std/cast.c
  2. 0 1
      src/std/types.c

+ 8 - 19
src/std/cast.c

@@ -130,6 +130,11 @@ void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ) {
 	case TK2(HDYNOBJ,HVIRTUAL):
 	case TK2(HVIRTUAL,HVIRTUAL):
 		return hl_to_virtual(to,*(vdynamic**)data);
+	case TK2(HVIRTUAL,HOBJ):
+		{
+			vvirtual *v = *(vvirtual**)data;
+			return hl_dyn_castp( &v->value, v->value->t, to);
+		}
 	case TK2(HOBJ,HDYN):
 	case TK2(HDYNOBJ,HDYN):
 	case TK2(HFUN,HDYN):
@@ -294,26 +299,10 @@ void hl_write_dyn( void *data, hl_type *t, vdynamic *v ) {
 HL_PRIM vdynamic* hl_value_cast( vdynamic *v, hl_type *t ) {
 	if( t->kind == HDYN || v == NULL || hl_safe_cast(v->t,t) )
 		return v;
-	hl_fatal("TODO");
+	hl_error_msg(USTR("Can't cast %s to %s"),hl_to_string(v),hl_type_str(t));
 	return NULL;
 }
 
-HL_PRIM bool hl_type_check( hl_type *t, vdynamic *value ) {
-	if( t->kind == HDYN )
-		return true;
-	if( value == NULL )
-		return false;
-	if( t == value->t )
-		return true;
-	if( t->kind == HF64 && value->t->kind == HI32 )
-		return true;
-	if( t->kind == HI32 && value->t->kind == HF64 && (int)value->v.d == value->v.d )
-		return true;
-	return hl_safe_cast(value->t, t);
-}
-
-HL_PRIM vdynamic *hl_type_instance( hl_type *t, vdynamic *v ) {
-	if( v == NULL )
-		return v;
-	return hl_safe_cast(v->t,t) ? v : NULL;
+HL_PRIM bool hl_type_safe_cast( hl_type *a, hl_type *b ) {
+	return hl_safe_cast(a,b);
 }

+ 0 - 1
src/std/types.c

@@ -401,6 +401,5 @@ HL_PRIM varray *hl_enum_parameters( vdynamic *v ) {
 	return a;
 }
 
-DEFINE_PRIM(_BOOL, hl_type_check, _TYPE _DYN);
 DEFINE_PRIM(_BYTES, hl_type_name, _TYPE);
 DEFINE_PRIM(_ARR, hl_type_enum_fields, _TYPE);