From 1305824b03e6c6c0241471b7f65fffc9beee0dab Mon Sep 17 00:00:00 2001 From: Leonardo de Moura Date: Tue, 25 Feb 2020 13:43:06 -0800 Subject: [PATCH] chore: add `get_bool_field` helper function Motivation: help us to adjust the code when we modify the position of scalar fields. --- src/library/compiler/ir_interpreter.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/library/compiler/ir_interpreter.cpp b/src/library/compiler/ir_interpreter.cpp index 3988f23fcc..175ee38a0b 100644 --- a/src/library/compiler/ir_interpreter.cpp +++ b/src/library/compiler/ir_interpreter.cpp @@ -69,6 +69,11 @@ nat const & ctor_info_size(ctor_info const & c) { return cnstr_get_ref_t(c, nat const & ctor_info_usize(ctor_info const & c) { return cnstr_get_ref_t(c, 3); } nat const & ctor_info_ssize(ctor_info const & c) { return cnstr_get_ref_t(c, 4); } +/* Return the only Bool scalar field in an object that has `num_obj_fields` object/usize fields */ +static inline bool get_bool_field(object * o, unsigned num_obj_fields) { + return cnstr_get_uint8(o, sizeof(void*)*num_obj_fields); +} + enum class expr_kind { Ctor, Reset, Reuse, Proj, UProj, SProj, FAp, PAp, Ap, Box, Unbox, Lit, IsShared, IsTaggedPtr }; expr_kind expr_tag(expr const & e) { return static_cast(cnstr_tag(e.raw())); } ctor_info const & expr_ctor_info(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Ctor); return cnstr_get_ref_t(e, 0); } @@ -77,7 +82,7 @@ nat const & expr_reset_num_objs(expr const & e) { lean_assert(expr_tag(e) == exp var_id const & expr_reset_obj(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reset); return cnstr_get_ref_t(e, 1); } var_id const & expr_reuse_obj(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reuse); return cnstr_get_ref_t(e, 0); } ctor_info const & expr_reuse_ctor(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reuse); return cnstr_get_ref_t(e, 1); } -bool expr_reuse_update_header(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reuse); return cnstr_get_uint8(e.raw(), sizeof(void *) * 3); } +bool expr_reuse_update_header(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reuse); return get_bool_field(e.raw(), 3); } array_ref const & expr_reuse_args(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Reuse); return cnstr_get_ref_t>(e, 2); } nat const & expr_proj_idx(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Proj); return cnstr_get_ref_t(e, 0); } var_id const & expr_proj_obj(expr const & e) { lean_assert(expr_tag(e) == expr_kind::Proj); return cnstr_get_ref_t(e, 1); } @@ -101,7 +106,7 @@ var_id const & expr_is_tagged_ptr_obj(expr const & e) { lean_assert(expr_tag(e) typedef object_ref param; var_id const & param_var(param const & p) { return cnstr_get_ref_t(p, 0); } -bool param_borrow(param const & p) { return cnstr_get_uint8(p.raw(), 2*sizeof(void *)); } +bool param_borrow(param const & p) { return get_bool_field(p.raw(), 2); } type param_type(param const & p) { return cnstr_get_type(p, 1); } typedef object_ref alt_core; @@ -140,11 +145,11 @@ type fn_body_sset_type(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_bod fn_body const & fn_body_sset_cont(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::SSet); return cnstr_get_ref_t(b, 5); } var_id const & fn_body_inc_var(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Inc); return cnstr_get_ref_t(b, 0); } nat const & fn_body_inc_val(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Inc); return cnstr_get_ref_t(b, 1); } -bool fn_body_inc_maybe_scalar(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Inc); return static_cast(cnstr_get_uint8(b.raw(), sizeof(void *) * 3)); } +bool fn_body_inc_maybe_scalar(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Inc); return get_bool_field(b.raw(), 3); } fn_body const & fn_body_inc_cont(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Inc); return cnstr_get_ref_t(b, 2); } var_id const & fn_body_dec_var(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Dec); return cnstr_get_ref_t(b, 0); } nat const & fn_body_dec_val(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Dec); return cnstr_get_ref_t(b, 1); } -bool fn_body_dec_maybe_scalar(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Dec); return static_cast(cnstr_get_uint8(b.raw(), sizeof(void *) * 3)); } +bool fn_body_dec_maybe_scalar(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Dec); return get_bool_field(b.raw(), 3); } fn_body const & fn_body_dec_cont(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Dec); return cnstr_get_ref_t(b, 2); } var_id const & fn_body_del_var(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Del); return cnstr_get_ref_t(b, 0); } fn_body const & fn_body_del_cont(fn_body const & b) { lean_assert(fn_body_tag(b) == fn_body_kind::Del); return cnstr_get_ref_t(b, 1); }