mt-lang 0.3.14 → 0.3.17

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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/docs/index.html +8 -8
  4. data/docs/language-design.md +7 -12
  5. data/docs/language-manual.md +20 -8
  6. data/lib/milk_tea/base.rb +1 -1
  7. data/lib/milk_tea/core/ast.rb +2 -2
  8. data/lib/milk_tea/core/{binding_types.rb → bindings.rb} +1 -1
  9. data/lib/milk_tea/core/c_backend.rb +14 -15
  10. data/lib/milk_tea/core/compile_time.rb +181 -2
  11. data/lib/milk_tea/core/control_flow/builder.rb +62 -2
  12. data/lib/milk_tea/core/control_flow/constant_propagation.rb +1 -1
  13. data/lib/milk_tea/core/{compatibility_helpers.rb → intrinsics.rb} +2 -2
  14. data/lib/milk_tea/core/lexer.rb +10 -14
  15. data/lib/milk_tea/core/lowering/async/analysis.rb +3 -9
  16. data/lib/milk_tea/core/lowering/async/lowering.rb +2 -10
  17. data/lib/milk_tea/core/lowering/async/normalization.rb +2 -7
  18. data/lib/milk_tea/core/lowering/block.rb +1 -5
  19. data/lib/milk_tea/core/lowering/proc.rb +1 -5
  20. data/lib/milk_tea/core/lowering/scans.rb +3 -1
  21. data/lib/milk_tea/core/lowering/utils.rb +1 -27
  22. data/lib/milk_tea/core/lowering.rb +18 -18
  23. data/lib/milk_tea/core/module_loader.rb +26 -15
  24. data/lib/milk_tea/core/parser/statements.rb +18 -12
  25. data/lib/milk_tea/core/parser.rb +17 -17
  26. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +3 -11
  27. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +2 -3
  28. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +1 -1
  29. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +1 -2
  30. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +2 -4
  31. data/lib/milk_tea/core/semantic_analyzer/statements.rb +2 -8
  32. data/lib/milk_tea/core/semantic_analyzer.rb +1 -1
  33. data/lib/milk_tea/core.rb +6 -2
  34. data/lib/milk_tea/dap/lldb_dap_backend.rb +153 -0
  35. data/lib/milk_tea/dap/server/lldb_backend.rb +1 -1
  36. data/lib/milk_tea/dap.rb +1 -1
  37. data/lib/milk_tea/lsp.rb +1 -7
  38. data/lib/milk_tea/{bindings/cli.rb → tooling/bindgen_cli.rb} +1 -1
  39. data/lib/milk_tea/tooling/linter/imports_platform.rb +2 -4
  40. data/lib/milk_tea/tooling/linter/release_rules.rb +1 -6
  41. data/lib/milk_tea/tooling/linter/source_helpers.rb +0 -6
  42. data/lib/milk_tea/tooling/linter/visitors.rb +4 -8
  43. data/lib/milk_tea/tooling/sexpr_dumper.rb +2 -0
  44. data/lib/milk_tea/tooling.rb +1 -1
  45. data/std/asset_pack.mt +1 -1
  46. data/std/async/libuv_runtime.mt +6 -6
  47. data/std/async/mailbox.mt +4 -4
  48. data/std/cookie.mt +2 -2
  49. data/std/crypto.mt +1 -1
  50. data/std/curl/runtime.mt +10 -10
  51. data/std/fs.linux.mt +26 -26
  52. data/std/fs.windows.mt +22 -22
  53. data/std/goap.mt +2 -2
  54. data/std/http/server.mt +21 -21
  55. data/std/http.mt +14 -14
  56. data/std/jobs.mt +4 -4
  57. data/std/json.mt +5 -5
  58. data/std/log.mt +1 -1
  59. data/std/mem/tracking.mt +1 -1
  60. data/std/net/channel.mt +4 -4
  61. data/std/net/clock.mt +6 -6
  62. data/std/net/discovery.mt +7 -7
  63. data/std/net/lobby.mt +10 -10
  64. data/std/net/manager.mt +1 -1
  65. data/std/net/mux.mt +4 -4
  66. data/std/net/nat.mt +4 -4
  67. data/std/net/packet.mt +3 -3
  68. data/std/net/punch.mt +3 -3
  69. data/std/net/rpc.mt +3 -3
  70. data/std/net/session.mt +15 -15
  71. data/std/net/stun.mt +4 -4
  72. data/std/net/turn.mt +4 -4
  73. data/std/oauth2.mt +12 -12
  74. data/std/path.mt +8 -8
  75. data/std/process.mt +4 -4
  76. data/std/raylib/packed_assets.mt +5 -5
  77. data/std/serialize.mt +1 -1
  78. data/std/tar.mt +10 -10
  79. data/std/terminal.mt +18 -18
  80. data/std/tls.mt +8 -8
  81. data/std/uri.mt +1 -1
  82. data/std/utility.mt +1 -1
  83. metadata +7 -9
  84. data/lib/milk_tea/core/compile_time/const_eval.rb +0 -182
  85. data/lib/milk_tea/core/module_loader/errors.rb +0 -23
  86. data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -156
  87. /data/lib/milk_tea/core/lowering/{async.rb → async/frame_builder.rb} +0 -0
data/std/oauth2.mt CHANGED
@@ -78,7 +78,7 @@ public function generate_pkce() -> Result[PkcePair, Error]:
78
78
  random_data.release()
79
79
 
80
80
  var challenge = crypto.sha256(text.as_byte_span(verifier.as_str()))
81
- defer challenge.release()
81
+ defer: challenge.release()
82
82
 
83
83
  let challenge_b64 = base64.encode_urlsafe(challenge.as_span())
84
84
 
@@ -141,9 +141,9 @@ function append_query_param(target: ref[string.String], key: str, value: str) ->
141
141
  target.push_byte(38)
142
142
 
143
143
  var encoded_key = url.percent_encode(key)
144
- defer encoded_key.release()
144
+ defer: encoded_key.release()
145
145
  var encoded_value = url.percent_encode(value)
146
- defer encoded_value.release()
146
+ defer: encoded_value.release()
147
147
 
148
148
  target.append(encoded_key.as_str())
149
149
  target.push_byte(61)
@@ -156,7 +156,7 @@ public async function exchange_code(
156
156
  pkce_verifier: Option[str]
157
157
  ) -> Result[Tokens, Error]:
158
158
  var body_params = vec.Vec[url.FormField].create()
159
- defer release_form_fields(ref_of(body_params))
159
+ defer: release_form_fields(ref_of(body_params))
160
160
 
161
161
  body_params.push(url.FormField(key = "grant_type", value = "authorization_code"))
162
162
  body_params.push(url.FormField(key = "code", value = code))
@@ -170,10 +170,10 @@ public async function exchange_code(
170
170
  body_params.push(url.FormField(key = "code_verifier", value = payload.value))
171
171
 
172
172
  var form_body = url.encode_form(body_params.as_span())
173
- defer form_body.release()
173
+ defer: form_body.release()
174
174
 
175
175
  var auth_header = build_basic_auth_header(config.client_id.as_str(), config.client_secret.as_str())
176
- defer auth_header.release()
176
+ defer: auth_header.release()
177
177
 
178
178
  var headers = array[http.RequestHeader, 2](
179
179
  http.RequestHeader(name = "Content-Type", value = "application/x-www-form-urlencoded"),
@@ -194,7 +194,7 @@ public async function exchange_code(
194
194
  return Result[Tokens, Error].failure(error = http_error_to_oauth(payload.error))
195
195
  Result.success as payload:
196
196
  var response = payload.value
197
- defer response.release()
197
+ defer: response.release()
198
198
 
199
199
  let body_str = response.body_as_str() else:
200
200
  return Result[Tokens, Error].failure(error = oauth_error("token response body is not valid UTF-8"))
@@ -226,7 +226,7 @@ function parse_token_response(body_str: str, status_code: int) -> Result[Tokens,
226
226
  return Result[Tokens, Error].failure(error = oauth_error("token response is not valid JSON"))
227
227
  Result.success as json_payload:
228
228
  let json_value = json_payload.value
229
- defer json.release_value(json_value)
229
+ defer: json.release_value(json_value)
230
230
 
231
231
  if status_code != 200:
232
232
  let object_ptr = json_value.as_object() else:
@@ -306,17 +306,17 @@ public async function refresh_access_token(
306
306
  refresh_token: str
307
307
  ) -> Result[Tokens, Error]:
308
308
  var body_params = vec.Vec[url.FormField].create()
309
- defer release_form_fields(ref_of(body_params))
309
+ defer: release_form_fields(ref_of(body_params))
310
310
 
311
311
  body_params.push(url.FormField(key = "grant_type", value = "refresh_token"))
312
312
  body_params.push(url.FormField(key = "refresh_token", value = refresh_token))
313
313
  body_params.push(url.FormField(key = "client_id", value = config.client_id.as_str()))
314
314
 
315
315
  var form_body = url.encode_form(body_params.as_span())
316
- defer form_body.release()
316
+ defer: form_body.release()
317
317
 
318
318
  var auth_header = build_basic_auth_header(config.client_id.as_str(), config.client_secret.as_str())
319
- defer auth_header.release()
319
+ defer: auth_header.release()
320
320
 
321
321
  var headers = array[http.RequestHeader, 2](
322
322
  http.RequestHeader(name = "Content-Type", value = "application/x-www-form-urlencoded"),
@@ -337,7 +337,7 @@ public async function refresh_access_token(
337
337
  return Result[Tokens, Error].failure(error = http_error_to_oauth(payload.error))
338
338
  Result.success as payload:
339
339
  var response = payload.value
340
- defer response.release()
340
+ defer: response.release()
341
341
 
342
342
  let body_str = response.body_as_str() else:
343
343
  return Result[Tokens, Error].failure(error = oauth_error("token response body is not valid UTF-8"))
data/std/path.mt CHANGED
@@ -54,9 +54,9 @@ public function join(left: str, right: str) -> string.String:
54
54
 
55
55
  public function relative_path(path: str, base: str) -> Option[string.String]:
56
56
  var normalized_path = normalize_separators(path)
57
- defer normalized_path.release()
57
+ defer: normalized_path.release()
58
58
  var normalized_base = normalize_separators(base)
59
- defer normalized_base.release()
59
+ defer: normalized_base.release()
60
60
 
61
61
  let path_text = normalized_path.as_str()
62
62
  let base_text = normalized_base.as_str()
@@ -66,11 +66,11 @@ public function relative_path(path: str, base: str) -> Option[string.String]:
66
66
  return Option[string.String].none
67
67
 
68
68
  var path_segments = vec.Vec[Segment].create()
69
- defer path_segments.release()
69
+ defer: path_segments.release()
70
70
  collect_normalized_segments(path_text, path_root, ref_of(path_segments))
71
71
 
72
72
  var base_segments = vec.Vec[Segment].create()
73
- defer base_segments.release()
73
+ defer: base_segments.release()
74
74
  collect_normalized_segments(base_text, base_root, ref_of(base_segments))
75
75
 
76
76
  var common: ptr_uint = 0
@@ -111,9 +111,9 @@ public function relative_path(path: str, base: str) -> Option[string.String]:
111
111
 
112
112
  public function is_within_root(path: str, root: str) -> bool:
113
113
  var normalized_path = normalize_separators(path)
114
- defer normalized_path.release()
114
+ defer: normalized_path.release()
115
115
  var normalized_root = normalize_separators(root)
116
- defer normalized_root.release()
116
+ defer: normalized_root.release()
117
117
 
118
118
  let path_text = normalized_path.as_str()
119
119
  let root_text = normalized_root.as_str()
@@ -123,11 +123,11 @@ public function is_within_root(path: str, root: str) -> bool:
123
123
  return false
124
124
 
125
125
  var path_segments = vec.Vec[Segment].create()
126
- defer path_segments.release()
126
+ defer: path_segments.release()
127
127
  collect_normalized_segments(path_text, path_root, ref_of(path_segments))
128
128
 
129
129
  var root_segments = vec.Vec[Segment].create()
130
- defer root_segments.release()
130
+ defer: root_segments.release()
131
131
  collect_normalized_segments(root_text, root_root, ref_of(root_segments))
132
132
 
133
133
  if path_segments.len() < root_segments.len():
data/std/process.mt CHANGED
@@ -437,7 +437,7 @@ function spawn_internal(
437
437
  return Result[ChildProcess, ProcessError].failure(error= payload.error)
438
438
  Result.success as payload:
439
439
  var prepared = payload.value
440
- defer prepared.release()
440
+ defer: prepared.release()
441
441
 
442
442
  var raw_handle = zero[c.mt_process_spawn_handle]
443
443
  var raw_error = zero[c.mt_process_error]
@@ -478,7 +478,7 @@ function spawn_pty_internal(
478
478
  return Result[PtyProcess, ProcessError].failure(error= payload.error)
479
479
  Result.success as payload:
480
480
  var prepared = payload.value
481
- defer prepared.release()
481
+ defer: prepared.release()
482
482
 
483
483
  var raw_handle = zero[c.mt_process_pty_handle]
484
484
  var raw_error = zero[c.mt_process_error]
@@ -512,7 +512,7 @@ function capture_internal(
512
512
  return Result[CaptureResult, ProcessError].failure(error= payload.error)
513
513
  Result.success as payload:
514
514
  var prepared = payload.value
515
- defer prepared.release()
515
+ defer: prepared.release()
516
516
 
517
517
  var raw_result = zero[c.mt_process_capture_result]
518
518
  var raw_error = zero[c.mt_process_error]
@@ -547,7 +547,7 @@ function spawn_detached_internal(
547
547
  return Result[int, ProcessError].failure(error= payload.error)
548
548
  Result.success as payload:
549
549
  var prepared = payload.value
550
- defer prepared.release()
550
+ defer: prepared.release()
551
551
 
552
552
  var pid: int = 0
553
553
  var raw_error = zero[c.mt_process_error]
@@ -113,7 +113,7 @@ public function close_reader(reader: ref[Reader]) -> void:
113
113
  public function load_image(reader: pack.Reader, logical_path: str) -> Result[rl.Image, Error]:
114
114
  let file_type = detect_file_type(logical_path)?
115
115
  var data = map_pack_result(reader.read_bytes(logical_path))?
116
- defer data.release()
116
+ defer: data.release()
117
117
 
118
118
  let image = rl.load_image_from_memory(file_type, data.as_span())
119
119
  if not rl.is_image_valid(image):
@@ -124,7 +124,7 @@ public function load_image(reader: pack.Reader, logical_path: str) -> Result[rl.
124
124
 
125
125
  public function load_texture(reader: pack.Reader, logical_path: str) -> Result[rl.Texture2D, Error]:
126
126
  let image = load_image(reader, logical_path)?
127
- defer rl.unload_image(image)
127
+ defer: rl.unload_image(image)
128
128
 
129
129
  let texture = rl.load_texture_from_image(image)
130
130
  if not rl.is_texture_valid(texture):
@@ -136,7 +136,7 @@ public function load_texture(reader: pack.Reader, logical_path: str) -> Result[r
136
136
  public function load_wave(reader: pack.Reader, logical_path: str) -> Result[rl.Wave, Error]:
137
137
  let file_type = detect_file_type(logical_path)?
138
138
  var data = map_pack_result(reader.read_bytes(logical_path))?
139
- defer data.release()
139
+ defer: data.release()
140
140
 
141
141
  let wave = rl.load_wave_from_memory(file_type, data.as_span())
142
142
  if not rl.is_wave_valid(wave):
@@ -147,7 +147,7 @@ public function load_wave(reader: pack.Reader, logical_path: str) -> Result[rl.W
147
147
 
148
148
  public function load_sound(reader: pack.Reader, logical_path: str) -> Result[rl.Sound, Error]:
149
149
  let wave = load_wave(reader, logical_path)?
150
- defer rl.unload_wave(wave)
150
+ defer: rl.unload_wave(wave)
151
151
 
152
152
  let sound = rl.load_sound_from_wave(wave)
153
153
  if not rl.is_sound_valid(sound):
@@ -173,7 +173,7 @@ public function load_music(reader: pack.Reader, logical_path: str) -> Result[Pac
173
173
 
174
174
  function open_pack_relative_to_application(pack_name: str) -> Result[pack.Reader, Error]:
175
175
  var application_path = application_relative_path(pack_name)
176
- defer application_path.release()
176
+ defer: application_path.release()
177
177
 
178
178
  let application_result = pack.open(application_path.as_str())
179
179
  match application_result:
data/std/serialize.mt CHANGED
@@ -52,7 +52,7 @@ extending bin.Reader:
52
52
  return Result[T, bin.Error].failure(error = p.error)
53
53
  Result.success as bp:
54
54
  var raw_bytes = bp.value
55
- defer raw_bytes.release()
55
+ defer: raw_bytes.release()
56
56
 
57
57
  let src_ptr = raw_bytes.data else:
58
58
  return Result[T, bin.Error].failure(
data/std/tar.mt CHANGED
@@ -358,7 +358,7 @@ function append_file_entry(source_path: str, archive_path: str, output: ref[vec.
358
358
  return Result[bool, Error].failure(error = take_fs_error(payload.error))
359
359
  Result.success as payload:
360
360
  var data = payload.value
361
- defer data.release()
361
+ defer: data.release()
362
362
  output.append_span(data.as_span())
363
363
  append_padding(output, data.len)
364
364
  return Result[bool, Error].success(value = true)
@@ -387,14 +387,14 @@ function append_directory_tree(
387
387
  return Result[bool, Error].failure(error = take_fs_error(payload.error))
388
388
  Result.success as payload:
389
389
  var entries = payload.value
390
- defer entries.release()
390
+ defer: entries.release()
391
391
 
392
392
  match copy_sorted_entry_names(entries, include_hidden):
393
393
  Result.failure as names_payload:
394
394
  return Result[bool, Error].failure(error = names_payload.error)
395
395
  Result.success as names_payload:
396
396
  var names = names_payload.value
397
- defer release_string_values(ref_of(names))
397
+ defer: release_string_values(ref_of(names))
398
398
 
399
399
  var index: ptr_uint = 0
400
400
  while index < names.len():
@@ -520,10 +520,10 @@ function read_text_field(input: span[ubyte], offset: ptr_uint, field_len: ptr_ui
520
520
 
521
521
  function parse_entry(input: span[ubyte], offset: ptr_uint) -> Result[ParsedEntry, Error]:
522
522
  var name = read_text_field(input, offset + 0, 100)?
523
- defer name.release()
523
+ defer: name.release()
524
524
 
525
525
  var prefix = read_text_field(input, offset + 345, 155)?
526
- defer prefix.release()
526
+ defer: prefix.release()
527
527
 
528
528
  let name_text = name.as_str()
529
529
  if name_text.len == 0:
@@ -590,7 +590,7 @@ function checked_destination_path(destination_root: str, relative_path: str) ->
590
590
  ].failure(error = error_message("tar extract path escapes destination root"))
591
591
  Option.some as payload:
592
592
  var normalized = payload.value
593
- defer normalized.release()
593
+ defer: normalized.release()
594
594
  let normalized_path = normalized.as_str()
595
595
  let escapes_parent = normalized_path.len == 2 and normalized_path.byte_at(0) == 46 and normalized_path.byte_at(1) == 46
596
596
  if escapes_parent or normalized_path.starts_with("../"):
@@ -648,7 +648,7 @@ public function archive_directory_gzip(
648
648
  return Result[bytes.Bytes, Error].failure(error = payload.error)
649
649
  Result.success as payload:
650
650
  var archive = payload.value
651
- defer archive.release()
651
+ defer: archive.release()
652
652
  match gzip.compress_bytes(archive.as_span()):
653
653
  Result.failure as gzip_payload:
654
654
  return Result[bytes.Bytes, Error].failure(error = take_gzip_error(gzip_payload.error))
@@ -668,10 +668,10 @@ public function extract(archive: span[ubyte], destination_root: str) -> Result[b
668
668
  return Result[bool, Error].success(value = true)
669
669
 
670
670
  var entry = parse_entry(archive, offset)?
671
- defer entry.release()
671
+ defer: entry.release()
672
672
 
673
673
  var destination_path = checked_destination_path(destination_root, entry.path.as_str())?
674
- defer destination_path.release()
674
+ defer: destination_path.release()
675
675
 
676
676
  if entry.kind == EntryKind.directory:
677
677
  fs.create_directories(destination_path.as_str()).map_error(take_fs_error)?
@@ -700,5 +700,5 @@ public function extract(archive: span[ubyte], destination_root: str) -> Result[b
700
700
 
701
701
  public function extract_gzip(archive: span[ubyte], destination_root: str) -> Result[bool, Error]:
702
702
  var decoded = gzip.decompress_bytes(archive).map_error(take_gzip_error)?
703
- defer decoded.release()
703
+ defer: decoded.release()
704
704
  return extract(decoded.as_span(), destination_root)
data/std/terminal.mt CHANGED
@@ -695,7 +695,7 @@ public function flush_stderr() -> Result[bool, Error]:
695
695
 
696
696
  public function clear_screen() -> Result[bool, Error]:
697
697
  var sequence = string.String.with_capacity(8)
698
- defer sequence.release()
698
+ defer: sequence.release()
699
699
  append_csi(ref_of(sequence), "2J")
700
700
  append_csi(ref_of(sequence), "H")
701
701
  return write_stdout_sequence(sequence, "terminal clear screen failed")
@@ -703,21 +703,21 @@ public function clear_screen() -> Result[bool, Error]:
703
703
 
704
704
  public function clear_line() -> Result[bool, Error]:
705
705
  var sequence = string.String.with_capacity(5)
706
- defer sequence.release()
706
+ defer: sequence.release()
707
707
  append_csi(ref_of(sequence), "2K")
708
708
  return write_stdout_sequence(sequence, "terminal clear line failed")
709
709
 
710
710
 
711
711
  public function cursor_home() -> Result[bool, Error]:
712
712
  var sequence = string.String.with_capacity(4)
713
- defer sequence.release()
713
+ defer: sequence.release()
714
714
  append_csi(ref_of(sequence), "H")
715
715
  return write_stdout_sequence(sequence, "terminal cursor home failed")
716
716
 
717
717
 
718
718
  public function move_cursor(row: int, column: int) -> Result[bool, Error]:
719
719
  var sequence = string.String.with_capacity(24)
720
- defer sequence.release()
720
+ defer: sequence.release()
721
721
  append_escape(ref_of(sequence))
722
722
  sequence.append_format(f"[#{clamp_cursor_position_1based(row)};#{clamp_cursor_position_1based(column)}H")
723
723
  return write_stdout_sequence(sequence, "terminal move cursor failed")
@@ -725,35 +725,35 @@ public function move_cursor(row: int, column: int) -> Result[bool, Error]:
725
725
 
726
726
  public function hide_cursor() -> Result[bool, Error]:
727
727
  var sequence = string.String.with_capacity(8)
728
- defer sequence.release()
728
+ defer: sequence.release()
729
729
  append_csi(ref_of(sequence), "?25l")
730
730
  return write_stdout_sequence(sequence, "terminal hide cursor failed")
731
731
 
732
732
 
733
733
  public function show_cursor() -> Result[bool, Error]:
734
734
  var sequence = string.String.with_capacity(8)
735
- defer sequence.release()
735
+ defer: sequence.release()
736
736
  append_csi(ref_of(sequence), "?25h")
737
737
  return write_stdout_sequence(sequence, "terminal show cursor failed")
738
738
 
739
739
 
740
740
  public function enter_alternate_screen() -> Result[bool, Error]:
741
741
  var sequence = string.String.with_capacity(10)
742
- defer sequence.release()
742
+ defer: sequence.release()
743
743
  append_csi(ref_of(sequence), "?1049h")
744
744
  return write_stdout_sequence(sequence, "terminal alternate screen failed")
745
745
 
746
746
 
747
747
  public function leave_alternate_screen() -> Result[bool, Error]:
748
748
  var sequence = string.String.with_capacity(10)
749
- defer sequence.release()
749
+ defer: sequence.release()
750
750
  append_csi(ref_of(sequence), "?1049l")
751
751
  return write_stdout_sequence(sequence, "terminal alternate screen failed")
752
752
 
753
753
 
754
754
  public function enable_mouse() -> Result[bool, Error]:
755
755
  var sequence = string.String.with_capacity(24)
756
- defer sequence.release()
756
+ defer: sequence.release()
757
757
  append_csi(ref_of(sequence), "?1000h")
758
758
  append_csi(ref_of(sequence), "?1002h")
759
759
  append_csi(ref_of(sequence), "?1006h")
@@ -762,7 +762,7 @@ public function enable_mouse() -> Result[bool, Error]:
762
762
 
763
763
  public function disable_mouse() -> Result[bool, Error]:
764
764
  var sequence = string.String.with_capacity(24)
765
- defer sequence.release()
765
+ defer: sequence.release()
766
766
  append_csi(ref_of(sequence), "?1006l")
767
767
  append_csi(ref_of(sequence), "?1002l")
768
768
  append_csi(ref_of(sequence), "?1000l")
@@ -771,7 +771,7 @@ public function disable_mouse() -> Result[bool, Error]:
771
771
 
772
772
  public function set_foreground(color: Color) -> Result[bool, Error]:
773
773
  var sequence = string.String.with_capacity(10)
774
- defer sequence.release()
774
+ defer: sequence.release()
775
775
  append_escape(ref_of(sequence))
776
776
  sequence.append("[")
777
777
  append_color_code(ref_of(sequence), color, false)
@@ -781,7 +781,7 @@ public function set_foreground(color: Color) -> Result[bool, Error]:
781
781
 
782
782
  public function set_background(color: Color) -> Result[bool, Error]:
783
783
  var sequence = string.String.with_capacity(10)
784
- defer sequence.release()
784
+ defer: sequence.release()
785
785
  append_escape(ref_of(sequence))
786
786
  sequence.append("[")
787
787
  append_color_code(ref_of(sequence), color, true)
@@ -791,7 +791,7 @@ public function set_background(color: Color) -> Result[bool, Error]:
791
791
 
792
792
  public function set_rgb_foreground(red: int, green: int, blue: int) -> Result[bool, Error]:
793
793
  var sequence = string.String.with_capacity(24)
794
- defer sequence.release()
794
+ defer: sequence.release()
795
795
  append_escape(ref_of(sequence))
796
796
  sequence.append_format(
797
797
  f"[38;2;#{clamp_color_channel(red)};#{clamp_color_channel(green)};#{clamp_color_channel(blue)}m"
@@ -801,7 +801,7 @@ public function set_rgb_foreground(red: int, green: int, blue: int) -> Result[bo
801
801
 
802
802
  public function set_rgb_background(red: int, green: int, blue: int) -> Result[bool, Error]:
803
803
  var sequence = string.String.with_capacity(24)
804
- defer sequence.release()
804
+ defer: sequence.release()
805
805
  append_escape(ref_of(sequence))
806
806
  sequence.append_format(
807
807
  f"[48;2;#{clamp_color_channel(red)};#{clamp_color_channel(green)};#{clamp_color_channel(blue)}m"
@@ -811,7 +811,7 @@ public function set_rgb_background(red: int, green: int, blue: int) -> Result[bo
811
811
 
812
812
  public function set_bold(enabled: bool) -> Result[bool, Error]:
813
813
  var sequence = string.String.with_capacity(6)
814
- defer sequence.release()
814
+ defer: sequence.release()
815
815
  if enabled:
816
816
  append_csi(ref_of(sequence), "1m")
817
817
  else:
@@ -821,7 +821,7 @@ public function set_bold(enabled: bool) -> Result[bool, Error]:
821
821
 
822
822
  public function set_underline(enabled: bool) -> Result[bool, Error]:
823
823
  var sequence = string.String.with_capacity(6)
824
- defer sequence.release()
824
+ defer: sequence.release()
825
825
  if enabled:
826
826
  append_csi(ref_of(sequence), "4m")
827
827
  else:
@@ -831,7 +831,7 @@ public function set_underline(enabled: bool) -> Result[bool, Error]:
831
831
 
832
832
  public function reset_style() -> Result[bool, Error]:
833
833
  var sequence = string.String.with_capacity(5)
834
- defer sequence.release()
834
+ defer: sequence.release()
835
835
  append_csi(ref_of(sequence), "0m")
836
836
  return write_stdout_sequence(sequence, "terminal style reset failed")
837
837
 
@@ -958,7 +958,7 @@ extending Terminal:
958
958
  return Result[Option[Event], Error].success(value= Option[Event].some(value= ev.unwrap()))
959
959
 
960
960
  var bytes = read_stdin(timeout_ms)?
961
- defer bytes.release()
961
+ defer: bytes.release()
962
962
  if not bytes.is_empty():
963
963
  this.input.append_span(bytes.as_span())
964
964
 
data/std/tls.mt CHANGED
@@ -335,7 +335,7 @@ function end_stream_operation(state: ptr[StreamState]) -> void:
335
335
 
336
336
  async function handshake_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -> Result[bool, Error]:
337
337
  let state = begin_stream_operation(state_raw)?
338
- defer end_stream_operation(state)
338
+ defer: end_stream_operation(state)
339
339
 
340
340
  while true:
341
341
  let client = unsafe: read(state).client else:
@@ -366,7 +366,7 @@ async function write_on(
366
366
  return Result[ptr_uint, Error].success(value = 0)
367
367
 
368
368
  let state = begin_stream_operation(state_raw)?
369
- defer end_stream_operation(state)
369
+ defer: end_stream_operation(state)
370
370
 
371
371
  var offset: ptr_uint = 0
372
372
  while offset < content.len:
@@ -411,7 +411,7 @@ async function read_once_on(
411
411
  return Result[bytes.Bytes, Error].failure(error = tls_error("tls read requires max_bytes > 0"))
412
412
 
413
413
  let state = begin_stream_operation(state_raw)?
414
- defer end_stream_operation(state)
414
+ defer: end_stream_operation(state)
415
415
 
416
416
  let buffer = heap.must_alloc[ubyte](max_bytes)
417
417
  while true:
@@ -449,7 +449,7 @@ async function read_once_on(
449
449
 
450
450
  async function shutdown_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -> Result[bool, Error]:
451
451
  let state = begin_stream_operation(state_raw)?
452
- defer end_stream_operation(state)
452
+ defer: end_stream_operation(state)
453
453
 
454
454
  while true:
455
455
  let client = unsafe: read(state).client else:
@@ -470,7 +470,7 @@ async function shutdown_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -
470
470
 
471
471
  public async function connect_on(runtime: aio.Runtime, host: str, port: int) -> Result[Stream, Error]:
472
472
  var service = fmt.to_string_int(port)
473
- defer service.release()
473
+ defer: service.release()
474
474
 
475
475
  let addresses_result = await net.resolve_all_on(runtime, host, service.as_str())
476
476
  match addresses_result:
@@ -478,7 +478,7 @@ public async function connect_on(runtime: aio.Runtime, host: str, port: int) ->
478
478
  return Result[Stream, Error].failure(error = take_net_error(payload.error))
479
479
  Result.success as payload:
480
480
  var addresses = payload.value
481
- defer release_socket_addresses(ref_of(addresses))
481
+ defer: release_socket_addresses(ref_of(addresses))
482
482
 
483
483
  var last_error = tls_error("tls connect failed")
484
484
  var last_error_owned = true
@@ -523,7 +523,7 @@ public async function client_on(runtime: aio.Runtime, host: str, transport: net.
523
523
  Result.success as payload:
524
524
  var raw_client: ptr[c.mt_tls_client]? = null
525
525
  var host_storage = arena.create(host.len + 1)
526
- defer host_storage.release()
526
+ defer: host_storage.release()
527
527
 
528
528
  var raw_error = zero[c.mt_tls_error]
529
529
  let create_status = c.mt_tls_client_create(host_storage.to_cstr(host), payload.value, raw_client, raw_error)
@@ -598,7 +598,7 @@ extending Stream:
598
598
 
599
599
  public function exchange(host: str, port: int, request: span[ubyte]) -> Result[bytes.Bytes, Error]:
600
600
  var host_storage = arena.create(host.len + 1)
601
- defer host_storage.release()
601
+ defer: host_storage.release()
602
602
 
603
603
  var raw_response = zero[c.mt_tls_bytes]
604
604
  var raw_error = zero[c.mt_tls_error]
data/std/uri.mt CHANGED
@@ -7,7 +7,7 @@ const FILE_URI_PREFIX: str = "file://"
7
7
 
8
8
  public function file_uri_from_path(path_text: str) -> string.String:
9
9
  var normalized = path.normalize_separators(path_text)
10
- defer normalized.release()
10
+ defer: normalized.release()
11
11
 
12
12
  var result = string.String.from_str(FILE_URI_PREFIX)
13
13
  append_percent_encoded_path(ref_of(result), normalized.as_str())
data/std/utility.mt CHANGED
@@ -152,7 +152,7 @@ extending Action[Context]:
152
152
  return 0.0
153
153
 
154
154
  var scores = vec.Vec[float].with_capacity(n)
155
- defer scores.release()
155
+ defer: scores.release()
156
156
 
157
157
  for entry in this.considerations:
158
158
  unsafe:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mt-lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.14
4
+ version: 0.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Long (Teefan) Tran
@@ -158,7 +158,6 @@ files:
158
158
  - lib/milk_tea/bindings/bindgen/emitter.rb
159
159
  - lib/milk_tea/bindings/bindgen/overrides.rb
160
160
  - lib/milk_tea/bindings/bindgen/type_mapper.rb
161
- - lib/milk_tea/bindings/cli.rb
162
161
  - lib/milk_tea/bindings/imported_bindings.rb
163
162
  - lib/milk_tea/bindings/imported_bindings/defaults.rb
164
163
  - lib/milk_tea/bindings/imported_bindings/generator.rb
@@ -185,7 +184,7 @@ files:
185
184
  - lib/milk_tea/core.rb
186
185
  - lib/milk_tea/core/ast.rb
187
186
  - lib/milk_tea/core/async_runtime_installer.rb
188
- - lib/milk_tea/core/binding_types.rb
187
+ - lib/milk_tea/core/bindings.rb
189
188
  - lib/milk_tea/core/bindings/attribute_binding.rb
190
189
  - lib/milk_tea/core/bindings/function_binding.rb
191
190
  - lib/milk_tea/core/bindings/module_binding.rb
@@ -203,9 +202,7 @@ files:
203
202
  - lib/milk_tea/core/c_backend/type_collectors.rb
204
203
  - lib/milk_tea/core/c_backend/type_declaration.rb
205
204
  - lib/milk_tea/core/c_backend/type_system.rb
206
- - lib/milk_tea/core/compatibility_helpers.rb
207
205
  - lib/milk_tea/core/compile_time.rb
208
- - lib/milk_tea/core/compile_time/const_eval.rb
209
206
  - lib/milk_tea/core/control_flow.rb
210
207
  - lib/milk_tea/core/control_flow/builder.rb
211
208
  - lib/milk_tea/core/control_flow/constant_propagation.rb
@@ -218,6 +215,7 @@ files:
218
215
  - lib/milk_tea/core/control_flow/termination.rb
219
216
  - lib/milk_tea/core/cst.rb
220
217
  - lib/milk_tea/core/cst_builder.rb
218
+ - lib/milk_tea/core/intrinsics.rb
221
219
  - lib/milk_tea/core/ir.rb
222
220
  - lib/milk_tea/core/keywords.rb
223
221
  - lib/milk_tea/core/lexer.rb
@@ -232,8 +230,8 @@ files:
232
230
  - lib/milk_tea/core/lexer/trivia.rb
233
231
  - lib/milk_tea/core/lowering.rb
234
232
  - lib/milk_tea/core/lowering/artifacts.rb
235
- - lib/milk_tea/core/lowering/async.rb
236
233
  - lib/milk_tea/core/lowering/async/analysis.rb
234
+ - lib/milk_tea/core/lowering/async/frame_builder.rb
237
235
  - lib/milk_tea/core/lowering/async/lowering.rb
238
236
  - lib/milk_tea/core/lowering/async/normalization.rb
239
237
  - lib/milk_tea/core/lowering/block.rb
@@ -253,7 +251,6 @@ files:
253
251
  - lib/milk_tea/core/lowering/utils.rb
254
252
  - lib/milk_tea/core/module_binder.rb
255
253
  - lib/milk_tea/core/module_loader.rb
256
- - lib/milk_tea/core/module_loader/errors.rb
257
254
  - lib/milk_tea/core/module_path_resolver.rb
258
255
  - lib/milk_tea/core/module_roots.rb
259
256
  - lib/milk_tea/core/parser.rb
@@ -294,7 +291,7 @@ files:
294
291
  - lib/milk_tea/core/types/registry.rb
295
292
  - lib/milk_tea/core/types/visitor.rb
296
293
  - lib/milk_tea/dap.rb
297
- - lib/milk_tea/dap/backends/lldb_dap.rb
294
+ - lib/milk_tea/dap/lldb_dap_backend.rb
298
295
  - lib/milk_tea/dap/protocol.rb
299
296
  - lib/milk_tea/dap/server.rb
300
297
  - lib/milk_tea/dap/server/breakpoints.rb
@@ -361,6 +358,7 @@ files:
361
358
  - lib/milk_tea/packages/version.rb
362
359
  - lib/milk_tea/tooling.rb
363
360
  - lib/milk_tea/tooling/asset_pack.rb
361
+ - lib/milk_tea/tooling/bindgen_cli.rb
364
362
  - lib/milk_tea/tooling/build.rb
365
363
  - lib/milk_tea/tooling/build_cache.rb
366
364
  - lib/milk_tea/tooling/cli.rb
@@ -605,7 +603,7 @@ metadata:
605
603
  homepage_uri: https://teefan.github.io/mt-lang/
606
604
  source_code_uri: https://github.com/teefan/mt-lang
607
605
  post_install_message: |
608
- Milk Tea 0.3.14 installed!
606
+ Milk Tea 0.3.17 installed!
609
607
 
610
608
  System requirements:
611
609
  - A C compiler (gcc or clang) must be available on PATH