STRING prim_IntInf_toString(sml_intinf_t *n) { char *buf, *ret; ASSERT(OBJ_TYPE(n) == OBJTYPE_INTINF); buf = sml_intinf_fmt(n, 10); ret = sml_str_new(buf); free(buf); return ret; }
void * sml_intinf_hex(void *obj) { char *buf; void *ret; assert(OBJ_TYPE(obj) == OBJTYPE_INTINF); buf = sml_intinf_fmt((sml_intinf_t*)obj, 16); ret = sml_str_new(buf); free(buf); return ret; }
/* for debug */ static void obj_dump__(int indent, void *obj) { unsigned int i; unsigned int *bitmap; void **field = obj; char *buf; if (obj == NULL) { sml_debug("%*sNULL\n", indent, ""); return; } switch (OBJ_TYPE(obj)) { case OBJTYPE_UNBOXED_ARRAY: case OBJTYPE_UNBOXED_VECTOR: sml_debug("%*s%p:%u:%s\n", indent, "", obj, OBJ_SIZE(obj), (OBJ_TYPE(obj) == OBJTYPE_UNBOXED_ARRAY) ? "UNBOXED_ARRAY" : "UNBOXED_VECTOR"); for (i = 0; i < OBJ_SIZE(obj) / sizeof(unsigned int); i++) sml_debug("%*s0x%08x\n", indent + 2, "", ((unsigned int *)field)[i]); for (i = i * sizeof(unsigned int); i < OBJ_SIZE(obj); i++) sml_debug("%*s0x%02x\n", indent + 2, "", ((unsigned char*)field)[i]); break; case OBJTYPE_BOXED_ARRAY: case OBJTYPE_BOXED_VECTOR: sml_debug("%*s%p:%u:%s\n", indent, "", obj, OBJ_SIZE(obj), (OBJ_TYPE(obj) == OBJTYPE_BOXED_ARRAY) ? "BOXED_ARRAY" : "BOXED_VECTOR"); for (i = 0; i < OBJ_SIZE(obj) / sizeof(void*); i++) obj_dump__(indent + 2, field[i]); for (i = i * sizeof(void*); i < OBJ_SIZE(obj); i++) sml_debug("%*s0x%02x\n", indent + 2, "", ((char*)field)[i]); break; case OBJTYPE_RECORD: sml_debug("%*s%p:%u:RECORD\n", indent, "", obj, OBJ_SIZE(obj)); bitmap = OBJ_BITMAP(obj); for (i = 0; i < OBJ_SIZE(obj) / sizeof(void*); i++) { if (BITMAP_BIT(bitmap, i) != TAG_UNBOXED) obj_dump__(indent + 2, field[i]); else sml_debug("%*s%p\n", indent + 2, "", field[i]); } break; case OBJTYPE_INTINF: buf = sml_intinf_fmt((sml_intinf_t*)obj, 10); sml_debug("%*s%p:%u:INTINF: %s\n", indent, "", obj, OBJ_SIZE(obj), buf); free(buf); break; default: sml_debug("%*s%p:%u:unknown type %u", indent, "", obj, OBJ_SIZE(obj), OBJ_TYPE(obj)); break; } }