adjust meta-expr type visualization; unify 'type unwrapping' paths, instead of nest of various 'scanners', we just have one path which we parameterize via bits to skip what each path needs

This commit is contained in:
Ryan Fleury
2025-04-15 11:35:49 -07:00
parent db381db85d
commit e27f31cfa4
8 changed files with 336 additions and 394 deletions
+9 -9
View File
@@ -94,7 +94,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
type_kind == E_TypeKind_Ptr)
{
Temp scratch = scratch_begin(0, 0);
E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key)));
E_TypeKey ptee_type_key = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key);
if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class)
{
@@ -111,7 +111,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
if(has_vtable)
{
U64 ptr_vaddr = eval.value.u64;
U64 addr_size = e_type_byte_size_from_key(e_type_unwrap(type_key));
U64 addr_size = e_type_byte_size_from_key(e_type_key_unwrap(type_key, E_TypeUnwrapFlag_AllDecorative));
U64 class_base_vaddr = 0;
U64 vtable_vaddr = 0;
if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) &&
@@ -160,7 +160,7 @@ e_value_eval_from_eval(E_Eval eval)
ProfBeginFunction();
if(eval.irtree.mode == E_Mode_Offset)
{
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(type_kind == E_TypeKind_Array)
{
@@ -249,7 +249,7 @@ e_value_from_expr(E_Expr *expr)
internal U64
e_base_offset_from_eval(E_Eval eval)
{
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key))))
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative))))
{
eval = e_value_eval_from_eval(eval);
}
@@ -273,23 +273,23 @@ e_range_from_eval(E_Eval eval)
}
}
}
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);
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.irtree.type_key));
E_TypeKey direct_type_key = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All);
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.irtree.type_key)));
size = e_type_byte_size_from_key(direct_type_key);
}
if(size == 0 && eval.irtree.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.irtree.type_key));
size = e_type_byte_size_from_key(type_key);
}
if(size == 0)
{
@@ -376,7 +376,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
S32 indent = 2;
for(E_TypeKey type_key = irtree.type_key;
!e_type_key_match(e_type_key_zero(), type_key);
type_key = e_type_direct_from_key(type_key),
type_key = e_type_key_direct(type_key),
indent += 1)
{
E_Type *type = e_type_from_key(scratch.arena, type_key);
+26 -33
View File
@@ -658,7 +658,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
E_Expr *exprl = expr->first;
E_Expr *exprr = exprl->next;
E_IRTreeAndType l = *lhs_irtree;
E_TypeKey l_restype = e_type_unwrap(l.type_key);
E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);
E_TypeKey check_type_key = l_restype;
E_TypeKind check_type_kind = l_restype_kind;
@@ -666,7 +666,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
l_restype_kind == E_TypeKind_LRef ||
l_restype_kind == E_TypeKind_RRef)
{
check_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_restype)));
check_type_key = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_All);
check_type_kind = e_type_kind_from_key(check_type_key);
}
e_msg_list_concat_in_place(&result.msgs, &l.msgs);
@@ -783,18 +783,11 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
E_Expr *exprr = exprl->next;
E_IRTreeAndType l = *lhs_irtree;
E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr);
E_TypeKey l_restype = e_type_unwrap(l.type_key);
E_TypeKey r_restype = e_type_unwrap(r.type_key);
E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);
E_TypeKind r_restype_kind = e_type_kind_from_key(r_restype);
if(e_type_kind_is_basic_or_enum(r_restype_kind))
{
r_restype = e_type_unwrap_enum(r_restype);
r_restype_kind = e_type_kind_from_key(r_restype);
}
E_TypeKey direct_type = e_type_unwrap(l_restype);
direct_type = e_type_direct_from_key(direct_type);
direct_type = e_type_unwrap(direct_type);
E_TypeKey direct_type = e_type_key_unwrap(l_restype, E_TypeUnwrapFlag_All);
U64 direct_type_size = e_type_byte_size_from_key(direct_type);
e_msg_list_concat_in_place(&result.msgs, &l.msgs);
e_msg_list_concat_in_place(&result.msgs, &r.msgs);
@@ -951,7 +944,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
{
e_type_key_list_push_front(scratch.arena, &inherited_lenses, k);
}
k = e_type_direct_from_key(k);
k = e_type_key_direct(k);
kind = e_type_kind_from_key(k);
}
}
@@ -981,9 +974,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
E_TypeKey r_type_direct = e_type_unwrap(e_type_direct_from_key(r_type));
E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All);
U64 r_type_direct_size = e_type_byte_size_from_key(r_type_direct);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
@@ -1037,7 +1030,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_TypeKey r_type = r_tree.type_key;
E_TypeKey r_type_unwrapped = e_type_unwrap(r_type);
E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
@@ -1068,7 +1061,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
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_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);
E_TypeKey casted_type = e_type_unwrap(casted_tree.type_key);
E_TypeKey casted_type = e_type_key_unwrap(casted_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);
U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type);
U8 in_group = e_type_group_from_kind(casted_type_kind);
@@ -1178,7 +1171,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, 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_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
U64 r_type_size = e_type_byte_size_from_key(r_type);
@@ -1212,10 +1205,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
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);
E_TypeKey r_type_promoted = e_type_promote(r_type);
E_TypeKey r_type_promoted = e_type_key_promote(r_type);
RDI_EvalOp op = e_opcode_from_expr_kind(kind);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
@@ -1245,7 +1238,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
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);
E_TypeKey r_type_promoted = e_type_key_basic(E_TypeKind_Bool);
@@ -1303,8 +1296,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, 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));
E_TypeKey r_type = e_type_unwrap_enum(e_type_unwrap(r_tree.type_key));
E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind l_type_kind = e_type_kind_from_key(l_type);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
if(l_type.kind == E_TypeKeyKind_Reg)
@@ -1359,8 +1352,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
}
if(l_is_pointer_like && r_is_pointer_like)
{
E_TypeKey l_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type)));
E_TypeKey r_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(r_type)));
E_TypeKey l_type_direct = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All);
E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All);
U64 l_type_direct_byte_size = e_type_byte_size_from_key(l_type_direct);
U64 r_type_direct_byte_size = e_type_byte_size_from_key(r_type_direct);
if(l_type_direct_byte_size == r_type_direct_byte_size)
@@ -1424,7 +1417,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
}
// rjf: unpack type
E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(ptr_tree->type_key)));
E_TypeKey direct_type = e_type_key_unwrap(ptr_tree->type_key, E_TypeUnwrapFlag_All);
U64 direct_type_size = e_type_byte_size_from_key(direct_type);
// rjf: generate
@@ -1457,7 +1450,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
case E_ArithPath_PtrSub:
{
// rjf: unpack type
E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type)));
E_TypeKey direct_type = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All);
U64 direct_type_size = e_type_byte_size_from_key(direct_type);
// rjf: generate
@@ -1529,9 +1522,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_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);
E_TypeKey c_type = e_type_unwrap(c_tree.type_key);
E_TypeKey l_type = e_type_unwrap(l_tree.type_key);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKey c_type = e_type_key_unwrap(c_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind c_type_kind = e_type_kind_from_key(c_type);
E_TypeKind l_type_kind = e_type_kind_from_key(l_type);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
@@ -1603,7 +1596,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
}
else
{
result.type_key = e_type_unwrap(result.type_key);
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses);
}
}
}
@@ -1646,7 +1639,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
else
{
result = e_irtree_and_type_from_expr(arena, lhs->next);
result.type_key = e_type_unwrap(result.type_key);
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses);
}
}
@@ -2268,7 +2261,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
E_IRTreeAndType irtree_stripped = result;
if(type->kind == E_TypeKind_Lens)
{
irtree_stripped.type_key = e_type_direct_from_key(irtree_stripped.type_key);
irtree_stripped.type_key = e_type_key_direct(irtree_stripped.type_key);
}
E_IRExt ext = type->irext(arena, expr, &irtree_stripped);
result.user_data = ext.user_data;
+249 -320
View File
@@ -562,7 +562,7 @@ e_type_key_match(E_TypeKey l, E_TypeKey r)
return result;
}
//- rjf: key -> info extraction
//- rjf: type key -> info extraction
internal U64
e_hash_from_type(E_Type *type)
@@ -627,6 +627,48 @@ e_type_kind_from_key(E_TypeKey key)
return kind;
}
internal U64
e_type_byte_size_from_key(E_TypeKey key)
{
ProfBeginFunction();
U64 result = 0;
switch(key.kind)
{
default:{}break;
case E_TypeKeyKind_Basic:
{
E_TypeKind kind = (E_TypeKind)key.u32[0];
result = e_type_kind_basic_byte_size_table[kind];
}break;
case E_TypeKeyKind_Ext:
{
U64 type_node_idx = key.u32[1];
U32 rdi_idx = key.u32[2];
RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi;
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
result = rdi_type->byte_size;
}break;
case E_TypeKeyKind_Cons:
{
U64 key_hash = e_hash_from_string(5381, str8_struct(&key));
U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count;
E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx];
for(E_ConsTypeNode *node = key_slot->first;
node != 0;
node = node->key_next)
{
if(e_type_key_match(node->key, key))
{
result = node->byte_size;
break;
}
}
}break;
}
ProfEnd();
return result;
}
internal E_Type *
e_type_from_key(Arena *arena, E_TypeKey key)
{
@@ -1201,287 +1243,6 @@ e_type_from_key(Arena *arena, E_TypeKey key)
return type;
}
internal U64
e_type_byte_size_from_key(E_TypeKey key)
{
ProfBeginFunction();
U64 result = 0;
switch(key.kind)
{
default:{}break;
case E_TypeKeyKind_Basic:
{
E_TypeKind kind = (E_TypeKind)key.u32[0];
result = e_type_kind_basic_byte_size_table[kind];
}break;
case E_TypeKeyKind_Ext:
{
U64 type_node_idx = key.u32[1];
U32 rdi_idx = key.u32[2];
RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi;
RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);
result = rdi_type->byte_size;
}break;
case E_TypeKeyKind_Cons:
{
U64 key_hash = e_hash_from_string(5381, str8_struct(&key));
U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count;
E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx];
for(E_ConsTypeNode *node = key_slot->first;
node != 0;
node = node->key_next)
{
if(e_type_key_match(node->key, key))
{
result = node->byte_size;
break;
}
}
}break;
}
ProfEnd();
return result;
}
internal E_TypeKey
e_type_direct_from_key(E_TypeKey key)
{
E_TypeKey result = zero_struct;
switch(key.kind)
{
default:{}break;
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
E_Type *type = e_type_from_key__cached(key);
result = type->direct_type_key;
}break;
}
return result;
}
internal E_TypeKey
e_type_owner_from_key(E_TypeKey key)
{
E_TypeKey result = zero_struct;
switch(key.kind)
{
default:{}break;
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
E_Type *type = e_type_from_key__cached(key);
result = type->owner_type_key;
}break;
}
return result;
}
internal E_TypeKey
e_type_ptee_from_key(E_TypeKey key)
{
E_TypeKey result = key;
B32 passed_ptr = 0;
for(;;)
{
E_TypeKind kind = e_type_kind_from_key(result);
result = e_type_direct_from_key(result);
if(kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef)
{
passed_ptr = 1;
}
E_TypeKind next_kind = e_type_kind_from_key(result);
if(passed_ptr &&
next_kind != E_TypeKind_IncompleteStruct &&
next_kind != E_TypeKind_IncompleteUnion &&
next_kind != E_TypeKind_IncompleteEnum &&
next_kind != E_TypeKind_IncompleteClass &&
next_kind != E_TypeKind_Alias &&
next_kind != E_TypeKind_Modifier)
{
break;
}
if(kind == E_TypeKind_Null)
{
break;
}
}
return result;
}
internal E_TypeKey
e_type_unwrap_enum(E_TypeKey key)
{
E_TypeKey result = key;
for(B32 good = 1; good;)
{
E_TypeKind kind = e_type_kind_from_key(result);
if(kind == E_TypeKind_Enum)
{
result = e_type_direct_from_key(result);
}
else
{
good = 0;
}
}
return result;
}
internal E_TypeKey
e_type_unwrap(E_TypeKey key)
{
E_TypeKey result = key;
for(B32 good = 1; good;)
{
E_TypeKind kind = e_type_kind_from_key(result);
if((E_TypeKind_FirstIncomplete <= kind && kind <= E_TypeKind_LastIncomplete) ||
kind == E_TypeKind_Modifier ||
kind == E_TypeKind_Alias ||
kind == E_TypeKind_Lens ||
kind == E_TypeKind_MetaExpr)
{
result = e_type_direct_from_key(result);
}
else
{
good = 0;
}
}
return result;
}
internal E_TypeKey
e_type_promote(E_TypeKey key)
{
E_TypeKey result = key;
E_TypeKind kind = e_type_kind_from_key(key);
if(kind == E_TypeKind_Bool ||
kind == E_TypeKind_S8 ||
kind == E_TypeKind_S16 ||
kind == E_TypeKind_U8 ||
kind == E_TypeKind_U16)
{
result = e_type_key_basic(E_TypeKind_S32);
}
return result;
}
internal B32
e_type_match(E_TypeKey l, E_TypeKey r)
{
// rjf: unpack parameters
E_TypeKey lu = e_type_unwrap(l);
E_TypeKey ru = e_type_unwrap(r);
// rjf: exact key matches -> match
B32 result = e_type_key_match(lu, ru);
// rjf: if keys don't match, type *contents* could still match,
// so we need to unpack the type info & compare
if(!result)
{
E_TypeKind luk = e_type_kind_from_key(lu);
E_TypeKind ruk = e_type_kind_from_key(ru);
if(luk == ruk)
{
switch(luk)
{
default:
{
result = 1;
}break;
case E_TypeKind_Ptr:
case E_TypeKind_LRef:
case E_TypeKind_RRef:
{
E_TypeKey lud = e_type_direct_from_key(lu);
E_TypeKey rud = e_type_direct_from_key(ru);
result = e_type_match(lud, rud);
}break;
case E_TypeKind_MemberPtr:
{
E_TypeKey lud = e_type_direct_from_key(lu);
E_TypeKey rud = e_type_direct_from_key(ru);
E_TypeKey luo = e_type_owner_from_key(lu);
E_TypeKey ruo = e_type_owner_from_key(ru);
result = (e_type_match(lud, rud) && e_type_match(luo, ruo));
}break;
case E_TypeKind_Array:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))
{
result = 1;
}
}break;
case E_TypeKind_Function:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))
{
B32 params_match = 1;
E_TypeKey *lp = lt->param_type_keys;
E_TypeKey *rp = rt->param_type_keys;
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!e_type_match(*lp, *rp))
{
params_match = 0;
break;
}
}
result = params_match;
}
}break;
case E_TypeKind_Method:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count &&
e_type_match(lt->direct_type_key, rt->direct_type_key) &&
e_type_match(lt->owner_type_key, rt->owner_type_key))
{
B32 params_match = 1;
E_TypeKey *lp = lt->param_type_keys;
E_TypeKey *rp = rt->param_type_keys;
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!e_type_match(*lp, *rp))
{
params_match = 0;
break;
}
}
result = params_match;
}
}break;
}
}
}
return result;
}
internal E_Member *
e_type_member_copy(Arena *arena, E_Member *src)
{
E_Member *dst = push_array(arena, E_Member, 1);
MemoryCopyStruct(dst, src);
dst->name = push_str8_copy(arena, src->name);
dst->inheritance_key_chain = e_type_key_list_copy(arena, &src->inheritance_key_chain);
return dst;
}
internal int
e_type_qsort_compare_members_offset(E_Member *a, E_Member *b)
{
@@ -1641,23 +1402,204 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
return members;
}
internal E_Member *
e_type_member_from_array_name(E_MemberArray *members, String8 name)
//- rjf: type key traversal
internal E_TypeKey
e_type_key_direct(E_TypeKey key)
{
E_Member *member = 0;
for(U64 idx = 0; idx < members->count; idx += 1)
E_TypeKey result = zero_struct;
switch(key.kind)
{
if((members->v[idx].kind == E_MemberKind_DataField ||
members->v[idx].kind == E_MemberKind_Padding) &&
str8_match(members->v[idx].name, name, 0))
default:{}break;
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
E_Type *type = e_type_from_key__cached(key);
result = type->direct_type_key;
}break;
}
return result;
}
internal E_TypeKey
e_type_key_owner(E_TypeKey key)
{
E_TypeKey result = zero_struct;
switch(key.kind)
{
default:{}break;
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
E_Type *type = e_type_from_key__cached(key);
result = type->owner_type_key;
}break;
}
return result;
}
internal E_TypeKey
e_type_key_promote(E_TypeKey key)
{
E_TypeKey result = key;
E_TypeKind kind = e_type_kind_from_key(key);
if(kind == E_TypeKind_Bool ||
kind == E_TypeKind_S8 ||
kind == E_TypeKind_S16 ||
kind == E_TypeKind_U8 ||
kind == E_TypeKind_U16)
{
result = e_type_key_basic(E_TypeKind_S32);
}
return result;
}
internal E_TypeKey
e_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags)
{
E_TypeKey result = key;
E_TypeKind kind = e_type_kind_from_key(result);
B32 did_ptr = 0;
for(;;)
{
B32 done = 0;
switch(kind)
{
default:{done = 1;}break;
case E_TypeKind_Modifier: {done = !(flags & E_TypeUnwrapFlag_Modifiers);}break;
case E_TypeKind_Lens: {done = !(flags & E_TypeUnwrapFlag_Lenses);}break;
case E_TypeKind_MetaExpr: {done = !(flags & E_TypeUnwrapFlag_Meta);}break;
case E_TypeKind_Enum: {done = !(flags & E_TypeUnwrapFlag_Enums);}break;
case E_TypeKind_Alias: {done = !(flags & E_TypeUnwrapFlag_Aliases);}break;
case E_TypeKind_Array:
case E_TypeKind_Ptr:
case E_TypeKind_RRef:
case E_TypeKind_LRef:
case E_TypeKind_MemberPtr:
{
done = (did_ptr || !(flags & E_TypeUnwrapFlag_Pointers));
did_ptr = 1;
}break;
}
if(done)
{
member = &members->v[idx];
break;
}
result = e_type_key_direct(result);
kind = e_type_kind_from_key(result);
}
return member;
return result;
}
//- rjf: type comparisons
internal B32
e_type_match(E_TypeKey l, E_TypeKey r)
{
// rjf: unpack parameters
E_TypeKey lu = e_type_key_unwrap(l, E_TypeUnwrapFlag_AllDecorative);
E_TypeKey ru = e_type_key_unwrap(r, E_TypeUnwrapFlag_AllDecorative);
// rjf: exact key matches -> match
B32 result = e_type_key_match(lu, ru);
// rjf: if keys don't match, type *contents* could still match,
// so we need to unpack the type info & compare
if(!result)
{
E_TypeKind luk = e_type_kind_from_key(lu);
E_TypeKind ruk = e_type_kind_from_key(ru);
if(luk == ruk)
{
switch(luk)
{
default:
{
result = 1;
}break;
case E_TypeKind_Ptr:
case E_TypeKind_LRef:
case E_TypeKind_RRef:
{
E_TypeKey lud = e_type_key_direct(lu);
E_TypeKey rud = e_type_key_direct(ru);
result = e_type_match(lud, rud);
}break;
case E_TypeKind_MemberPtr:
{
E_TypeKey lud = e_type_key_direct(lu);
E_TypeKey rud = e_type_key_direct(ru);
E_TypeKey luo = e_type_key_owner(lu);
E_TypeKey ruo = e_type_key_owner(ru);
result = (e_type_match(lud, rud) && e_type_match(luo, ruo));
}break;
case E_TypeKind_Array:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))
{
result = 1;
}
}break;
case E_TypeKind_Function:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))
{
B32 params_match = 1;
E_TypeKey *lp = lt->param_type_keys;
E_TypeKey *rp = rt->param_type_keys;
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!e_type_match(*lp, *rp))
{
params_match = 0;
break;
}
}
result = params_match;
}
}break;
case E_TypeKind_Method:
{
E_Type *lt = e_type_from_key__cached(l);
E_Type *rt = e_type_from_key__cached(r);
if(lt->count == rt->count &&
e_type_match(lt->direct_type_key, rt->direct_type_key) &&
e_type_match(lt->owner_type_key, rt->owner_type_key))
{
B32 params_match = 1;
E_TypeKey *lp = lt->param_type_keys;
E_TypeKey *rp = rt->param_type_keys;
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!e_type_match(*lp, *rp))
{
params_match = 0;
break;
}
}
result = params_match;
}
}break;
}
}
}
return result;
}
//- rjf: key -> string
internal void
e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return)
{
@@ -1722,7 +1664,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_Array:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, 2, skip_return);
if(prec == 1)
{
@@ -1734,7 +1676,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
{
if(!skip_return)
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, 2, 0);
}
if(prec == 1)
@@ -1747,7 +1689,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
{
E_Type *type = e_type_from_key__cached(key);
str8_list_pushf(arena, out, "%S(", type->name);
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
String8 direct_string = e_type_string_from_key(arena, direct);
str8_list_push(arena, out, direct_string);
for EachIndex(idx, type->count)
@@ -1761,7 +1703,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_Ptr:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("*"));
E_Type *type = e_type_from_key__cached(key);
@@ -1773,14 +1715,14 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_LRef:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&"));
}break;
case E_TypeKind_RRef:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
str8_list_push(arena, out, str8_lit("&&"));
}break;
@@ -1804,7 +1746,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_MetaExpr:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, prec, skip_return);
}break;
}
@@ -1820,7 +1762,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_Bitfield:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_rhs_string_from_key(arena, direct, out, prec);
}break;
@@ -1830,7 +1772,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_RRef:
case E_TypeKind_MemberPtr:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_rhs_string_from_key(arena, direct, out, 1);
}break;
@@ -1845,7 +1787,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
str8_list_push(arena, out, str8_lit("["));
str8_list_push(arena, out, count_str);
str8_list_push(arena, out, str8_lit("]"));
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_rhs_string_from_key(arena, direct, out, 2);
}break;
@@ -1878,13 +1820,13 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
}
str8_list_push(arena, out, str8_lit(")"));
}
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_rhs_string_from_key(arena, direct, out, 2);
}break;
case E_TypeKind_MetaExpr:
{
E_TypeKey direct = e_type_direct_from_key(key);
E_TypeKey direct = e_type_key_direct(key);
e_type_rhs_string_from_key(arena, direct, out, prec);
}break;
}
@@ -1910,7 +1852,7 @@ e_default_expansion_type_from_key(E_TypeKey root_key)
B32 hit_1ptr = 0;
for(E_TypeKey key = root_key;
!e_type_key_match(e_type_key_zero(), key);
key = e_type_direct_from_key(key))
key = e_type_key_direct(key))
{
B32 done = 1;
E_TypeKind kind = e_type_kind_from_key(key);
@@ -2388,21 +2330,8 @@ E_TYPE_IREXT_FUNCTION_DEF(slice)
{
Temp scratch = scratch_begin(&arena, 1);
// rjf: unpack struct type
E_TypeKey struct_type_key = e_type_unwrap(irtree->type_key);
for(;;)
{
if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(struct_type_key)))
{
struct_type_key = e_type_unwrap(e_type_direct_from_key(struct_type_key));
}
else
{
break;
}
}
// rjf: build info from struct type
E_TypeKey struct_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);
E_TypeKind type_kind = e_type_kind_from_key(struct_type_key);
if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class)
{
@@ -2416,7 +2345,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice)
for(U64 idx = 0; idx < members.count; idx += 1)
{
E_Member *member = &members.v[idx];
E_TypeKey member_type = e_type_unwrap(member->type_key);
E_TypeKey member_type = e_type_key_unwrap(member->type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind member_type_kind = e_type_kind_from_key(member_type);
if(count_member == 0 && e_type_kind_is_integer(member_type_kind))
{
@@ -2479,7 +2408,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice)
E_TypeKey element_type_key = zero_struct;
if(base_ptr_member != 0)
{
element_type_key = e_type_direct_from_key(base_ptr_member->type_key);
element_type_key = e_type_key_direct(base_ptr_member->type_key);
}
// rjf: if no count, but base/opl, swap base/opl if needed, and measure count
+28 -10
View File
@@ -29,6 +29,22 @@ struct E_String2TypeKeyMap
E_String2TypeKeySlot *slots;
};
////////////////////////////////
//~ rjf: Type Unwrapping
typedef U32 E_TypeUnwrapFlags;
enum
{
E_TypeUnwrapFlag_Modifiers = (1<<0),
E_TypeUnwrapFlag_Pointers = (1<<1),
E_TypeUnwrapFlag_Lenses = (1<<2),
E_TypeUnwrapFlag_Meta = (1<<3),
E_TypeUnwrapFlag_Enums = (1<<4),
E_TypeUnwrapFlag_Aliases = (1<<5),
E_TypeUnwrapFlag_All = 0xffffffff,
E_TypeUnwrapFlag_AllDecorative = (E_TypeUnwrapFlag_All & ~E_TypeUnwrapFlag_Pointers)
};
////////////////////////////////
//~ rjf: Evaluation Context
@@ -245,22 +261,24 @@ internal E_TypeKey e_type_key_folder(void);
//- rjf: basic type key functions
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);
//- rjf: key -> info extraction
//- rjf: type key -> info extraction
internal U64 e_hash_from_type(E_Type *type);
internal E_TypeKind e_type_kind_from_key(E_TypeKey key);
internal U64 e_type_byte_size_from_key(E_TypeKey key);
internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key);
internal E_TypeKey e_type_direct_from_key(E_TypeKey key);
internal E_TypeKey e_type_owner_from_key(E_TypeKey key);
internal E_TypeKey e_type_ptee_from_key(E_TypeKey key);
internal E_TypeKey e_type_unwrap_enum(E_TypeKey key);
internal E_TypeKey e_type_unwrap(E_TypeKey key);
internal E_TypeKey e_type_promote(E_TypeKey key);
internal B32 e_type_match(E_TypeKey l, E_TypeKey r);
internal E_Member *e_type_member_copy(Arena *arena, E_Member *src);
internal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b);
internal E_MemberArray e_type_data_members_from_key(Arena *arena, E_TypeKey key);
internal E_Member *e_type_member_from_array_name(E_MemberArray *members, String8 name);
//- rjf: type key traversal
internal E_TypeKey e_type_key_direct(E_TypeKey key);
internal E_TypeKey e_type_key_owner(E_TypeKey key);
internal E_TypeKey e_type_key_promote(E_TypeKey key);
internal E_TypeKey e_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags);
//- rjf: type comparisons
internal B32 e_type_match(E_TypeKey l, E_TypeKey r);
//- rjf: type key -> string
internal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return);
internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec);
internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);
@@ -105,7 +105,7 @@ ev_type_key_is_editable(E_TypeKey type_key)
{
B32 result = 0;
B32 done = 0;
for(E_TypeKey t = type_key; !result && !done; t = e_type_direct_from_key(t))
for(E_TypeKey t = type_key; !result && !done; t = e_type_key_direct(t))
{
E_TypeKind kind = e_type_kind_from_key(t);
switch(kind)
@@ -132,7 +132,7 @@ ev_type_key_is_editable(E_TypeKey type_key)
}
else
{
E_TypeKind element_kind = e_type_kind_from_key(e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t))));
E_TypeKind element_kind = e_type_kind_from_key(e_type_key_unwrap(t, E_TypeUnwrapFlag_All));
result = (element_kind == E_TypeKind_U8 ||
element_kind == E_TypeKind_U16 ||
element_kind == E_TypeKind_U32 ||
@@ -403,7 +403,7 @@ ev_expand_rule_from_type_key(E_TypeKey type_key)
{
E_TypeKey k = type_key;
E_TypeKind kind = e_type_kind_from_key(k);
for(;kind == E_TypeKind_Lens; k = e_type_direct_from_key(k), kind = e_type_kind_from_key(k))
for(;kind == E_TypeKind_Lens; k = e_type_key_direct(k), kind = e_type_kind_from_key(k))
{
E_Type *type = e_type_from_key__cached(k);
EV_ExpandRule *candidate = ev_expand_rule_from_string(type->name);
@@ -430,7 +430,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
E_Eval eval = e_eval_from_expr(scratch.arena, expr);
E_TypeKey type_key = eval.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key)));
E_TypeKey ptee_type_key = e_type_unwrap(e_type_key_direct(e_type_unwrap(type_key)));
E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key);
if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class)
{
@@ -1287,7 +1287,7 @@ internal String8
ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval)
{
String8 result = {0};
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
U64 type_byte_size = e_type_byte_size_from_key(type_key);
U8 digit_group_separator = 0;
@@ -1598,7 +1598,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
need_pop = 1;
new_task.params = lens_params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);
}
else if(type->expand.info != 0)
{
@@ -1614,7 +1614,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
need_pop = 1;
new_task.params = lens_params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);
#if 0 // NOTE(rjf): will explicitly visualize lenses in value strings. does not seem useful for now?
switch(task_idx)
{
@@ -1643,7 +1643,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
need_pop = 0;
new_task.params = *params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);
scratch_end(scratch);
}break;
@@ -1669,16 +1669,17 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
default:{}break;
case 0:
{
E_Type *type = e_type_from_key__cached(type_key);
*out_string = push_str8f(arena, "%S (", type->name);
need_pop = 0;
need_new_task = 1;
new_task.params = *params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);
}break;
case 1:
{
E_Type *type = e_type_from_key__cached(type_key);
*out_string = push_str8f(arena, " (%S)", type->name);
*out_string = str8_lit(")");
}break;
}
}
@@ -1698,7 +1699,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
need_new_task = 1;
new_task.params = *params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);
}break;
//////////////////////////
@@ -1733,7 +1734,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
ptr_data = it->top_task->user_data = push_array(arena, EV_StringPtrData, 1);
ptr_data->value_eval = e_value_eval_from_eval(eval);
ptr_data->type = e_type_from_key__cached(type_key);
ptr_data->direct_type = e_type_from_key__cached(e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))));
ptr_data->direct_type = e_type_from_key__cached(e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All));
ptr_data->ptee_has_content = (ptr_data->value_eval.value.u64 != 0 && ptr_data->direct_type->kind != E_TypeKind_Null && ptr_data->direct_type->kind != E_TypeKind_Void);
ptr_data->ptee_has_string = ((E_TypeKind_Char8 <= ptr_data->direct_type->kind && ptr_data->direct_type->kind <= E_TypeKind_UChar32) ||
ptr_data->direct_type->kind == E_TypeKind_S8 ||
+6 -5
View File
@@ -1915,9 +1915,9 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string)
Temp scratch = scratch_begin(0, 0);
//- rjf: unpack type of destination
E_TypeKey type_key = e_type_unwrap(dst_eval.irtree.type_key);
E_TypeKey type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.irtree.type_key)));
E_TypeKey direct_type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_All);
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
//- rjf: determine data we'll write
@@ -4001,7 +4001,8 @@ rd_view_ui(Rng2F32 rect)
RD_WatchViewTextEditState *cell_edit_state = rd_watch_view_text_edit_state_from_pt(ewv, cell_pt);
B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_x && cell_x <= selection_tbl.max.x);
RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);
E_Type *cell_type = e_type_from_key__cached(cell_info.eval.irtree.type_key);
E_TypeKey cell_type_key = cell_info.eval.irtree.type_key;
E_Type *cell_type = e_type_from_key__cached(cell_type_key);
E_Eval cell_value_eval = e_value_eval_from_eval(cell_info.eval);
F32 cell_width_px = cell->px + cell->pct * (dim_2f32(rect).x - floor_f32(ui_top_font_size()*1.5f));
F32 next_cell_x_px = cell_x_px + cell_width_px;
@@ -4022,7 +4023,7 @@ rd_view_ui(Rng2F32 rect)
E_IRTreeAndType *prev_overridden_irtree = e_ir_state->overridden_irtree;
e_ir_state->overridden_irtree = &cell_info.eval.irtree;
{
E_TypeKey slider_value_type = e_type_unwrap(cell_type->direct_type_key);
E_TypeKey slider_value_type = e_type_key_unwrap(cell_type->direct_type_key, E_TypeUnwrapFlag_AllDecorative);
slider_value_type_kind = e_type_kind_from_key(slider_value_type);
E_Expr *min_casted = e_expr_ref_cast(scratch.arena, slider_value_type, min_expr);
E_Expr *max_casted = e_expr_ref_cast(scratch.arena, slider_value_type, max_expr);
@@ -10774,7 +10775,7 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string)
E_Eval eval = e_eval_from_string(scratch.arena, string);
if(eval.msgs.max_kind == E_MsgKind_Null)
{
E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key));
E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative));
if(eval_type_kind == E_TypeKind_Ptr ||
eval_type_kind == E_TypeKind_LRef ||
eval_type_kind == E_TypeKind_RRef)
+3 -3
View File
@@ -370,7 +370,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
Temp scratch = scratch_begin(&arena, 1);
child_type_key = e_type_key_basic(E_TypeKind_U64);
E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first;
if(expr->kind != E_ExprKind_LeafU64)
if(expr->kind != E_ExprKind_LeafU64 && expr != &e_expr_nil)
{
child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key);
}
@@ -381,7 +381,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
Temp scratch = scratch_begin(&arena, 1);
child_type_key = e_type_key_basic(E_TypeKind_F32);
E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first;
if(expr->kind != E_ExprKind_LeafF32 && expr->kind != E_ExprKind_LeafF64)
if(expr->kind != E_ExprKind_LeafF32 && expr->kind != E_ExprKind_LeafF64 && expr != &e_expr_nil)
{
child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key);
}
@@ -392,7 +392,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
Temp scratch = scratch_begin(&arena, 1);
child_type_key = e_type_key_basic(E_TypeKind_Bool);
E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first;
if(expr->kind != E_ExprKind_LeafU64)
if(expr->kind != E_ExprKind_LeafU64 && expr != &e_expr_nil)
{
child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key);
}
+1 -1
View File
@@ -1257,7 +1257,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
row->eval.space.kind == E_SpaceKind_File)
{
if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Array &&
e_type_kind_from_key(e_type_direct_from_key(row->eval.irtree.type_key)) == E_TypeKind_U8)
e_type_kind_from_key(e_type_key_direct(row->eval.irtree.type_key)) == E_TypeKind_U8)
{
info.can_expand = 0;
}