diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 4db7e20d..44d8c57a 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2281,6 +2281,37 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity) return id; } +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `sequence` lens + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(sequence) +{ + E_Type *type = e_type_from_key__cached(irtree->type_key); + U64 count = 0; + { + Temp scratch = scratch_begin(&arena, 1); + E_OpList count_oplist = e_oplist_from_irtree(scratch.arena, irtree->root); + String8 count_bytecode = e_bytecode_from_oplist(scratch.arena, &count_oplist); + E_Interpretation count_interpret = e_interpret(count_bytecode); + E_Value count_value = count_interpret.value; + count = count_value.u64; + scratch_end(scratch); + } + E_TypeExpandInfo info = {0, count}; + return info; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence) +{ + U64 read_range_count = dim_1u64(idx_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) + { + E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafU64, 0); + expr->value.u64 = idx_range.min + idx; + exprs_out[idx] = expr; + } +} + //////////////////////////////// //~ rjf: (Built-In Type Hooks) `array` lens diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index bdc52766..ae1c3dd5 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -309,6 +309,12 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); +//////////////////////////////// +//~ rjf: (Built-In Type Hooks) `sequence` lens + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(sequence); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence); + //////////////////////////////// //~ rjf: (Built-In Type Hooks) `array` lens diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 5a095cbf..e4ae439a 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -84,17 +84,33 @@ ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode) { B32 result = 0; { - E_TypeKey expand_type_key = e_default_expansion_type_from_key(type_key); - E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key); - if(expand_type_kind == E_TypeKind_Struct || - expand_type_kind == E_TypeKind_Union || - expand_type_kind == E_TypeKind_Class || - expand_type_kind == E_TypeKind_Array || - expand_type_kind == E_TypeKind_Set || - e_type_kind_is_pointer_or_ref(expand_type_kind) || - (expand_type_kind == E_TypeKind_Enum && mode == E_Mode_Null)) + if(e_type_kind_from_key(type_key) == E_TypeKind_Lens) { - result = 1; + for(E_Type *lens_type = e_type_from_key__cached(type_key); + lens_type->kind == E_TypeKind_Lens; + lens_type = e_type_from_key__cached(lens_type->direct_type_key)) + { + if(lens_type->expand.info != 0) + { + result = 1; + break; + } + } + } + else + { + E_TypeKey expand_type_key = e_default_expansion_type_from_key(type_key); + E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key); + if(expand_type_kind == E_TypeKind_Struct || + expand_type_kind == E_TypeKind_Union || + expand_type_kind == E_TypeKind_Class || + expand_type_kind == E_TypeKind_Array || + expand_type_kind == E_TypeKind_Set || + e_type_kind_is_pointer_or_ref(expand_type_kind) || + (expand_type_kind == E_TypeKind_Enum && mode == E_Mode_Null)) + { + result = 1; + } } } return result; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 55492ef2..ca291bd4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12365,6 +12365,7 @@ rd_frame(void) {str8_lit("digits"), 1, 1, 0, 0, 0, {0}}, {str8_lit("no_string"), 1, 1, 0, 0, 0, {0}}, {str8_lit("no_addr"), 1, 1, 0, 0, 0, {0}}, + {str8_lit("sequence"), 0, 0, 1, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(sequence), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(sequence)}}, {str8_lit("range1"), 0, 0, 0, 0, 0, {0}}, {str8_lit("array"), 0, 0, 1, 0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(array), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(array)}}, {str8_lit("slice"), 0, 0, 1, E_TYPE_IREXT_FUNCTION_NAME(slice), E_TYPE_ACCESS_FUNCTION_NAME(slice), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(slice), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(slice)}},