base class -> derived class autocast in eval system; completion of first pass

This commit is contained in:
Ryan Fleury
2024-01-17 13:28:03 -08:00
parent a0a6fc0988
commit d3931fd3e2
9 changed files with 124 additions and 155 deletions
+4 -3
View File
@@ -43,9 +43,9 @@ if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=add
:: --- Compile/Link Line Definitions ------------------------------------------
set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /MP
set clang_common= -I..\src\ -I..\local\ -maes -mssse3 -msse4 -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf
set cl_debug= call cl /Od /D_DEBUG %cl_common%
set cl_debug= call cl /Od %cl_common%
set cl_release= call cl /O2 /DNDEBUG %cl_common%
set clang_debug= call clang -g -O0 -D_DEBUG %clang_common%
set clang_debug= call clang -g -O0 %clang_common%
set clang_release= call clang -g -O3 -DNDEBUG %clang_common%
set cl_link= /link /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis"
set clang_link= -Xlinker /natvis:"%~dp0\src\natvis\base.natvis"
@@ -90,8 +90,9 @@ if "%raddbg_from_pdb%"=="1" %compile% ..\src\raddbg_convert\pdb\r
if "%raddbg_from_dwarf%"=="1" %compile% ..\src\raddbg_convert\dwarf\raddbg_from_dwarf.c %compile_link% %out%raddbg_from_dwarf.exe
if "%raddbg_dump%"=="1" %compile% ..\src\raddbg_dump\raddbg_dump.c %compile_link% %out%raddbg_dump.exe
if "%ryan_scratch%"=="1" %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe
if "%cpp_tests%"=="1" %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe
if "%look_at_raddbg%"=="1" %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %cl_release% /c ..\src\mule\mule_inline.cpp && %cl_release% /c ..\src\mule\mule_o2.cpp && %cl_debug% /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj
if "%mule_main%"=="1" del vc*.pdb mule*.pdb && %cl_release% /MT /c ..\src\mule\mule_inline.cpp && %cl_release% /MT /c ..\src\mule\mule_o2.cpp && %cl_debug% /MT /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj
if "%mule_module%"=="1" %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll
if "%mule_hotload%"=="1" %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll
popd
+79 -134
View File
@@ -3632,7 +3632,6 @@ df_set_thread_rip(DF_Entity *thread, U64 vaddr)
df_state->unwind_cache_invalidated = 1;
df_state->locals_cache_invalidated = 1;
df_state->member_cache_invalidated = 1;
df_state->local_dynamic_type_override_cache_invalidated = 1;
}
// rjf: early mutation of unwind cache for immediate frontend effect
@@ -3898,7 +3897,6 @@ df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 vof
EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch);
EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_binary_voff(binary, voff);
EVAL_String2NumMap *member_map = df_query_cached_member_map_from_binary_voff(binary, voff);
EVAL_String2NumMap *local_dynamic_type_override_map = df_query_cached_local_dynamic_type_override_map_from_module_voff(module, voff);
//- rjf: build ctx
EVAL_ParseCtx ctx = zero_struct;
@@ -3911,7 +3909,6 @@ df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_Entity *module, U64 vof
ctx.reg_alias_map = reg_alias_map;
ctx.locals_map = locals_map;
ctx.member_map = member_map;
ctx.local_dynamic_type_override_map = local_dynamic_type_override_map;
}
scratch_end(scratch);
return ctx;
@@ -4024,7 +4021,6 @@ df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt)
ctx.reg_alias_map = &eval_string2num_map_nil;
ctx.locals_map = &eval_string2num_map_nil;
ctx.member_map = &eval_string2num_map_nil;
ctx.local_dynamic_type_override_map = &eval_string2num_map_nil;
}
scratch_end(scratch);
@@ -4059,6 +4055,19 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
}
}
//- rjf: unpack module info & produce eval machine
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
U64 module_base = df_base_vaddr_from_module(module);
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
EVAL_Machine machine = {0};
machine.u = (void *)thread->parent;
machine.arch = arch;
machine.memory_read = df_eval_memory_read;
machine.reg_data = thread_unwind_regs_block;
machine.reg_size = reg_size;
machine.module_base = &module_base;
machine.tls_base = &tls_base;
//- rjf: lex & parse
EVAL_TokenArray tokens = eval_token_array_from_text(arena, string);
EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens);
@@ -4066,32 +4075,6 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
B32 parse_has_expr = (parse.expr != &eval_expr_nil);
B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent);
//- rjf: apply dynamic type overrides to expression tree - insert implicit cast
// nodes as necessary
#if 0
if(errors.count != 0)
{
typedef struct Task Task;
struct Task
{
Task *next;
EVAL_Expr *expr;
};
Task start_task = {0, parse.expr};
Task *first_task = &start_task;
Task *last_task = &start_task;
for(Task *t = first_task; t != 0; t = t->next)
{
if(t->expr->kind == EVAL_ExprKind_LeafBytecode &&
t->expr->mode == EVAL_EvalMode_Addr)
{
String8 bytecode = t->expr->kind;
}
}
}
#endif
//- rjf: produce IR tree & type
EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil};
if(parse_has_expr && errors.count == 0)
@@ -4113,23 +4096,10 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
bytecode = eval_bytecode_from_oplist(arena, &op_list);
}
//- rjf: grab thread/module
DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr);
//- rjf: evaluate
EVAL_Result eval = {0};
if(bytecode.size != 0)
{
U64 module_base = df_base_vaddr_from_module(module);
U64 tls_base = df_tls_base_vaddr_from_thread(thread);
EVAL_Machine machine = {0};
machine.u = (void *)thread->parent;
machine.arch = arch;
machine.memory_read = df_eval_memory_read;
machine.reg_data = thread_unwind_regs_block;
machine.reg_size = reg_size;
machine.module_base = &module_base;
machine.tls_base = &tls_base;
eval = eval_interpret(&machine, bytecode);
}
@@ -4160,6 +4130,12 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_
result.errors = errors;
}
//- rjf: apply dynamic type overrides
if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast)
{
result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, result);
}
scratch_end(scratch);
ProfEnd();
return result;
@@ -4235,42 +4211,65 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c
}
internal DF_Eval
df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg)
df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval)
{
ProfBeginFunction();
#if 0
//- rjf: pointer-to-struct -> read result & find "derived class" for "real"
// type of evaluation
Temp scratch = scratch_begin(0, 0);
DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread);
Architecture arch = df_architecture_from_entity(thread);
DF_Entity *process = thread->parent;
U64 unwind_count = ctrl_ctx->unwind_count;
U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count);
DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr);
TG_Key type_key = eval.type_key;
TG_Kind type_kind = tg_kind_from_key(type_key);
if(type_kind == TG_Kind_Ptr)
{
TG_Kind kind = tg_kind_from_key(eval.type_key);
if(kind == TG_Kind_Ptr)
TG_Key ptee_type_key = tg_direct_from_graph_raddbg_key(graph, rdbg, type_key);
TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key);
if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class)
{
TG_Key direct_key = tg_direct_from_graph_raddbg_key(parse_ctx->type_graph, parse_ctx->rdbg, eval.type_key);
TG_Kind direct_kind = tg_kind_from_key(direct_key);
if((direct_kind == TG_Kind_Struct || direct_kind == TG_Kind_Class) && parse_ctx->rdbg->global_vmap != 0)
TG_Type *ptee_type = tg_type_from_graph_raddbg_key(scratch.arena, graph, rdbg, ptee_type_key);
B32 has_vtable = 0;
for(U64 idx = 0; idx < ptee_type->count; idx += 1)
{
DF_Eval ptr_addr_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
U64 vaddr = ptr_addr_eval.imm_u64;
String8 ptr_val_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(vaddr, vaddr+bit_size_from_arch(parse_ctx->arch)/8));
if(ptr_val_memory.size >= bit_size_from_arch(parse_ctx->arch)/8)
if(ptee_type->members[idx].kind == TG_MemberKind_VirtualMethod)
{
U64 vtable_ptr_maybe = 0;
MemoryCopy(&vtable_ptr_maybe, ptr_val_memory.str, bit_size_from_arch(parse_ctx->arch)/8);
U64 voff = df_voff_from_vaddr(module, vtable_ptr_maybe);
U64 global_idx = raddbg_vmap_idx_from_voff(parse_ctx->rdbg->global_vmap, parse_ctx->rdbg->global_vmap_count, voff);
if(0 < global_idx && global_idx < parse_ctx->rdbg->global_variable_count)
has_vtable = 1;
break;
}
}
if(has_vtable)
{
U64 ptr_vaddr = eval.offset;
U64 addr_size = bit_size_from_arch(arch)/8;
String8 ptr_value_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
r1u64(ptr_vaddr, ptr_vaddr+addr_size));
if(ptr_value_memory.size >= addr_size)
{
U64 class_base_vaddr = 0;
MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size);
String8 vtable_base_ptr_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
r1u64(class_base_vaddr, class_base_vaddr+addr_size));
if(vtable_base_ptr_memory.size >= addr_size)
{
RADDBG_GlobalVariable *global_var = &parse_ctx->rdbg->global_variables[global_idx];
if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped &&
0 < global_var->container_idx && global_var->container_idx < parse_ctx->rdbg->udt_count)
U64 vtable_vaddr = 0;
MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size);
U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr);
U64 global_idx = raddbg_vmap_idx_from_voff(rdbg->global_vmap, rdbg->global_vmap_count, vtable_voff);
if(0 < global_idx && global_idx < rdbg->global_variable_count)
{
RADDBG_UDT *udt = &parse_ctx->rdbg->udts[global_var->container_idx];
if(0 < udt->self_type_idx && udt->self_type_idx < parse_ctx->rdbg->type_node_count)
RADDBG_GlobalVariable *global_var = &rdbg->global_variables[global_idx];
if(global_var->link_flags & RADDBG_LinkFlag_TypeScoped &&
0 < global_var->container_idx && global_var->container_idx < rdbg->udt_count)
{
RADDBG_TypeNode *type = &parse_ctx->rdbg->type_nodes[udt->self_type_idx];
TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx);
eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, derived_type_key, 0);
RADDBG_UDT *udt = &rdbg->udts[global_var->container_idx];
if(0 < udt->self_type_idx && udt->self_type_idx < rdbg->type_node_count)
{
RADDBG_TypeNode *type = &rdbg->type_nodes[udt->self_type_idx];
TG_Key derived_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type->kind), (U64)udt->self_type_idx);
TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0);
eval.type_key = ptr_to_derived_type_key;
}
}
}
}
@@ -4278,7 +4277,14 @@ df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ct
}
}
}
#endif
scratch_end(scratch);
return eval;
}
internal DF_Eval
df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg)
{
ProfBeginFunction();
//- rjf: apply view rules
for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next)
@@ -4958,6 +4964,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DBGI_Scope *scope, DF_EvalVie
//////////////////////////////
//- rjf: apply view rules & resolve eval
//
eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, eval);
eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, eval, cfg_table);
//////////////////////////////
@@ -6091,56 +6098,6 @@ df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff)
return map;
}
internal EVAL_String2NumMap *
df_query_cached_local_dynamic_type_override_map_from_module_voff(DF_Entity *module, U64 voff)
{
ProfBeginFunction();
EVAL_String2NumMap *map = &eval_string2num_map_nil;
{
DF_RunLocalsCache *cache = &df_state->local_dynamic_type_override_cache;
if(cache->table_size == 0)
{
cache->table_size = 256;
cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size);
}
DF_Handle handle = df_handle_from_entity(module);
U64 hash = df_hash_from_string(str8_struct(&handle));
U64 slot_idx = hash % cache->table_size;
DF_RunLocalsCacheSlot *slot = &cache->table[slot_idx];
DF_RunLocalsCacheNode *node = 0;
for(DF_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next)
{
if(df_handle_match(n->binary, handle) && n->voff == voff)
{
node = n;
break;
}
}
if(node == 0)
{
DBGI_Scope *scope = dbgi_scope_open();
#if 0
EVAL_String2NumMap *map = df_push_member_map_from_binary_voff(cache->arena, scope, binary, voff);
if(map->slots_count != 0)
{
node = push_array(cache->arena, DF_RunLocalsCacheNode, 1);
node->binary = handle;
node->voff = voff;
node->locals_map = map;
SLLQueuePush_N(slot->first, slot->last, node, hash_next);
}
#endif
dbgi_scope_close(scope);
}
if(node != 0)
{
map = node->locals_map;
}
}
ProfEnd();
return map;
}
//- rjf: top-level command dispatch
internal void
@@ -6205,7 +6162,6 @@ df_core_init(String8 user_path, String8 profile_path, DF_StateDeltaHistory *hist
df_state->unwind_cache.arena = arena_alloc();
df_state->locals_cache.arena = arena_alloc();
df_state->member_cache.arena = arena_alloc();
df_state->local_dynamic_type_override_cache.arena = arena_alloc();
// rjf: set up eval view cache
df_state->eval_view_cache.slots_count = 4096;
@@ -6609,7 +6565,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
df_state->unwind_cache_invalidated = 1;
df_state->locals_cache_invalidated = 1;
df_state->member_cache_invalidated = 1;
df_state->local_dynamic_type_override_cache_invalidated = 1;
}
//- rjf: refresh unwind cache
@@ -6661,16 +6616,6 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
cache->table = 0;
}
//- rjf: clear local -> dynamic type override cache
if(df_state->local_dynamic_type_override_cache_invalidated && !df_ctrl_targets_running())
{
df_state->local_dynamic_type_override_cache_invalidated = 0;
DF_RunLocalsCache *cache = &df_state->local_dynamic_type_override_cache;
arena_clear(cache->arena);
cache->table_size = 0;
cache->table = 0;
}
scratch_end(scratch);
}
+1 -3
View File
@@ -1135,8 +1135,6 @@ struct DF_State
DF_RunLocalsCache locals_cache;
B32 member_cache_invalidated;
DF_RunLocalsCache member_cache;
B32 local_dynamic_type_override_cache_invalidated;
DF_RunLocalsCache local_dynamic_type_override_cache;
// rjf: eval view cache
DF_EvalViewCache eval_view_cache;
@@ -1565,6 +1563,7 @@ internal EVAL_ParseCtx df_eval_parse_ctx_from_module_voff(DBGI_Scope *scope, DF_
internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DBGI_Scope *scope, DF_Entity *file, TxtPt pt);
internal DF_Eval df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, String8 string);
internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *ctrl_ctx, DF_Eval eval);
internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_Eval eval, DF_CfgTable *cfg);
////////////////////////////////
@@ -1657,7 +1656,6 @@ internal U64 df_query_cached_rip_from_thread(DF_Entity *thread);
internal U64 df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count);
internal EVAL_String2NumMap *df_query_cached_locals_map_from_binary_voff(DF_Entity *binary, U64 voff);
internal EVAL_String2NumMap *df_query_cached_member_map_from_binary_voff(DF_Entity *binary, U64 voff);
internal EVAL_String2NumMap *df_query_cached_local_dynamic_type_override_map_from_module_voff(DF_Entity *module, U64 voff);
//- rjf: top-level command dispatch
internal void df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec);
+3
View File
@@ -7195,6 +7195,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval
{
member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, member_eval);
member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, member_eval, &view_rule_table);
}
@@ -7275,6 +7276,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
// rjf: apply view rules to eval
{
elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, elem_eval);
elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, elem_eval, &view_rule_table);
}
@@ -7354,6 +7356,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop
df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User);
// rjf: apply view rules to eval
link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdbg, ctrl_ctx, link_eval);
link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, link_eval, &view_rule_table);
TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key);
-14
View File
@@ -980,20 +980,6 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8
}
}
//- rjf: identifier refers to type which may be possibly overridden -> look up into
// identifier -> dynamic type table & patch
if(identifier_type_is_possibly_dynamically_overridden)
{
U64 base_type_num = eval_num_from_string(ctx->local_dynamic_type_override_map, token_string);
if(base_type_num != 0)
{
U64 type_idx = base_type_num;
RADDBG_TypeNode *type_node = &ctx->rdbg->type_nodes[type_idx];
TG_Key base_type_key = tg_key_ext(tg_kind_from_raddbg_type_kind(type_node->kind), type_idx);
type_key = tg_cons_type_make(ctx->type_graph, TG_Kind_Ptr, base_type_key, 0);
}
}
//- rjf: attach on map
if(mapped_identifier != 0)
{
-1
View File
@@ -98,7 +98,6 @@ struct EVAL_ParseCtx
EVAL_String2NumMap *reg_alias_map;
EVAL_String2NumMap *locals_map;
EVAL_String2NumMap *member_map;
EVAL_String2NumMap *local_dynamic_type_override_map;
};
////////////////////////////////
+29
View File
@@ -1151,6 +1151,22 @@ struct Derived : Base
virtual void Foo() {a += 1;}
};
struct DerivedA : Base
{
float a;
float b;
virtual void Foo() {a += 1;}
virtual ~DerivedA() = default;
};
struct DerivedB : Base
{
double c;
double d;
virtual void Foo() {c += 1;}
virtual ~DerivedB() = default;
};
struct OverloadedMethods{
int x;
int cool_method(void){
@@ -1367,6 +1383,19 @@ extended_type_coverage_eval_tests(void){
derived->Foo();
delete derived;
Base *base_array[1024] = {0};
for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1)
{
if(i & 1 == 1)
{
base_array[i] = new DerivedA();
}
else
{
base_array[i] = new DerivedB();
}
}
OverloadedMethods overloaded_methods;
{
overloaded_methods.x = 0;
+1
View File
@@ -1316,6 +1316,7 @@ pdbconv_type_cons_leaf_record(PDBCONV_Ctx *ctx, CV_TypeId itype){
case CV_LeafKind_STRUCTURE:
{
ProfBegin("CV_LeafKind_CLASS/CV_LeafKind_STRUCTURE");
// TODO(allen): error if bad range
if (sizeof(CV_LeafStruct) <= cap){
CV_LeafStruct *lf_struct = (CV_LeafStruct*)first;
+7
View File
@@ -0,0 +1,7 @@
#include <fstream>
int main()
{
std::fstream temp;
return 0;
}