value make_constant(constant c) { struct obj *cst; switch (c->vclass) { case cst_string: cst = (value)alloc_string_length(c->u.string.str, c->u.string.len); cst->flags |= OBJ_READONLY | OBJ_IMMUTABLE; return cst; case cst_list: return make_list(c->u.constants); case cst_array: return make_array(c->u.constants); case cst_int: return makeint(c->u.integer); case cst_float: return (value)alloc_mudlle_float(c->u.mudlle_float); case cst_bigint: return make_bigint(c->u.bigint_str); case cst_table: return make_table(c->u.constants); case cst_symbol: return make_symbol(c->u.constpair); default: abort(); } }
value make_constant(constant c, bool save_location, fncode fn) { struct obj *cst; switch (c->vclass) { case cst_string: cst = (value)alloc_string(c->u.string); SET_READONLY(cst); SET_IMMUTABLE(cst); return cst; case cst_gsymbol: return make_gsymbol(c->u.string, fn); case cst_quote: return make_quote(c, save_location, fn); case cst_list: return make_list(c, c->u.constants, 1, save_location, fn); case cst_array: return make_array(c->u.constants, fn); case cst_int: return makeint(c->u.integer); case cst_float: return alloc_mudlle_float(c->u.mudlle_float); case cst_table: return make_table(c->u.constants, fn); case cst_symbol: return make_symbol(c->u.constpair, fn); default: abort(); } }