@@ -282,13 +282,13 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
282282 //- rjf: fill with lookups
283283 //
284284 else if (accel -> lookup_rule != 0 )
285- {
286- E_LookupRange lookup_range = accel -> lookup_rule -> range (arena , expr , idx_range , accel -> lookup_user_data );
287- result .row_exprs_count = lookup_range .exprs_count ;
288- result .row_exprs = lookup_range .exprs ;
289- result .row_strings = lookup_range .exprs_strings ;
285+ {
286+ E_LookupRange lookup_range = accel -> lookup_rule -> range (arena , expr , idx_range , accel -> lookup_user_data );
287+ result .row_exprs_count = lookup_range .exprs_count ;
288+ result .row_exprs = lookup_range .exprs ;
289+ result .row_strings = lookup_range .exprs_strings ;
290290 result .row_view_rules = push_array (arena , String8 , result .row_exprs_count );
291- result .row_members = push_array (arena , E_Member * , result .row_exprs_count );
291+ result .row_members = push_array (arena , E_Member * , result .row_exprs_count );
292292 for EachIndex (row_expr_idx , result .row_exprs_count )
293293 {
294294 result .row_members [row_expr_idx ] = & e_member_nil ;
@@ -298,27 +298,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
298298 return result ;
299299}
300300
301- ////////////////////////////////
302- //~ rjf: "array"
303-
304- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (array )
305- {
306- Temp scratch = scratch_begin (& arena , 1 );
307- E_IRTreeAndType irtree = e_irtree_and_type_from_expr (scratch .arena , expr );
308- E_TypeKey type_key = irtree .type_key ;
309- E_TypeKind type_kind = e_type_kind_from_key (type_key );
310- if (e_type_kind_is_pointer_or_ref (type_kind ))
311- {
312- E_Value count = ev_value_from_params (params );
313- E_TypeKey element_type_key = e_type_ptee_from_key (type_key );
314- E_TypeKey array_type_key = e_type_key_cons_array (element_type_key , count .u64 );
315- E_TypeKey ptr_type_key = e_type_key_cons_ptr (e_type_state -> ctx -> primary_module -> arch , array_type_key , 0 );
316- expr = e_expr_ref_cast (arena , ptr_type_key , expr );
317- }
318- scratch_end (scratch );
319- return expr ;
320- }
321-
322301////////////////////////////////
323302//~ rjf: "list"
324303
@@ -333,257 +312,3 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list)
333312 EV_ExpandRangeInfo info = {0 };
334313 return info ;
335314}
336-
337- ////////////////////////////////
338- //~ rjf: "slice"
339-
340- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (slice )
341- {
342- Temp scratch = scratch_begin (& arena , 1 );
343- E_IRTreeAndType irtree = e_irtree_and_type_from_expr (scratch .arena , expr );
344- E_TypeKind type_kind = e_type_kind_from_key (irtree .type_key );
345- if (type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class )
346- {
347- // rjf: unpack members
348- E_MemberArray members = e_type_data_members_from_key__cached (irtree .type_key );
349-
350- // rjf: choose base pointer & count members
351- E_Member * base_ptr_member = 0 ;
352- E_Member * count_member = 0 ;
353- for (U64 idx = 0 ; idx < members .count ; idx += 1 )
354- {
355- E_Member * member = & members .v [idx ];
356- E_TypeKey member_type = e_type_unwrap (member -> type_key );
357- E_TypeKind member_type_kind = e_type_kind_from_key (member_type );
358- if (count_member == 0 && e_type_kind_is_integer (member_type_kind ))
359- {
360- count_member = member ;
361- }
362- if (base_ptr_member == 0 && e_type_kind_is_pointer_or_ref (member_type_kind ))
363- {
364- base_ptr_member = & members .v [idx ];
365- }
366- if (count_member != 0 && base_ptr_member != 0 )
367- {
368- break ;
369- }
370- }
371-
372- // rjf: evaluate count member, determine count
373- U64 count = 0 ;
374- if (count_member != 0 )
375- {
376- E_Expr * count_member_expr = e_expr_ref_member_access (scratch .arena , expr , count_member -> name );
377- E_Eval count_member_eval = e_eval_from_expr (scratch .arena , count_member_expr );
378- E_Eval count_member_value_eval = e_value_eval_from_eval (count_member_eval );
379- count = count_member_value_eval .value .u64 ;
380- }
381-
382- // rjf: generate new struct slice type
383- E_TypeKey slice_type_key = zero_struct ;
384- if (base_ptr_member != 0 && count_member != 0 )
385- {
386- String8 struct_name = e_type_string_from_key (scratch .arena , irtree .type_key );
387- E_TypeKey element_type_key = e_type_ptee_from_key (base_ptr_member -> type_key );
388- E_TypeKey array_type_key = e_type_key_cons_array (element_type_key , count );
389- E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr (e_type_state -> ctx -> primary_module -> arch , array_type_key , 0 );
390- E_MemberList slice_type_members = {0 };
391- e_member_list_push (scratch .arena , & slice_type_members , count_member );
392- e_member_list_push (scratch .arena , & slice_type_members , & (E_Member ){.kind = E_MemberKind_DataField , .type_key = sized_base_ptr_type_key , .name = base_ptr_member -> name , .pretty_name = base_ptr_member -> pretty_name , .off = base_ptr_member -> off });
393- E_MemberArray slice_type_members_array = e_member_array_from_list (scratch .arena , & slice_type_members );
394- slice_type_key = e_type_key_cons (.arch = e_type_state -> ctx -> primary_module -> arch ,
395- .kind = E_TypeKind_Struct ,
396- .name = struct_name ,
397- .members = slice_type_members_array .v ,
398- .count = slice_type_members_array .count );
399- }
400-
401- // rjf: generate new expression tree - addr of struct, cast-to-ptr, deref
402- if (base_ptr_member != 0 && count_member != 0 )
403- {
404- expr = e_expr_ref_addr (arena , expr );
405- expr = e_expr_ref_cast (arena , e_type_key_cons_ptr (e_type_state -> ctx -> primary_module -> arch , slice_type_key , 0 ), expr );
406- expr = e_expr_ref_deref (arena , expr );
407- }
408- }
409- scratch_end (scratch );
410- return expr ;
411- }
412-
413- ////////////////////////////////
414- //~ rjf: "bswap"
415-
416- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (bswap )
417- {
418- expr = e_expr_ref_bswap (arena , expr );
419- return expr ;
420- }
421-
422- ////////////////////////////////
423- //~ rjf: "cast"
424-
425- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (cast )
426- {
427- E_TypeKey type_key = ev_type_key_from_params (params );
428- expr = e_expr_ref_cast (arena , type_key , expr );
429- return expr ;
430- }
431-
432- ////////////////////////////////
433- //~ rjf: "wrap"
434-
435- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (wrap )
436- {
437- String8 wrap_string = md_string_from_children (arena , params );
438- E_Expr * wrap_expr = e_parse_expr_from_text (arena , wrap_string );
439- E_Expr * new_root_expr = wrap_expr ;
440- if (wrap_expr != & e_expr_nil )
441- {
442- Temp scratch = scratch_begin (& arena , 1 );
443- typedef struct Task Task ;
444- struct Task
445- {
446- Task * next ;
447- E_Expr * parent ;
448- E_Expr * expr ;
449- };
450- Task start_task = {0 , & e_expr_nil , wrap_expr };
451- Task * first_task = & start_task ;
452- Task * last_task = first_task ;
453- for (Task * t = first_task ; t != 0 ; t = t -> next )
454- {
455- if (t -> expr -> kind == E_ExprKind_LeafIdent && str8_match (t -> expr -> string , str8_lit ("$expr" ), 0 ))
456- {
457- E_Expr * original_expr_ref = e_expr_ref (arena , expr );
458- if (t -> parent != & e_expr_nil )
459- {
460- e_expr_insert_child (t -> parent , t -> expr , original_expr_ref );
461- e_expr_remove_child (t -> parent , t -> expr );
462- }
463- else
464- {
465- new_root_expr = original_expr_ref ;
466- }
467- }
468- else for (E_Expr * child = t -> expr -> first ; child != & e_expr_nil ; child = child -> next )
469- {
470- Task * task = push_array (scratch .arena , Task , 1 );
471- SLLQueuePush (first_task , last_task , task );
472- task -> parent = t -> expr ;
473- task -> expr = child ;
474- }
475- }
476- scratch_end (scratch );
477- }
478- return new_root_expr ;
479- }
480-
481- ////////////////////////////////
482- //~ rjf: "only"
483-
484- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (only )
485- {
486- Temp scratch = scratch_begin (& arena , 1 );
487- E_IRTreeAndType irtree = e_irtree_and_type_from_expr (scratch .arena , expr );
488- E_TypeKey type_key = irtree .type_key ;
489- E_TypeKind type_kind = e_type_kind_from_key (type_key );
490- E_TypeKey direct_type_key = e_type_direct_from_key (type_key );
491- E_TypeKind direct_type_kind = e_type_kind_from_key (direct_type_key );
492- B32 is_ptr = e_type_kind_is_pointer_or_ref (type_kind );
493- E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key ;
494- E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind ;
495- if (struct_type_kind == E_TypeKind_Struct ||
496- struct_type_kind == E_TypeKind_Union ||
497- struct_type_kind == E_TypeKind_Class )
498- {
499- E_MemberArray current_members = e_type_data_members_from_key__cached (struct_type_key );
500- E_MemberList new_members = {0 };
501- for MD_EachNode (node , params -> first )
502- {
503- for EachIndex (idx , current_members .count )
504- {
505- if (str8_match (node -> string , current_members .v [idx ].name , 0 ))
506- {
507- e_member_list_push (scratch .arena , & new_members , & current_members .v [idx ]);
508- break ;
509- }
510- }
511- }
512- E_MemberArray new_members_array = e_member_array_from_list (scratch .arena , & new_members );
513- E_TypeKey new_type = {0 };
514- if (new_members_array .count == 1 && new_members_array .v [0 ].off == 0 )
515- {
516- new_type = new_members_array .v [0 ].type_key ;
517- }
518- else
519- {
520- String8 struct_name = e_type_string_from_key (scratch .arena , struct_type_key );
521- new_type = e_type_key_cons (.kind = E_TypeKind_Struct , .name = struct_name , .members = new_members_array .v , .count = new_members_array .count );
522- }
523- if (!is_ptr )
524- {
525- expr = e_expr_ref_addr (arena , expr );
526- }
527- expr = e_expr_ref_cast (arena , e_type_key_cons_ptr (e_type_state -> ctx -> primary_module -> arch , new_type , 0 ), expr );
528- if (!is_ptr )
529- {
530- expr = e_expr_ref_deref (arena , expr );
531- }
532- }
533- scratch_end (scratch );
534- return expr ;
535- }
536-
537- ////////////////////////////////
538- //~ rjf: "omit"
539-
540- EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF (omit )
541- {
542- Temp scratch = scratch_begin (& arena , 1 );
543- E_IRTreeAndType irtree = e_irtree_and_type_from_expr (scratch .arena , expr );
544- E_TypeKey type_key = irtree .type_key ;
545- E_TypeKind type_kind = e_type_kind_from_key (type_key );
546- E_TypeKey direct_type_key = e_type_direct_from_key (type_key );
547- E_TypeKind direct_type_kind = e_type_kind_from_key (direct_type_key );
548- B32 is_ptr = e_type_kind_is_pointer_or_ref (type_kind );
549- E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key ;
550- E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind ;
551- if (struct_type_kind == E_TypeKind_Struct ||
552- struct_type_kind == E_TypeKind_Union ||
553- struct_type_kind == E_TypeKind_Class )
554- {
555- E_MemberArray current_members = e_type_data_members_from_key__cached (struct_type_key );
556- E_MemberList new_members = {0 };
557- for EachIndex (idx , current_members .count )
558- {
559- B32 include = 1 ;
560- for MD_EachNode (node , params -> first )
561- {
562- if (str8_match (node -> string , current_members .v [idx ].name , 0 ))
563- {
564- include = 0 ;
565- break ;
566- }
567- }
568- if (include )
569- {
570- e_member_list_push (scratch .arena , & new_members , & current_members .v [idx ]);
571- }
572- }
573- E_MemberArray new_members_array = e_member_array_from_list (scratch .arena , & new_members );
574- E_TypeKey new_type = {0 };
575- String8 struct_name = e_type_string_from_key (scratch .arena , struct_type_key );
576- new_type = e_type_key_cons (.kind = E_TypeKind_Struct , .name = struct_name , .members = new_members_array .v , .count = new_members_array .count );
577- if (!is_ptr )
578- {
579- expr = e_expr_ref_addr (arena , expr );
580- }
581- expr = e_expr_ref_cast (arena , e_type_key_cons_ptr (e_type_state -> ctx -> primary_module -> arch , new_type , 0 ), expr );
582- if (!is_ptr )
583- {
584- expr = e_expr_ref_deref (arena , expr );
585- }
586- }
587- scratch_end (scratch );
588- return expr ;
589- }
0 commit comments