cfg tree collection evaluation

This commit is contained in:
Ryan Fleury
2025-01-27 15:33:35 -08:00
parent b085acbc32
commit 4cc5f636fe
15 changed files with 505 additions and 723 deletions
+1
View File
@@ -71,6 +71,7 @@ E_TypeKindTable:
{IncompleteEnum "enum" 0 }
{Bitfield "bitfield" 0 }
{Variadic "variadic" 0 }
{SpacePtr "space_ptr" 0 }
}
@table(name op_kind precedence string op_pre op_sep op_pos)
+1 -3
View File
@@ -11,13 +11,11 @@ e_eval_from_expr(Arena *arena, E_Expr *expr)
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
E_Interpretation interp = e_interpret(bytecode);
E_Space zero_space = {0};
E_Space space = (MemoryMatchStruct(&zero_space, &irtree.space) ? e_interpret_ctx->primary_space : irtree.space);
E_Eval eval =
{
.value = interp.value,
.mode = irtree.mode,
.space = space,
.space = interp.space,
.expr = expr,
.type_key = irtree.type_key,
.code = interp.code,
+24 -1
View File
@@ -74,7 +74,8 @@ e_interpret(String8 bytecode)
}
else switch(op)
{
case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break;
case E_IRExtKind_SetSpace: {ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break;
case E_IRExtKind_DerefSpacePtr:{ctrlbits = RDI_EVAL_CTRLBITS(0, 1, 1);}break;
default:
{
result.code = E_InterpretationCode_BadOp;
@@ -124,6 +125,27 @@ e_interpret(String8 bytecode)
MemoryCopy(&selected_space, &imm, sizeof(selected_space));
}break;
case E_IRExtKind_DerefSpacePtr:
{
U64 addr = svals[0].u64;
U64 size = sizeof(E_Space) + sizeof(U64);
typedef struct SpacePtrRead SpacePtrRead;
struct SpacePtrRead
{
E_Space space;
U64 off;
};
SpacePtrRead space_ptr_read = {0};
B32 good_read = e_space_read(selected_space, &space_ptr_read, r1u64(addr, addr+size));
if(!good_read)
{
result.code = E_InterpretationCode_BadMemRead;
goto done;
}
MemoryCopyStruct(&selected_space, &space_ptr_read.space);
nval.u64 = space_ptr_read.off;
}break;
case RDI_EvalOp_Stop:
{
goto done;
@@ -812,6 +834,7 @@ e_interpret(String8 bytecode)
{
result.value = stack[0];
}
result.space = selected_space;
scratch_end(scratch);
return result;
}
+1
View File
@@ -11,6 +11,7 @@ typedef struct E_Interpretation E_Interpretation;
struct E_Interpretation
{
E_Value value;
E_Space space;
E_InterpretationCode code;
};
+104 -96
View File
@@ -145,6 +145,16 @@ e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space)
list->encoded_size += 1 + sizeof(space);
}
internal void
e_oplist_push_deref_space_ptr(Arena *arena, E_OpList *list)
{
E_Op *node = push_array_no_zero(arena, E_Op, 1);
node->opcode = E_IRExtKind_DerefSpacePtr;
SLLQueuePush(list->first, list->last, node);
list->op_count += 1;
list->encoded_size += 1;
}
internal void
e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string)
{
@@ -274,7 +284,15 @@ e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c)
}
internal E_IRNode *
e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key)
e_irtree_deref_space_ptr(Arena *arena, E_IRNode *c)
{
E_IRNode *root = e_push_irnode(arena, E_IRExtKind_DerefSpacePtr);
e_irnode_push_child(root, c);
return root;
}
internal E_IRNode *
e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key)
{
E_IRNode *result = &e_irnode_nil;
U64 byte_size = e_type_byte_size_from_key(type_key);
@@ -296,11 +314,8 @@ e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_
e_irnode_push_child(with_trunc, read_node);
}
// rjf: set space for this mem read
E_IRNode *set_space_node = e_irtree_set_space(arena, space, with_trunc);
// rjf: fill
result = set_space_node;
result = with_trunc;
return result;
}
@@ -358,12 +373,12 @@ e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in)
}
internal E_IRNode *
e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key)
e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key)
{
E_IRNode *result = tree;
if(from_mode == E_Mode_Offset)
{
result = e_irtree_mem_read_type(arena, from_space, tree, type_key);
result = e_irtree_mem_read_type(arena, tree, type_key);
}
return result;
}
@@ -371,7 +386,7 @@ e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_
//- rjf: top-level irtree/type extraction
internal E_IRTreeAndType
e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr *expr)
{
E_IRTreeAndType result = {&e_irnode_nil};
E_ExprKind kind = expr->kind;
@@ -382,7 +397,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
//- rjf: references -> just descend to sub-expr
case E_ExprKind_Ref:
{
result = e_irtree_and_type_from_expr(arena, expr->ref);
result = e_irtree_and_type_from_expr__space(arena, current_space, expr->ref);
}break;
//- rjf: array indices
@@ -391,8 +406,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: unpack left/right expressions
E_Expr *exprl = expr->first;
E_Expr *exprr = exprl->next;
E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl);
E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr);
E_IRTreeAndType l = e_irtree_and_type_from_expr__space(arena, current_space, exprl);
E_IRTreeAndType r = e_irtree_and_type_from_expr__space(arena, current_space, exprr);
E_TypeKey l_restype = e_type_unwrap(l.type_key);
E_TypeKey r_restype = e_type_unwrap(r.type_key);
E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);
@@ -446,7 +461,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
case E_Mode_Offset:
{
// rjf: ops to compute the offset
E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype);
E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype);
if(direct_type_size > 1)
{
E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size);
@@ -457,7 +472,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_IRNode *base_tree = l.root;
if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value)
{
base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype);
base_tree = e_irtree_resolve_to_value(arena, l.mode, base_tree, l_restype);
}
// rjf: ops to compute the final address
@@ -468,7 +483,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
case E_Mode_Value:
{
// rjf: ops to compute the offset
E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype);
E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype);
if(direct_type_size > 1)
{
E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size);
@@ -488,7 +503,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = direct_type;
result.mode = l.mode;
result.space = l.space;
}break;
//- rjf: member accesses
@@ -497,7 +511,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: unpack left/right expressions
E_Expr *exprl = expr->first;
E_Expr *exprr = exprl->next;
E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl);
E_IRTreeAndType l = e_irtree_and_type_from_expr__space(arena, current_space, exprl);
E_TypeKey l_restype = e_type_unwrap(l.type_key);
E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);
E_TypeKey check_type_key = l_restype;
@@ -589,7 +603,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
l_restype_kind == E_TypeKind_LRef ||
l_restype_kind == E_TypeKind_RRef)
{
new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype);
new_tree = e_irtree_resolve_to_value(arena, l.mode, new_tree, l_restype);
mode = E_Mode_Offset;
}
if(r_value != 0 && !r_is_constant_value)
@@ -607,7 +621,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = r_type;
result.mode = mode;
result.space = l.space;
}
}break;
@@ -616,7 +629,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
E_TypeKey r_type_direct = e_type_direct_from_key(r_type);
@@ -658,12 +671,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
r_type_kind == E_TypeKind_LRef ||
r_type_kind == E_TypeKind_RRef))
{
new_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type);
new_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
}
result.root = new_tree;
result.type_key = r_type_direct;
result.mode = E_Mode_Offset;
result.space = r_tree.space;
}
}break;
@@ -672,7 +684,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
E_TypeKey r_type = r_tree.type_key;
E_TypeKey r_type_unwrapped = e_type_unwrap(r_type);
E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped);
@@ -692,7 +704,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = r_tree.root;
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0);
result.mode = E_Mode_Value;
result.space = r_tree.space;
}break;
//- rjf: cast
@@ -704,7 +715,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_TypeKey cast_type = e_type_from_expr(cast_type_expr);
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr);
E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr__space(arena, current_space, casted_expr);
e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);
E_TypeKey casted_type = e_type_unwrap(casted_tree.type_key);
E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);
@@ -736,7 +747,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate
{
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.space, casted_tree.mode, casted_tree.root, casted_type);
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type);
E_IRNode *new_tree = in_tree;
if(conversion_rule == RDI_EvalConversionKind_Legal)
{
@@ -749,7 +760,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = cast_type;
result.mode = E_Mode_Value;
result.space = casted_tree.space;
}
}break;
@@ -771,10 +781,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
}break;
default:
{
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
r_type = r_tree.type_key;
space = r_tree.space;
}break;
}
@@ -794,7 +803,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = e_irtree_const_u(arena, r_type_byte_size);
result.type_key = e_type_key_basic(E_TypeKind_U64);
result.mode = E_Mode_Value;
result.space = space;
}
}break;
@@ -803,14 +811,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
// rjf: evaluate operand tree
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
// rjf: fill output
result.root = e_irtree_const_u(arena, 0);
result.type_key = r_tree.type_key;
result.mode = E_Mode_Null;
result.space = r_tree.space;
}break;
//- rjf: byteswap
@@ -818,12 +825,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
U64 r_type_size = e_type_byte_size_from_key(r_type);
E_Space space = r_tree.space;
// rjf: bad conditions? -> error if applicable, exit
if(!e_type_kind_is_integer(r_type_kind) || (r_type_size != 8 && r_type_size != 4 && r_type_size != 2))
@@ -835,12 +841,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate
{
E_IRNode *node = e_push_irnode(arena, RDI_EvalOp_ByteSwap);
E_IRNode *rhs = e_irtree_resolve_to_value(arena, space, r_tree.mode, r_tree.root, r_type);
E_IRNode *rhs = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
e_irnode_push_child(node, rhs);
node->value.u64 = r_type_size;
result.root = node;
result.mode = E_Mode_Value;
result.space = space;
result.type_key = r_type;
}
}break;
@@ -848,7 +853,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
//- rjf: unary operations
case E_ExprKind_Pos:
{
result = e_irtree_and_type_from_expr(arena, expr->first);
result = e_irtree_and_type_from_expr__space(arena, current_space, expr->first);
}break;
case E_ExprKind_Neg:
case E_ExprKind_LogNot:
@@ -856,7 +861,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);
@@ -877,13 +882,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate
{
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type);
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type);
E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree);
result.root = new_tree;
result.type_key = r_type_promoted;
result.mode = E_Mode_Value;
result.space = r_tree.space;
}
}break;
@@ -912,8 +916,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
B32 is_comparison = e_expr_kind_is_comparison(kind);
E_Expr *l_expr = expr->first;
E_Expr *r_expr = l_expr->next;
E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType l_tree = e_irtree_and_type_from_expr__space(arena, current_space, l_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
E_TypeKey l_type = e_type_unwrap_enum(e_type_unwrap(l_tree.type_key));
@@ -1011,20 +1015,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate
{
E_TypeKey final_type_key = is_comparison ? e_type_key_basic(E_TypeKind_Bool) : l_type;
E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type);
E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type);
E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type);
E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
l_value_tree = e_irtree_convert_hi(arena, l_value_tree, l_type, l_type);
r_value_tree = e_irtree_convert_hi(arena, r_value_tree, l_type, r_type);
E_IRNode *new_tree = e_irtree_binary_op(arena, op, l_type_group, l_value_tree, r_value_tree);
result.root = new_tree;
result.type_key = final_type_key;
result.mode = E_Mode_Value;
result.space = l_tree.space;
E_Space zero_space = {0};
if(MemoryMatchStruct(&result.space, &zero_space))
{
result.space = r_tree.space;
}
}
}break;
@@ -1051,10 +1049,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_IRNode *ptr_root = ptr_tree->root;
if(!ptr_is_decay)
{
ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_root, ptr_tree->type_key);
ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_root, ptr_tree->type_key);
}
E_IRNode *int_root = int_tree->root;
int_root = e_irtree_resolve_to_value(arena, int_tree->space, int_tree->mode, int_root, int_tree->type_key);
int_root = e_irtree_resolve_to_value(arena, int_tree->mode, int_root, int_tree->type_key);
if(direct_type_size > 1)
{
E_IRNode *const_root = e_irtree_const_u(arena, direct_type_size);
@@ -1069,12 +1067,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_root;
result.type_key = ptr_type;
result.mode = E_Mode_Value;
result.space = l_tree.space;
E_Space zero_space = {0};
if(MemoryMatchStruct(&result.space, &zero_space))
{
result.space = r_tree.space;
}
}
}break;
@@ -1090,11 +1082,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_IRNode *r_root = r_tree.root;
if(!l_is_decay)
{
l_root = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_root, l_type);
l_root = e_irtree_resolve_to_value(arena, l_tree.mode, l_root, l_type);
}
if(!r_is_decay)
{
r_root = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_root, r_type);
r_root = e_irtree_resolve_to_value(arena, r_tree.mode, r_root, r_type);
}
E_IRNode *op_tree = e_irtree_binary_op_u(arena, op, l_root, r_root);
E_IRNode *new_tree = op_tree;
@@ -1106,12 +1098,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = e_type_key_basic(E_TypeKind_U64);
result.mode = E_Mode_Value;
result.space = l_tree.space;
E_Space zero_space = {0};
if(MemoryMatchStruct(&result.space, &zero_space))
{
result.space = r_tree.space;
}
}break;
//- rjf: pointer array comparison
@@ -1133,22 +1119,16 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_IRNode *arr_root = arr_tree->root;
if(!ptr_is_decay)
{
ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key);
ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key);
}
// rjf: read from pointer into value, to compare with array
E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_tree->space, ptr_root, arr_tree->type_key);
E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_root, arr_tree->type_key);
// rjf: generate
result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root);
result.type_key = e_type_key_basic(E_TypeKind_Bool);
result.mode = E_Mode_Value;
result.space = ptr_tree->space;
E_Space zero_space = {0};
if(MemoryMatchStruct(&result.space, &zero_space))
{
result.space = arr_tree->space;
}
}break;
}
}break;
@@ -1160,9 +1140,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_Expr *c_expr = expr->first;
E_Expr *l_expr = c_expr->next;
E_Expr *r_expr = l_expr->next;
E_IRTreeAndType c_tree = e_irtree_and_type_from_expr(arena, c_expr);
E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_IRTreeAndType c_tree = e_irtree_and_type_from_expr__space(arena, current_space, c_expr);
E_IRTreeAndType l_tree = e_irtree_and_type_from_expr__space(arena, current_space, l_expr);
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr);
e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs);
e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
@@ -1190,21 +1170,15 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate
{
E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.space, c_tree.mode, c_tree.root, c_type);
E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type);
E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type);
E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.mode, c_tree.root, c_type);
E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type);
E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
l_value_tree = e_irtree_convert_hi(arena, l_value_tree, result_type, l_type);
r_value_tree = e_irtree_convert_hi(arena, r_value_tree, result_type, r_type);
E_IRNode *new_tree = e_irtree_conditional(arena, c_value_tree, l_value_tree, r_value_tree);
result.root = new_tree;
result.type_key = result_type;
result.mode = E_Mode_Value;
result.space = l_expr->space;
E_Space zero_space = {0};
if(MemoryMatchStruct(&result.space, &zero_space))
{
result.space = r_expr->space;
}
}
}break;
@@ -1216,7 +1190,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = final_type_key;
result.mode = expr->mode;
result.space = expr->space;
}break;
//- rjf: (unexpected) leaf member
@@ -1290,7 +1263,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
else
{
e_string2expr_map_inc_poison(e_ir_ctx->macro_map, expr->string);
result = e_irtree_and_type_from_expr(arena, macro_expr);
result = e_irtree_and_type_from_expr__space(arena, current_space, macro_expr);
e_string2expr_map_dec_poison(e_ir_ctx->macro_map, expr->string);
}
}break;
@@ -1303,7 +1276,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = new_tree;
result.type_key = expr->type_key;
result.mode = E_Mode_Offset;
result.space = expr->space;
}break;
//- rjf: leaf file paths
@@ -1317,7 +1289,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = set_space;
result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), size);
result.mode = E_Mode_Offset;
result.space = space;
}break;
//- rjf: types
@@ -1326,7 +1297,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = e_irtree_const_u(arena, 0);
result.type_key = expr->type_key;
result.mode = E_Mode_Null;
result.space = expr->space;
}break;
//- rjf: (unexpected) type expressions
@@ -1342,15 +1312,19 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
E_Expr *lhs = expr->first;
E_Expr *rhs = expr->last;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
E_Space space = lhs_irtree.space;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr__space(arena, current_space, lhs);
U64 line_num = rhs->value.u64;
B32 space_is_good = 1;
E_Space space = {0};
if(lhs_irtree.root->op != E_IRExtKind_SetSpace)
{
space_is_good = 0;
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, lhs->location, "Cannot take a line from a non-file.");
}
else
{
MemoryCopy(&space, &lhs_irtree.root->value, sizeof(space));
}
B32 line_num_is_good = 1;
if(rhs->kind != E_ExprKind_LeafU64)
{
@@ -1372,7 +1346,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
result.root = set_space;
result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), line_size);
result.mode = E_Mode_Offset;
result.space = space;
}
else
{
@@ -1387,15 +1360,40 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
E_Expr *lhs = expr->first;
E_Expr *rhs = lhs->next;
result = e_irtree_and_type_from_expr(arena, rhs);
result = e_irtree_and_type_from_expr__space(arena, current_space, rhs);
if(lhs->kind != E_ExprKind_LeafIdent)
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left side of assignment must be an unused identifier.");
}
}break;
}
//- rjf: evaluating a space pointer -> generate a dynamic set-space & resolve to the offset
if(e_type_kind_from_key(result.type_key) == E_TypeKind_SpacePtr)
{
result.root = e_irtree_deref_space_ptr(arena, result.root);
result.type_key = e_type_direct_from_key(result.type_key);
result.mode = E_Mode_Offset;
}
//- rjf: if the expression's space does not match the current, then push a set-space node
// before returning
E_Space zero_space = zero_struct;
if(!MemoryMatchStruct(current_space, &expr->space) &&
!MemoryMatchStruct(&zero_space, &expr->space))
{
result.root = e_irtree_set_space(arena, expr->space, result.root);
*current_space = expr->space;
}
return result;
}
internal E_IRTreeAndType
e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
{
E_Space space = e_interpret_ctx->primary_space;
E_IRTreeAndType result = e_irtree_and_type_from_expr__space(arena, &space, expr);
return result;
}
@@ -1429,7 +1427,17 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
{
e_append_oplist_from_irtree(arena, child, out);
}
}break;
case E_IRExtKind_DerefSpacePtr:
{
for(E_IRNode *child = root->first;
child != &e_irnode_nil;
child = child->next)
{
e_append_oplist_from_irtree(arena, child, out);
}
e_oplist_push_deref_space_ptr(arena, out);
}break;
case RDI_EvalOp_Cond:
+6 -3
View File
@@ -11,6 +11,7 @@ enum
{
E_IRExtKind_Bytecode = RDI_EvalOp_COUNT,
E_IRExtKind_SetSpace,
E_IRExtKind_DerefSpacePtr,
E_IRExtKind_COUNT
};
@@ -52,7 +53,6 @@ struct E_IRTreeAndType
E_IRNode *root;
E_TypeKey type_key;
E_Mode mode;
E_Space space;
E_MsgList msgs;
};
@@ -92,6 +92,7 @@ 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_set_space(Arena *arena, E_OpList *list, E_Space space);
internal void e_oplist_push_deref_space_ptr(Arena *arena, E_OpList *list);
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);
@@ -108,13 +109,15 @@ internal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l,
internal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode);
internal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string);
internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c);
internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key);
internal E_IRNode *e_irtree_deref_space_ptr(Arena *arena, E_IRNode *c);
internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key);
internal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in);
internal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key);
internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in);
internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key);
internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key);
//- rjf: top-level irtree/type extraction
internal E_IRTreeAndType e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr *expr);
internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr);
//- rjf: irtree -> linear ops/bytecode
+17
View File
@@ -427,6 +427,10 @@ e_type_key_cons_(E_ConsTypeParams *params)
{
node->byte_size = bit_size_from_arch(node->params.arch)/8;
}break;
case E_TypeKind_SpacePtr:
{
node->byte_size = sizeof(U64) + sizeof(E_Space);
}break;
case E_TypeKind_Array:
{
U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key);
@@ -458,6 +462,13 @@ e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags)
return key;
}
internal E_TypeKey
e_type_key_cons_space_ptr(E_TypeKey direct_type_key)
{
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_SpacePtr, .direct_key = direct_type_key);
return key;
}
internal E_TypeKey
e_type_key_cons_base(Type *type)
{
@@ -1699,6 +1710,12 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
str8_list_push(arena, out, str8_lit("*"));
}break;
case E_TypeKind_SpacePtr:
{
E_TypeKey direct = e_type_direct_from_key(key);
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
}break;
case E_TypeKind_LRef:
{
E_TypeKey direct = e_type_direct_from_key(key);
+1
View File
@@ -294,6 +294,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
//- rjf: constructed type construction helpers
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_space_ptr(E_TypeKey direct_type_key);
internal E_TypeKey e_type_key_cons_base(Type *type);
//- rjf: basic type key functions
+4 -2
View File
@@ -135,7 +135,7 @@ E_OpInfo e_expr_kind_op_info_table[49] =
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") },
};
U8 e_kind_basic_byte_size_table[55] =
U8 e_kind_basic_byte_size_table[56] =
{
0,
0,
@@ -192,9 +192,10 @@ U8 e_kind_basic_byte_size_table[55] =
0,
0,
0,
0,
};
String8 e_kind_basic_string_table[55] =
String8 e_kind_basic_string_table[56] =
{
str8_lit_comp(""),
str8_lit_comp("void"),
@@ -251,6 +252,7 @@ str8_lit_comp("class"),
str8_lit_comp("enum"),
str8_lit_comp("bitfield"),
str8_lit_comp("variadic"),
str8_lit_comp("space_ptr"),
};
C_LINKAGE_END
+3 -2
View File
@@ -74,6 +74,7 @@ E_TypeKind_IncompleteClass,
E_TypeKind_IncompleteEnum,
E_TypeKind_Bitfield,
E_TypeKind_Variadic,
E_TypeKind_SpacePtr,
E_TypeKind_COUNT,
E_TypeKind_FirstBasic = E_TypeKind_Void,
E_TypeKind_LastBasic = E_TypeKind_ComplexF128,
@@ -163,8 +164,8 @@ extern String8 e_token_kind_strings[6];
extern String8 e_expr_kind_strings[49];
extern String8 e_interpretation_code_display_strings[11];
extern E_OpInfo e_expr_kind_op_info_table[49];
extern U8 e_kind_basic_byte_size_table[55];
extern String8 e_kind_basic_string_table[55];
extern U8 e_kind_basic_byte_size_table[56];
extern String8 e_kind_basic_string_table[56];
C_LINKAGE_END
+7 -42
View File
@@ -710,14 +710,9 @@ str8_lit_comp("5"),
str8_lit_comp("c"),
};
String8 rd_collection_name_table[18] =
String8 rd_collection_name_table[13] =
{
str8_lit_comp("watches"),
str8_lit_comp("targets"),
str8_lit_comp("breakpoints"),
str8_lit_comp("watch_pins"),
str8_lit_comp("file_path_maps"),
str8_lit_comp("auto_view_rules"),
str8_lit_comp("machines"),
str8_lit_comp("processes"),
str8_lit_comp("threads"),
@@ -732,14 +727,9 @@ str8_lit_comp("types"),
str8_lit_comp("procedures"),
};
RD_EntityKind rd_collection_entity_kind_table[18] =
RD_EntityKind rd_collection_entity_kind_table[13] =
{
RD_EntityKind_Watch,
RD_EntityKind_Target,
RD_EntityKind_Breakpoint,
RD_EntityKind_WatchPin,
RD_EntityKind_FilePathMap,
RD_EntityKind_AutoViewRule,
RD_EntityKind_Nil,
RD_EntityKind_Nil,
RD_EntityKind_Nil,
@@ -754,14 +744,9 @@ RD_EntityKind_Nil,
RD_EntityKind_Nil,
};
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18] =
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[13] =
{
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Machine,
CTRL_EntityKind_Process,
CTRL_EntityKind_Thread,
@@ -776,14 +761,9 @@ CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
};
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18] =
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[13] =
{
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(threads),
@@ -798,14 +778,9 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18] =
EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[13] =
{
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(threads),
@@ -820,14 +795,9 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18] =
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[13] =
{
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads),
@@ -842,14 +812,9 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18] =
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[13] =
{
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads),
+7 -27
View File
@@ -651,11 +651,6 @@ RD_ViewRuleUIFunctionType *ui;
.os_event = rd_regs()->os_event,\
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads);
@@ -669,11 +664,6 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(thread_locals);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(types);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(procedures);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads);
@@ -687,11 +677,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(thread_locals);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(types);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads);
@@ -703,11 +688,6 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads);
@@ -768,13 +748,13 @@ extern RD_StringBindingPair rd_default_binding_table[110];
extern String8 rd_binding_version_remap_old_name_table[8];
extern String8 rd_binding_version_remap_new_name_table[8];
extern String8 rd_icon_kind_text_table[69];
extern String8 rd_collection_name_table[18];
extern RD_EntityKind rd_collection_entity_kind_table[18];
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18];
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18];
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18];
extern String8 rd_collection_name_table[13];
extern RD_EntityKind rd_collection_entity_kind_table[13];
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[13];
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[13];
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[13];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[13];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[13];
extern RD_ViewRuleInfo rd_view_rule_kind_info_table[28];
extern RD_IconKind rd_entity_kind_icon_kind_table[27];
extern String8 rd_theme_preset_display_string_table[9];
+5 -5
View File
@@ -988,11 +988,11 @@ RD_CollectionTable:
{
//- rjf: frontend entity groups
{watches Watch Null x}
{targets Target Null x}
{breakpoints Breakpoint Null x}
{watch_pins WatchPin Null x}
{file_path_maps FilePathMap Null x}
{auto_view_rules AutoViewRule Null x}
//{targets Target Null x}
//{breakpoints Breakpoint Null x}
//{watch_pins WatchPin Null x}
//{file_path_maps FilePathMap Null x}
//{auto_view_rules AutoViewRule Null x}
//- rjf: control entity groups
{machines Nil Machine x}
+311 -532
View File
@@ -759,6 +759,20 @@ rd_cfg_top_level_list_from_string(Arena *arena, String8 string)
return result;
}
internal RD_CfgArray
rd_cfg_array_from_list(Arena *arena, RD_CfgList *list)
{
RD_CfgArray array = {0};
array.count = list->count;
array.v = push_array_no_zero(arena, RD_Cfg *, array.count);
U64 idx = 0;
for(RD_CfgNode *n = list->first; n != 0; n = n->next, idx += 1)
{
array.v[idx] = n->v;
}
return array;
}
internal RD_CfgList
rd_cfg_tree_list_from_string(Arena *arena, String8 string)
{
@@ -941,7 +955,7 @@ rd_cfg_list_push(Arena *arena, RD_CfgList *list, RD_Cfg *cfg)
{
RD_CfgNode *n = push_array(arena, RD_CfgNode, 1);
n->v = cfg;
SLLQueuePush(list->first, list->last, n);
DLLPushBack(list->first, list->last, n);
list->count += 1;
}
@@ -2427,9 +2441,23 @@ rd_eval_blob_from_cfg(Arena *arena, RD_Cfg *cfg)
MD_Node *member_schema = md_child_from_string(schema, child_name, 0);
String8 member_type_name = member_schema->first->string;
RD_Cfg *child = rd_cfg_child_from_string(cfg, child_name);
if(str8_match(member_type_name, str8_lit("code_string"), 0) ||
str8_match(member_type_name, str8_lit("path"), 0) ||
str8_match(member_type_name, str8_lit("string"), 0))
if(str8_match(member_type_name, str8_lit("location"), 0))
{
U64 off = type->byte_size + variable_width_parts.total_size;
str8_list_push(scratch.arena, &fixed_width_parts, push_str8_copy(scratch.arena, str8_struct(&off)));
for(RD_Cfg *loc_child = child->first; loc_child != &rd_nil_cfg; loc_child = loc_child->first)
{
if(loc_child != child->first)
{
str8_list_push(scratch.arena, &variable_width_parts, str8_lit(":"));
}
str8_list_push(scratch.arena, &variable_width_parts, loc_child->string);
}
str8_list_push(scratch.arena, &variable_width_parts, str8_lit("\0"));
}
else if(str8_match(member_type_name, str8_lit("code_string"), 0) ||
str8_match(member_type_name, str8_lit("path"), 0) ||
str8_match(member_type_name, str8_lit("string"), 0))
{
U64 off = type->byte_size + variable_width_parts.total_size;
str8_list_push(scratch.arena, &fixed_width_parts, push_str8_copy(scratch.arena, str8_struct(&off)));
@@ -2778,6 +2806,38 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
}
}
}break;
//- rjf: meta collections
case RD_EvalSpaceKind_MetaCollection:
{
typedef struct SpacePtr SpacePtr;
struct SpacePtr
{
E_Space space;
U64 off;
};
RD_CfgArray cfgs_array = {0};
if(space.u64s[0] < rd_state->eval_collection_cfg_names->count)
{
cfgs_array = rd_state->eval_collection_cfgs[space.u64s[0]];
}
U64 space_ptr_size = sizeof(SpacePtr);
Rng1U64 idx_range = r1u64(range.min/space_ptr_size, range.max/space_ptr_size);
U64 out_off = 0;
U64 out_opl = dim_1u64(range);
for(U64 src_idx = idx_range.min; src_idx < idx_range.max && out_off+space_ptr_size <= out_opl; src_idx += 1)
{
RD_Cfg *cfg = &rd_nil_cfg;
if(src_idx < cfgs_array.count)
{
cfg = cfgs_array.v[src_idx];
}
SpacePtr space_ptr = {rd_eval_space_from_cfg(cfg), 0};
MemoryCopy((U8 *)out + out_off, &space_ptr, space_ptr_size);
out_off += sizeof(space_ptr);
}
result = 1;
}break;
}
scratch_end(scratch);
return result;
@@ -2869,12 +2929,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
if(contains_1u64(string_range, range.min))
{
String8 new_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range));
if(child == &rd_nil_cfg)
if(new_string.size == 0)
{
child = rd_cfg_new(cfg, child_name);
rd_cfg_release(child);
}
else
{
if(child == &rd_nil_cfg)
{
child = rd_cfg_new(cfg, child_name);
}
rd_cfg_release_all_children(child);
rd_cfg_new(child, new_string);
}
rd_cfg_release_all_children(child);
rd_cfg_new(child, new_string);
result = 1;
break;
}
@@ -2883,12 +2950,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
{
U64 value = 0;
MemoryCopy(&value, in, dim_1u64(range));
if(child == &rd_nil_cfg)
if(value == 0)
{
child = rd_cfg_new(cfg, child_name);
rd_cfg_release(child);
}
else
{
if(child == &rd_nil_cfg)
{
child = rd_cfg_new(cfg, child_name);
}
rd_cfg_release_all_children(child);
rd_cfg_newf(child, "%I64u", value);
}
rd_cfg_release_all_children(child);
rd_cfg_newf(child, "%I64u", value);
result = 1;
break;
}
@@ -2896,12 +2970,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
{
U64 value = 0;
MemoryCopy(&value, in, dim_1u64(range));
if(child == &rd_nil_cfg)
if(value == 0)
{
child = rd_cfg_new(cfg, child_name);
rd_cfg_release(child);
}
else
{
if(child == &rd_nil_cfg)
{
child = rd_cfg_new(cfg, child_name);
}
rd_cfg_release_all_children(child);
rd_cfg_newf(child, "%I64u", value);
}
rd_cfg_release_all_children(child);
rd_cfg_newf(child, "%I64u", value);
result = 1;
break;
}
@@ -12940,127 +13021,135 @@ rd_frame(void)
}
}
//- rjf: add macros for evallable config trees
//- rjf: choose set of evallable config names
String8 evallable_cfg_names[] =
{
//- rjf: choose set of evallable config names
String8 evallable_cfg_names[] =
{
str8_lit("breakpoint"),
str8_lit("watch_pin"),
str8_lit("target"),
str8_lit("file_path_map"),
str8_lit("auto_view_rule"),
};
//- rjf: build special member types for evallable config types
E_TypeKey bool_type_key = {0};
E_TypeKey u64_type_key = {0};
E_TypeKey code_string_type_key = {0};
E_TypeKey path_type_key = {0};
E_TypeKey string_type_key = {0};
E_TypeKey location_type_key = {0};
{
bool_type_key = e_type_key_basic(E_TypeKind_Bool);
u64_type_key = e_type_key_basic(E_TypeKind_U64);
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsCodeText);
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPathText);
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText);
location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText);
}
//- rjf: build types for each evallable config tree
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("code_string"), code_string_type_key },
{ str8_lit("path"), path_type_key },
{ str8_lit("string"), string_type_key },
{ str8_lit("location"), location_type_key },
};
E_TypeKey evallable_cfg_types[ArrayCount(evallable_cfg_names)] = {0};
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
MD_Node *schema = rd_schema_from_name(scratch.arena, name);
E_MemberList members_list = {0};
U64 off = 0;
for MD_EachNode(child, schema->first)
{
String8 member_name = child->string;
String8 member_pretty_name = rd_display_from_code_name(member_name);
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,
.pretty_name = member_pretty_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_cfg_types[idx] = e_type_key_cons(.name = name,
.kind = E_TypeKind_Struct,
.members = members.v,
.count = members.count);
}
//- rjf: cache cfg name -> type key correllation
rd_state->cfg_string2typekey_map = push_array(rd_frame_arena(), RD_String2TypeKeyMap, 1);
rd_state->cfg_string2typekey_map->slots_count = 256;
rd_state->cfg_string2typekey_map->slots = push_array(rd_frame_arena(), RD_String2TypeKeySlot, rd_state->cfg_string2typekey_map->slots_count);
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
E_TypeKey type_key = evallable_cfg_types[idx];
U64 hash = d_hash_from_string(name);
U64 slot_idx = hash%rd_state->cfg_string2typekey_map->slots_count;
RD_String2TypeKeyNode *node = push_array(rd_frame_arena(), RD_String2TypeKeyNode, 1);
node->string = push_str8_copy(rd_frame_arena(), name);
node->key = type_key;
SLLQueuePush(rd_state->cfg_string2typekey_map->slots[slot_idx].first, rd_state->cfg_string2typekey_map->slots[slot_idx].last, node);
}
//- rjf: add macros for each evallable config tree
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, name);
for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next)
{
RD_Cfg *cfg = n->v;
String8 label = rd_cfg_child_from_string(cfg, str8_lit("label"))->first->string;
String8 exe = rd_cfg_child_from_string(cfg, str8_lit("executable"))->first->string;
E_Space space = rd_eval_space_from_cfg(cfg);
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->space = space;
expr->mode = E_Mode_Offset;
expr->type_key = evallable_cfg_types[idx];
if(exe.size != 0)
{
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr);
}
if(label.size != 0)
{
e_string2expr_map_insert(scratch.arena, ctx->macro_map, label, expr);
}
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x%I64x", (U64)cfg, cfg->gen), expr);
}
}
str8_lit("breakpoint"),
str8_lit("watch_pin"),
str8_lit("target"),
str8_lit("file_path_map"),
str8_lit("auto_view_rule"),
};
//- rjf: store off eval collections for this frame
rd_state->eval_collection_cfg_names = push_array(rd_frame_arena(), String8Array, 1);
rd_state->eval_collection_cfg_names->count = ArrayCount(evallable_cfg_names);
rd_state->eval_collection_cfg_names->v = push_array(rd_frame_arena(), String8, rd_state->eval_collection_cfg_names->count);
MemoryCopy(rd_state->eval_collection_cfg_names->v, evallable_cfg_names, sizeof(evallable_cfg_names));
rd_state->eval_collection_cfgs = push_array(rd_frame_arena(), RD_CfgArray, rd_state->eval_collection_cfg_names->count);
for EachElement(idx, evallable_cfg_names)
{
RD_CfgList list = rd_cfg_top_level_list_from_string(scratch.arena, evallable_cfg_names[idx]);
rd_state->eval_collection_cfgs[idx] = rd_cfg_array_from_list(rd_frame_arena(), &list);
}
//- rjf: build special member types for evallable config types
E_TypeKey bool_type_key = {0};
E_TypeKey u64_type_key = {0};
E_TypeKey code_string_type_key = {0};
E_TypeKey path_type_key = {0};
E_TypeKey string_type_key = {0};
E_TypeKey location_type_key = {0};
{
bool_type_key = e_type_key_basic(E_TypeKind_Bool);
u64_type_key = e_type_key_basic(E_TypeKind_U64);
code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsCodeText);
path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPathText);
string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText);
location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText);
}
//- rjf: build types for each evallable config tree
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("code_string"), code_string_type_key },
{ str8_lit("path"), path_type_key },
{ str8_lit("string"), string_type_key },
{ str8_lit("location"), location_type_key },
};
E_TypeKey evallable_cfg_types[ArrayCount(evallable_cfg_names)] = {0};
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
MD_Node *schema = rd_schema_from_name(scratch.arena, name);
E_MemberList members_list = {0};
U64 off = 0;
for MD_EachNode(child, schema->first)
{
String8 member_name = child->string;
String8 member_pretty_name = rd_display_from_code_name(member_name);
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,
.pretty_name = member_pretty_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_cfg_types[idx] = e_type_key_cons(.name = name,
.kind = E_TypeKind_Struct,
.members = members.v,
.count = members.count);
}
//- rjf: cache cfg name -> type key correllation
rd_state->cfg_string2typekey_map = push_array(rd_frame_arena(), RD_String2TypeKeyMap, 1);
rd_state->cfg_string2typekey_map->slots_count = 256;
rd_state->cfg_string2typekey_map->slots = push_array(rd_frame_arena(), RD_String2TypeKeySlot, rd_state->cfg_string2typekey_map->slots_count);
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
E_TypeKey type_key = evallable_cfg_types[idx];
U64 hash = d_hash_from_string(name);
U64 slot_idx = hash%rd_state->cfg_string2typekey_map->slots_count;
RD_String2TypeKeyNode *node = push_array(rd_frame_arena(), RD_String2TypeKeyNode, 1);
node->string = push_str8_copy(rd_frame_arena(), name);
node->key = type_key;
SLLQueuePush(rd_state->cfg_string2typekey_map->slots[slot_idx].first, rd_state->cfg_string2typekey_map->slots[slot_idx].last, node);
}
//- rjf: add macros for each evallable config tree
for EachElement(idx, evallable_cfg_names)
{
String8 name = evallable_cfg_names[idx];
RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, name);
for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next)
{
RD_Cfg *cfg = n->v;
String8 label = rd_cfg_child_from_string(cfg, str8_lit("label"))->first->string;
String8 exe = rd_cfg_child_from_string(cfg, str8_lit("executable"))->first->string;
E_Space space = rd_eval_space_from_cfg(cfg);
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->space = space;
expr->mode = E_Mode_Offset;
expr->type_key = evallable_cfg_types[idx];
if(exe.size != 0)
{
e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr);
}
if(label.size != 0)
{
e_string2expr_map_insert(scratch.arena, ctx->macro_map, label, expr);
}
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x%I64x", (U64)cfg, cfg->gen), expr);
}
}
//- rjf: add macros for all evallable control entities
{
CTRL_EntityKind evallable_kinds[] =
@@ -13110,6 +13199,26 @@ rd_frame(void)
}
}
//- rjf: add macros for collections (new @cfg)
for EachElement(cfg_name_idx, evallable_cfg_names)
{
String8 cfg_name = evallable_cfg_names[cfg_name_idx];
String8 collection_name = rd_plural_from_code_name(cfg_name);
E_TypeKey collection_type_key = {0};
{
E_TypeKey element_type_key = evallable_cfg_types[cfg_name_idx];
RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name);
collection_type_key = e_type_key_cons_array(e_type_key_cons_space_ptr(element_type_key), cfgs.count);
}
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
E_Space space = e_space_make(RD_EvalSpaceKind_MetaCollection);
space.u64s[0] = cfg_name_idx;
expr->space = space;
expr->mode = E_Mode_Offset;
expr->type_key = collection_type_key;
e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr);
}
//- rjf: add macros for all watches which define identifiers
RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch"));
for(RD_CfgNode *n = watches.first; n != 0; n = n->next)
@@ -14095,47 +14204,65 @@ rd_frame(void)
}break;
case RD_CmdKind_NextTab:
{
#if 0 // TODO(rjf): @cfg
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *start_view = rd_selected_tab_from_panel(panel);
RD_View *next_view = start_view;
U64 idx = 0;
for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_next) ? panel->first_tab_view : v->order_next), idx += 1)
RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window);
RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window);
RD_PanelNode *focused = panel_tree.focused;
RD_CfgNode *selected_tab_n = 0;
for(RD_CfgNode *n = focused->tabs.first; n != 0; n = n->next)
{
if(v == start_view && idx != 0)
if(n->v == focused->selected_tab)
{
break;
}
if(!rd_view_is_project_filtered(v) && v != start_view)
{
next_view = v;
selected_tab_n = n;
break;
}
}
panel->selected_tab_view = rd_handle_from_view(next_view);
#endif
RD_Cfg *next_selected_tab = &rd_nil_cfg;
U64 idx = 0;
for(RD_CfgNode *tab_n = selected_tab_n;
tab_n != 0 && (tab_n != selected_tab_n || idx == 0);
((tab_n->next == 0) ? (tab_n = focused->tabs.first) : (tab_n = tab_n->next)), idx += 1)
{
if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n)
{
next_selected_tab = tab_n->v;
break;
}
}
if(next_selected_tab != &rd_nil_cfg)
{
rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab));
}
}break;
case RD_CmdKind_PrevTab:
{
#if 0 // TODO(rjf): @cfg
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *start_view = rd_selected_tab_from_panel(panel);
RD_View *next_view = start_view;
U64 idx = 0;
for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_prev) ? panel->last_tab_view : v->order_prev), idx += 1)
RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window);
RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window);
RD_PanelNode *focused = panel_tree.focused;
RD_CfgNode *selected_tab_n = 0;
for(RD_CfgNode *n = focused->tabs.last; n != 0; n = n->prev)
{
if(v == start_view && idx != 0)
if(n->v == focused->selected_tab)
{
break;
}
if(!rd_view_is_project_filtered(v) && v != start_view)
{
next_view = v;
selected_tab_n = n;
break;
}
}
panel->selected_tab_view = rd_handle_from_view(next_view);
#endif
RD_Cfg *next_selected_tab = &rd_nil_cfg;
U64 idx = 0;
for(RD_CfgNode *tab_n = selected_tab_n;
tab_n != 0 && (tab_n != selected_tab_n || idx == 0);
((tab_n->prev == 0) ? (tab_n = focused->tabs.last) : (tab_n = tab_n->prev)), idx += 1)
{
if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n)
{
next_selected_tab = tab_n->v;
break;
}
}
if(next_selected_tab != &rd_nil_cfg)
{
rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab));
}
}break;
case RD_CmdKind_MoveTabRight:
case RD_CmdKind_MoveTabLeft:
@@ -14168,15 +14295,28 @@ rd_frame(void)
}break;
case RD_CmdKind_CloseTab:
{
#if 0 // TODO(rjf): @cfg
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
RD_View *view = rd_view_from_handle(rd_regs()->view);
if(!rd_view_is_nil(view))
RD_Cfg *tab = rd_cfg_from_handle(rd_regs()->view);
RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, tab);
RD_PanelNode *panel = rd_panel_node_from_tree_cfg(panel_tree.root, tab->parent);
B32 found_selected = 0;
RD_Cfg *next_selected_tab = &rd_nil_cfg;
for(RD_CfgNode *n = panel->tabs.first; n != 0; n = n->next)
{
rd_panel_remove_tab_view(panel, view);
rd_view_release(view);
if(n->v == panel->selected_tab)
{
found_selected = 1;
}
else if(!rd_cfg_is_project_filtered(n->v))
{
next_selected_tab = n->v;
if(found_selected)
{
break;
}
}
}
#endif
rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab));
rd_cfg_release(tab);
}break;
case RD_CmdKind_MoveTab:
{
@@ -14603,368 +14743,6 @@ X(getting_started)
#define X(name) if(name->parent == &rd_nil_cfg) {rd_cfg_release(name);}
FixedTab_XList
#undef X
#if 0 // TODO(rjf): @cfg
RD_Window *ws = rd_window_from_handle(rd_regs()->window);
typedef enum Layout
{
Layout_Default,
Layout_Compact,
}
Layout;
Layout layout = Layout_Default;
switch(kind)
{
default:{}break;
case RD_CmdKind_ResetToDefaultPanels:{layout = Layout_Default;}break;
case RD_CmdKind_ResetToCompactPanels:{layout = Layout_Compact;}break;
}
//- rjf: gather all panels in the panel tree - remove & gather views
// we'd like to keep in the next layout
RD_HandleList panels_to_close = {0};
RD_HandleList views_to_close = {0};
RD_View *watch = &rd_nil_view;
RD_View *locals = &rd_nil_view;
RD_View *regs = &rd_nil_view;
RD_View *globals = &rd_nil_view;
RD_View *tlocals = &rd_nil_view;
RD_View *types = &rd_nil_view;
RD_View *procs = &rd_nil_view;
RD_View *callstack = &rd_nil_view;
RD_View *breakpoints = &rd_nil_view;
RD_View *watch_pins = &rd_nil_view;
RD_View *output = &rd_nil_view;
RD_View *targets = &rd_nil_view;
RD_View *scheduler = &rd_nil_view;
RD_View *modules = &rd_nil_view;
RD_View *disasm = &rd_nil_view;
RD_View *memory = &rd_nil_view;
RD_View *getting_started = &rd_nil_view;
RD_HandleList code_views = {0};
for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next)
{
RD_Handle handle = rd_handle_from_panel(panel);
rd_handle_list_push(scratch.arena, &panels_to_close, handle);
for(RD_View *view = panel->first_tab_view, *next = 0; !rd_view_is_nil(view); view = next)
{
next = view->order_next;
RD_ViewRuleKind view_rule_kind = rd_view_rule_kind_from_string(view->spec->string);
B32 needs_delete = 1;
switch(view_rule_kind)
{
default:{}break;
case RD_ViewRuleKind_Watch: {if(rd_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break;
case RD_ViewRuleKind_Locals: {if(rd_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break;
case RD_ViewRuleKind_Registers: {if(rd_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break;
case RD_ViewRuleKind_Globals: {if(rd_view_is_nil(globals)) { needs_delete = 0; globals = view;} }break;
case RD_ViewRuleKind_ThreadLocals: {if(rd_view_is_nil(tlocals)) { needs_delete = 0; tlocals = view;} }break;
case RD_ViewRuleKind_Types: {if(rd_view_is_nil(types)) { needs_delete = 0; types = view;} }break;
case RD_ViewRuleKind_Procedures: {if(rd_view_is_nil(procs)) { needs_delete = 0; procs = view;} }break;
case RD_ViewRuleKind_CallStack: {if(rd_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break;
case RD_ViewRuleKind_Breakpoints: {if(rd_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break;
case RD_ViewRuleKind_WatchPins: {if(rd_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break;
case RD_ViewRuleKind_Output: {if(rd_view_is_nil(output)) { needs_delete = 0; output = view;} }break;
case RD_ViewRuleKind_Targets: {if(rd_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break;
case RD_ViewRuleKind_Scheduler: {if(rd_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break;
case RD_ViewRuleKind_Modules: {if(rd_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break;
case RD_ViewRuleKind_Disasm: {if(rd_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break;
case RD_ViewRuleKind_Memory: {if(rd_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break;
case RD_ViewRuleKind_GettingStarted:{if(rd_view_is_nil(getting_started)) { needs_delete = 0; getting_started = view;} }break;
case RD_ViewRuleKind_Text:
{
needs_delete = 0;
rd_handle_list_push(scratch.arena, &code_views, rd_handle_from_view(view));
}break;
}
if(!needs_delete)
{
rd_panel_remove_tab_view(panel, view);
}
}
}
//- rjf: close all panels/views
for(RD_HandleNode *n = panels_to_close.first; n != 0; n = n->next)
{
RD_Panel *panel = rd_panel_from_handle(n->handle);
if(panel != ws->root_panel)
{
rd_panel_release(ws, panel);
}
else
{
rd_panel_release_all_views(panel);
panel->first = panel->last = &rd_nil_panel;
}
}
//- rjf: allocate any missing views
if(rd_view_is_nil(watch))
{
watch = rd_view_alloc();
rd_view_equip_spec(watch, rd_view_rule_info_from_kind(RD_ViewRuleKind_Watch), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(locals))
{
locals = rd_view_alloc();
rd_view_equip_spec(locals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Locals), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(regs))
{
regs = rd_view_alloc();
rd_view_equip_spec(regs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Registers), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(globals))
{
globals = rd_view_alloc();
rd_view_equip_spec(globals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Globals), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(tlocals))
{
tlocals = rd_view_alloc();
rd_view_equip_spec(tlocals, rd_view_rule_info_from_kind(RD_ViewRuleKind_ThreadLocals), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(types))
{
types = rd_view_alloc();
rd_view_equip_spec(types, rd_view_rule_info_from_kind(RD_ViewRuleKind_Types), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(procs))
{
procs = rd_view_alloc();
rd_view_equip_spec(procs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Procedures), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(callstack))
{
callstack = rd_view_alloc();
rd_view_equip_spec(callstack, rd_view_rule_info_from_kind(RD_ViewRuleKind_CallStack), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(breakpoints))
{
breakpoints = rd_view_alloc();
rd_view_equip_spec(breakpoints, rd_view_rule_info_from_kind(RD_ViewRuleKind_Breakpoints), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(watch_pins))
{
watch_pins = rd_view_alloc();
rd_view_equip_spec(watch_pins, rd_view_rule_info_from_kind(RD_ViewRuleKind_WatchPins), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(output))
{
output = rd_view_alloc();
rd_view_equip_spec(output, rd_view_rule_info_from_kind(RD_ViewRuleKind_Output), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(targets))
{
targets = rd_view_alloc();
rd_view_equip_spec(targets, rd_view_rule_info_from_kind(RD_ViewRuleKind_Targets), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(scheduler))
{
scheduler = rd_view_alloc();
rd_view_equip_spec(scheduler, rd_view_rule_info_from_kind(RD_ViewRuleKind_Scheduler), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(modules))
{
modules = rd_view_alloc();
rd_view_equip_spec(modules, rd_view_rule_info_from_kind(RD_ViewRuleKind_Modules), str8_zero(), &md_nil_node);
}
if(rd_view_is_nil(disasm))
{
disasm = rd_view_alloc();
rd_view_equip_spec(disasm, rd_view_rule_info_from_kind(RD_ViewRuleKind_Disasm), str8_zero(), &md_nil_node);
}
if(layout == Layout_Default && rd_view_is_nil(memory))
{
memory = rd_view_alloc();
rd_view_equip_spec(memory, rd_view_rule_info_from_kind(RD_ViewRuleKind_Memory), str8_zero(), &md_nil_node);
}
if(code_views.count == 0 && rd_view_is_nil(getting_started))
{
getting_started = rd_view_alloc();
rd_view_equip_spec(getting_started, rd_view_rule_info_from_kind(RD_ViewRuleKind_GettingStarted), str8_zero(), &md_nil_node);
}
//- rjf: apply layout
switch(layout)
{
//- rjf: default layout
case Layout_Default:
{
// rjf: root split
ws->root_panel->split_axis = Axis2_X;
RD_Panel *root_0 = rd_panel_alloc(ws);
RD_Panel *root_1 = rd_panel_alloc(ws);
rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0);
rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1);
root_0->pct_of_parent = 0.85f;
root_1->pct_of_parent = 0.15f;
// rjf: root_0 split
root_0->split_axis = Axis2_Y;
RD_Panel *root_0_0 = rd_panel_alloc(ws);
RD_Panel *root_0_1 = rd_panel_alloc(ws);
rd_panel_insert(root_0, root_0->last, root_0_0);
rd_panel_insert(root_0, root_0->last, root_0_1);
root_0_0->pct_of_parent = 0.80f;
root_0_1->pct_of_parent = 0.20f;
// rjf: root_1 split
root_1->split_axis = Axis2_Y;
RD_Panel *root_1_0 = rd_panel_alloc(ws);
RD_Panel *root_1_1 = rd_panel_alloc(ws);
rd_panel_insert(root_1, root_1->last, root_1_0);
rd_panel_insert(root_1, root_1->last, root_1_1);
root_1_0->pct_of_parent = 0.50f;
root_1_1->pct_of_parent = 0.50f;
rd_panel_insert_tab_view(root_1_0, root_1_0->last_tab_view, targets);
rd_panel_insert_tab_view(root_1_1, root_1_1->last_tab_view, scheduler);
root_1_0->selected_tab_view = rd_handle_from_view(targets);
root_1_1->selected_tab_view = rd_handle_from_view(scheduler);
root_1_1->tab_side = Side_Max;
// rjf: root_0_0 split
root_0_0->split_axis = Axis2_X;
RD_Panel *root_0_0_0 = rd_panel_alloc(ws);
RD_Panel *root_0_0_1 = rd_panel_alloc(ws);
rd_panel_insert(root_0_0, root_0_0->last, root_0_0_0);
rd_panel_insert(root_0_0, root_0_0->last, root_0_0_1);
root_0_0_0->pct_of_parent = 0.25f;
root_0_0_1->pct_of_parent = 0.75f;
// rjf: root_0_0_0 split
root_0_0_0->split_axis = Axis2_Y;
RD_Panel *root_0_0_0_0 = rd_panel_alloc(ws);
RD_Panel *root_0_0_0_1 = rd_panel_alloc(ws);
rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_0);
rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_1);
root_0_0_0_0->pct_of_parent = 0.5f;
root_0_0_0_1->pct_of_parent = 0.5f;
rd_panel_insert_tab_view(root_0_0_0_0, root_0_0_0_0->last_tab_view, disasm);
root_0_0_0_0->selected_tab_view = rd_handle_from_view(disasm);
rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, breakpoints);
rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, watch_pins);
rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, output);
rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, memory);
root_0_0_0_1->selected_tab_view = rd_handle_from_view(output);
// rjf: root_0_1 split
root_0_1->split_axis = Axis2_X;
RD_Panel *root_0_1_0 = rd_panel_alloc(ws);
RD_Panel *root_0_1_1 = rd_panel_alloc(ws);
rd_panel_insert(root_0_1, root_0_1->last, root_0_1_0);
rd_panel_insert(root_0_1, root_0_1->last, root_0_1_1);
root_0_1_0->pct_of_parent = 0.60f;
root_0_1_1->pct_of_parent = 0.40f;
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, globals);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, tlocals);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, types);
rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, procs);
root_0_1_0->selected_tab_view = rd_handle_from_view(watch);
root_0_1_0->tab_side = Side_Max;
rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, callstack);
rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, modules);
root_0_1_1->selected_tab_view = rd_handle_from_view(callstack);
root_0_1_1->tab_side = Side_Max;
// rjf: fill main panel with getting started, OR all collected code views
if(!rd_view_is_nil(getting_started))
{
rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, getting_started);
}
for(RD_HandleNode *n = code_views.first; n != 0; n = n->next)
{
RD_View *view = rd_view_from_handle(n->handle);
if(!rd_view_is_nil(view))
{
rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, view);
}
}
// rjf: choose initial focused panel
ws->focused_panel = root_0_0_1;
}break;
//- rjf: compact layout:
case Layout_Compact:
{
// rjf: root split
ws->root_panel->split_axis = Axis2_X;
RD_Panel *root_0 = rd_panel_alloc(ws);
RD_Panel *root_1 = rd_panel_alloc(ws);
rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0);
rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1);
root_0->pct_of_parent = 0.25f;
root_1->pct_of_parent = 0.75f;
// rjf: root_0 split
root_0->split_axis = Axis2_Y;
RD_Panel *root_0_0 = rd_panel_alloc(ws);
{
if(!rd_view_is_nil(watch)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, watch); }
if(!rd_view_is_nil(types)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, types); }
root_0_0->selected_tab_view = rd_handle_from_view(watch);
}
RD_Panel *root_0_1 = rd_panel_alloc(ws);
{
if(!rd_view_is_nil(scheduler)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, scheduler); }
if(!rd_view_is_nil(targets)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, targets); }
if(!rd_view_is_nil(breakpoints)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, breakpoints); }
if(!rd_view_is_nil(watch_pins)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, watch_pins); }
root_0_1->selected_tab_view = rd_handle_from_view(scheduler);
}
RD_Panel *root_0_2 = rd_panel_alloc(ws);
{
if(!rd_view_is_nil(disasm)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, disasm); }
if(!rd_view_is_nil(output)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, output); }
root_0_2->selected_tab_view = rd_handle_from_view(disasm);
}
RD_Panel *root_0_3 = rd_panel_alloc(ws);
{
if(!rd_view_is_nil(callstack)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, callstack); }
if(!rd_view_is_nil(modules)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, modules); }
root_0_3->selected_tab_view = rd_handle_from_view(callstack);
}
rd_panel_insert(root_0, root_0->last, root_0_0);
rd_panel_insert(root_0, root_0->last, root_0_1);
rd_panel_insert(root_0, root_0->last, root_0_2);
rd_panel_insert(root_0, root_0->last, root_0_3);
root_0_0->pct_of_parent = 0.25f;
root_0_1->pct_of_parent = 0.25f;
root_0_2->pct_of_parent = 0.25f;
root_0_3->pct_of_parent = 0.25f;
// rjf: fill main panel with getting started, OR all collected code views
if(!rd_view_is_nil(getting_started))
{
rd_panel_insert_tab_view(root_1, root_1->last_tab_view, getting_started);
}
for(RD_HandleNode *n = code_views.first; n != 0; n = n->next)
{
RD_View *view = rd_view_from_handle(n->handle);
if(!rd_view_is_nil(view))
{
rd_panel_insert_tab_view(root_1, root_1->last_tab_view, view);
}
}
// rjf: choose initial focused panel
ws->focused_panel = root_1;
}break;
}
// rjf: dispatch cfg saves
for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1))
{
RD_CmdKind write_cmd = rd_cfg_src_write_cmd_kind_table[src];
rd_cmd(write_cmd, .file_path = rd_cfg_path_from_src(src));
}
#endif
}break;
//- rjf: thread finding
@@ -15671,7 +15449,8 @@ X(getting_started)
case RD_CmdKind_DisableTarget:
{
RD_Cfg *cfg = rd_cfg_from_handle(rd_regs()->cfg);
rd_cfg_child_from_string_or_alloc(cfg, str8_lit("disabled"));
RD_Cfg *disabled = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("disabled"));
rd_cfg_new(disabled, str8_lit("1"));
}break;
case RD_CmdKind_RemoveCfg:
{
+13 -10
View File
@@ -143,16 +143,6 @@ enum
RD_EntityFlag_MarkedForDeletion = (1<<31),
};
////////////////////////////////
//~ rjf: Setting Types
typedef struct RD_SettingVal RD_SettingVal;
struct RD_SettingVal
{
B32 set;
S32 s32;
};
////////////////////////////////
//~ rjf: View Rule Info Types
@@ -351,6 +341,7 @@ typedef struct RD_CfgNode RD_CfgNode;
struct RD_CfgNode
{
RD_CfgNode *next;
RD_CfgNode *prev;
RD_Cfg *v;
};
@@ -362,6 +353,13 @@ struct RD_CfgList
U64 count;
};
typedef struct RD_CfgArray RD_CfgArray;
struct RD_CfgArray
{
RD_Cfg **v;
U64 count;
};
typedef struct RD_CfgRec RD_CfgRec;
struct RD_CfgRec
{
@@ -889,6 +887,10 @@ struct RD_State
// rjf: config -> eval blob map (lazily constructed from-scratch each frame)
RD_Cfg2EvalBlobMap *cfg2evalblob_map;
// rjf: eval collections (constructed from scratch every frame)
String8Array *eval_collection_cfg_names;
RD_CfgArray *eval_collection_cfgs;
// rjf: registers stack
RD_RegsNode base_regs;
RD_RegsNode *top_regs;
@@ -1171,6 +1173,7 @@ internal RD_Cfg *rd_cfg_child_from_string(RD_Cfg *parent, String8 string);
internal RD_Cfg *rd_cfg_child_from_string_or_alloc(RD_Cfg *parent, String8 string);
internal RD_CfgList rd_cfg_child_list_from_string(Arena *arena, RD_Cfg *parent, String8 string);
internal RD_CfgList rd_cfg_top_level_list_from_string(Arena *arena, String8 string);
internal RD_CfgArray rd_cfg_array_from_list(Arena *arena, RD_CfgList *list);
internal RD_CfgList rd_cfg_tree_list_from_string(Arena *arena, String8 string);
internal String8 rd_string_from_cfg_tree(Arena *arena, RD_Cfg *cfg);
internal RD_CfgRec rd_cfg_rec__depth_first(RD_Cfg *root, RD_Cfg *cfg);