mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-24 04:34:59 -07:00
cfg tree collection evaluation
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ typedef struct E_Interpretation E_Interpretation;
|
||||
struct E_Interpretation
|
||||
{
|
||||
E_Value value;
|
||||
E_Space space;
|
||||
E_InterpretationCode code;
|
||||
};
|
||||
|
||||
|
||||
+104
-96
@@ -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
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user