small string evaluation; strings as values in eval

This commit is contained in:
Ryan Fleury
2024-08-14 10:49:56 -07:00
parent eac1672c4e
commit 918895c091
12 changed files with 175 additions and 112 deletions
+2 -2
View File
@@ -4983,8 +4983,8 @@ df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DF_EvalView *eval_
DF_EvalVizBlockList blocks = {0};
{
E_Eval eval = e_eval_from_string(arena, expr);
U64 expr_comma_pos = str8_find_needle(expr, 0, str8_lit(","), 0);
U64 passthrough_pos = str8_find_needle(expr, 0, str8_lit("--"), 0);
U64 expr_comma_pos = str8_find_needle(expr, eval.advance, str8_lit(","), 0);
U64 passthrough_pos = str8_find_needle(expr, eval.advance, str8_lit("--"), 0);
String8List default_view_rules = {0};
if(expr_comma_pos < expr.size && expr_comma_pos < passthrough_pos)
{
+24 -17
View File
@@ -8531,19 +8531,36 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
B32 special_case = 0;
// rjf: special-case: strings
if(!has_array && direct_type_is_string && eval.mode == E_Mode_Addr)
if(!has_array && direct_type_is_string)
{
special_case = 1;
DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread);
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
U64 element_size = e_type_byte_size_from_key(eval_type->direct_type_key);
CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0);
// rjf: read text
String8 text_data = {0};
switch(eval.mode)
{
default:{}break;
case E_Mode_Addr:
{
CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0);
text_data = text_slice.data;
}break;
case E_Mode_Value:
{
text_data = str8_cstring_capped(&eval.value.u512[0], (U8 *)(&eval.value.u512[0]) + sizeof(eval.value.u512));
}break;
}
// rjf: convert to utf-8 if needed
String8 raw_text = {0};
switch(element_size)
{
default:{raw_text = text_slice.data;}break;
case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break;
case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break;
default:{raw_text = text_data;}break;
case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_data.str, text_data.size/sizeof(U16)));}break;
case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_data.str, text_data.size/sizeof(U32)));}break;
}
String8 text = df_eval_escaped_from_raw_string(arena, raw_text);
space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x;
@@ -8569,11 +8586,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
U64 direct_type_byte_size = e_type_byte_size_from_key(direct_type_key);
for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1)
{
E_Eval element_eval = zero_struct;
element_eval.type_key = direct_type_key;
element_eval.mode = eval.mode;
element_eval.value = eval.value;
element_eval.value.u64 += direct_type_byte_size*idx;
E_Eval element_eval = e_element_eval_from_array_eval_index(eval, idx);
String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table);
space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, element_strs).x;
str8_list_concat_in_place(&list, &element_strs);
@@ -8937,13 +8950,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope,
DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1);
// rjf: get eval for this element
E_Eval elem_eval = zero_struct;
{
elem_eval.type_key = direct_type_key;
elem_eval.mode = block->eval.mode;
elem_eval.value = block->eval.value;
elem_eval.value.u64 += idx*direct_type_key_byte_size;
}
E_Eval elem_eval = e_element_eval_from_array_eval_index(block->eval, idx);
// rjf: get view rules
String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key);
+1 -1
View File
@@ -2722,7 +2722,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break;
default:
{
ext = str8_from_u64(scratch.arena, op->p, 16, 0, 0);
ext = str8_from_u64(scratch.arena, op->u64, 16, 0, 0);
}break;
}
ui_labelf(" %S%s%S", op_string, ext.size ? " " : "", ext);
+30
View File
@@ -19,6 +19,7 @@ e_eval_from_string(Arena *arena, String8 string)
.mode = irtree.mode,
.type_key = irtree.type_key,
.code = interp.code,
.advance = parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min,
};
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs);
@@ -200,3 +201,32 @@ e_value_eval_from_eval(E_Eval eval)
return eval;
}
internal E_Eval
e_element_eval_from_array_eval_index(E_Eval eval, U64 index)
{
E_Eval result = {0};
result.mode = eval.mode;
result.type_key = e_type_direct_from_key(eval.type_key);
result.code = eval.code;
result.msgs = eval.msgs;
U64 element_size = e_type_byte_size_from_key(result.type_key);
switch(eval.mode)
{
default:{}break;
case E_Mode_Value:
if(element_size <= sizeof(E_Value) &&
index < sizeof(E_Value)/element_size)
{
MemoryCopy((U8 *)(&result.value.u512[0]),
(U8 *)(&eval.value.u512[0]) + index*element_size,
element_size);
}break;
case E_Mode_Addr:
case E_Mode_Reg:
{
result.value.u64 = eval.value.u64 + element_size*index;
}break;
}
return result;
}
+2
View File
@@ -15,6 +15,7 @@ struct E_Eval
E_TypeKey type_key;
E_InterpretationCode code;
E_MsgList msgs;
U64 advance;
};
////////////////////////////////
@@ -24,5 +25,6 @@ internal E_Eval e_eval_from_string(Arena *arena, String8 string);
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval);
internal E_Eval e_value_eval_from_eval(E_Eval eval);
internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index);
#endif // EVAL_BUNDLES_H
+6
View File
@@ -206,6 +206,12 @@ e_interpret(String8 bytecode)
nval.u64 = imm;
}break;
case RDI_EvalOp_ConstString:
{
MemoryCopy(&nval, ptr, imm);
ptr += imm;
}break;
case RDI_EvalOp_Abs:
{
if(imm == RDI_EvalTypeGroup_F32)
+42 -14
View File
@@ -82,7 +82,7 @@ e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, U64 p)
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
E_Op *node = push_array_no_zero(arena, E_Op, 1);
node->opcode = opcode;
node->p = p;
node->u64 = p;
SLLQueuePush(list->first, list->last, node);
list->op_count += 1;
list->encoded_size += 1 + p_size;
@@ -127,12 +127,27 @@ e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode)
{
E_Op *node = push_array_no_zero(arena, E_Op, 1);
node->opcode = E_IRExtKind_Bytecode;
node->bytecode = bytecode;
node->string = bytecode;
SLLQueuePush(list->first, list->last, node);
list->op_count += 1;
list->encoded_size += bytecode.size;
}
internal void
e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string)
{
RDI_EvalOp opcode = RDI_EvalOp_ConstString;
U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
E_Op *node = push_array_no_zero(arena, E_Op, 1);
node->opcode = opcode;
node->string = string;
node->u64 = Min(string.size, 64);
SLLQueuePush(list->first, list->last, node);
list->op_count += 1;
list->encoded_size += 1 + p_size + node->u64;
}
internal void
e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push)
{
@@ -231,8 +246,8 @@ e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode)
internal E_IRNode *
e_irtree_string_literal(Arena *arena, String8 string)
{
E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstU512);
root->string = str8(string.str, Min(64, string.size));
E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstString);
root->string = string;
return root;
}
@@ -1138,13 +1153,6 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
e_oplist_push_bytecode(arena, out, root->string);
}break;
case RDI_EvalOp_ConstU128:
case RDI_EvalOp_ConstU256:
case RDI_EvalOp_ConstU512:
{
// TODO(rjf)
}break;
case RDI_EvalOp_Cond:
{
// rjf: generate oplists for each child
@@ -1171,6 +1179,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
e_oplist_concat_in_place(out, &prt_left);
}break;
case RDI_EvalOp_ConstString:
{
e_oplist_push_string_literal(arena, out, root->string);
}break;
default:
{
if(op >= RDI_EvalOp_COUNT)
@@ -1232,7 +1245,22 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
// rjf: fill bytecode
ptr[0] = opcode;
MemoryCopy(ptr + 1, &op->p, extra_byte_count);
MemoryCopy(ptr + 1, &op->u64, extra_byte_count);
// rjf: advance
ptr = next_ptr;
}break;
case RDI_EvalOp_ConstString:
{
// rjf: compute bytecode advance
U8 *next_ptr = ptr + 2 + op->u64;
Assert(next_ptr <= opl);
// rjf: fill
ptr[0] = opcode;
ptr[1] = (U8)op->u64;
MemoryCopy(ptr+2, op->string.str, op->u64);
// rjf: advance
ptr = next_ptr;
@@ -1241,12 +1269,12 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
case E_IRExtKind_Bytecode:
{
// rjf: compute bytecode advance
U64 size = op->bytecode.size;
U64 size = op->string.size;
U8 *next_ptr = ptr + size;
Assert(next_ptr <= opl);
// rjf: fill bytecode
MemoryCopy(ptr, op->bytecode.str, size);
MemoryCopy(ptr, op->string.str, size);
// rjf: advance
ptr = next_ptr;
+3 -6
View File
@@ -18,12 +18,8 @@ struct E_Op
{
E_Op *next;
RDI_EvalOp opcode;
union
{
U64 p;
String8 bytecode;
String8 data;
};
U64 u64;
String8 string;
};
typedef struct E_OpList E_OpList;
@@ -93,6 +89,7 @@ internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode,
internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x);
internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x);
internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode);
internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string);
internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push);
//- rjf: ir tree core building helpers
+2 -4
View File
@@ -92,7 +92,7 @@ RDI_U8 rdi_section_is_required_table[37] =
0,
};
RDI_U8 rdi_eval_op_ctrlbits_table[48] =
RDI_U8 rdi_eval_op_ctrlbits_table[46] =
{
RDI_EVAL_CTRLBITS(0, 0, 0),
RDI_EVAL_CTRLBITS(0, 0, 0),
@@ -110,9 +110,7 @@ RDI_EVAL_CTRLBITS(1, 0, 1),
RDI_EVAL_CTRLBITS(2, 0, 1),
RDI_EVAL_CTRLBITS(4, 0, 1),
RDI_EVAL_CTRLBITS(8, 0, 1),
RDI_EVAL_CTRLBITS(16, 0, 1),
RDI_EVAL_CTRLBITS(32, 0, 1),
RDI_EVAL_CTRLBITS(64, 0, 1),
RDI_EVAL_CTRLBITS(1, 0, 1),
RDI_EVAL_CTRLBITS(1, 1, 1),
RDI_EVAL_CTRLBITS(1, 1, 1),
RDI_EVAL_CTRLBITS(1, 2, 1),
+32 -36
View File
@@ -452,38 +452,36 @@ RDI_EvalOp_ConstU8 = 12,
RDI_EvalOp_ConstU16 = 13,
RDI_EvalOp_ConstU32 = 14,
RDI_EvalOp_ConstU64 = 15,
RDI_EvalOp_ConstU128 = 16,
RDI_EvalOp_ConstU256 = 17,
RDI_EvalOp_ConstU512 = 18,
RDI_EvalOp_Abs = 19,
RDI_EvalOp_Neg = 20,
RDI_EvalOp_Add = 21,
RDI_EvalOp_Sub = 22,
RDI_EvalOp_Mul = 23,
RDI_EvalOp_Div = 24,
RDI_EvalOp_Mod = 25,
RDI_EvalOp_LShift = 26,
RDI_EvalOp_RShift = 27,
RDI_EvalOp_BitAnd = 28,
RDI_EvalOp_BitOr = 29,
RDI_EvalOp_BitXor = 30,
RDI_EvalOp_BitNot = 31,
RDI_EvalOp_LogAnd = 32,
RDI_EvalOp_LogOr = 33,
RDI_EvalOp_LogNot = 34,
RDI_EvalOp_EqEq = 35,
RDI_EvalOp_NtEq = 36,
RDI_EvalOp_LsEq = 37,
RDI_EvalOp_GrEq = 38,
RDI_EvalOp_Less = 39,
RDI_EvalOp_Grtr = 40,
RDI_EvalOp_Trunc = 41,
RDI_EvalOp_TruncSigned = 42,
RDI_EvalOp_Convert = 43,
RDI_EvalOp_Pick = 44,
RDI_EvalOp_Pop = 45,
RDI_EvalOp_Insert = 46,
RDI_EvalOp_COUNT = 47,
RDI_EvalOp_ConstString = 16,
RDI_EvalOp_Abs = 17,
RDI_EvalOp_Neg = 18,
RDI_EvalOp_Add = 19,
RDI_EvalOp_Sub = 20,
RDI_EvalOp_Mul = 21,
RDI_EvalOp_Div = 22,
RDI_EvalOp_Mod = 23,
RDI_EvalOp_LShift = 24,
RDI_EvalOp_RShift = 25,
RDI_EvalOp_BitAnd = 26,
RDI_EvalOp_BitOr = 27,
RDI_EvalOp_BitXor = 28,
RDI_EvalOp_BitNot = 29,
RDI_EvalOp_LogAnd = 30,
RDI_EvalOp_LogOr = 31,
RDI_EvalOp_LogNot = 32,
RDI_EvalOp_EqEq = 33,
RDI_EvalOp_NtEq = 34,
RDI_EvalOp_LsEq = 35,
RDI_EvalOp_GrEq = 36,
RDI_EvalOp_Less = 37,
RDI_EvalOp_Grtr = 38,
RDI_EvalOp_Trunc = 39,
RDI_EvalOp_TruncSigned = 40,
RDI_EvalOp_Convert = 41,
RDI_EvalOp_Pick = 42,
RDI_EvalOp_Pop = 43,
RDI_EvalOp_Insert = 44,
RDI_EvalOp_COUNT = 45,
} RDI_EvalOpEnum;
typedef RDI_U8 RDI_EvalTypeGroup;
@@ -857,9 +855,7 @@ X(ConstU8)\
X(ConstU16)\
X(ConstU32)\
X(ConstU64)\
X(ConstU128)\
X(ConstU256)\
X(ConstU512)\
X(ConstString)\
X(Abs)\
X(Neg)\
X(Add)\
@@ -1357,6 +1353,6 @@ RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConver
extern RDI_U16 rdi_section_element_size_table[37];
extern RDI_U8 rdi_section_is_required_table[37];
extern RDI_U8 rdi_eval_op_ctrlbits_table[48];
extern RDI_U8 rdi_eval_op_ctrlbits_table[46];
#endif // RDI_FORMAT_H
+1
View File
@@ -4,6 +4,7 @@
////////////////////////////////
//~ rjf: Frontend/UI Pass Tasks
//
// [ ] fix HRESULTs
// [ ] file overrides -> always pick most specific one! found with conflicting
// overrides, e.g. C:/devel/ -> D:/devel/, but also C:/devel/foo ->
// C:/devel/bar, etc.
+30 -32
View File
@@ -1245,38 +1245,36 @@ RDI_EvalOpTable:
{ConstU16 13 2 0 1}
{ConstU32 14 4 0 1}
{ConstU64 15 8 0 1}
{ConstU128 16 16 0 1}
{ConstU256 17 32 0 1}
{ConstU512 18 64 0 1}
{Abs 19 1 1 1}
{Neg 20 1 1 1}
{Add 21 1 2 1}
{Sub 22 1 2 1}
{Mul 23 1 2 1}
{Div 24 1 2 1}
{Mod 25 1 2 1}
{LShift 26 1 2 1}
{RShift 27 1 2 1}
{BitAnd 28 1 2 1}
{BitOr 29 1 2 1}
{BitXor 30 1 2 1}
{BitNot 31 1 1 1}
{LogAnd 32 1 2 1}
{LogOr 33 1 2 1}
{LogNot 34 1 1 1}
{EqEq 35 1 2 1}
{NtEq 36 1 2 1}
{LsEq 37 1 2 1}
{GrEq 38 1 2 1}
{Less 39 1 2 1}
{Grtr 40 1 2 1}
{Trunc 41 1 1 1}
{TruncSigned 42 1 1 1}
{Convert 43 2 1 1}
{Pick 44 1 0 1}
{Pop 45 0 1 0}
{Insert 46 1 0 0}
{COUNT 47 0 0 0}
{ConstString 16 1 0 1}
{Abs 17 1 1 1}
{Neg 18 1 1 1}
{Add 19 1 2 1}
{Sub 20 1 2 1}
{Mul 21 1 2 1}
{Div 22 1 2 1}
{Mod 23 1 2 1}
{LShift 24 1 2 1}
{RShift 25 1 2 1}
{BitAnd 26 1 2 1}
{BitOr 27 1 2 1}
{BitXor 28 1 2 1}
{BitNot 29 1 1 1}
{LogAnd 30 1 2 1}
{LogOr 31 1 2 1}
{LogNot 32 1 1 1}
{EqEq 33 1 2 1}
{NtEq 34 1 2 1}
{LsEq 35 1 2 1}
{GrEq 36 1 2 1}
{Less 37 1 2 1}
{Grtr 38 1 2 1}
{Trunc 39 1 1 1}
{TruncSigned 40 1 1 1}
{Convert 41 2 1 1}
{Pick 42 1 0 1}
{Pop 43 0 1 0}
{Insert 44 1 0 0}
{COUNT 45 0 0 0}
}
// NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form