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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/milk_tea/base.rb +1 -1
  3. data/lib/milk_tea/core/c_backend/expressions.rb +6 -1
  4. data/lib/milk_tea/core/c_backend/feature_detection.rb +27 -55
  5. data/lib/milk_tea/core/c_backend/format_helpers.rb +551 -0
  6. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +0 -542
  7. data/lib/milk_tea/core/c_backend/statements.rb +4 -0
  8. data/lib/milk_tea/core/c_backend/type_collectors.rb +51 -204
  9. data/lib/milk_tea/core/c_backend.rb +10 -0
  10. data/lib/milk_tea/core/compatibility_helpers.rb +1 -1
  11. data/lib/milk_tea/core/compile_time.rb +19 -1
  12. data/lib/milk_tea/core/ir.rb +3 -1
  13. data/lib/milk_tea/core/lowering/async/lowering.rb +147 -141
  14. data/lib/milk_tea/core/lowering/block.rb +761 -726
  15. data/lib/milk_tea/core/lowering/declarations.rb +2 -1
  16. data/lib/milk_tea/core/lowering/expressions.rb +94 -0
  17. data/lib/milk_tea/core/lowering/loops.rb +49 -0
  18. data/lib/milk_tea/core/lowering/resolve.rb +222 -215
  19. data/lib/milk_tea/core/lowering/utils.rb +0 -222
  20. data/lib/milk_tea/core/module_loader.rb +29 -48
  21. data/lib/milk_tea/core/parser/declarations.rb +2 -2
  22. data/lib/milk_tea/core/parser/recovery.rb +1 -1
  23. data/lib/milk_tea/core/parser.rb +1 -1
  24. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +3 -120
  25. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +116 -113
  26. data/lib/milk_tea/core/semantic_analyzer/generics.rb +346 -343
  27. data/lib/milk_tea/core/semantic_analyzer/statements.rb +37 -12
  28. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +23 -0
  29. data/lib/milk_tea/core/types/predicates.rb +501 -499
  30. data/lib/milk_tea/core/types/visitor.rb +1 -1
  31. data/lib/milk_tea/tooling/error_formatter.rb +18 -14
  32. data/std/mem/ptr.mt +9 -0
  33. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7cd20acdc903389647adc4c6c7e552fdbbf35694f69328b0427134109782b21f
4
- data.tar.gz: 5cc1498f88f6ddb87eaa2d7a7da9f54c76a6ee9a38fe3e33f68ddc6120160057
3
+ metadata.gz: 2d5caebfa149a9d43d576f3cbf1b36b175ce70b28bfe474bc942fc2d11f0f1e8
4
+ data.tar.gz: bf9f4a30b1cabadbed2b2d276dd29d567e118d008000791eefb2ec0e81f80c4f
5
5
  SHA512:
6
- metadata.gz: bcf70e8639131a5d7198028d7f70e632ebb817eba816635d24d753dfa4023bc0364e0b8a6082f2ccd747d40bf7c5f7d778ad2efeb2b6283e6c10604a4f44492b
7
- data.tar.gz: b802f4c8cc2654c8464ec156967430573577a76316d916e31e5b043d81a61a8e2279bf5fadc037b38f2f388e3241507b4f17be08b78558fa2424da4b72315c31
6
+ metadata.gz: 681c1614c3449f16bb71fbb0f9ee7e9ec10420e302602b131c4ed813b087742e7474ff71e9111f5d35cb1e4315eb440c3c85e29d66e8c733159063cbe946ea01
7
+ data.tar.gz: 6ea9caabdb7407f64d634f6576135df74e614878f81680777062c2e5f64f75278bb56f71bb48406153e40745e2d2b458e99c46193c9c85837c2b28b3b7aca4b4
data/lib/milk_tea/base.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require "pathname"
4
4
 
5
5
  module MilkTea
6
- VERSION = "0.3.4"
6
+ VERSION = "0.3.6"
7
7
 
8
8
  def self.root
9
9
  @root ||= Pathname.new(File.expand_path("../..", __dir__))
@@ -33,7 +33,12 @@ module MilkTea
33
33
  when IR::NullableSpanIndex
34
34
  "#{nullable_span_index_helper_name(expression.receiver_type)}(#{emit_expression(expression.receiver)}, #{emit_expression(expression.index)})"
35
35
  when IR::Call
36
- raise CBackendError, "array-return call must be materialized before C emission" if array_type?(expression.type)
36
+ if array_type?(expression.type)
37
+ location = [@source_path, @current_line && "line #{@current_line}"].compact.join(" ")
38
+ msg = "array-return call must be materialized before C emission"
39
+ msg += " (#{location})" unless location.empty?
40
+ raise CBackendError.new(msg, line: @current_line, path: @source_path)
41
+ end
37
42
 
38
43
  emit_call_expression(expression)
39
44
  when IR::Unary
@@ -234,7 +234,7 @@ module MilkTea
234
234
  changed = false
235
235
 
236
236
  helpers.keys.each do |helper|
237
- format_helper_dependencies(helper).each do |dependency|
237
+ (FORMAT_HELPER_DEPENDENCIES[helper] || []).each do |dependency|
238
238
  next if helpers[dependency]
239
239
 
240
240
  helpers[dependency] = true
@@ -249,60 +249,32 @@ module MilkTea
249
249
  end
250
250
  end
251
251
 
252
- def format_helper_dependencies(helper)
253
- case helper
254
- when 'mt_format_append_str'
255
- %w[mt_format_append_bytes mt_format_check_capacity]
256
- when 'mt_format_append_cstr'
257
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_cstr_len]
258
- when 'mt_format_append_bool'
259
- %w[mt_format_append_bytes mt_format_check_capacity]
260
- when 'mt_format_append_ptr_uint'
261
- %w[mt_format_check_capacity mt_format_ptr_uint_len]
262
- when 'mt_format_append_ulong'
263
- %w[mt_format_check_capacity mt_format_ulong_len]
264
- when 'mt_format_append_uint'
265
- %w[mt_format_append_ptr_uint mt_format_check_capacity mt_format_ptr_uint_len]
266
- when 'mt_format_append_long'
267
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong mt_format_ulong_len]
268
- when 'mt_format_append_int'
269
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ptr_uint mt_format_ptr_uint_len]
270
- when 'mt_format_append_ulong_hex'
271
- %w[mt_format_check_capacity mt_format_ulong_hex_len]
272
- when 'mt_format_append_ulong_hex_upper'
273
- %w[mt_format_check_capacity mt_format_ulong_hex_len]
274
- when 'mt_format_append_long_hex'
275
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_hex mt_format_ulong_hex_len]
276
- when 'mt_format_append_long_hex_upper'
277
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_hex_upper mt_format_ulong_hex_len]
278
- when 'mt_format_append_ulong_oct'
279
- %w[mt_format_check_capacity mt_format_ulong_oct_len]
280
- when 'mt_format_append_long_oct'
281
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_oct mt_format_ulong_oct_len]
282
- when 'mt_format_append_ulong_bin'
283
- %w[mt_format_check_capacity mt_format_ulong_bin_len]
284
- when 'mt_format_append_long_bin'
285
- %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_bin mt_format_ulong_bin_len]
286
- when 'mt_format_append_float'
287
- %w[mt_format_check_capacity mt_format_float_len]
288
- when 'mt_format_append_double'
289
- %w[mt_format_check_capacity mt_format_double_len]
290
- when 'mt_format_append_double_precision'
291
- %w[mt_format_check_capacity mt_format_double_precision_len]
292
- when 'mt_format_int_len'
293
- %w[mt_format_ptr_uint_len]
294
- when 'mt_format_long_len'
295
- %w[mt_format_ulong_len]
296
- when 'mt_format_long_hex_len'
297
- %w[mt_format_ulong_hex_len]
298
- when 'mt_format_long_oct_len'
299
- %w[mt_format_ulong_oct_len]
300
- when 'mt_format_long_bin_len'
301
- %w[mt_format_ulong_bin_len]
302
- else
303
- []
304
- end
305
- end
252
+ FORMAT_HELPER_DEPENDENCIES = {
253
+ 'mt_format_append_str' => %w[mt_format_append_bytes mt_format_check_capacity],
254
+ 'mt_format_append_cstr' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_cstr_len],
255
+ 'mt_format_append_bool' => %w[mt_format_append_bytes mt_format_check_capacity],
256
+ 'mt_format_append_ptr_uint' => %w[mt_format_check_capacity mt_format_ptr_uint_len],
257
+ 'mt_format_append_ulong' => %w[mt_format_check_capacity mt_format_ulong_len],
258
+ 'mt_format_append_uint' => %w[mt_format_append_ptr_uint mt_format_check_capacity mt_format_ptr_uint_len],
259
+ 'mt_format_append_long' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong mt_format_ulong_len],
260
+ 'mt_format_append_int' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ptr_uint mt_format_ptr_uint_len],
261
+ 'mt_format_append_ulong_hex' => %w[mt_format_check_capacity mt_format_ulong_hex_len],
262
+ 'mt_format_append_ulong_hex_upper' => %w[mt_format_check_capacity mt_format_ulong_hex_len],
263
+ 'mt_format_append_long_hex' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_hex mt_format_ulong_hex_len],
264
+ 'mt_format_append_long_hex_upper' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_hex_upper mt_format_ulong_hex_len],
265
+ 'mt_format_append_ulong_oct' => %w[mt_format_check_capacity mt_format_ulong_oct_len],
266
+ 'mt_format_append_long_oct' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_oct mt_format_ulong_oct_len],
267
+ 'mt_format_append_ulong_bin' => %w[mt_format_check_capacity mt_format_ulong_bin_len],
268
+ 'mt_format_append_long_bin' => %w[mt_format_append_bytes mt_format_check_capacity mt_format_append_ulong_bin mt_format_ulong_bin_len],
269
+ 'mt_format_append_float' => %w[mt_format_check_capacity mt_format_float_len],
270
+ 'mt_format_append_double' => %w[mt_format_check_capacity mt_format_double_len],
271
+ 'mt_format_append_double_precision' => %w[mt_format_check_capacity mt_format_double_precision_len],
272
+ 'mt_format_int_len' => %w[mt_format_ptr_uint_len],
273
+ 'mt_format_long_len' => %w[mt_format_ulong_len],
274
+ 'mt_format_long_hex_len' => %w[mt_format_ulong_hex_len],
275
+ 'mt_format_long_oct_len' => %w[mt_format_ulong_oct_len],
276
+ 'mt_format_long_bin_len' => %w[mt_format_ulong_bin_len],
277
+ }.freeze
306
278
 
307
279
  def uses_format_helpers?
308
280
  !used_format_helpers.empty?