Browse Source

TestJson passing

Nicolas Cannasse 9 years ago
parent
commit
939e2c9642
4 changed files with 55 additions and 5 deletions
  1. 9 1
      src/std/cast.c
  2. 2 0
      src/std/math.c
  3. 43 3
      src/std/obj.c
  4. 1 1
      src/std/sys.c

+ 9 - 1
src/std/cast.c

@@ -159,9 +159,17 @@ void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ) {
 }
 
 double hl_dyn_castd( void *data, hl_type *t ) {
+	if( t->kind == HDYN ) {
+		vdynamic *v = *((vdynamic**)data);
+		if( v == NULL ) return 0;
+		t = v->t;
+		if( !hl_is_dynamic(t) ) data = &v->v;
+	}
 	switch( t->kind ) {
 	case HF32:
 		return *(float*)data;
+	case HF64:
+		return *(double*)data;
 	case HI8:
 		return *(char*)data;
 	case HI16:
@@ -213,7 +221,7 @@ int hl_dyn_compare( vdynamic *a, vdynamic *b ) {
 	case TK2(HOBJ,HOBJ):
 		if( a->t->obj == b->t->obj && a->t->obj->rt->compareFun )
 			return a->t->obj->rt->compareFun(a,b);
-		break;
+		return a > b ? 1 : -1;
 	case TK2(HENUM,HENUM):
 	case TK2(HTYPE,HTYPE):
 	case TK2(HBYTES,HBYTES):

+ 2 - 0
src/std/math.c

@@ -22,6 +22,8 @@ typedef union {
 HL_PRIM bool hl_math_isfinite( double a ) {
 	qw q;
 	unsigned int h, l;
+	if( a != a )
+		return false;
 	q.d = a;
 	h = q.i.h;
 	l = q.i.l;

+ 43 - 3
src/std/obj.c

@@ -386,6 +386,10 @@ double hl_dyn_getd( vdynamic *d, int hfield ) {
 	return 0.;
 }
 
+void hl_dyn_setf( vdynamic *d, int hfield, float value ) {
+	hl_fatal("TODO");
+}
+
 void hl_dyn_setd( vdynamic *d, int hfield, double value ) {
 	if( d == NULL ) hl_error("Invalid field access");
 	switch( d->t->kind ) {
@@ -544,7 +548,29 @@ HL_PRIM vdynamic *hl_obj_get_field( vdynamic *obj, int hfield ) {
 }
 
 HL_PRIM void hl_obj_set_field( vdynamic *obj, int hfield, vdynamic *v ) {
-	hl_dyn_setp(obj,hfield,v->t,&v);
+	switch( v->t->kind ) {
+	case HI8:
+		hl_dyn_seti(obj,hfield,v->t,v->v.c);
+		break;
+	case HI16:
+		hl_dyn_seti(obj,hfield,v->t,v->v.s);
+		break;
+	case HI32:
+		hl_dyn_seti(obj,hfield,v->t,v->v.i);
+		break;
+	case HBOOL:
+		hl_dyn_seti(obj,hfield,v->t,v->v.b);
+		break;
+	case HF32:
+		hl_dyn_setf(obj,hfield,v->v.f);
+		break;
+	case HF64:
+		hl_dyn_setd(obj,hfield,v->v.d);
+		break;
+	default:
+		hl_dyn_setp(obj,hfield,v->t,hl_is_dynamic(v->t)?v:v->v.ptr);
+		break;
+	}
 }
 
 HL_PRIM bool hl_obj_has_field( vdynamic *obj, int hfield ) {
@@ -579,6 +605,20 @@ HL_PRIM bool hl_obj_delete_field( vdynamic *obj, int hfield ) {
 }
 
 HL_PRIM varray *hl_obj_fields( vdynamic *obj ) {
-	hl_fatal("TODO");
-	return NULL;
+	varray *a = NULL;
+	switch( obj->t->kind ) {
+	case HDYNOBJ:
+		{
+			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;
+			for(i=0;i<o->nfields;i++)
+				((vbyte**)(a + 1))[i] = (vbyte*)hl_field_name((&o->dproto->fields + i)->hashed_name);
+		}
+		break;
+	}
+	return a;
 }

+ 1 - 1
src/std/sys.c

@@ -22,7 +22,7 @@ extern void hl_entry_point();
 int main() {
 	hl_trap_ctx ctx;
 	vdynamic *exc;
-	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF /*| _CRTDBG_CHECK_ALWAYS_DF*/ );
+	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF /*| _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF*/ );
 	hlc_trap(ctx,exc,on_exception);
 	hl_entry_point();
 	return 0;