static term_t convert_val(val_converter_t *convert, value_t v) { value_table_t *vtbl; value_kind_t kind; int32_t c; term_t t; vtbl = convert->vtbl; kind = object_kind(vtbl, v); switch (kind) { case BOOLEAN_VALUE: // skip the cache for Boolean values t = convert_bool(vtbl, v); break; case RATIONAL_VALUE: t = convert_cached_term(convert, v); if (t < 0) { t = convert_rational(convert->terms, vtbl, v); convert_cache_map(convert, v, t); } break; case BITVECTOR_VALUE: t = convert_cached_term(convert, v); if (t < 0) { t = convert_bitvector(convert->terms, vtbl, v); convert_cache_map(convert, v, t); } break; case TUPLE_VALUE: t = convert_cached_term(convert, v); if (t < 0) { t = convert_tuple(convert, vtbl_tuple(vtbl, v)); convert_cache_map(convert, v, t); } break; case UNINTERPRETED_VALUE: t = convert_cached_term(convert, v); if (t < 0) { t = convert_unint(convert->terms, vtbl, v); convert_cache_map(convert, v, t); } break; default: c = get_convert_code(kind); assert(c < 0); longjmp(convert->env, c); break; } return t; }
/* * Expand a tuple v: * - a must be an array large enough to store n values where n = arity of v */ void yval_expand_tuple(value_table_t *tbl, value_t v, yval_t *a) { value_tuple_t *tuple; uint32_t i, n; tuple = vtbl_tuple(tbl, v); n = tuple->nelems; for (i=0; i<n; i++) { get_yval(tbl, tuple->elem[i], a + i); } }