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; }
/* * Attempt to convert a primitive value v * - return an error code if v is not primitive */ term_t convert_simple_value(term_table_t *terms, value_table_t *vtbl, value_t v) { term_t t; switch (object_kind(vtbl, v)) { case UNKNOWN_VALUE: t = CONVERT_UNKNOWN_VALUE; break; case BOOLEAN_VALUE: t = convert_bool(vtbl, v); break; case RATIONAL_VALUE: t = convert_rational(terms, vtbl, v); break; case BITVECTOR_VALUE: t = convert_bitvector(terms, vtbl, v); break; case TUPLE_VALUE: t = CONVERT_NOT_PRIMITIVE; break; case UNINTERPRETED_VALUE: t = convert_unint(terms, vtbl, v); break; case FUNCTION_VALUE: case UPDATE_VALUE: t = CONVERT_FUNCTION; break; case MAP_VALUE: t = CONVERT_FAILED; break; default: t = CONVERT_INTERNAL_ERROR; assert(false); break; } return t; }
/* * Build a yval_t descriptor for value v defined in tbl * - v must be a valid index in tbl */ void get_yval(value_table_t *tbl, value_t v, yval_t *d) { assert(good_object(tbl, v)); d->node_id = v; d->node_tag = tag_for_valkind(object_kind(tbl, v)); }