mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-26 05:25:00 -07:00
work on new eval-viz layer stringification which factors out measurement/limiting/etc., but just walks an eval tree and stringifies each part; start working on new types <-> lookup-rule stuff
This commit is contained in:
+15
-16
@@ -44,8 +44,7 @@ typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr)
|
||||
switch(t->type->kind)
|
||||
{
|
||||
default:{}break;
|
||||
case TypeKind_Ptr:
|
||||
if(!(t->type->flags & TypeFlag_IsExternal))
|
||||
case TypeKind_Ptr:
|
||||
{
|
||||
*(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr));
|
||||
}break;
|
||||
@@ -173,13 +172,13 @@ serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerialize
|
||||
task->containing_type = t->containing_type;
|
||||
task->containing_ptr = t->containing_ptr;
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
}
|
||||
|
||||
// rjf: catch-all: write pointer value
|
||||
else
|
||||
{
|
||||
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: catch-all: write pointer value
|
||||
else
|
||||
{
|
||||
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: arrays -> descend to underlying type, + count
|
||||
@@ -345,14 +344,14 @@ deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSeriali
|
||||
task->containing_type = t->containing_type;
|
||||
task->containing_ptr = t->containing_ptr;
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
}
|
||||
|
||||
// rjf: catch-all: read pointer value
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
// rjf: catch-all: read pointer value
|
||||
else
|
||||
{
|
||||
MemoryCopy(t->dst, t_src, t->type->size*t->count);
|
||||
read_off += t->type->size*t->count;
|
||||
}
|
||||
read_off += t->type->size*t->count;
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: arrays -> descend to underlying type, + count
|
||||
|
||||
@@ -100,10 +100,9 @@ TypeKind;
|
||||
typedef U32 TypeFlags;
|
||||
enum
|
||||
{
|
||||
TypeFlag_IsExternal = (1<<0),
|
||||
TypeFlag_IsPlainText = (1<<1),
|
||||
TypeFlag_IsCodeText = (1<<2),
|
||||
TypeFlag_IsPathText = (1<<3),
|
||||
TypeFlag_IsPlainText = (1<<0),
|
||||
TypeFlag_IsCodeText = (1<<1),
|
||||
TypeFlag_IsPathText = (1<<2),
|
||||
};
|
||||
|
||||
typedef U32 MemberFlags;
|
||||
|
||||
@@ -73,6 +73,7 @@ E_TypeKindTable:
|
||||
{Variadic "variadic" 0 }
|
||||
{Set "set" 0 }
|
||||
{Lens "lens" 0 }
|
||||
{LensSpec "lens_spec" 0 }
|
||||
}
|
||||
|
||||
@table(name op_kind precedence op_pre op_sep op_pos)
|
||||
|
||||
@@ -274,11 +274,10 @@ enum
|
||||
{
|
||||
E_TypeFlag_Const = (1<<0),
|
||||
E_TypeFlag_Volatile = (1<<1),
|
||||
E_TypeFlag_External = (1<<2),
|
||||
E_TypeFlag_IsPlainText = (1<<3),
|
||||
E_TypeFlag_IsCodeText = (1<<4),
|
||||
E_TypeFlag_IsPathText = (1<<5),
|
||||
E_TypeFlag_EditableChildren = (1<<6),
|
||||
E_TypeFlag_IsPlainText = (1<<2),
|
||||
E_TypeFlag_IsCodeText = (1<<3),
|
||||
E_TypeFlag_IsPathText = (1<<4),
|
||||
E_TypeFlag_EditableChildren = (1<<5),
|
||||
};
|
||||
|
||||
typedef struct E_Member E_Member;
|
||||
|
||||
+13
-2
@@ -98,7 +98,7 @@ e_select_ir_ctx(E_IRCtx *ctx)
|
||||
for EachElement(idx, builtin_view_rule_names)
|
||||
{
|
||||
E_Expr *expr = e_push_expr(e_ir_state->arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = builtin_view_rule_names[idx]);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = builtin_view_rule_names[idx]);
|
||||
e_string2expr_map_insert(e_ir_state->arena, ctx->macro_map, builtin_view_rule_names[idx], expr);
|
||||
}
|
||||
}
|
||||
@@ -2421,7 +2421,7 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
|
||||
// rjf: calling a lens? -> generate IR for the first argument; wrap the type in
|
||||
// a lens type, which preserves the name & arguments of the lens call expression
|
||||
if(lhs_type->kind == E_TypeKind_Lens)
|
||||
if(lhs_type->kind == E_TypeKind_LensSpec)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
@@ -3347,6 +3347,17 @@ e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_Type
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression & IR-Tree => Rules
|
||||
|
||||
internal E_LookupRule *
|
||||
e_lookup_rule_from_type_key(E_TypeKey type_key)
|
||||
{
|
||||
E_LookupRule *rule = &e_lookup_rule__default;
|
||||
|
||||
// rjf: unpack type
|
||||
E_Type *type = e_type_from_key__cached(type_key);
|
||||
|
||||
return rule;
|
||||
}
|
||||
|
||||
internal E_LookupRuleExprPair
|
||||
e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree)
|
||||
{
|
||||
|
||||
@@ -288,6 +288,7 @@ internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *r
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression & IR-Tree => Rules
|
||||
|
||||
internal E_LookupRule *e_lookup_rule_from_type_key(E_TypeKey type_key);
|
||||
internal E_LookupRuleExprPair e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree);
|
||||
|
||||
#if 0 // TODO(rjf): @eval
|
||||
|
||||
@@ -483,7 +483,6 @@ e_type_key_cons_base(Type *type)
|
||||
{
|
||||
E_TypeKey direct_type = e_type_key_cons_base(type->direct);
|
||||
E_TypeFlags flags = 0;
|
||||
if(type->flags & TypeFlag_IsExternal) { flags |= E_TypeFlag_External; }
|
||||
if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }
|
||||
if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }
|
||||
if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }
|
||||
|
||||
@@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"),
|
||||
str8_lit_comp("Symbol"),
|
||||
};
|
||||
|
||||
String8 e_type_kind_basic_string_table[57] =
|
||||
String8 e_type_kind_basic_string_table[58] =
|
||||
{
|
||||
str8_lit_comp(""),
|
||||
str8_lit_comp("void"),
|
||||
@@ -73,9 +73,10 @@ str8_lit_comp("bitfield"),
|
||||
str8_lit_comp("variadic"),
|
||||
str8_lit_comp("set"),
|
||||
str8_lit_comp("lens"),
|
||||
str8_lit_comp("lens_spec"),
|
||||
};
|
||||
|
||||
U8 e_type_kind_basic_byte_size_table[57] =
|
||||
U8 e_type_kind_basic_byte_size_table[58] =
|
||||
{
|
||||
0,
|
||||
0,
|
||||
@@ -134,6 +135,7 @@ U8 e_type_kind_basic_byte_size_table[57] =
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
};
|
||||
|
||||
String8 e_expr_kind_strings[48] =
|
||||
|
||||
@@ -76,6 +76,7 @@ E_TypeKind_Bitfield,
|
||||
E_TypeKind_Variadic,
|
||||
E_TypeKind_Set,
|
||||
E_TypeKind_Lens,
|
||||
E_TypeKind_LensSpec,
|
||||
E_TypeKind_COUNT,
|
||||
E_TypeKind_FirstBasic = E_TypeKind_Void,
|
||||
E_TypeKind_LastBasic = E_TypeKind_ComplexF128,
|
||||
@@ -161,8 +162,8 @@ E_InterpretationCode_COUNT,
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
extern String8 e_token_kind_strings[6];
|
||||
extern String8 e_type_kind_basic_string_table[57];
|
||||
extern U8 e_type_kind_basic_byte_size_table[57];
|
||||
extern String8 e_type_kind_basic_string_table[58];
|
||||
extern U8 e_type_kind_basic_byte_size_table[58];
|
||||
extern String8 e_expr_kind_strings[48];
|
||||
extern E_OpInfo e_expr_kind_op_info_table[48];
|
||||
extern String8 e_interpretation_code_display_strings[11];
|
||||
|
||||
@@ -1367,14 +1367,14 @@ ev_string_from_hresult_code(U32 code)
|
||||
}
|
||||
|
||||
internal String8
|
||||
ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval)
|
||||
ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval)
|
||||
{
|
||||
String8 result = {0};
|
||||
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
U64 type_byte_size = e_type_byte_size_from_key(type_key);
|
||||
U8 digit_group_separator = 0;
|
||||
if(!(flags & EV_StringFlag_ReadOnlyDisplayRules))
|
||||
if(!(params->flags & EV_StringFlag_ReadOnlyDisplayRules))
|
||||
{
|
||||
digit_group_separator = 0;
|
||||
}
|
||||
@@ -1385,19 +1385,19 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
|
||||
case E_TypeKind_Handle:
|
||||
{
|
||||
result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator);
|
||||
result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator);
|
||||
}break;
|
||||
|
||||
case E_TypeKind_HResult:
|
||||
{
|
||||
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
U32 hresult_value = (U32)eval.value.u64;
|
||||
U32 is_error = !!(hresult_value & (1ull<<31));
|
||||
U32 error_code = (hresult_value);
|
||||
U32 facility = (hresult_value & 0x7ff0000) >> 16;
|
||||
String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator);
|
||||
String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
|
||||
String8 facility_string = ev_string_from_hresult_facility_code(facility);
|
||||
String8 error_string = ev_string_from_hresult_code(error_code);
|
||||
result = push_str8f(arena, "%S%s%s%S%s%s%S%s",
|
||||
@@ -1413,7 +1413,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
}
|
||||
else
|
||||
{
|
||||
result = str8_from_s64(arena, eval.value.u64, radix, min_digits, digit_group_separator);
|
||||
result = str8_from_s64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -1428,11 +1428,11 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
String8 char_str = ev_string_from_ascii_value(arena, eval.value.s64);
|
||||
if(char_str.size != 0)
|
||||
{
|
||||
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
{
|
||||
String8 imm_string = (type_is_unsigned
|
||||
? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator)
|
||||
: str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator));
|
||||
? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)
|
||||
: str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));
|
||||
result = push_str8f(arena, "'%S' (%S)", char_str, imm_string);
|
||||
}
|
||||
else
|
||||
@@ -1443,8 +1443,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
else
|
||||
{
|
||||
result = (type_is_unsigned
|
||||
? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator)
|
||||
: str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator));
|
||||
? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)
|
||||
: str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -1453,7 +1453,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
case E_TypeKind_S32:
|
||||
case E_TypeKind_S64:
|
||||
{
|
||||
result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator);
|
||||
result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator);
|
||||
}break;
|
||||
|
||||
case E_TypeKind_U8:
|
||||
@@ -1461,14 +1461,14 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
case E_TypeKind_U32:
|
||||
case E_TypeKind_U64:
|
||||
{
|
||||
result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator);
|
||||
result = str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
|
||||
}break;
|
||||
|
||||
case E_TypeKind_U128:
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], radix, min_digits, digit_group_separator);
|
||||
String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], radix, min_digits, digit_group_separator);
|
||||
String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], params->radix, params->min_digits, digit_group_separator);
|
||||
String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], params->radix, params->min_digits, digit_group_separator);
|
||||
result = push_str8f(arena, "%S:%S", upper64, lower64);
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
@@ -1477,7 +1477,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
case E_TypeKind_F64:{f64 = eval.value.f64;}goto f64_path;
|
||||
f64_path:;
|
||||
{
|
||||
result = push_str8f(arena, "%.*f", min_digits ? min_digits : 16, f64);
|
||||
result = push_str8f(arena, "%.*f", params->min_digits ? params->min_digits : 16, f64);
|
||||
U64 num_to_chop = 0;
|
||||
for(U64 num_trimmed = 0; num_trimmed < result.size; num_trimmed += 1)
|
||||
{
|
||||
@@ -1512,8 +1512,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
|
||||
break;
|
||||
}
|
||||
}
|
||||
String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator);
|
||||
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
|
||||
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
|
||||
{
|
||||
if(constant_name.size != 0)
|
||||
{
|
||||
@@ -1581,6 +1581,159 @@ ev_escaped_from_raw_string(Arena *arena, String8 raw)
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: tree stringification iterator
|
||||
|
||||
internal EV_StringIter *
|
||||
ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params)
|
||||
{
|
||||
EV_StringIter *it = push_array(arena, EV_StringIter, 1);
|
||||
it->top_task = push_array(arena, EV_StringIterTask, 1);
|
||||
it->top_task->eval = eval;
|
||||
MemoryCopyStruct(&it->top_task->params, params);
|
||||
return it;
|
||||
}
|
||||
|
||||
internal B32
|
||||
ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
|
||||
{
|
||||
B32 result = 0;
|
||||
|
||||
//- rjf: make progress on top task
|
||||
MemoryZeroStruct(out_string);
|
||||
B32 need_pop = 1;
|
||||
B32 need_new_task = 0;
|
||||
EV_StringIterTask new_task = {0};
|
||||
if(it->top_task != 0)
|
||||
{
|
||||
result = 1;
|
||||
|
||||
//- rjf: unpack task
|
||||
U64 task_idx = it->top_task->idx;
|
||||
EV_StringParams *params = &it->top_task->params;
|
||||
E_Eval eval = it->top_task->eval;
|
||||
E_TypeKey type_key = eval.irtree.type_key;
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
|
||||
//- rjf: type evaluations -> display type string
|
||||
if(eval.irtree.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
|
||||
{
|
||||
*out_string = e_type_string_from_key(arena, type_key);
|
||||
}
|
||||
|
||||
//- rjf: non-type evaluations
|
||||
else switch(type_kind)
|
||||
{
|
||||
//- rjf: default - leaf cases
|
||||
default:
|
||||
{
|
||||
E_Eval value_eval = e_value_eval_from_eval(eval);
|
||||
*out_string = ev_string_from_simple_typed_eval(arena, params, value_eval);
|
||||
}break;
|
||||
|
||||
//- rjf: lenses
|
||||
case E_TypeKind_Lens:
|
||||
switch(task_idx)
|
||||
{
|
||||
default:{}break;
|
||||
|
||||
// rjf: step 0 -> generate lens description, then descend to same evaluation w/ direct type
|
||||
case 0:
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List strings = {0};
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(type_key);
|
||||
str8_list_pushf(scratch.arena, &strings, "%S(", type->name);
|
||||
for EachIndex(idx, type->count)
|
||||
{
|
||||
String8 string = e_string_from_expr(scratch.arena, type->args[idx]);
|
||||
str8_list_push(scratch.arena, &strings, string);
|
||||
if(idx+1 < type->count)
|
||||
{
|
||||
str8_list_pushf(scratch.arena, &strings, ", ");
|
||||
}
|
||||
}
|
||||
str8_list_pushf(scratch.arena, &strings, ") <- (");
|
||||
}
|
||||
*out_string = str8_list_join(arena, &strings, 0);
|
||||
need_new_task = 1;
|
||||
new_task.params = *params;
|
||||
new_task.eval = eval;
|
||||
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
|
||||
// rjf: step 1 -> close
|
||||
case 1:
|
||||
{
|
||||
*out_string = str8_lit(")");
|
||||
}break;
|
||||
}break;
|
||||
|
||||
//- rjf: pointers
|
||||
case E_TypeKind_Function:
|
||||
case E_TypeKind_Ptr:
|
||||
case E_TypeKind_LRef:
|
||||
case E_TypeKind_RRef:
|
||||
{
|
||||
|
||||
}break;
|
||||
|
||||
//- rjf: arrays
|
||||
case E_TypeKind_Array:
|
||||
{
|
||||
|
||||
}break;
|
||||
|
||||
//- rjf: non-string-arrays/structs/sets
|
||||
case E_TypeKind_Struct:
|
||||
case E_TypeKind_Union:
|
||||
case E_TypeKind_Class:
|
||||
case E_TypeKind_IncompleteStruct:
|
||||
case E_TypeKind_IncompleteUnion:
|
||||
case E_TypeKind_IncompleteClass:
|
||||
case E_TypeKind_Set:
|
||||
arrays_and_sets_and_structs:
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: bump task counter
|
||||
if(it->top_task != 0)
|
||||
{
|
||||
it->top_task->idx += 1;
|
||||
}
|
||||
|
||||
//- rjf: if result is good, and we have a new task? -> push
|
||||
if(result && need_new_task)
|
||||
{
|
||||
EV_StringIterTask *new_t = it->free_task;
|
||||
if(new_t != 0)
|
||||
{
|
||||
SLLStackPop(it->free_task);
|
||||
}
|
||||
else
|
||||
{
|
||||
new_t = push_array(arena, EV_StringIterTask, 1);
|
||||
}
|
||||
MemoryCopyStruct(new_t, &new_task);
|
||||
SLLStackPush(it->top_task, new_t);
|
||||
new_t->idx = 0;
|
||||
}
|
||||
|
||||
//- rjf: if result is good, but we don't have a new task? -> pop
|
||||
else if(result && need_pop)
|
||||
{
|
||||
EV_StringIterTask *task = it->top_task;
|
||||
SLLStackPop(it->top_task);
|
||||
SLLStackPush(it->free_task, task);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression & IR-Tree => Expand Rule
|
||||
|
||||
|
||||
@@ -237,6 +237,32 @@ enum
|
||||
{
|
||||
EV_StringFlag_ReadOnlyDisplayRules = (1<<0),
|
||||
EV_StringFlag_PrettyNames = (1<<1),
|
||||
EV_StringFlag_DisableAddresses = (1<<2),
|
||||
EV_StringFlag_DisableStrings = (1<<3),
|
||||
};
|
||||
|
||||
typedef struct EV_StringParams EV_StringParams;
|
||||
struct EV_StringParams
|
||||
{
|
||||
EV_StringFlags flags;
|
||||
U32 radix;
|
||||
U32 min_digits;
|
||||
};
|
||||
|
||||
typedef struct EV_StringIterTask EV_StringIterTask;
|
||||
struct EV_StringIterTask
|
||||
{
|
||||
EV_StringIterTask *next;
|
||||
EV_StringParams params;
|
||||
E_Eval eval;
|
||||
U64 idx;
|
||||
};
|
||||
|
||||
typedef struct EV_StringIter EV_StringIter;
|
||||
struct EV_StringIter
|
||||
{
|
||||
EV_StringIterTask *top_task;
|
||||
EV_StringIterTask *free_task;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -341,9 +367,13 @@ internal B32 ev_row_is_editable(EV_Row *row);
|
||||
internal String8 ev_string_from_ascii_value(Arena *arena, U8 val);
|
||||
internal String8 ev_string_from_hresult_facility_code(U32 code);
|
||||
internal String8 ev_string_from_hresult_code(U32 code);
|
||||
internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval);
|
||||
internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval);
|
||||
internal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw);
|
||||
|
||||
//- rjf: tree stringification iterator
|
||||
internal EV_StringIter *ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params);
|
||||
internal B32 ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Expression & IR-Tree => Expand Rule
|
||||
|
||||
|
||||
+27
-19
@@ -6839,7 +6839,8 @@ rd_window_frame(void)
|
||||
E_Eval eval = e_eval_from_string(scratch.arena, rd_state->drag_drop_regs->expr);
|
||||
if(eval.irtree.mode != E_Mode_Null)
|
||||
{
|
||||
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
|
||||
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
|
||||
String8 value_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
|
||||
rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string);
|
||||
}
|
||||
}
|
||||
@@ -10419,7 +10420,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
U32 min_digits = 0;
|
||||
B32 no_addr = 0;
|
||||
B32 no_string = 0;
|
||||
B32 has_array = 0;
|
||||
#if 0 // TODO(rjf): @eval
|
||||
for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next)
|
||||
{
|
||||
@@ -10430,7 +10430,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
else if(str8_match(tag->string, str8_lit("oct"), 0)) {radix = 8; }
|
||||
else if(str8_match(tag->string, str8_lit("no_addr"), 0)) {no_addr = 1;}
|
||||
else if(str8_match(tag->string, str8_lit("no_string"), 0)) {no_string = 1;}
|
||||
else if(str8_match(tag->string, str8_lit("array"), 0)) {has_array = 1;}
|
||||
else if(str8_match(tag->string, str8_lit("digits"), 0))
|
||||
{
|
||||
E_Expr *num_expr = tag->first->next;
|
||||
@@ -10440,22 +10439,12 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: force no_addr in non-address-spaces
|
||||
if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
|
||||
eval.space.kind == RD_EvalSpaceKind_MetaCfg)
|
||||
{
|
||||
E_TypeKind kind = e_type_kind_from_key(eval.irtree.type_key);
|
||||
if(kind != E_TypeKind_Ptr)
|
||||
{
|
||||
no_addr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
|
||||
if(!(type->flags & E_TypeFlag_External))
|
||||
{
|
||||
no_addr = 1;
|
||||
}
|
||||
}
|
||||
no_addr = 1;
|
||||
}
|
||||
|
||||
//- rjf: force no_string, if we are looking at padding members
|
||||
@@ -10507,7 +10496,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
default:
|
||||
{
|
||||
E_Eval value_eval = e_value_eval_from_eval(eval);
|
||||
String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
|
||||
String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
|
||||
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
|
||||
str8_list_push(arena, out, string);
|
||||
}break;
|
||||
@@ -10624,7 +10613,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, left_paren).x;
|
||||
str8_list_push(arena, out, left_paren);
|
||||
}
|
||||
String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
|
||||
String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
|
||||
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
|
||||
str8_list_push(arena, out, string);
|
||||
if(did_content)
|
||||
@@ -10889,6 +10878,25 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U3
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
rd_value_string_from_eval_NEW(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List strs = {0};
|
||||
{
|
||||
EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params);
|
||||
F32 space_taken_px = 0;
|
||||
for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string) && space_taken_px < max_size;)
|
||||
{
|
||||
str8_list_push(scratch.arena, &strs, string);
|
||||
space_taken_px += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
|
||||
}
|
||||
}
|
||||
String8 result = str8_list_join(arena, &strs, 0);
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Hover Eval
|
||||
|
||||
@@ -13922,7 +13930,7 @@ rd_frame(void)
|
||||
for EachElement(idx, view_ui_rule_table)
|
||||
{
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = view_ui_rule_table[idx].name);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = view_ui_rule_table[idx].name);
|
||||
e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, view_ui_rule_table[idx].name, expr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1007,6 +1007,7 @@ internal void rd_window_frame(void);
|
||||
|
||||
internal F32 rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval root_eval, E_Eval eval, String8List *out);
|
||||
internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
|
||||
internal String8 rd_value_string_from_eval_NEW(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Hover Eval
|
||||
|
||||
@@ -1503,7 +1503,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
}
|
||||
|
||||
//- rjf: generate strings/flags based on that expression & fill
|
||||
result.string = rd_value_string_from_eval(arena, rd_view_query_input(), string_flags, default_radix, font, font_size, max_size_px, result.eval);
|
||||
EV_StringParams string_params = {.flags = string_flags, .radix = default_radix};
|
||||
result.string = rd_value_string_from_eval_NEW(arena, rd_view_query_input(), &string_params, font, font_size, max_size_px, result.eval);
|
||||
result.flags |= !!(ev_type_key_is_editable(result.eval.irtree.type_key) && result.eval.irtree.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit;
|
||||
E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key);
|
||||
if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))
|
||||
|
||||
@@ -1978,7 +1978,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
String8 eval_string = {0};
|
||||
if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
|
||||
{
|
||||
eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval);
|
||||
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
|
||||
eval_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval);
|
||||
}
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
ui_set_next_pref_width(ui_children_sum(1));
|
||||
|
||||
Reference in New Issue
Block a user