mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-15 08:32:22 -07:00
107 lines
3.6 KiB
C
107 lines
3.6 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
////////////////////////////////
|
|
//~ rjf: View Rule Tree Info Extraction Helpers
|
|
|
|
internal U64
|
|
ev_base_offset_from_eval(E_Eval eval)
|
|
{
|
|
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key)))
|
|
{
|
|
eval = e_value_eval_from_eval(eval);
|
|
}
|
|
return eval.value.u64;
|
|
}
|
|
|
|
internal E_Value
|
|
ev_value_from_params(MD_Node *params)
|
|
{
|
|
Temp scratch = scratch_begin(0, 0);
|
|
String8 expr = md_string_from_children(scratch.arena, params);
|
|
E_Eval eval = e_eval_from_string(scratch.arena, expr);
|
|
E_Eval value_eval = e_value_eval_from_eval(eval);
|
|
scratch_end(scratch);
|
|
return value_eval.value;
|
|
}
|
|
|
|
internal E_TypeKey
|
|
ev_type_key_from_params(MD_Node *params)
|
|
{
|
|
Temp scratch = scratch_begin(0, 0);
|
|
String8 expr = md_string_from_children(scratch.arena, params);
|
|
E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr);
|
|
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, expr, &tokens);
|
|
E_TypeKey type_key = e_type_from_expr(parse.expr);
|
|
scratch_end(scratch);
|
|
return type_key;
|
|
}
|
|
|
|
internal E_Value
|
|
ev_value_from_params_key(MD_Node *params, String8 key)
|
|
{
|
|
Temp scratch = scratch_begin(0, 0);
|
|
MD_Node *key_node = md_child_from_string(params, key, 0);
|
|
String8 expr = md_string_from_children(scratch.arena, key_node);
|
|
E_Eval eval = e_eval_from_string(scratch.arena, expr);
|
|
E_Eval value_eval = e_value_eval_from_eval(eval);
|
|
scratch_end(scratch);
|
|
return value_eval.value;
|
|
}
|
|
|
|
internal Rng1U64
|
|
ev_range_from_eval_params(E_Eval eval, MD_Node *params)
|
|
{
|
|
Temp scratch = scratch_begin(0, 0);
|
|
U64 size = ev_value_from_params_key(params, str8_lit("size")).u64;
|
|
E_TypeKey type_key = e_type_unwrap(eval.type_key);
|
|
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
|
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key));
|
|
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
|
|
if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct ||
|
|
direct_type_kind == E_TypeKind_Union ||
|
|
direct_type_kind == E_TypeKind_Class ||
|
|
direct_type_kind == E_TypeKind_Array))
|
|
{
|
|
size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key)));
|
|
}
|
|
if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct ||
|
|
type_kind == E_TypeKind_Union ||
|
|
type_kind == E_TypeKind_Class ||
|
|
type_kind == E_TypeKind_Array))
|
|
{
|
|
size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key));
|
|
}
|
|
if(size == 0)
|
|
{
|
|
size = 16384;
|
|
}
|
|
Rng1U64 result = {0};
|
|
result.min = ev_base_offset_from_eval(eval);
|
|
result.max = result.min + size;
|
|
scratch_end(scratch);
|
|
return result;
|
|
}
|
|
|
|
internal Arch
|
|
ev_arch_from_eval_params(E_Eval eval, MD_Node *params)
|
|
{
|
|
Arch arch = Arch_Null;
|
|
MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0);
|
|
String8 arch_kind_string = arch_node->first->string;
|
|
if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive))
|
|
{
|
|
arch = Arch_x64;
|
|
}
|
|
return arch;
|
|
}
|
|
|
|
////////////////////////////////
|
|
//~ rjf: "list"
|
|
|
|
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list)
|
|
{
|
|
EV_ExpandInfo info = {0};
|
|
return info;
|
|
}
|