mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-24 04:34:59 -07:00
begin plugging in view rules as formal call part of expression language
This commit is contained in:
+1
-3
@@ -71,7 +71,7 @@ E_TypeKindTable:
|
||||
{IncompleteEnum "enum" 0 }
|
||||
{Bitfield "bitfield" 0 }
|
||||
{Variadic "variadic" 0 }
|
||||
{Set "set" 0 }
|
||||
{Stub "stub" 0 }
|
||||
}
|
||||
|
||||
@table(name op_kind precedence op_pre op_sep op_pos)
|
||||
@@ -134,8 +134,6 @@ E_ExprKindTable:
|
||||
{ Func Null 0 "" "" "" }
|
||||
|
||||
{ Define Binary 13 "" "=" "" }
|
||||
|
||||
{ Tag Null 0 "=>" "," "" }
|
||||
}
|
||||
|
||||
@table(name display_string)
|
||||
|
||||
@@ -27,6 +27,7 @@ e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
|
||||
.space = interp.space,
|
||||
.exprs = exprs,
|
||||
.irtree = irtree,
|
||||
.bytecode = bytecode,
|
||||
.lookup_rule_tag = lookup,
|
||||
.code = interp.code,
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@ struct E_Eval
|
||||
E_Space space;
|
||||
E_ExprChain exprs;
|
||||
E_IRTreeAndType irtree;
|
||||
String8 bytecode;
|
||||
E_LookupRuleTagPair lookup_rule_tag;
|
||||
E_InterpretationCode code;
|
||||
E_MsgList msgs;
|
||||
|
||||
@@ -535,7 +535,7 @@ struct E_LookupRuleTagPair
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Generation Hooks
|
||||
|
||||
#define E_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr, E_Expr *tag)
|
||||
#define E_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr)
|
||||
#define E_IRGEN_FUNCTION_NAME(name) e_irgen_##name
|
||||
#define E_IRGEN_FUNCTION_DEF(name) internal E_IRGEN_FUNCTION_SIG(E_IRGEN_FUNCTION_NAME(name))
|
||||
typedef E_IRGEN_FUNCTION_SIG(E_IRGenFunctionType);
|
||||
|
||||
+68
-75
@@ -69,11 +69,12 @@ e_select_ir_ctx(E_IRCtx *ctx)
|
||||
e_ir_state->arena_eval_start_pos = arena_pos(arena);
|
||||
}
|
||||
arena_pop_to(e_ir_state->arena, e_ir_state->arena_eval_start_pos);
|
||||
if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; }
|
||||
if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; }
|
||||
if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; }
|
||||
if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; }
|
||||
if(ctx->macro_map == 0) {ctx->macro_map = &e_string2expr_map_nil;}
|
||||
if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; }
|
||||
if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; }
|
||||
if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; }
|
||||
if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; }
|
||||
if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; }
|
||||
if(ctx->macro_map == 0) { ctx->macro_map = push_array(e_ir_state->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_ir_state->arena, 512); }
|
||||
e_ir_state->ctx = ctx;
|
||||
e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(ctx->primary_module->rdi, ctx->thread_ip_voff);
|
||||
e_ir_state->used_tag_map = push_array(e_ir_state->arena, E_UsedTagMap, 1);
|
||||
@@ -88,6 +89,18 @@ e_select_ir_ctx(E_IRCtx *ctx)
|
||||
e_ir_state->string_id_map->id_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->id_slots_count);
|
||||
e_ir_state->string_id_map->hash_slots_count = 1024;
|
||||
e_ir_state->string_id_map->hash_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->hash_slots_count);
|
||||
String8 builtin_view_rule_names[] =
|
||||
{
|
||||
str8_lit_comp("bswap"),
|
||||
str8_lit_comp("array"),
|
||||
};
|
||||
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_Stub, .name = str8_lit("view_rule"));
|
||||
expr->value.u64 = e_id_from_string(builtin_view_rule_names[idx]);
|
||||
e_string2expr_map_insert(e_ir_state->arena, ctx->macro_map, builtin_view_rule_names[idx], expr);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
@@ -179,7 +192,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(folder)
|
||||
String8 folder_name = accel->folders.v[idx - 0];
|
||||
String8 folder_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", folder_name);
|
||||
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder"));
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("folder"));
|
||||
expr->space = e_space_make(E_SpaceKind_FileSystem);
|
||||
expr->value.u64 = e_id_from_string(folder_path);
|
||||
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, folder_name));
|
||||
@@ -189,7 +202,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(folder)
|
||||
String8 file_name = accel->files.v[idx - accel->folders.count];
|
||||
String8 file_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", file_name);
|
||||
expr = e_push_expr(arena, E_ExprKind_LeafValue, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file"));
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("file"));
|
||||
expr->space = e_space_make(E_SpaceKind_FileSystem);
|
||||
expr->value.u64 = e_id_from_string(file_path);
|
||||
expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, file_name));
|
||||
@@ -866,7 +879,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
|
||||
enum_type_key = lhs_type_key;
|
||||
do_enum_range = 1;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Set)
|
||||
else if(lhs_type_kind == E_TypeKind_Stub)
|
||||
{
|
||||
do_index_range = 1;
|
||||
}
|
||||
@@ -1177,15 +1190,6 @@ e_lookup_rule_from_string(String8 string)
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Gen Rules
|
||||
|
||||
E_IRGEN_FUNCTION_DEF(cast)
|
||||
{
|
||||
E_Expr *type_expr = tag->first->next;
|
||||
E_TypeKey type_key = e_type_from_expr(type_expr);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
|
||||
E_IRTreeAndType result = {irtree.root, type_key, irtree.member, irtree.mode, irtree.msgs};
|
||||
return result;
|
||||
}
|
||||
|
||||
E_IRGEN_FUNCTION_DEF(bswap)
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
|
||||
@@ -1197,60 +1201,20 @@ E_IRGEN_FUNCTION_DEF(bswap)
|
||||
|
||||
E_IRGEN_FUNCTION_DEF(array)
|
||||
{
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
|
||||
E_TypeKey type_key = irtree.type_key;
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
if(e_type_kind_is_pointer_or_ref(type_kind))
|
||||
{
|
||||
E_Value count_value = e_value_from_expr(tag->first->next);
|
||||
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
|
||||
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0);
|
||||
irtree.type_key = ptr_type_key;
|
||||
}
|
||||
return irtree;
|
||||
E_Expr *ptr_expr = expr->first->next;
|
||||
E_Expr *count_expr = ptr_expr->next;
|
||||
E_IRTreeAndType result = e_irtree_and_type_from_expr(arena, ptr_expr);
|
||||
E_TypeKey element_type_key = e_type_ptee_from_key(result.type_key);
|
||||
E_Value count_value = e_value_from_expr(count_expr);
|
||||
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
E_IRGEN_FUNCTION_DEF(wrap)
|
||||
E_IRGEN_FUNCTION_DEF(view_rule_noop)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Expr *expr_to_irify = expr;
|
||||
E_Expr *wrap_expr_src = tag->first->next;
|
||||
if(wrap_expr_src != &e_expr_nil)
|
||||
{
|
||||
expr_to_irify = e_expr_copy(scratch.arena, wrap_expr_src);
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
{
|
||||
Task *next;
|
||||
E_Expr *parent;
|
||||
E_Expr *expr;
|
||||
};
|
||||
Task start_task = {0, &e_expr_nil, expr_to_irify};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = first_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
{
|
||||
if(t->expr->kind == E_ExprKind_LeafIdentifier && str8_match(t->expr->string, str8_lit("$expr"), 0))
|
||||
{
|
||||
E_Expr *original_expr_ref = e_expr_ref(arena, expr);
|
||||
if(t->parent != &e_expr_nil)
|
||||
{
|
||||
e_expr_insert_child(t->parent, t->expr, original_expr_ref);
|
||||
e_expr_remove_child(t->parent, t->expr);
|
||||
}
|
||||
}
|
||||
else for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)
|
||||
{
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
task->parent = t->expr;
|
||||
task->expr = child;
|
||||
}
|
||||
}
|
||||
}
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr_to_irify);
|
||||
scratch_end(scratch);
|
||||
return irtree;
|
||||
E_Expr *expr_arg = expr->first->next;
|
||||
E_IRTreeAndType result = e_irtree_and_type_from_expr(arena, expr_arg);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E_IRGenRuleMap
|
||||
@@ -1260,10 +1224,8 @@ e_irgen_rule_map_make(Arena *arena, U64 slots_count)
|
||||
map.slots_count = slots_count;
|
||||
map.slots = push_array(arena, E_IRGenRuleSlot, map.slots_count);
|
||||
e_irgen_rule_map_insert_new(arena, &map, str8_lit("default"), .irgen = E_IRGEN_FUNCTION_NAME(default));
|
||||
e_irgen_rule_map_insert_new(arena, &map, str8_lit("cast"), .irgen = E_IRGEN_FUNCTION_NAME(cast));
|
||||
e_irgen_rule_map_insert_new(arena, &map, str8_lit("bswap"), .irgen = E_IRGEN_FUNCTION_NAME(bswap));
|
||||
e_irgen_rule_map_insert_new(arena, &map, str8_lit("array"), .irgen = E_IRGEN_FUNCTION_NAME(array));
|
||||
e_irgen_rule_map_insert_new(arena, &map, str8_lit("wrap"), .irgen = E_IRGEN_FUNCTION_NAME(wrap));
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -2458,6 +2420,37 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: call
|
||||
case E_ExprKind_Call:
|
||||
{
|
||||
E_Expr *lhs = expr->first;
|
||||
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
|
||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
|
||||
if(lhs_type->kind == E_TypeKind_Stub)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs_irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
String8 name = e_string_from_id(interp.value.u64);
|
||||
E_IRGenRule *irgen_rule = e_irgen_rule_from_string(name);
|
||||
if(irgen_rule != &e_irgen_rule__default)
|
||||
{
|
||||
result = irgen_rule->irgen(arena, expr);
|
||||
}
|
||||
else
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "There is no rule named `%S`.", name);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
else
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "Calling this type is not currently supported.");
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: leaf bytecode
|
||||
case E_ExprKind_LeafBytecode:
|
||||
{
|
||||
@@ -2970,7 +2963,7 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_FileSystem);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(file_path)));
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file"));
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("file"));
|
||||
result.mode = E_Mode_Value;
|
||||
}
|
||||
else
|
||||
@@ -2981,7 +2974,7 @@ E_IRGEN_FUNCTION_DEF(default)
|
||||
{
|
||||
E_Space space = e_space_make(E_SpaceKind_FileSystem);
|
||||
result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(folder_path)));
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder"));
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("folder"));
|
||||
result.mode = E_Mode_Value;
|
||||
}
|
||||
}
|
||||
@@ -3074,10 +3067,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
// rjf: do this rule's generation
|
||||
ProfScope("irgen rule '%.*s'", str8_varg(t->rule->name))
|
||||
{
|
||||
result = t->rule->irgen(arena, expr, t->tag);
|
||||
result = t->rule->irgen(arena, expr);
|
||||
if(result.root == &e_irnode_nil && t->rule != &e_irgen_rule__default)
|
||||
{
|
||||
result = e_irgen_rule__default.irgen(arena, expr, &e_expr_nil);
|
||||
result = e_irgen_rule__default.irgen(arena, expr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3419,7 +3412,7 @@ e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree)
|
||||
if(!default_is_forced && result.rule == &e_lookup_rule__default)
|
||||
{
|
||||
E_TypeKind type_kind = e_type_kind_from_key(irtree->type_key);
|
||||
if(type_kind == E_TypeKind_Set)
|
||||
if(type_kind == E_TypeKind_Stub)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(irtree->type_key);
|
||||
String8 name = type->name;
|
||||
|
||||
@@ -71,7 +71,7 @@ str8_lit_comp("class"),
|
||||
str8_lit_comp("enum"),
|
||||
str8_lit_comp("bitfield"),
|
||||
str8_lit_comp("variadic"),
|
||||
str8_lit_comp("set"),
|
||||
str8_lit_comp("stub"),
|
||||
};
|
||||
|
||||
U8 e_type_kind_basic_byte_size_table[56] =
|
||||
@@ -134,7 +134,7 @@ U8 e_type_kind_basic_byte_size_table[56] =
|
||||
0,
|
||||
};
|
||||
|
||||
String8 e_expr_kind_strings[49] =
|
||||
String8 e_expr_kind_strings[48] =
|
||||
{
|
||||
str8_lit_comp("Nil"),
|
||||
str8_lit_comp("Ref"),
|
||||
@@ -184,10 +184,9 @@ str8_lit_comp("Ptr"),
|
||||
str8_lit_comp("Array"),
|
||||
str8_lit_comp("Func"),
|
||||
str8_lit_comp("Define"),
|
||||
str8_lit_comp("Tag"),
|
||||
};
|
||||
|
||||
E_OpInfo e_expr_kind_op_info_table[49] =
|
||||
E_OpInfo e_expr_kind_op_info_table[48] =
|
||||
{
|
||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||
@@ -237,7 +236,6 @@ E_OpInfo e_expr_kind_op_info_table[49] =
|
||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") },
|
||||
{ E_OpKind_Null, 0, str8_lit_comp("=>"), str8_lit_comp(","), str8_lit_comp("") },
|
||||
};
|
||||
|
||||
String8 e_interpretation_code_display_strings[11] =
|
||||
|
||||
@@ -74,7 +74,7 @@ E_TypeKind_IncompleteClass,
|
||||
E_TypeKind_IncompleteEnum,
|
||||
E_TypeKind_Bitfield,
|
||||
E_TypeKind_Variadic,
|
||||
E_TypeKind_Set,
|
||||
E_TypeKind_Stub,
|
||||
E_TypeKind_COUNT,
|
||||
E_TypeKind_FirstBasic = E_TypeKind_Void,
|
||||
E_TypeKind_LastBasic = E_TypeKind_ComplexF128,
|
||||
@@ -139,7 +139,6 @@ E_ExprKind_Ptr,
|
||||
E_ExprKind_Array,
|
||||
E_ExprKind_Func,
|
||||
E_ExprKind_Define,
|
||||
E_ExprKind_Tag,
|
||||
E_ExprKind_COUNT,
|
||||
} E_ExprKindEnum;
|
||||
|
||||
@@ -163,8 +162,8 @@ C_LINKAGE_BEGIN
|
||||
extern String8 e_token_kind_strings[6];
|
||||
extern String8 e_type_kind_basic_string_table[56];
|
||||
extern U8 e_type_kind_basic_byte_size_table[56];
|
||||
extern String8 e_expr_kind_strings[49];
|
||||
extern E_OpInfo e_expr_kind_op_info_table[49];
|
||||
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];
|
||||
|
||||
C_LINKAGE_END
|
||||
|
||||
@@ -94,7 +94,7 @@ ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode)
|
||||
kind == E_TypeKind_Union ||
|
||||
kind == E_TypeKind_Class ||
|
||||
kind == E_TypeKind_Array ||
|
||||
kind == E_TypeKind_Set ||
|
||||
kind == E_TypeKind_Stub ||
|
||||
(kind == E_TypeKind_Enum && mode == E_Mode_Null))
|
||||
{
|
||||
result = 1;
|
||||
|
||||
@@ -106,7 +106,7 @@ void optimized_struct_parameters_eval_tests(void);
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
|
||||
raddbg_auto_view_rule(std::vector<?>, slice(_Mypair._Myval2));
|
||||
// raddbg_auto_view_rule(std::vector<?>, slice(_Mypair._Myval2));
|
||||
|
||||
struct Basics{
|
||||
char a;
|
||||
@@ -150,7 +150,7 @@ struct Dynamic_Array{
|
||||
Pair *pairs;
|
||||
int count;
|
||||
};
|
||||
raddbg_auto_view_rule(Dynamic_Array, slice);
|
||||
// raddbg_auto_view_rule(Dynamic_Array, slice);
|
||||
|
||||
struct Struct_With_Embedded_Arrays{
|
||||
int x;
|
||||
@@ -1620,7 +1620,7 @@ struct Bitmap
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
raddbg_auto_view_rule(Bitmap, bitmap(base, width, height));
|
||||
// raddbg_auto_view_rule(Bitmap, bitmap(base, width, height));
|
||||
|
||||
static unsigned int
|
||||
mule_bswap_u32(unsigned int x)
|
||||
|
||||
+59
-129
@@ -107,7 +107,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches)
|
||||
{
|
||||
E_Eval eval = e_eval_from_string(scratch.arena, expr);
|
||||
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
|
||||
if(type->kind != E_TypeKind_Set)
|
||||
if(type->kind != E_TypeKind_Stub)
|
||||
{
|
||||
passes_filter = 0;
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, expr);
|
||||
@@ -441,7 +441,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(schema)
|
||||
}
|
||||
else if(str8_match(child_schema->first->string, str8_lit("query"), 0))
|
||||
{
|
||||
child_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = child_schema->string);
|
||||
child_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = child_schema->string);
|
||||
}
|
||||
|
||||
//- rjf: evaluate
|
||||
@@ -4706,7 +4706,7 @@ rd_view_ui(Rng2F32 rect)
|
||||
E_IRTreeAndType block_irtree = e_irtree_and_type_from_expr(scratch.arena, selection_block->expr);
|
||||
E_TypeKey block_type_key = block_irtree.type_key;
|
||||
E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);
|
||||
if(block_type_kind == E_TypeKind_Set)
|
||||
if(block_type_kind == E_TypeKind_Stub)
|
||||
{
|
||||
E_Type *block_type = e_type_from_key__cached(block_type_key);
|
||||
group_cfg_name = rd_singular_from_code_name_plural(block_type->name);
|
||||
@@ -10788,7 +10788,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
|
||||
case E_TypeKind_IncompleteStruct:
|
||||
case E_TypeKind_IncompleteUnion:
|
||||
case E_TypeKind_IncompleteClass:
|
||||
case E_TypeKind_Set:
|
||||
case E_TypeKind_Stub:
|
||||
arrays_and_sets_and_structs:
|
||||
{
|
||||
// rjf: unpack
|
||||
@@ -13527,92 +13527,13 @@ rd_frame(void)
|
||||
ctx->auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1);
|
||||
ctx->auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512);
|
||||
|
||||
//- rjf: build special member types for evallable meta types
|
||||
E_TypeKey bool_type_key = {0};
|
||||
E_TypeKey u64_type_key = {0};
|
||||
E_TypeKey vaddr_range_type_key = {0};
|
||||
E_TypeKey code_string_type_key = {0};
|
||||
E_TypeKey path_type_key = {0};
|
||||
E_TypeKey string_type_key = {0};
|
||||
E_TypeKey path_pt_type_key = {0};
|
||||
{
|
||||
E_MemberList vaddr_range_members_list = {0};
|
||||
e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("min"), .off = 0);
|
||||
e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("max"), .off = 8);
|
||||
E_MemberArray vaddr_range_members = e_member_array_from_list(scratch.arena, &vaddr_range_members_list);
|
||||
bool_type_key = e_type_key_basic(E_TypeKind_Bool);
|
||||
u64_type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
vaddr_range_type_key = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v);
|
||||
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText);
|
||||
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText);
|
||||
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText);
|
||||
path_pt_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText);
|
||||
}
|
||||
|
||||
//- rjf: build types for each evallable meta name
|
||||
struct
|
||||
{
|
||||
String8 schema_type_name;
|
||||
E_TypeKey type_key;
|
||||
}
|
||||
schema_type_name_key_map[] =
|
||||
{
|
||||
{ str8_lit("bool"), bool_type_key },
|
||||
{ str8_lit("u64"), u64_type_key },
|
||||
{ str8_lit("vaddr_range"), vaddr_range_type_key },
|
||||
{ str8_lit("code_string"), code_string_type_key },
|
||||
{ str8_lit("path"), path_type_key },
|
||||
{ str8_lit("string"), string_type_key },
|
||||
{ str8_lit("path_pt"), path_pt_type_key },
|
||||
};
|
||||
E_TypeKey evallable_meta_types[ArrayCount(rd_name_schema_info_table)] = {0};
|
||||
for EachElement(idx, rd_name_schema_info_table)
|
||||
{
|
||||
String8 name = rd_name_schema_info_table[idx].name;
|
||||
MD_Node *schema = rd_schema_from_name(name);
|
||||
E_MemberList members_list = {0};
|
||||
U64 off = 0;
|
||||
for MD_EachNode(child, schema->first)
|
||||
{
|
||||
if(str8_match(child->first->string, str8_lit("query"), 0))
|
||||
{
|
||||
e_member_list_push_new(scratch.arena, &members_list,
|
||||
.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = child->string),
|
||||
.name = child->string);
|
||||
}
|
||||
else
|
||||
{
|
||||
String8 member_name = child->string;
|
||||
E_TypeKey member_type_key = zero_struct;
|
||||
for EachElement(schema_type_name_idx, schema_type_name_key_map)
|
||||
{
|
||||
if(str8_match(child->first->string, schema_type_name_key_map[schema_type_name_idx].schema_type_name, 0))
|
||||
{
|
||||
member_type_key = schema_type_name_key_map[schema_type_name_idx].type_key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
e_member_list_push_new(scratch.arena, &members_list,
|
||||
.type_key = member_type_key,
|
||||
.name = member_name,
|
||||
.off = off);
|
||||
off += e_type_byte_size_from_key(member_type_key);
|
||||
}
|
||||
}
|
||||
E_MemberArray members = e_member_array_from_list(scratch.arena, &members_list);
|
||||
evallable_meta_types[idx] = e_type_key_cons(.name = name,
|
||||
.kind = E_TypeKind_Set,
|
||||
.members = members.v,
|
||||
.count = members.count);
|
||||
}
|
||||
|
||||
//- rjf: cache meta name -> type key correllation
|
||||
rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1);
|
||||
rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256);
|
||||
for EachElement(idx, rd_name_schema_info_table)
|
||||
{
|
||||
String8 name = rd_name_schema_info_table[idx].name;
|
||||
E_TypeKey type_key = evallable_meta_types[idx];
|
||||
E_TypeKey type_key = e_type_key_cons(.name = name, .kind = E_TypeKind_Stub);
|
||||
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key);
|
||||
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name,
|
||||
.info = E_LOOKUP_INFO_FUNCTION_NAME(schema),
|
||||
@@ -13741,7 +13662,7 @@ rd_frame(void)
|
||||
{
|
||||
String8 collection_name = str8_lit("watches");
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name, .flags = E_TypeFlag_EditableChildren);
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name,
|
||||
@@ -13783,7 +13704,7 @@ rd_frame(void)
|
||||
{
|
||||
String8 collection_name = collection_infos[idx].name;
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
|
||||
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name,
|
||||
.info = collection_infos[idx].lookup_info,
|
||||
@@ -13803,7 +13724,7 @@ rd_frame(void)
|
||||
{
|
||||
String8 name = debug_info_table_collection_names[idx];
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name);
|
||||
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = name);
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr);
|
||||
e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name,
|
||||
@@ -13818,7 +13739,7 @@ rd_frame(void)
|
||||
{
|
||||
String8 cfg_name = evallable_cfg_names[cfg_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(cfg_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name);
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
@@ -13836,7 +13757,7 @@ rd_frame(void)
|
||||
{
|
||||
String8 kind_name = evallable_ctrl_names[ctrl_name_idx];
|
||||
String8 collection_name = rd_plural_from_code_name(kind_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name);
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
@@ -13850,7 +13771,7 @@ rd_frame(void)
|
||||
//- rjf: add macro / lookup rules for unattached processes
|
||||
{
|
||||
String8 collection_name = str8_lit("unattached_processes");
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name);
|
||||
E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name);
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = collection_type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity);
|
||||
@@ -13863,7 +13784,7 @@ rd_frame(void)
|
||||
//- rjf: add macro for commands
|
||||
{
|
||||
String8 name = str8_lit("commands");
|
||||
E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name);
|
||||
E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = name);
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->type_key = type_key;
|
||||
expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);
|
||||
@@ -13950,6 +13871,53 @@ rd_frame(void)
|
||||
}
|
||||
e_select_ir_ctx(ir_ctx);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: generate macros for all view ui rules
|
||||
//
|
||||
{
|
||||
//- rjf: choose set of view ui rules
|
||||
// TODO(rjf): generate via metaprogram
|
||||
struct
|
||||
{
|
||||
String8 name;
|
||||
RD_ViewUIFunctionType *ui;
|
||||
EV_ExpandRuleInfoHookFunctionType *expand;
|
||||
}
|
||||
view_ui_rule_table[] =
|
||||
{
|
||||
{str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)},
|
||||
{str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},
|
||||
{str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
|
||||
{str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)},
|
||||
{str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox), 0},
|
||||
{str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)},
|
||||
{str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d), EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)},
|
||||
};
|
||||
|
||||
//- rjf: fill view ui rules in expand rule map, view ui rule map
|
||||
EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1);
|
||||
ev_select_expand_rule_table(expand_rule_table);
|
||||
rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512);
|
||||
{
|
||||
for EachElement(idx, view_ui_rule_table)
|
||||
{
|
||||
e_irgen_rule_map_insert_new(scratch.arena, e_ir_state->ctx->irgen_rule_map, view_ui_rule_table[idx].name, E_IRGEN_FUNCTION_NAME(view_rule_noop));
|
||||
rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, view_ui_rule_table[idx].name, view_ui_rule_table[idx].ui);
|
||||
if(view_ui_rule_table[idx].expand != 0)
|
||||
{
|
||||
ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, view_ui_rule_table[idx].name, view_ui_rule_table[idx].expand);
|
||||
}
|
||||
}
|
||||
}
|
||||
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_Stub, .name = str8_lit("view_rule"));
|
||||
expr->value.u64 = e_id_from_string(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);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval interpretation context
|
||||
//
|
||||
@@ -13969,44 +13937,6 @@ rd_frame(void)
|
||||
}
|
||||
e_select_interpret_ctx(interpret_ctx, eval_modules_primary->rdi, rip_voff);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval expand rule table
|
||||
//
|
||||
EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1);
|
||||
ev_select_expand_rule_table(expand_rule_table);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build view ui rule map
|
||||
//
|
||||
rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512);
|
||||
{
|
||||
// TODO(rjf): generate via metaprogram
|
||||
struct
|
||||
{
|
||||
String8 name;
|
||||
RD_ViewUIFunctionType *ui;
|
||||
EV_ExpandRuleInfoHookFunctionType *expand;
|
||||
}
|
||||
table[] =
|
||||
{
|
||||
{str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)},
|
||||
{str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},
|
||||
{str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
|
||||
{str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)},
|
||||
{str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox), 0},
|
||||
{str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)},
|
||||
{str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d), EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)},
|
||||
};
|
||||
for EachElement(idx, table)
|
||||
{
|
||||
rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, table[idx].name, table[idx].ui);
|
||||
if(table[idx].expand != 0)
|
||||
{
|
||||
ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, table[idx].name, table[idx].expand);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: autosave if needed
|
||||
//
|
||||
|
||||
@@ -89,6 +89,12 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: feature cleanup, code dedup, code elimination pass:
|
||||
//
|
||||
// [ ] 'view rules' need to be rephrased as "function" calls in the expression language
|
||||
// [ ] need a formalization which takes unknown identifiers which are called, and tries
|
||||
// to use that to apply a IR-generation rule, which is keyed by that unknown
|
||||
// identifier
|
||||
// [ ] *ALL* expressions in watch windows need to be editable.
|
||||
//
|
||||
// [ ] config hot-reloading, using cfg wins
|
||||
// [ ] undo/redo, using cfg wins
|
||||
// [ ] back/forward, using cfg wins
|
||||
|
||||
+10
-10
@@ -1002,21 +1002,21 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: determine ctrl entity
|
||||
if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
|
||||
block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
|
||||
if(block_type_kind == E_TypeKind_Stub && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
|
||||
block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))
|
||||
{
|
||||
info.group_entity = rd_ctrl_entity_from_eval_space(info.eval.space);
|
||||
}
|
||||
|
||||
// rjf: determine cfg group name / parent
|
||||
if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
|
||||
block_eval.space.kind == RD_EvalSpaceKind_MetaCfg))
|
||||
if(block_type_kind == E_TypeKind_Stub && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
|
||||
block_eval.space.kind == RD_EvalSpaceKind_MetaCfg))
|
||||
{
|
||||
info.group_cfg_parent = rd_cfg_from_eval_space(block_eval.space);
|
||||
}
|
||||
|
||||
// rjf: determine group cfg name
|
||||
if(block_type_kind == E_TypeKind_Set)
|
||||
if(block_type_kind == E_TypeKind_Stub)
|
||||
{
|
||||
String8 singular_name = rd_singular_from_code_name_plural(block_type->name);
|
||||
if(singular_name.size != 0)
|
||||
@@ -1070,7 +1070,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
else if(info.eval.space.kind == E_SpaceKind_FileSystem)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
if(type->kind == E_TypeKind_Stub)
|
||||
{
|
||||
String8 file_path = e_string_from_id(info.eval.value.u64);
|
||||
DR_FStrList fstrs = rd_title_fstrs_from_file_path(arena, file_path);
|
||||
@@ -1226,7 +1226,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCmd)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
if(type->kind == E_TypeKind_Stub)
|
||||
{
|
||||
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = 0, .pct = 1.f);
|
||||
}
|
||||
@@ -1282,7 +1282,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
|
||||
}
|
||||
|
||||
// rjf: procedures collections get only expr/value/view-rule
|
||||
else if(block_type->kind == E_TypeKind_Set && str8_match(block_type->name, str8_lit("procedures"), 0))
|
||||
else if(block_type->kind == E_TypeKind_Stub && str8_match(block_type->name, str8_lit("procedures"), 0))
|
||||
{
|
||||
info.cell_style_key = str8_lit("expr_value_viewrule");
|
||||
RD_Cfg *view = rd_cfg_from_id(rd_regs()->view);
|
||||
@@ -1565,7 +1565,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
else if(result.eval.space.kind == E_SpaceKind_FileSystem)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
if(type->kind == E_TypeKind_Stub)
|
||||
{
|
||||
String8 file_path = e_string_from_id(result.eval.value.u64);
|
||||
result.fstrs = rd_title_fstrs_from_file_path(arena, file_path);
|
||||
@@ -1633,7 +1633,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
|
||||
else if(result.eval.space.kind == E_SpaceKind_FileSystem)
|
||||
{
|
||||
E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key);
|
||||
if(type->kind == E_TypeKind_Set)
|
||||
if(type->kind == E_TypeKind_Stub)
|
||||
{
|
||||
String8 file_path = e_string_from_id(result.eval.value.u64);
|
||||
result.fstrs = rd_title_fstrs_from_file_path(arena, file_path);
|
||||
|
||||
@@ -60,7 +60,7 @@ entry_point(CmdLine *cmdline)
|
||||
}
|
||||
|
||||
//- rjf: parse
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, expr_text, &tokens);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, expr_text, tokens);
|
||||
{
|
||||
typedef struct Task Task;
|
||||
struct Task
|
||||
|
||||
Reference in New Issue
Block a user