lens inheritance-on-expansion, composability with lens types & accesses (dot operator, array index operator), plugging in visualizers, killing dead code, etc.

This commit is contained in:
Ryan Fleury
2025-04-10 14:18:57 -07:00
parent d15f9af4b7
commit c05c21cfa4
10 changed files with 450 additions and 385 deletions
+7 -6
View File
@@ -296,12 +296,13 @@ E_MemberKind;
typedef U32 E_TypeFlags;
enum
{
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_IsPlainText = (1<<2),
E_TypeFlag_IsCodeText = (1<<3),
E_TypeFlag_IsPathText = (1<<4),
E_TypeFlag_EditableChildren = (1<<5),
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_IsPlainText = (1<<2),
E_TypeFlag_IsCodeText = (1<<3),
E_TypeFlag_IsPathText = (1<<4),
E_TypeFlag_EditableChildren = (1<<5),
E_TypeFlag_InheritedOnAccess = (1<<6),
};
typedef struct E_Member E_Member;
+49 -4
View File
@@ -1242,6 +1242,7 @@ e_expr_unpoison(E_Expr *expr)
E_TYPE_ACCESS_FUNCTION_DEF(default)
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType result = {&e_irnode_nil};
switch(expr->kind)
{
@@ -1260,8 +1261,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
E_TypeKind check_type_kind = l_restype_kind;
if(l_restype_kind == E_TypeKind_Ptr ||
l_restype_kind == E_TypeKind_LRef ||
l_restype_kind == E_TypeKind_RRef ||
l_restype_kind == E_TypeKind_Lens)
l_restype_kind == E_TypeKind_RRef)
{
check_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_restype)));
check_type_kind = e_type_kind_from_key(check_type_key);
@@ -1472,6 +1472,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
result.mode = mode;
}break;
}
scratch_end(scratch);
return result;
}
@@ -1482,6 +1483,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
E_TypeKeyList inherited_lenses = {0};
E_IRTreeAndType result = {&e_irnode_nil};
//////////////////////////////
@@ -1519,10 +1521,26 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
case E_ExprKind_MemberAccess:
case E_ExprKind_ArrayIndex:
{
// rjf: unpack left-hand-size
// rjf: unpack left-hand-side
E_Expr *lhs = expr->first;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
// rjf: gather inherited lenses from the left-hand-side
{
E_TypeKey k = lhs_irtree.type_key;
E_TypeKind kind = e_type_kind_from_key(k);
for(;kind == E_TypeKind_Lens;)
{
E_Type *lens_type = e_type_from_key__cached(k);
if(lens_type->flags & E_TypeFlag_InheritedOnAccess)
{
e_type_key_list_push_front(scratch.arena, &inherited_lenses, k);
}
k = e_type_direct_from_key(k);
kind = e_type_kind_from_key(k);
}
}
// rjf: pick access hook based on type
E_Type *lhs_type = e_type_from_key__cached(lhs_irtree.type_key);
E_TypeAccessFunctionType *lhs_access = lhs_type->access;
@@ -2180,7 +2198,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
}
// rjf: patch resultant type with a lens w/ args, pointing to the original type
result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .count = arg_count, .args = args, .direct_key = result.type_key, .name = lhs_type->name);
result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
.flags = lhs_type->flags,
.count = arg_count,
.args = args,
.direct_key = result.type_key,
.name = lhs_type->name);
scratch_end(scratch);
}
@@ -2790,6 +2813,28 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
e_expr_unpoison(t->expr);
}
//////////////////////////////
//- rjf: apply inherited lenses to the resultant type
//
if(inherited_lenses.count != 0)
{
E_Type *result_type = e_type_from_key__cached(result.type_key);
for(E_TypeKeyNode *n = inherited_lenses.first; n != 0; n = n->next)
{
E_Type *src_type = e_type_from_key__cached(n->v);
E_TypeKey dst_type_key = e_type_key_cons(.kind = src_type->kind,
.flags = src_type->flags,
.name = src_type->name,
.count = src_type->count,
.args = src_type->args,
.irgen = src_type->irgen,
.access = src_type->access,
.expand = src_type->expand,
.direct_key = result.type_key);
result.type_key = dst_type_key;
}
}
scratch_end(scratch);
ProfEnd();
return result;
+147 -102
View File
@@ -1337,7 +1337,8 @@ e_type_unwrap(E_TypeKey key)
E_TypeKind kind = e_type_kind_from_key(result);
if((E_TypeKind_FirstIncomplete <= kind && kind <= E_TypeKind_LastIncomplete) ||
kind == E_TypeKind_Modifier ||
kind == E_TypeKind_Alias)
kind == E_TypeKind_Alias ||
kind == E_TypeKind_Lens)
{
result = e_type_direct_from_key(result);
}
@@ -1889,6 +1890,91 @@ e_type_string_from_key(Arena *arena, E_TypeKey key)
return result;
}
internal E_TypeKey
e_default_expansion_type_from_key(E_TypeKey root_key)
{
E_TypeKey type_key = zero_struct;
for(E_TypeKey key = root_key;
!e_type_key_match(e_type_key_zero(), key);
key = e_type_direct_from_key(key))
{
B32 done = 1;
E_TypeKind kind = e_type_kind_from_key(key);
//- rjf: if we have pointers which point to a single thing (count = 1),
// or we have a lens, or we have a modifier node, then we will defer to
// the next type in the chain.
//
// if this pointer points to N things (count > 1), then we can use it for
// array-like expansion.
//
if(e_type_kind_is_pointer_or_ref(kind))
{
E_Type *type = e_type_from_key__cached(key);
if(!e_type_key_match(e_type_key_basic(E_TypeKind_Void), type->direct_type_key))
{
if(type->count == 1)
{
done = 0;
}
else if(type->count > 1)
{
type_key = key;
}
}
}
//- rjf: if we have lenses or modifiers in the type chain, then we will
// defer to the next type in the chain.
//
// NOTE(rjf): while it may seem like a lens type needs to do something
// different, because lenses sometimes want to define their own expansion
// rules, they would've redirected to an entirely different expansion
// hook. if we are in the default expansion hook, then the lenses do not
// impact the expansion at all (e.g. they are for other cosmetic things,
// like visualizers or integer radix changes), and so in that case we
// want to ignore them.
//
else if(kind == E_TypeKind_Lens ||
kind == E_TypeKind_Modifier)
{
done = 0;
}
//- rjf: if we've reached a struct-like, then we can use that for
// struct-like expansion.
else if(kind == E_TypeKind_Struct ||
kind == E_TypeKind_Union ||
kind == E_TypeKind_Class ||
kind == E_TypeKind_Set)
{
type_key = key;
}
//- rjf: if we've reached an enum-like, then we can use that for
// enum-like expansion.
else if(kind == E_TypeKind_Enum)
{
type_key = key;
}
//- rjf: if we've reached an array, then we can use that for array-like
// expansion.
else if(kind == E_TypeKind_Array)
{
type_key = key;
}
//- rjf: if we're done, then just break.
if(done)
{
break;
}
}
return type_key;
}
//- rjf: type key data structures
internal void
@@ -1900,6 +1986,15 @@ e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
list->count += 1;
}
internal void
e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key)
{
E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);
n->v = key;
SLLQueuePushFront(list->first, list->last, n);
list->count += 1;
}
internal E_TypeKeyList
e_type_key_list_copy(Arena *arena, E_TypeKeyList *src)
{
@@ -2105,47 +2200,48 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(default)
{
E_TypeExpandInfo result = {0};
{
E_TypeKey type_key = e_type_unwrap(irtree->type_key);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(e_type_kind_is_pointer_or_ref(type_kind) ||
type_kind == E_TypeKind_Lens)
//- rjf: try to extract a struct-like type key, enum-like, or array-like
// type key, for expansion
E_TypeKey expand_type_key = e_default_expansion_type_from_key(irtree->type_key);
//- rjf: struct type? -> use the struct type for expansion
B32 did_expansion = 0;
if(!did_expansion)
{
E_Type *type = e_type_from_key__cached(type_key);
result.expr_count = type->count;
if(type->count == 1 || type_kind == E_TypeKind_Lens)
E_TypeKind struct_type_kind = e_type_kind_from_key(expand_type_key);
if(struct_type_kind == E_TypeKind_Struct ||
struct_type_kind == E_TypeKind_Class ||
struct_type_kind == E_TypeKind_Union)
{
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Union)
{
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(direct_type_key, filter);
result.expr_count = data_members.count;
}
else if(direct_type_kind == E_TypeKind_Enum)
{
E_Type *direct_type = e_type_from_key__cached(direct_type_key);
result.expr_count = direct_type->count;
}
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(expand_type_key, filter);
result.expr_count = data_members.count;
did_expansion = 1;
}
}
else if(type_kind == E_TypeKind_Struct ||
type_kind == E_TypeKind_Class ||
type_kind == E_TypeKind_Union)
//- rjf: array-like type? -> use the array-like for expansion
if(!did_expansion)
{
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(type_key, filter);
result.expr_count = data_members.count;
E_TypeKind array_type_kind = e_type_kind_from_key(expand_type_key);
if(array_type_kind == E_TypeKind_Array ||
array_type_kind == E_TypeKind_Ptr)
{
E_Type *array_type = e_type_from_key__cached(expand_type_key);
result.expr_count = array_type->count;
did_expansion = 1;
}
}
else if(type_kind == E_TypeKind_Enum)
//- rjf: enum-like type? -> use the enum-like for expansion
if(!did_expansion)
{
E_Type *direct_type = e_type_from_key__cached(type_key);
result.expr_count = direct_type->count;
}
else if(type_kind == E_TypeKind_Array)
{
E_Type *type = e_type_from_key__cached(type_key);
result.expr_count = type->count;
E_TypeKind enum_type_kind = e_type_kind_from_key(expand_type_key);
if(enum_type_kind == E_TypeKind_Enum)
{
E_Type *enum_type = e_type_from_key__cached(expand_type_key);
result.expr_count = enum_type->count;
did_expansion = 1;
}
}
}
return result;
@@ -2155,70 +2251,17 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
Temp scratch = scratch_begin(&arena, 1);
{
//- rjf: unpack type of expression
E_IRTreeAndType lhs_irtree = *irtree;
E_TypeKey lhs_type_key = lhs_irtree.type_key;
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
//- rjf: pull out specific kinds of types
B32 do_struct_range = 0;
B32 do_enum_range = 0;
B32 do_index_range = 0;
E_TypeKey enum_type_key = zero_struct;
E_TypeKey struct_type_key = zero_struct;
E_TypeKind struct_type_kind = E_TypeKind_Null;
if(e_type_kind_is_pointer_or_ref(lhs_type_kind) ||
lhs_type_kind == E_TypeKind_Lens)
{
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
if((lhs_type->count == 1 ||
lhs_type_kind == E_TypeKind_Lens) &&
(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Union ||
direct_type_kind == E_TypeKind_Class))
{
struct_type_key = direct_type_key;
struct_type_kind = direct_type_kind;
do_struct_range = 1;
}
else if(lhs_type->count == 1 && direct_type_kind == E_TypeKind_Enum)
{
do_enum_range = 1;
enum_type_key = direct_type_key;
}
else
{
do_index_range = 1;
}
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Union ||
lhs_type_kind == E_TypeKind_Class)
{
struct_type_key = lhs_type_key;
struct_type_kind = lhs_type_kind;
do_struct_range = 1;
}
else if(lhs_type_kind == E_TypeKind_Enum)
{
enum_type_key = lhs_type_key;
do_enum_range = 1;
}
else if(lhs_type_kind == E_TypeKind_Set)
{
do_index_range = 1;
}
else if(lhs_type_kind == E_TypeKind_Array)
{
do_index_range = 1;
}
//- rjf: try to extract a struct-like type key, enum-like, or array-like
// type key, for expansion
E_TypeKey expand_type_key = e_default_expansion_type_from_key(irtree->type_key);
E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key);
//- rjf: struct case -> the lookup-range will return a range of members
if(do_struct_range)
if(expand_type_kind == E_TypeKind_Struct ||
expand_type_kind == E_TypeKind_Class ||
expand_type_kind == E_TypeKind_Union)
{
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(struct_type_key, filter);
E_MemberArray data_members = e_type_data_members_from_key_filter__cached(expand_type_key, filter);
Rng1U64 legal_idx_range = r1u64(0, data_members.count);
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
U64 read_range_count = dim_1u64(read_range);
@@ -2226,14 +2269,14 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
U64 member_idx = idx + read_range.min;
String8 member_name = data_members.v[member_idx].name;
exprs_out[idx] = e_expr_irext_member_access(arena, expr, &lhs_irtree, member_name);
exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name);
}
}
//- rjf: enum case -> the lookup-range will return a range of enum constants
else if(do_enum_range)
else if(expand_type_kind == E_TypeKind_Enum)
{
E_Type *type = e_type_from_key__cached(enum_type_key);
E_Type *type = e_type_from_key__cached(expand_type_key);
Rng1U64 legal_idx_range = r1u64(0, type->count);
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
U64 read_range_count = dim_1u64(read_range);
@@ -2241,17 +2284,19 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)
{
U64 member_idx = idx + read_range.min;
String8 member_name = type->enum_vals[member_idx].name;
exprs_out[idx] = e_expr_irext_member_access(arena, expr, &lhs_irtree, member_name);
exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name);
}
}
//- rjf: ptr case -> the lookup-range will return a range of dereferences
else if(do_index_range)
else if(expand_type_kind == E_TypeKind_Ptr ||
expand_type_kind == E_TypeKind_Array ||
expand_type_kind == E_TypeKind_Set)
{
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
exprs_out[idx] = e_expr_irext_array_index(arena, expr, &lhs_irtree, idx_range.min + idx);
exprs_out[idx] = e_expr_irext_array_index(arena, expr, irtree, idx_range.min + idx);
}
}
}
+2
View File
@@ -264,9 +264,11 @@ internal E_Member *e_type_member_from_array_name(E_MemberArray *members, String8
internal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return);
internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec);
internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);
internal E_TypeKey e_default_expansion_type_from_key(E_TypeKey key);
//- rjf: type key data structures
internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);
internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count);
internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key);
+52 -112
View File
@@ -83,30 +83,19 @@ internal B32
ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode)
{
B32 result = 0;
for(E_TypeKey t = type_key; !result; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t))))
{
E_TypeKind kind = e_type_kind_from_key(t);
if(kind == E_TypeKind_Null || kind == E_TypeKind_Function)
{
break;
}
if(kind == E_TypeKind_Struct ||
kind == E_TypeKind_Union ||
kind == E_TypeKind_Class ||
kind == E_TypeKind_Array ||
kind == E_TypeKind_Set ||
(kind == E_TypeKind_Enum && mode == E_Mode_Null))
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;
}
if(kind == E_TypeKind_Ptr)
{
E_Type *type = e_type_from_key__cached(t);
if(type->count > 1)
{
result = 1;
}
}
}
return result;
}
@@ -396,6 +385,27 @@ ev_expand_rule_from_string(String8 string)
return info;
}
internal EV_ExpandRule *
ev_expand_rule_from_type_key(E_TypeKey type_key)
{
EV_ExpandRule *rule = &ev_nil_expand_rule;
{
E_TypeKey k = type_key;
E_TypeKind kind = e_type_kind_from_key(k);
for(;kind == E_TypeKind_Lens; k = e_type_direct_from_key(k), kind = e_type_kind_from_key(k))
{
E_Type *type = e_type_from_key__cached(k);
EV_ExpandRule *candidate = ev_expand_rule_from_string(type->name);
if(candidate != &ev_nil_expand_rule)
{
rule = candidate;
break;
}
}
}
return rule;
}
////////////////////////////////
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
@@ -471,66 +481,6 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
}
#endif
////////////////////////////////
//~ rjf: Upgrading Expressions w/ Tags From All Sources
#if 0 // TODO(rjf): @eval
internal void
ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key, E_Expr *expr)
{
Temp scratch = scratch_begin(&arena, 1);
if(expr != &e_expr_nil)
{
// rjf: push inherited tags first (we want these to be found first, since tags are applied
// in order, and explicit ones should always be strongest)
{
for(E_Expr *src_tag = block->expr->first_tag; src_tag != &e_expr_nil; src_tag = src_tag->next)
{
B32 is_inherited = 0;
// TODO(rjf): table-drive this
if(str8_match(src_tag->string, str8_lit("hex"), 0) ||
str8_match(src_tag->string, str8_lit("oct"), 0) ||
str8_match(src_tag->string, str8_lit("bin"), 0) ||
str8_match(src_tag->string, str8_lit("dec"), 0) ||
str8_match(src_tag->string, str8_lit("no_addr"), 0) ||
str8_match(src_tag->string, str8_lit("digits"), 0) ||
str8_match(src_tag->string, str8_lit("no_string"), 0) ||
str8_match(src_tag->string, str8_lit("only"), 0) ||
str8_match(src_tag->string, str8_lit("omit"), 0))
{
is_inherited = 1;
}
if(is_inherited)
{
e_expr_push_tag(expr, e_expr_copy(arena, src_tag));
}
}
}
// rjf: push tags inferred from the type
{
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
E_ExprList tags = e_auto_hook_exprs_from_type_key__cached(irtree.type_key);
for(E_ExprNode *n = tags.first; n != 0; n = n->next)
{
e_expr_push_tag(expr, e_expr_copy(arena, n->v));
}
}
// rjf: push explicitly-attached tags (via key) next
String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, key));
E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr);
E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, tag_expr_tokens);
for(E_Expr *tag = tag_expr_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
{
next = tag->next;
e_expr_push_tag(expr, tag);
}
}
scratch_end(scratch);
}
#endif
////////////////////////////////
//~ rjf: Block Building
@@ -546,9 +496,6 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
EV_Key root_key = ev_key_root();
EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1);
E_Expr *root_expr = e_expr_copy(arena, expr);
#if 0 // TODO(rjf): @eval
ev_keyed_expr_push_tags(arena, view, &ev_nil_block, root_row_key, root_expr);
#endif
//- rjf: generate root block
tree.root = push_array(arena, EV_Block, 1);
@@ -606,9 +553,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
}
// rjf: get eval's visualization expansion rule
// TODO(rjf): @eval EV_ExpandRuleTagPair expand_rule_and_tag = ev_expand_rule_tag_pair_from_expr_irtree(t->expr, &expr_irtree);
EV_ExpandRule *viz_expand_rule = &ev_nil_expand_rule;
E_Expr *viz_expand_rule_tag = &e_expr_nil;
EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(type_key);
// rjf: skip if no expansion rule, & type info disallows expansion
if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(type_key, mode))
@@ -618,7 +563,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
// rjf: get top-level lookup/expansion info
E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval.expr, &t->eval.irtree, filter);
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr, viz_expand_rule_tag);
EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr);
// rjf: determine expansion info
U64 expansion_row_count = type_expand_info.expr_count;
@@ -738,9 +683,6 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, E_Expr *exp
{
E_Eval child_eval = e_eval_from_expr(arena, child_expr);
EV_Key child_key = child_keys[idx];
#if 0 // TODO(rjf): @eval
ev_keyed_expr_push_tags(arena, view, expansion_block, child_key, child_expr);
#endif
Task *task = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, task);
task->parent_block = expansion_block;
@@ -857,7 +799,7 @@ ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num)
U64 base_num = 1;
for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)
{
U64 range_size = n->v.block->single_item ? 1 : dim_1u64(n->v.range);
U64 range_size = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);
Rng1U64 global_range = r1u64(base_num, base_num + range_size);
if(contains_1u64(global_range, num))
{
@@ -880,7 +822,7 @@ ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num)
U64 base_num = 1;
for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)
{
U64 range_size = n->v.block->single_item ? 1 : dim_1u64(n->v.range);
U64 range_size = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);
Rng1U64 global_range = r1u64(base_num, base_num + range_size);
if(contains_1u64(global_range, num))
{
@@ -906,14 +848,14 @@ ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key)
if(hash == key.parent_hash)
{
U64 relative_num = ev_block_num_from_id(n->v.block, key.child_id);
Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->single_item ? (n->v.range.min+1) : n->v.range.max);
Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->viz_expand_info.single_item ? (n->v.range.min+1) : n->v.range.max);
if(contains_1u64(num_range, relative_num-1))
{
result = base_num + (relative_num - 1 - n->v.range.min);
break;
}
}
base_num += n->v.block->single_item ? 1 : dim_1u64(n->v.range);
base_num += n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);
}
return result;
}
@@ -927,10 +869,10 @@ ev_vnum_from_num(EV_BlockRangeList *block_ranges, U64 num)
U64 base_num = 1;
for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)
{
U64 next_base_num = base_num + (n->v.block->single_item ? 1 : dim_1u64(n->v.range));
U64 next_base_num = base_num + (n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range));
if(base_num <= num && num < next_base_num)
{
U64 relative_vnum = (n->v.block->single_item ? 0 : (num - base_num));
U64 relative_vnum = (n->v.block->viz_expand_info.single_item ? 0 : (num - base_num));
vnum = base_vnum + relative_vnum;
break;
}
@@ -957,12 +899,12 @@ ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vnum)
U64 next_base_vnum = base_vnum + dim_1u64(n->v.range);
if(base_vnum <= vnum && vnum < next_base_vnum)
{
U64 relative_num = (n->v.block->single_item ? 0 : (vnum - base_vnum));
U64 relative_num = (n->v.block->viz_expand_info.single_item ? 0 : (vnum - base_vnum));
num = base_num + relative_num;
break;
}
base_vnum = next_base_vnum;
base_num += (n->v.block->single_item ? 1 : dim_1u64(n->v.range));
base_num += (n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range));
}
}
return num;
@@ -1009,7 +951,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
rows.count_before_visual += num_skipped;
if(block_num_visual_rows != 0 && num_skipped != 0)
{
if(n->v.block->single_item)
if(n->v.block->viz_expand_info.single_item)
{
if(num_skipped >= block_num_visual_rows)
{
@@ -1034,7 +976,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
{
range_exprs[idx] = &e_expr_nil;
}
if(n->v.block->single_item || n->v.block->parent == &ev_nil_block)
if(n->v.block->viz_expand_info.single_item || n->v.block->parent == &ev_nil_block)
{
is_standalone_row = 1;
}
@@ -1054,7 +996,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
EV_Row *row = &row_node->row;
row->block = n->v.block;
row->key = ev_key_make(ev_hash_from_key(row->block->key), 1);
row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;
row->visual_size = n->v.block->viz_expand_info.single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;
row->string = n->v.block->string;
row->eval = n->v.block->eval;
}
@@ -1067,9 +1009,6 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);
E_Expr *row_expr = range_exprs[idx];
E_Eval row_eval = e_eval_from_expr(arena, row_expr);
#if 0 // TODO(rjf): @eval
ev_keyed_expr_push_tags(arena, view, n->v.block, row_key, row_expr);
#endif
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
SLLQueuePush(rows.first, rows.last, row_node);
rows.count += 1;
@@ -1121,16 +1060,14 @@ ev_row_is_expandable(EV_Row *row)
{
E_IRTreeAndType irtree = row->eval.irtree;
// rjf: determine if view rules force expandability
// rjf: determine if lenses force expandability
if(!result)
{
#if 0 // TODO(rjf): @eval
EV_ExpandRuleTagPair expand_rule_and_tag = ev_expand_rule_tag_pair_from_expr_irtree(row->expr, &irtree);
if(expand_rule_and_tag.rule != &ev_nil_expand_rule)
EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key);
if(expand_rule != &ev_nil_expand_rule)
{
result = 1;
}
#endif
}
// rjf: determine if type info force expandability
@@ -1736,13 +1673,16 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
case 0:
{
// rjf: try strings
if(!ptr_data->did_prefix_content && ptr_data->ptee_has_string && !(params->flags & EV_StringFlag_DisableStrings))
if(!ptr_data->did_prefix_content && ptr_data->ptee_has_string &&
!(params->flags & EV_StringFlag_DisableStrings) &&
(type_kind == E_TypeKind_Array ||
params->flags & EV_StringFlag_ReadOnlyDisplayRules))
{
Temp scratch = scratch_begin(&arena, 1);
// rjf: read string data
U64 string_memory_addr = ptr_data->value_eval.value.u64;
U64 string_buffer_size = 256;
U64 string_buffer_size = 4096;
U8 *string_buffer = push_array(scratch.arena, U8, string_buffer_size);
for(U64 try_size = string_buffer_size; try_size >= 16; try_size /= 2)
{
@@ -1765,7 +1705,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
}
// rjf: escape and quote
B32 string__is_escaped_and_quoted = (!(params->flags & EV_StringFlag_DisableAddresses) || depth > 0);
B32 string__is_escaped_and_quoted = (!(params->flags & EV_StringFlag_DisableStringQuotes) || depth > 0);
String8 string__escaped_and_quoted = string;
if(string__is_escaped_and_quoted)
{
@@ -87,7 +87,7 @@ struct EV_ExpandInfo
B32 rows_default_expanded;
};
#define EV_EXPAND_RULE_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, E_Expr *tag)
#define EV_EXPAND_RULE_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr)
#define EV_EXPAND_RULE_INFO_FUNCTION_NAME(name) ev_expand_rule_info__##name
#define EV_EXPAND_RULE_INFO_FUNCTION_DEF(name) internal EV_EXPAND_RULE_INFO_FUNCTION_SIG(EV_EXPAND_RULE_INFO_FUNCTION_NAME(name))
typedef EV_EXPAND_RULE_INFO_FUNCTION_SIG(EV_ExpandRuleInfoHookFunctionType);
@@ -156,8 +156,6 @@ struct EV_Block
// rjf: expansion info
U64 row_count;
B32 single_item;
B32 rows_default_expanded;
};
typedef struct EV_BlockTree EV_BlockTree;
@@ -237,6 +235,7 @@ enum
EV_StringFlag_PrettyNames = (1<<1),
EV_StringFlag_DisableAddresses = (1<<2),
EV_StringFlag_DisableStrings = (1<<3),
EV_StringFlag_DisableStringQuotes = (1<<4),
};
typedef struct EV_StringParams EV_StringParams;
@@ -282,7 +281,22 @@ global read_only EV_ExpandRule ev_nil_expand_rule =
EV_EXPAND_RULE_INFO_FUNCTION_NAME(nil),
};
thread_static EV_ExpandRuleTable *ev_view_rule_info_table = 0;
global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, {zero_struct, zero_struct, &e_expr_nil, &e_irnode_nil}};
global read_only EV_Block ev_nil_block =
{
&ev_nil_block,
&ev_nil_block,
&ev_nil_block,
&ev_nil_block,
&ev_nil_block,
{0},
0,
{0},
{zero_struct, zero_struct, &e_expr_nil, &e_irnode_nil},
{0},
&e_type_expand_rule__default,
{0},
&ev_nil_expand_rule,
};
////////////////////////////////
//~ rjf: Key Functions
@@ -322,6 +336,7 @@ internal void ev_expand_rule_table_push(Arena *arena, EV_ExpandRuleTable *table,
#define ev_expand_rule_table_push_new(arena, table, ...) ev_expand_rule_table_push((arena), (table), &(EV_ExpandRule){__VA_ARGS__})
internal void ev_select_expand_rule_table(EV_ExpandRuleTable *table);
internal EV_ExpandRule *ev_expand_rule_from_string(String8 string);
internal EV_ExpandRule *ev_expand_rule_from_type_key(E_TypeKey type_key);
////////////////////////////////
//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application)
@@ -330,13 +345,6 @@ internal EV_ExpandRule *ev_expand_rule_from_string(String8 string);
internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr);
#endif
////////////////////////////////
//~ rjf: Upgrading Expressions w/ Tags From All Sources
#if 0 // TODO(rjf): @eval
internal void ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key, E_Expr *expr);
#endif
////////////////////////////////
//~ rjf: Block Building
+138 -108
View File
@@ -1404,16 +1404,6 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path)
return result;
}
internal E_Expr *
rd_tag_from_cfg(Arena *arena, RD_Cfg *cfg)
{
E_Expr *expr = &e_expr_nil;
{
// TODO(rjf): @cfg
}
return expr;
}
////////////////////////////////
//~ rjf: Control Entity Info Extraction
@@ -1949,7 +1939,7 @@ rd_whole_range_from_eval_space(E_Space space)
//- rjf: writing values back to child processes
internal B32
rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping)
rd_commit_eval_value_string(E_Eval dst_eval, String8 string)
{
B32 result = 0;
if(dst_eval.irtree.mode == E_Mode_Offset)
@@ -1984,17 +1974,14 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_un
e_type_kind_is_integer(direct_type_kind))
{
B32 is_quoted = 0;
if(string_needs_unescaping)
if(string.size >= 1 && string.str[0] == '"')
{
if(string.size >= 1 && string.str[0] == '"')
{
string = str8_skip(string, 1);
is_quoted = 1;
}
if(string.size >= 1 && string.str[string.size-1] == '"')
{
string = str8_chop(string, 1);
}
string = str8_skip(string, 1);
is_quoted = 1;
}
if(string.size >= 1 && string.str[string.size-1] == '"')
{
string = str8_chop(string, 1);
}
if(is_quoted)
{
@@ -2652,7 +2639,7 @@ rd_view_ui(Rng2F32 rect)
{
UI_ScrollListRowBlock block = {0};
block.row_count = dim_1u64(n->v.range);
block.item_count = n->v.block->single_item ? 1 : dim_1u64(n->v.range);
block.item_count = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);
ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block);
}
row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks);
@@ -3134,7 +3121,7 @@ rd_view_ui(Rng2F32 rect)
if(should_commit_asap)
{
B32 success = 0;
success = rd_commit_eval_value_string(cell_info.eval, new_string, 0);
success = rd_commit_eval_value_string(cell_info.eval, new_string);
if(!success)
{
log_user_error(str8_lit("Could not commit value successfully."));
@@ -3268,7 +3255,7 @@ rd_view_ui(Rng2F32 rect)
case RD_WatchCellKind_Eval:
{
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
rd_commit_eval_value_string(cell_info.eval, str8_zero(), 0);
rd_commit_eval_value_string(cell_info.eval, str8_zero());
}break;
}
}
@@ -4069,7 +4056,7 @@ rd_view_ui(Rng2F32 rect)
}
// rjf: view ui contents
cell_info.view_ui_rule->ui(cell_info.eval, cell_info.view_ui_tag, cell_rect);
cell_info.view_ui_rule->ui(cell_info.eval, cell_rect);
// rjf: loading fill
UI_Parent(loading_overlay_container)
@@ -4442,7 +4429,7 @@ rd_view_ui(Rng2F32 rect)
//
if(next_cell_toggled != cell_toggled)
{
rd_commit_eval_value_string(cell_info.eval, next_cell_toggled ? str8_lit("1") : str8_lit("0"), 0);
rd_commit_eval_value_string(cell_info.eval, next_cell_toggled ? str8_lit("1") : str8_lit("0"));
}
////////////
@@ -4488,8 +4475,7 @@ rd_view_ui(Rng2F32 rect)
Temp scratch = scratch_begin(0, 0);
RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(view_name);
E_Eval expr_eval = e_eval_from_string(scratch.arena, expr_string);
E_Expr *tag = rd_tag_from_cfg(scratch.arena, view);
view_ui_rule->ui(expr_eval, tag, rect);
view_ui_rule->ui(expr_eval, rect);
scratch_end(scratch);
}
}
@@ -4595,7 +4581,7 @@ rd_view_cfg_value_from_string(String8 string)
internal U64
rd_base_offset_from_eval(E_Eval eval)
{
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.irtree.type_key)))
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key))))
{
eval = e_value_eval_from_eval(eval);
}
@@ -4603,15 +4589,20 @@ rd_base_offset_from_eval(E_Eval eval)
}
internal Rng1U64
rd_range_from_eval_tag(E_Eval eval, E_Expr *tag)
rd_range_from_eval(E_Eval eval)
{
U64 size = 0;
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
if(param->kind == E_ExprKind_Define && str8_match(param->first->string, str8_lit("size"), 0))
for EachIndex(idx, type->count)
{
size = e_value_from_expr(param->first->next).u64;
break;
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("size"), 0))
{
size = e_value_from_expr(arg->first->next).u64;
break;
}
}
}
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
@@ -4643,7 +4634,7 @@ rd_range_from_eval_tag(E_Eval eval, E_Expr *tag)
}
internal TXT_LangKind
rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag)
rd_lang_kind_from_eval(E_Eval eval)
{
TXT_LangKind lang_kind = TXT_LangKind_Null;
Temp scratch = scratch_begin(0, 0);
@@ -4654,12 +4645,17 @@ rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag)
}
if(lang_kind == TXT_LangKind_Null)
{
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
if(param->kind == E_ExprKind_Define && str8_match(param->first->string, str8_lit("lang"), 0))
for EachIndex(idx, type->count)
{
lang_kind = txt_lang_kind_from_extension(param->first->next->string);
break;
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("lang"), 0))
{
lang_kind = txt_lang_kind_from_extension(arg->first->next->string);
break;
}
}
}
}
@@ -4668,7 +4664,7 @@ rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag)
}
internal Arch
rd_arch_from_eval_tag(E_Eval eval, E_Expr *tag)
rd_arch_from_eval(E_Eval eval)
{
// rjf: try implicitly from either `eval` itself, or from context
CTRL_Entity *ctrl_entity = rd_ctrl_entity_from_eval_space(eval.space);
@@ -4683,18 +4679,25 @@ rd_arch_from_eval_tag(E_Eval eval, E_Expr *tag)
arch = arch_from_context();
}
// rjf: try arch parameters
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
// rjf: try arch arguments
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
String8 param_arch_string = param->string;
if(param->kind == E_ExprKind_Define && str8_match(param->first->string, str8_lit("arch"), 0))
for EachIndex(idx, type->count)
{
param_arch_string = param->first->next->string;
}
if(str8_match(param->first->next->string, str8_lit("x64"), 0))
{
arch = Arch_x64;
break;
E_Expr *arg = type->args[idx];
{
String8 arg_arch_string = arg->string;
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("arch"), 0))
{
arg_arch_string = arg->first->next->string;
}
if(str8_match(arg->first->next->string, str8_lit("x64"), 0))
{
arch = Arch_x64;
break;
}
}
}
}
@@ -4702,45 +4705,54 @@ rd_arch_from_eval_tag(E_Eval eval, E_Expr *tag)
}
internal Vec2S32
rd_dim2s32_from_eval_tag(E_Eval eval, E_Expr *tag)
rd_dim2s32_from_eval(E_Eval eval)
{
Vec2S32 dim = v2s32(1, 1);
B32 got_x = 0;
B32 got_y = 0;
// rjf: try explicitly passed dimensions
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
if(param->kind == E_ExprKind_Define)
for EachIndex(idx, type->count)
{
if(str8_match(param->first->string, str8_lit("w"), 0))
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_Define)
{
got_x = 1;
dim.x = e_value_from_expr(param->first->next).s64;
}
if(str8_match(param->first->string, str8_lit("h"), 0))
{
got_y = 1;
dim.y = e_value_from_expr(param->first->next).s64;
if(str8_match(arg->first->string, str8_lit("w"), 0))
{
got_x = 1;
dim.x = e_value_from_expr(arg->first->next).s64;
}
if(str8_match(arg->first->string, str8_lit("h"), 0))
{
got_y = 1;
dim.y = e_value_from_expr(arg->first->next).s64;
}
}
}
}
// rjf: try ordered non-define arguments
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
if(type->kind == E_TypeKind_Lens)
{
if(param->kind != E_ExprKind_Define)
for EachIndex(idx, type->count)
{
if(!got_x)
E_Expr *arg = type->args[idx];
if(arg->kind != E_ExprKind_Define)
{
got_x = 1;
dim.x = e_value_from_expr(param).s64;
}
else if(!got_y)
{
got_y = 1;
dim.y = e_value_from_expr(param).s64;
break;
if(!got_x)
{
got_x = 1;
dim.x = e_value_from_expr(arg).s64;
}
else if(!got_y)
{
got_y = 1;
dim.y = e_value_from_expr(arg).s64;
break;
}
}
}
}
@@ -4749,39 +4761,48 @@ rd_dim2s32_from_eval_tag(E_Eval eval, E_Expr *tag)
}
internal R_Tex2DFormat
rd_tex2dformat_from_eval_tag(E_Eval eval, E_Expr *tag)
rd_tex2dformat_from_eval(E_Eval eval)
{
R_Tex2DFormat fmt = R_Tex2DFormat_RGBA8;
B32 got_fmt = 0;
// rjf: try explicitly passed formats
for(E_Expr *param = tag->first->next; param != &e_expr_nil; param = param->next)
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
if(param->kind == E_ExprKind_Define && str8_match(param->first->string, str8_lit("fmt"), 0))
for EachIndex(idx, type->count)
{
got_fmt = 1;
for EachEnumVal(R_Tex2DFormat, f)
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit("fmt"), 0))
{
if(str8_match(param->first->next->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive))
got_fmt = 1;
for EachEnumVal(R_Tex2DFormat, f)
{
fmt = f;
break;
if(str8_match(arg->first->next->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive))
{
fmt = f;
break;
}
}
}
}
}
// rjf: try implicit non-define arguments
for(E_Expr *param = tag->first->next; param != &e_expr_nil && !got_fmt; param = param->next)
if(type->kind == E_TypeKind_Lens)
{
if(param->kind == E_ExprKind_LeafIdentifier)
for EachIndex(idx, type->count)
{
for EachEnumVal(R_Tex2DFormat, f)
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_LeafIdentifier)
{
if(str8_match(param->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive))
for EachEnumVal(R_Tex2DFormat, f)
{
fmt = f;
break;
if(str8_match(arg->string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive))
{
fmt = f;
break;
}
}
}
}
@@ -4791,15 +4812,20 @@ rd_tex2dformat_from_eval_tag(E_Eval eval, E_Expr *tag)
}
internal E_Value
rd_value_from_eval_tag_key(E_Eval eval, E_Expr *tag, String8 key)
rd_value_from_eval_key(E_Eval eval, String8 key)
{
E_Value value = zero_struct;
for(E_Expr *arg = tag->first->next; arg != &e_expr_nil; arg = arg->next)
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(type->kind == E_TypeKind_Lens)
{
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, key, 0))
for EachIndex(idx, type->count)
{
value = e_value_from_expr(arg->first->next);
break;
E_Expr *arg = type->args[idx];
if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, key, 0))
{
value = e_value_from_expr(arg->first->next);
break;
}
}
}
return value;
@@ -6253,10 +6279,8 @@ rd_window_frame(void)
if(build_hover_eval)
{
// rjf: determine if we have a top-level visualizer
#if 0 // TODO(rjf): @eval
EV_ExpandRuleTagPair expand_rule_tag = ev_expand_rule_tag_pair_from_expr_irtree(hover_eval.exprs.last, &hover_eval.irtree);
#endif
RD_ViewUIRule *view_ui_rule = &rd_nil_view_ui_rule; // TODO(rjf): @eval rd_view_ui_rule_from_string(expand_rule_tag.rule->string);
EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(hover_eval.irtree.type_key);
RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(expand_rule->string);
// rjf: determine view name
String8 view_name = str8_lit("watch");
@@ -12677,23 +12701,24 @@ rd_frame(void)
struct
{
String8 name;
B32 inherited;
RD_ViewUIFunctionType *ui;
EV_ExpandRuleInfoHookFunctionType *expand;
}
view_ui_rule_table[] =
{
{str8_lit("bin")},
{str8_lit("oct")},
{str8_lit("dec")},
{str8_lit("hex")},
{str8_lit("digits")},
{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)},
{str8_lit("bin"), 1},
{str8_lit("oct"), 1},
{str8_lit("dec"), 1},
{str8_lit("hex"), 1},
{str8_lit("digits"), 1},
{str8_lit("text"), 0, RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)},
{str8_lit("disasm"), 0, RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},
{str8_lit("memory"), 0, RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},
{str8_lit("bitmap"), 0, RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)},
{str8_lit("checkbox"), 0, RD_VIEW_UI_FUNCTION_NAME(checkbox), 0},
{str8_lit("color_rgba"), 0, RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)},
{str8_lit("geo3d"), 0, 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
@@ -12712,8 +12737,13 @@ rd_frame(void)
}
for EachElement(idx, view_ui_rule_table)
{
E_TypeFlags type_flags = 0;
if(view_ui_rule_table[idx].inherited)
{
type_flags |= E_TypeFlag_InheritedOnAccess;
}
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = view_ui_rule_table[idx].name);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .flags = type_flags, .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);
}
}
+8 -10
View File
@@ -92,7 +92,7 @@ enum
////////////////////////////////
//~ rjf: View UI Hook Types
#define RD_VIEW_UI_FUNCTION_SIG(name) void name(E_Eval eval, E_Expr *tag, Rng2F32 rect)
#define RD_VIEW_UI_FUNCTION_SIG(name) void name(E_Eval eval, Rng2F32 rect)
#define RD_VIEW_UI_FUNCTION_NAME(name) rd_view_ui__##name
#define RD_VIEW_UI_FUNCTION_DEF(name) internal RD_VIEW_UI_FUNCTION_SIG(RD_VIEW_UI_FUNCTION_NAME(name))
typedef RD_VIEW_UI_FUNCTION_SIG(RD_ViewUIFunctionType);
@@ -908,8 +908,6 @@ internal RD_Cfg *rd_immediate_cfg_from_keyf(char *fmt, ...);
internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path);
internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path);
internal E_Expr *rd_tag_from_cfg(Arena *arena, RD_Cfg *cfg);
////////////////////////////////
//~ rjf: Control Entity Info Extraction
@@ -941,7 +939,7 @@ internal Rng1U64 rd_whole_range_from_eval_space(E_Space space);
//~ rjf: Evaluation Visualization
//- rjf: writing values back to child processes
internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping);
internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string);
//- rjf: eval <-> file path
internal String8 rd_file_path_from_eval(Arena *arena, E_Eval eval);
@@ -971,12 +969,12 @@ internal E_Value rd_view_cfg_value_from_string(String8 string);
//- rjf: evaluation & tag (a view's 'call') parameter extraction
internal U64 rd_base_offset_from_eval(E_Eval eval);
internal Rng1U64 rd_range_from_eval_tag(E_Eval eval, E_Expr *tag);
internal TXT_LangKind rd_lang_kind_from_eval_tag(E_Eval eval, E_Expr *tag);
internal Arch rd_arch_from_eval_tag(E_Eval eval, E_Expr *tag);
internal Vec2S32 rd_dim2s32_from_eval_tag(E_Eval eval, E_Expr *tag);
internal R_Tex2DFormat rd_tex2dformat_from_eval_tag(E_Eval eval, E_Expr *tag);
internal E_Value rd_value_from_eval_tag_key(E_Eval eval, E_Expr *tag, String8 key);
internal Rng1U64 rd_range_from_eval(E_Eval eval);
internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval);
internal Arch rd_arch_from_eval(E_Eval eval);
internal Vec2S32 rd_dim2s32_from_eval(E_Eval eval);
internal R_Tex2DFormat rd_tex2dformat_from_eval(E_Eval eval);
internal E_Value rd_value_from_eval_key(E_Eval eval, String8 key);
//- rjf: pushing/attaching view resources
internal void *rd_view_state_by_size(U64 size);
+28 -31
View File
@@ -1051,14 +1051,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
}
// rjf: determine view ui rule
// TODO(rjf): @eval
info.view_ui_rule = &rd_nil_view_ui_rule; // rd_view_ui_rule_from_string(row->block->expand_rule->string);
#if 0 // TODO(rjf): @eval
if(info.view_ui_rule != &rd_nil_view_ui_rule)
{
info.view_ui_tag = row->block->expand_tag;
}
#endif
info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string);
// rjf: fill row's cells
{
@@ -1311,9 +1304,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
RD_Cfg *w_cfg = style->first;
F32 next_pct = 0;
#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_CallStackFrame, .default_pct = 0.05f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .default_pct = 0.55f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("lens:hex((U64)($expr))"), .default_pct = 0.20f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_CallStackFrame, .default_pct = 0.05f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .default_pct = 0.55f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("lens:hex((uint64)($expr))"), .default_pct = 0.20f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval,
.eval = (module == &ctrl_entity_nil ? (E_Eval)zero_struct : module_eval),
.string = str8_lit(" "),
@@ -1332,7 +1325,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .default_pct = 0.25f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .default_pct = 0.35f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof($expr => default)"), .default_pct = 0.15f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .string = str8_lit("typeof($expr)"), .default_pct = 0.15f, .pct = take_pct());
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Tag, .default_pct = 0.25f, .pct = take_pct());
#undef take_pct
}
@@ -1353,7 +1346,6 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
//- rjf: fill basics/defaults
result.view_ui_rule = &rd_nil_view_ui_rule;
result.view_ui_tag = &e_expr_nil;
result.fstrs = cell->fstrs;
result.flags = cell->flags;
result.cfg = &rd_nil_cfg;
@@ -1495,16 +1487,22 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
//- rjf: evaluate wrapped expression
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : e_eval_from_expr(arena, root_expr));
//- rjf: determine default radix
U32 default_radix = 10;
if(result.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity &&
rd_ctrl_entity_from_eval_space(result.eval.space)->kind == CTRL_EntityKind_Module)
//- rjf: determine string generation parameters based on evaluation
EV_StringParams string_params = {string_flags, 10};
{
default_radix = 16;
if(result.eval.space.kind == RD_EvalSpaceKind_MetaCfg ||
result.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
{
string_params.flags |= EV_StringFlag_DisableStringQuotes;
}
if(result.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity &&
rd_ctrl_entity_from_eval_space(result.eval.space)->kind == CTRL_EntityKind_Module)
{
string_params.radix = 16;
}
}
//- rjf: generate strings/flags based on that expression & fill
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);
@@ -1529,7 +1527,6 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
{
result.eval = (cell->eval.irtree.mode != E_Mode_Null ? cell->eval : row->eval);
result.view_ui_rule = row_info->view_ui_rule;
result.view_ui_tag = row_info->view_ui_tag;
}break;
}
@@ -1743,9 +1740,9 @@ RD_VIEW_UI_FUNCTION_DEF(text)
if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; }
if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; }
if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; }
Rng1U64 range = rd_range_from_eval_tag(eval, tag);
Rng1U64 range = rd_range_from_eval(eval);
rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1);
rd_regs()->lang_kind = rd_lang_kind_from_eval_tag(eval, tag);
rd_regs()->lang_kind = rd_lang_kind_from_eval(eval);
U128 hash = {0};
TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, rd_regs()->text_key, rd_regs()->lang_kind, &hash);
String8 data = hs_data_from_hash(hs_scope, hash);
@@ -2002,8 +1999,8 @@ RD_VIEW_UI_FUNCTION_DEF(disasm)
{
space = auto_space;
}
Rng1U64 range = rd_range_from_eval_tag(eval, tag);
Arch arch = rd_arch_from_eval_tag(eval, tag);
Rng1U64 range = rd_range_from_eval(eval);
Arch arch = rd_arch_from_eval(eval);
CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space);
CTRL_Entity *dasm_module = &ctrl_entity_nil;
DI_Key dbgi_key = {0};
@@ -2170,7 +2167,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
//////////////////////////////
//- rjf: unpack parameterization info
//
Rng1U64 space_range = rd_range_from_eval_tag(eval, tag);
Rng1U64 space_range = rd_range_from_eval(eval);
if(eval.space.kind == 0)
{
eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity);
@@ -3085,8 +3082,8 @@ RD_VIEW_UI_FUNCTION_DEF(bitmap)
//////////////////////////////
//- rjf: evaluate expression
//
Vec2S32 dim = rd_dim2s32_from_eval_tag(eval, tag);
R_Tex2DFormat fmt = rd_tex2dformat_from_eval_tag(eval, tag);
Vec2S32 dim = rd_dim2s32_from_eval(eval);
R_Tex2DFormat fmt = rd_tex2dformat_from_eval(eval);
U64 base_offset = rd_base_offset_from_eval(eval);
U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt];
Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size);
@@ -3283,7 +3280,7 @@ RD_VIEW_UI_FUNCTION_DEF(checkbox)
E_Eval value_eval = e_value_eval_from_eval(eval);
if(ui_clicked(rd_icon_buttonf(value_eval.value.u64 == 0 ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled, 0, "###check")))
{
rd_commit_eval_value_string(eval, value_eval.value.u64 == 0 ? str8_lit("1") : str8_lit("0"), 0);
rd_commit_eval_value_string(eval, value_eval.value.u64 == 0 ? str8_lit("1") : str8_lit("0"));
}
}
@@ -3484,9 +3481,9 @@ RD_VIEW_UI_FUNCTION_DEF(geo3d)
//////////////////////////////
//- rjf: unpack parameters
//
U64 count = rd_value_from_eval_tag_key(eval, tag, str8_lit("count")).u64;
U64 vtx_base_off = rd_value_from_eval_tag_key(eval, tag, str8_lit("vtx")).u64;
U64 vtx_size = rd_value_from_eval_tag_key(eval, tag, str8_lit("vtx_size")).u64;
U64 count = rd_value_from_eval_key(eval, str8_lit("count")).u64;
U64 vtx_base_off = rd_value_from_eval_key(eval, str8_lit("vtx")).u64;
U64 vtx_size = rd_value_from_eval_key(eval, str8_lit("vtx_size")).u64;
F32 yaw_target = rd_view_cfg_value_from_string(str8_lit("yaw")).f32;
F32 pitch_target = rd_view_cfg_value_from_string(str8_lit("pitch")).f32;
F32 zoom_target = rd_view_cfg_value_from_string(str8_lit("zoom")).f32;
-1
View File
@@ -118,7 +118,6 @@ struct RD_WatchRowCellInfo
String8 error_tooltip;
String8 inheritance_tooltip;
RD_ViewUIRule *view_ui_rule;
E_Expr *view_ui_tag;
};
typedef enum RD_WatchViewColumnKind