mt-lang 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/milk_tea/base.rb +1 -1
- data/lib/milk_tea/core/c_backend/expressions.rb +6 -1
- data/lib/milk_tea/core/c_backend/feature_detection.rb +27 -55
- data/lib/milk_tea/core/c_backend/format_helpers.rb +551 -0
- data/lib/milk_tea/core/c_backend/runtime_helpers.rb +0 -542
- data/lib/milk_tea/core/c_backend/statements.rb +4 -0
- data/lib/milk_tea/core/c_backend/type_collectors.rb +51 -204
- data/lib/milk_tea/core/c_backend.rb +10 -0
- data/lib/milk_tea/core/compatibility_helpers.rb +1 -1
- data/lib/milk_tea/core/compile_time.rb +19 -1
- data/lib/milk_tea/core/ir.rb +3 -1
- data/lib/milk_tea/core/lowering/async/lowering.rb +147 -141
- data/lib/milk_tea/core/lowering/block.rb +761 -726
- data/lib/milk_tea/core/lowering/declarations.rb +2 -1
- data/lib/milk_tea/core/lowering/expressions.rb +94 -0
- data/lib/milk_tea/core/lowering/loops.rb +49 -0
- data/lib/milk_tea/core/lowering/resolve.rb +222 -215
- data/lib/milk_tea/core/lowering/utils.rb +0 -222
- data/lib/milk_tea/core/module_loader.rb +29 -48
- data/lib/milk_tea/core/parser/declarations.rb +2 -2
- data/lib/milk_tea/core/parser/recovery.rb +1 -1
- data/lib/milk_tea/core/parser.rb +1 -1
- data/lib/milk_tea/core/semantic_analyzer/expressions.rb +3 -120
- data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +116 -113
- data/lib/milk_tea/core/semantic_analyzer/generics.rb +346 -343
- data/lib/milk_tea/core/semantic_analyzer/statements.rb +37 -12
- data/lib/milk_tea/core/semantic_analyzer/top_level.rb +23 -0
- data/lib/milk_tea/core/types/predicates.rb +501 -499
- data/lib/milk_tea/core/types/visitor.rb +1 -1
- data/lib/milk_tea/tooling/error_formatter.rb +18 -14
- data/std/mem/ptr.mt +9 -0
- metadata +3 -2
|
@@ -483,45 +483,52 @@ module MilkTea
|
|
|
483
483
|
proc_types
|
|
484
484
|
end
|
|
485
485
|
|
|
486
|
-
def
|
|
487
|
-
statements.each do |
|
|
488
|
-
case
|
|
486
|
+
def each_ir_statement_for_type_collection(statements, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
487
|
+
statements.each do |stmt|
|
|
488
|
+
case stmt
|
|
489
489
|
when IR::LocalDecl
|
|
490
|
-
|
|
491
|
-
|
|
490
|
+
send(type_collector_method, stmt.type, accumulator, visited)
|
|
491
|
+
send(expression_walker_method, stmt.value, accumulator, visited) if stmt.value
|
|
492
492
|
when IR::Assignment
|
|
493
|
-
|
|
494
|
-
|
|
493
|
+
send(expression_walker_method, stmt.target, accumulator, visited)
|
|
494
|
+
send(expression_walker_method, stmt.value, accumulator, visited)
|
|
495
495
|
when IR::BlockStmt
|
|
496
|
-
|
|
496
|
+
each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
497
497
|
when IR::WhileStmt
|
|
498
|
-
|
|
499
|
-
|
|
498
|
+
send(expression_walker_method, stmt.condition, accumulator, visited)
|
|
499
|
+
each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
500
500
|
when IR::ForStmt
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
501
|
+
each_ir_statement_for_type_collection([stmt.init], type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
502
|
+
send(expression_walker_method, stmt.condition, accumulator, visited)
|
|
503
|
+
each_ir_statement_for_type_collection(stmt.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
504
|
+
each_ir_statement_for_type_collection([stmt.post], type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
505
505
|
when IR::IfStmt
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
506
|
+
send(expression_walker_method, stmt.condition, accumulator, visited)
|
|
507
|
+
each_ir_statement_for_type_collection(stmt.then_body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
508
|
+
each_ir_statement_for_type_collection(stmt.else_body, type_collector_method:, expression_walker_method:, accumulator:, visited:) if stmt.else_body
|
|
509
509
|
when IR::SwitchStmt
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
510
|
+
send(expression_walker_method, stmt.expression, accumulator, visited)
|
|
511
|
+
stmt.cases.each do |switch_case|
|
|
512
|
+
each_ir_statement_for_type_collection(switch_case.body, type_collector_method:, expression_walker_method:, accumulator:, visited:)
|
|
513
513
|
end
|
|
514
514
|
when IR::StaticAssert
|
|
515
|
-
|
|
516
|
-
|
|
515
|
+
send(expression_walker_method, stmt.condition, accumulator, visited)
|
|
516
|
+
send(expression_walker_method, stmt.message, accumulator, visited)
|
|
517
517
|
when IR::ReturnStmt
|
|
518
|
-
|
|
518
|
+
send(expression_walker_method, stmt.value, accumulator, visited) if stmt.value
|
|
519
519
|
when IR::ExpressionStmt
|
|
520
|
-
|
|
520
|
+
send(expression_walker_method, stmt.expression, accumulator, visited)
|
|
521
521
|
end
|
|
522
522
|
end
|
|
523
523
|
end
|
|
524
524
|
|
|
525
|
+
def collect_proc_types_from_statements(statements, proc_types, visited)
|
|
526
|
+
each_ir_statement_for_type_collection(statements,
|
|
527
|
+
type_collector_method: :collect_proc_type,
|
|
528
|
+
expression_walker_method: :collect_proc_types_from_expression,
|
|
529
|
+
accumulator: proc_types, visited:)
|
|
530
|
+
end
|
|
531
|
+
|
|
525
532
|
def collect_proc_types_from_expression(expression, proc_types, visited)
|
|
526
533
|
case expression
|
|
527
534
|
when IR::Member
|
|
@@ -610,42 +617,10 @@ module MilkTea
|
|
|
610
617
|
end
|
|
611
618
|
|
|
612
619
|
def collect_task_types_from_statements(statements, task_types, visited)
|
|
613
|
-
statements
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
collect_task_types_from_expression(statement.value, task_types, visited)
|
|
618
|
-
when IR::Assignment
|
|
619
|
-
collect_task_types_from_expression(statement.target, task_types, visited)
|
|
620
|
-
collect_task_types_from_expression(statement.value, task_types, visited)
|
|
621
|
-
when IR::BlockStmt
|
|
622
|
-
collect_task_types_from_statements(statement.body, task_types, visited)
|
|
623
|
-
when IR::WhileStmt
|
|
624
|
-
collect_task_types_from_expression(statement.condition, task_types, visited)
|
|
625
|
-
collect_task_types_from_statements(statement.body, task_types, visited)
|
|
626
|
-
when IR::ForStmt
|
|
627
|
-
collect_task_types_from_statements([statement.init], task_types, visited)
|
|
628
|
-
collect_task_types_from_expression(statement.condition, task_types, visited)
|
|
629
|
-
collect_task_types_from_statements(statement.body, task_types, visited)
|
|
630
|
-
collect_task_types_from_statements([statement.post], task_types, visited)
|
|
631
|
-
when IR::IfStmt
|
|
632
|
-
collect_task_types_from_expression(statement.condition, task_types, visited)
|
|
633
|
-
collect_task_types_from_statements(statement.then_body, task_types, visited)
|
|
634
|
-
collect_task_types_from_statements(statement.else_body, task_types, visited) if statement.else_body
|
|
635
|
-
when IR::SwitchStmt
|
|
636
|
-
collect_task_types_from_expression(statement.expression, task_types, visited)
|
|
637
|
-
statement.cases.each do |switch_case|
|
|
638
|
-
collect_task_types_from_statements(switch_case.body, task_types, visited)
|
|
639
|
-
end
|
|
640
|
-
when IR::StaticAssert
|
|
641
|
-
collect_task_types_from_expression(statement.condition, task_types, visited)
|
|
642
|
-
collect_task_types_from_expression(statement.message, task_types, visited)
|
|
643
|
-
when IR::ReturnStmt
|
|
644
|
-
collect_task_types_from_expression(statement.value, task_types, visited) if statement.value
|
|
645
|
-
when IR::ExpressionStmt
|
|
646
|
-
collect_task_types_from_expression(statement.expression, task_types, visited)
|
|
647
|
-
end
|
|
648
|
-
end
|
|
620
|
+
each_ir_statement_for_type_collection(statements,
|
|
621
|
+
type_collector_method: :collect_task_type,
|
|
622
|
+
expression_walker_method: :collect_task_types_from_expression,
|
|
623
|
+
accumulator: task_types, visited:)
|
|
649
624
|
end
|
|
650
625
|
|
|
651
626
|
def collect_task_types_from_expression(expression, task_types, visited)
|
|
@@ -771,42 +746,10 @@ module MilkTea
|
|
|
771
746
|
end
|
|
772
747
|
|
|
773
748
|
def collect_generic_variant_types_from_statements(statements, generic_variant_types, visited)
|
|
774
|
-
statements
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited)
|
|
779
|
-
when IR::Assignment
|
|
780
|
-
collect_generic_variant_types_from_expression(statement.target, generic_variant_types, visited)
|
|
781
|
-
collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited)
|
|
782
|
-
when IR::BlockStmt
|
|
783
|
-
collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
|
|
784
|
-
when IR::WhileStmt
|
|
785
|
-
collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
|
|
786
|
-
collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
|
|
787
|
-
when IR::ForStmt
|
|
788
|
-
collect_generic_variant_types_from_statements([statement.init], generic_variant_types, visited)
|
|
789
|
-
collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
|
|
790
|
-
collect_generic_variant_types_from_statements(statement.body, generic_variant_types, visited)
|
|
791
|
-
collect_generic_variant_types_from_statements([statement.post], generic_variant_types, visited)
|
|
792
|
-
when IR::IfStmt
|
|
793
|
-
collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
|
|
794
|
-
collect_generic_variant_types_from_statements(statement.then_body, generic_variant_types, visited)
|
|
795
|
-
collect_generic_variant_types_from_statements(statement.else_body, generic_variant_types, visited) if statement.else_body
|
|
796
|
-
when IR::SwitchStmt
|
|
797
|
-
collect_generic_variant_types_from_expression(statement.expression, generic_variant_types, visited)
|
|
798
|
-
statement.cases.each do |switch_case|
|
|
799
|
-
collect_generic_variant_types_from_statements(switch_case.body, generic_variant_types, visited)
|
|
800
|
-
end
|
|
801
|
-
when IR::StaticAssert
|
|
802
|
-
collect_generic_variant_types_from_expression(statement.condition, generic_variant_types, visited)
|
|
803
|
-
collect_generic_variant_types_from_expression(statement.message, generic_variant_types, visited)
|
|
804
|
-
when IR::ReturnStmt
|
|
805
|
-
collect_generic_variant_types_from_expression(statement.value, generic_variant_types, visited) if statement.value
|
|
806
|
-
when IR::ExpressionStmt
|
|
807
|
-
collect_generic_variant_types_from_expression(statement.expression, generic_variant_types, visited)
|
|
808
|
-
end
|
|
809
|
-
end
|
|
749
|
+
each_ir_statement_for_type_collection(statements,
|
|
750
|
+
type_collector_method: :collect_generic_variant_type,
|
|
751
|
+
expression_walker_method: :collect_generic_variant_types_from_expression,
|
|
752
|
+
accumulator: generic_variant_types, visited:)
|
|
810
753
|
end
|
|
811
754
|
|
|
812
755
|
def collect_generic_variant_types_from_expression(expression, generic_variant_types, visited)
|
|
@@ -981,42 +924,10 @@ module MilkTea
|
|
|
981
924
|
end
|
|
982
925
|
|
|
983
926
|
def collect_str_buffer_types_from_statements(statements, str_buffer_types, visited)
|
|
984
|
-
statements
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited)
|
|
989
|
-
when IR::Assignment
|
|
990
|
-
collect_str_buffer_types_from_expression(statement.target, str_buffer_types, visited)
|
|
991
|
-
collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited)
|
|
992
|
-
when IR::BlockStmt
|
|
993
|
-
collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
|
|
994
|
-
when IR::WhileStmt
|
|
995
|
-
collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
|
|
996
|
-
collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
|
|
997
|
-
when IR::ForStmt
|
|
998
|
-
collect_str_buffer_types_from_statements([statement.init], str_buffer_types, visited)
|
|
999
|
-
collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
|
|
1000
|
-
collect_str_buffer_types_from_statements(statement.body, str_buffer_types, visited)
|
|
1001
|
-
collect_str_buffer_types_from_statements([statement.post], str_buffer_types, visited)
|
|
1002
|
-
when IR::IfStmt
|
|
1003
|
-
collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
|
|
1004
|
-
collect_str_buffer_types_from_statements(statement.then_body, str_buffer_types, visited)
|
|
1005
|
-
collect_str_buffer_types_from_statements(statement.else_body, str_buffer_types, visited) if statement.else_body
|
|
1006
|
-
when IR::SwitchStmt
|
|
1007
|
-
collect_str_buffer_types_from_expression(statement.expression, str_buffer_types, visited)
|
|
1008
|
-
statement.cases.each do |switch_case|
|
|
1009
|
-
collect_str_buffer_types_from_statements(switch_case.body, str_buffer_types, visited)
|
|
1010
|
-
end
|
|
1011
|
-
when IR::StaticAssert
|
|
1012
|
-
collect_str_buffer_types_from_expression(statement.condition, str_buffer_types, visited)
|
|
1013
|
-
collect_str_buffer_types_from_expression(statement.message, str_buffer_types, visited)
|
|
1014
|
-
when IR::ReturnStmt
|
|
1015
|
-
collect_str_buffer_types_from_expression(statement.value, str_buffer_types, visited) if statement.value
|
|
1016
|
-
when IR::ExpressionStmt
|
|
1017
|
-
collect_str_buffer_types_from_expression(statement.expression, str_buffer_types, visited)
|
|
1018
|
-
end
|
|
1019
|
-
end
|
|
927
|
+
each_ir_statement_for_type_collection(statements,
|
|
928
|
+
type_collector_method: :collect_str_buffer_type,
|
|
929
|
+
expression_walker_method: :collect_str_buffer_types_from_expression,
|
|
930
|
+
accumulator: str_buffer_types, visited:)
|
|
1020
931
|
end
|
|
1021
932
|
|
|
1022
933
|
def collect_str_buffer_types_from_expression(expression, str_buffer_types, visited)
|
|
@@ -1100,42 +1011,10 @@ module MilkTea
|
|
|
1100
1011
|
end
|
|
1101
1012
|
|
|
1102
1013
|
def collect_generic_struct_types_from_statements(statements, generic_struct_types, visited)
|
|
1103
|
-
statements
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited)
|
|
1108
|
-
when IR::Assignment
|
|
1109
|
-
collect_generic_struct_types_from_expression(statement.target, generic_struct_types, visited)
|
|
1110
|
-
collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited)
|
|
1111
|
-
when IR::BlockStmt
|
|
1112
|
-
collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
|
|
1113
|
-
when IR::WhileStmt
|
|
1114
|
-
collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
|
|
1115
|
-
collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
|
|
1116
|
-
when IR::ForStmt
|
|
1117
|
-
collect_generic_struct_types_from_statements([statement.init], generic_struct_types, visited)
|
|
1118
|
-
collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
|
|
1119
|
-
collect_generic_struct_types_from_statements(statement.body, generic_struct_types, visited)
|
|
1120
|
-
collect_generic_struct_types_from_statements([statement.post], generic_struct_types, visited)
|
|
1121
|
-
when IR::IfStmt
|
|
1122
|
-
collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
|
|
1123
|
-
collect_generic_struct_types_from_statements(statement.then_body, generic_struct_types, visited)
|
|
1124
|
-
collect_generic_struct_types_from_statements(statement.else_body, generic_struct_types, visited) if statement.else_body
|
|
1125
|
-
when IR::SwitchStmt
|
|
1126
|
-
collect_generic_struct_types_from_expression(statement.expression, generic_struct_types, visited)
|
|
1127
|
-
statement.cases.each do |switch_case|
|
|
1128
|
-
collect_generic_struct_types_from_statements(switch_case.body, generic_struct_types, visited)
|
|
1129
|
-
end
|
|
1130
|
-
when IR::StaticAssert
|
|
1131
|
-
collect_generic_struct_types_from_expression(statement.condition, generic_struct_types, visited)
|
|
1132
|
-
collect_generic_struct_types_from_expression(statement.message, generic_struct_types, visited)
|
|
1133
|
-
when IR::ReturnStmt
|
|
1134
|
-
collect_generic_struct_types_from_expression(statement.value, generic_struct_types, visited) if statement.value
|
|
1135
|
-
when IR::ExpressionStmt
|
|
1136
|
-
collect_generic_struct_types_from_expression(statement.expression, generic_struct_types, visited)
|
|
1137
|
-
end
|
|
1138
|
-
end
|
|
1014
|
+
each_ir_statement_for_type_collection(statements,
|
|
1015
|
+
type_collector_method: :collect_generic_struct_type,
|
|
1016
|
+
expression_walker_method: :collect_generic_struct_types_from_expression,
|
|
1017
|
+
accumulator: generic_struct_types, visited:)
|
|
1139
1018
|
end
|
|
1140
1019
|
|
|
1141
1020
|
def collect_generic_struct_types_from_expression(expression, generic_struct_types, visited)
|
|
@@ -1221,42 +1100,10 @@ module MilkTea
|
|
|
1221
1100
|
end
|
|
1222
1101
|
|
|
1223
1102
|
def collect_span_types_from_statements(statements, span_types, visited)
|
|
1224
|
-
statements
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
collect_span_types_from_expression(statement.value, span_types, visited)
|
|
1229
|
-
when IR::Assignment
|
|
1230
|
-
collect_span_types_from_expression(statement.target, span_types, visited)
|
|
1231
|
-
collect_span_types_from_expression(statement.value, span_types, visited)
|
|
1232
|
-
when IR::BlockStmt
|
|
1233
|
-
collect_span_types_from_statements(statement.body, span_types, visited)
|
|
1234
|
-
when IR::WhileStmt
|
|
1235
|
-
collect_span_types_from_expression(statement.condition, span_types, visited)
|
|
1236
|
-
collect_span_types_from_statements(statement.body, span_types, visited)
|
|
1237
|
-
when IR::ForStmt
|
|
1238
|
-
collect_span_types_from_statements([statement.init], span_types, visited)
|
|
1239
|
-
collect_span_types_from_expression(statement.condition, span_types, visited)
|
|
1240
|
-
collect_span_types_from_statements(statement.body, span_types, visited)
|
|
1241
|
-
collect_span_types_from_statements([statement.post], span_types, visited)
|
|
1242
|
-
when IR::IfStmt
|
|
1243
|
-
collect_span_types_from_expression(statement.condition, span_types, visited)
|
|
1244
|
-
collect_span_types_from_statements(statement.then_body, span_types, visited)
|
|
1245
|
-
collect_span_types_from_statements(statement.else_body, span_types, visited) if statement.else_body
|
|
1246
|
-
when IR::SwitchStmt
|
|
1247
|
-
collect_span_types_from_expression(statement.expression, span_types, visited)
|
|
1248
|
-
statement.cases.each do |switch_case|
|
|
1249
|
-
collect_span_types_from_statements(switch_case.body, span_types, visited)
|
|
1250
|
-
end
|
|
1251
|
-
when IR::StaticAssert
|
|
1252
|
-
collect_span_types_from_expression(statement.condition, span_types, visited)
|
|
1253
|
-
collect_span_types_from_expression(statement.message, span_types, visited)
|
|
1254
|
-
when IR::ReturnStmt
|
|
1255
|
-
collect_span_types_from_expression(statement.value, span_types, visited) if statement.value
|
|
1256
|
-
when IR::ExpressionStmt
|
|
1257
|
-
collect_span_types_from_expression(statement.expression, span_types, visited)
|
|
1258
|
-
end
|
|
1259
|
-
end
|
|
1103
|
+
each_ir_statement_for_type_collection(statements,
|
|
1104
|
+
type_collector_method: :collect_span_type,
|
|
1105
|
+
expression_walker_method: :collect_span_types_from_expression,
|
|
1106
|
+
accumulator: span_types, visited:)
|
|
1260
1107
|
end
|
|
1261
1108
|
|
|
1262
1109
|
def collect_span_types_from_expression(expression, span_types, visited)
|
|
@@ -10,6 +10,7 @@ require_relative "c_backend/control_flow_emission"
|
|
|
10
10
|
require_relative "c_backend/runtime_helpers"
|
|
11
11
|
require_relative "c_backend/type_declaration"
|
|
12
12
|
require_relative "c_backend/expressions"
|
|
13
|
+
require_relative "c_backend/format_helpers"
|
|
13
14
|
require_relative "c_backend/reinterpret"
|
|
14
15
|
|
|
15
16
|
module MilkTea
|
|
@@ -54,6 +55,8 @@ module MilkTea
|
|
|
54
55
|
@checked_index_alias_id = 0
|
|
55
56
|
@loop_guard_id = 0
|
|
56
57
|
@emitted_span_type_names = Set.new
|
|
58
|
+
@source_path = program.source_path
|
|
59
|
+
@current_line = nil
|
|
57
60
|
end
|
|
58
61
|
|
|
59
62
|
def emit
|
|
@@ -217,10 +220,16 @@ module MilkTea
|
|
|
217
220
|
end
|
|
218
221
|
|
|
219
222
|
constants.each do |constant|
|
|
223
|
+
@current_line = constant.line if constant.line
|
|
224
|
+
@source_path ||= constant.source_path if constant.source_path
|
|
220
225
|
lines << "#{constant_storage(constant.type)} #{c_declaration(constant.type, constant.linkage_name)} = #{emit_initializer(constant.value)};"
|
|
221
226
|
end
|
|
222
227
|
@program.globals.each do |global|
|
|
223
228
|
next unless emitted_globals.include?(global)
|
|
229
|
+
if global.respond_to?(:line) && global.line
|
|
230
|
+
@current_line = global.line
|
|
231
|
+
@source_path ||= global.source_path if global.respond_to?(:source_path) && global.source_path
|
|
232
|
+
end
|
|
224
233
|
lines << "#{global_storage(global.type)} #{c_declaration(global.type, global.linkage_name)} = #{emit_initializer(global.value)};"
|
|
225
234
|
end
|
|
226
235
|
lines << "" unless constants.empty? && @program.globals.empty?
|
|
@@ -288,6 +297,7 @@ module MilkTea
|
|
|
288
297
|
include Statements
|
|
289
298
|
include ControlFlowEmission
|
|
290
299
|
include RuntimeHelpers
|
|
300
|
+
include FormatHelpers
|
|
291
301
|
include TypeDeclaration
|
|
292
302
|
include Expressions
|
|
293
303
|
include Reinterpret
|
|
@@ -114,7 +114,12 @@ module MilkTea
|
|
|
114
114
|
else
|
|
115
115
|
@checker.instance_variable_get(:@ctx).types
|
|
116
116
|
end
|
|
117
|
-
|
|
117
|
+
callee_name = if call_expr.callee.is_a?(AST::Specialization) && call_expr.callee.callee.respond_to?(:name)
|
|
118
|
+
call_expr.callee.callee.name
|
|
119
|
+
elsif call_expr.callee.respond_to?(:name)
|
|
120
|
+
call_expr.callee.name
|
|
121
|
+
end
|
|
122
|
+
if callee_name && (type = types[callee_name]) && type.is_a?(Types::Struct)
|
|
118
123
|
fields = {}
|
|
119
124
|
call_expr.arguments.each do |argument|
|
|
120
125
|
val = evaluate_expression(argument.value, scopes:)
|
|
@@ -123,6 +128,19 @@ module MilkTea
|
|
|
123
128
|
end
|
|
124
129
|
next fields
|
|
125
130
|
end
|
|
131
|
+
|
|
132
|
+
if call_expr.callee.is_a?(AST::Specialization) && @checker.respond_to?(:resolve_type_expression)
|
|
133
|
+
resolved = @checker.send(:resolve_type_expression, call_expr.callee)
|
|
134
|
+
if resolved && @checker.respond_to?(:array_type?) && @checker.send(:array_type?, resolved)
|
|
135
|
+
values = []
|
|
136
|
+
call_expr.arguments.each do |argument|
|
|
137
|
+
val = evaluate_expression(argument.value, scopes:)
|
|
138
|
+
return nil unless val
|
|
139
|
+
values << val
|
|
140
|
+
end
|
|
141
|
+
next values
|
|
142
|
+
end
|
|
143
|
+
end
|
|
126
144
|
|
|
127
145
|
@checker.send(:evaluate_compile_time_const_value, call_expr, scopes:)
|
|
128
146
|
},
|
data/lib/milk_tea/core/ir.rb
CHANGED
|
@@ -6,7 +6,9 @@ module MilkTea
|
|
|
6
6
|
def initialize(module_name:, includes:, constants:, globals:, opaques:, structs:, unions:, enums:, variants:, static_asserts:, functions:, source_path: nil) = super
|
|
7
7
|
end
|
|
8
8
|
Include = Data.define(:header)
|
|
9
|
-
Constant = Data.define(:name, :linkage_name, :type, :value)
|
|
9
|
+
Constant = Data.define(:name, :linkage_name, :type, :value, :line, :source_path) do
|
|
10
|
+
def initialize(name:, linkage_name:, type:, value:, line: nil, source_path: nil) = super
|
|
11
|
+
end
|
|
10
12
|
Global = Data.define(:name, :linkage_name, :type, :value)
|
|
11
13
|
OpaqueDecl = Data.define(:name, :linkage_name, :forward_declarable, :source_module) do
|
|
12
14
|
def initialize(name:, linkage_name:, forward_declarable:, source_module: nil) = super
|