mt-lang 0.3.13 → 0.3.16

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/docs/index.html +31 -23
  4. data/docs/language-design.md +13 -17
  5. data/docs/language-manual.md +19 -7
  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/control_flow/builder.rb +62 -2
  9. data/lib/milk_tea/core/lowering/async/analysis.rb +3 -9
  10. data/lib/milk_tea/core/lowering/async/lowering.rb +2 -10
  11. data/lib/milk_tea/core/lowering/async/normalization.rb +2 -7
  12. data/lib/milk_tea/core/lowering/block.rb +1 -5
  13. data/lib/milk_tea/core/lowering/expressions.rb +47 -3
  14. data/lib/milk_tea/core/lowering/proc.rb +1 -5
  15. data/lib/milk_tea/core/lowering/resolve.rb +26 -2
  16. data/lib/milk_tea/core/lowering/scans.rb +3 -1
  17. data/lib/milk_tea/core/lowering/utils.rb +7 -28
  18. data/lib/milk_tea/core/parser/statements.rb +18 -12
  19. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +3 -11
  20. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +2 -3
  21. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +1 -1
  22. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +1 -2
  23. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +2 -4
  24. data/lib/milk_tea/core/semantic_analyzer/statements.rb +2 -8
  25. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +29 -2
  26. data/lib/milk_tea/core/types.rb +0 -6
  27. data/lib/milk_tea/tooling/linter/imports_platform.rb +2 -4
  28. data/lib/milk_tea/tooling/linter/release_rules.rb +1 -6
  29. data/lib/milk_tea/tooling/linter/source_helpers.rb +0 -6
  30. data/lib/milk_tea/tooling/linter/visitors.rb +4 -8
  31. data/lib/milk_tea/tooling/sexpr_dumper.rb +2 -0
  32. data/std/asset_pack.mt +1 -1
  33. data/std/async/libuv_runtime.mt +6 -6
  34. data/std/async/mailbox.mt +4 -4
  35. data/std/{cell.mt → box.mt} +9 -9
  36. data/std/cookie.mt +2 -2
  37. data/std/crypto.mt +1 -1
  38. data/std/curl/runtime.mt +10 -10
  39. data/std/fs.linux.mt +26 -26
  40. data/std/fs.windows.mt +22 -22
  41. data/std/goap.mt +2 -2
  42. data/std/http/server.mt +21 -21
  43. data/std/http.mt +14 -14
  44. data/std/jobs.mt +4 -4
  45. data/std/json.mt +5 -5
  46. data/std/log.mt +1 -1
  47. data/std/mem/tracking.mt +1 -1
  48. data/std/net/channel.mt +4 -4
  49. data/std/net/clock.mt +6 -6
  50. data/std/net/discovery.mt +7 -7
  51. data/std/net/lobby.mt +10 -10
  52. data/std/net/manager.mt +1 -1
  53. data/std/net/mux.mt +4 -4
  54. data/std/net/nat.mt +4 -4
  55. data/std/net/packet.mt +3 -3
  56. data/std/net/punch.mt +3 -3
  57. data/std/net/rpc.mt +3 -3
  58. data/std/net/session.mt +15 -15
  59. data/std/net/stun.mt +4 -4
  60. data/std/net/turn.mt +4 -4
  61. data/std/oauth2.mt +12 -12
  62. data/std/path.mt +8 -8
  63. data/std/process.mt +4 -4
  64. data/std/raylib/packed_assets.mt +5 -5
  65. data/std/serialize.mt +1 -1
  66. data/std/tar.mt +10 -10
  67. data/std/terminal.mt +18 -18
  68. data/std/tls.mt +8 -8
  69. data/std/uri.mt +1 -1
  70. data/std/utility.mt +1 -1
  71. metadata +3 -3
data/std/net/punch.mt CHANGED
@@ -104,8 +104,8 @@ function poll_recv(
104
104
  return Option[PunchResult].none()
105
105
  Result.success as dp:
106
106
  var dg = dp.value
107
- defer dg.data.release()
108
- defer dg.source.release()
107
+ defer: dg.data.release()
108
+ defer: dg.source.release()
109
109
  return result_from_datagram(dg, remote_candidates)
110
110
 
111
111
 
@@ -114,7 +114,7 @@ public async function punch(
114
114
  remote_candidates: vec.Vec[Candidate]
115
115
  ) -> Result[PunchResult, Error]:
116
116
  var probe = build_punch_probe()
117
- defer probe.release()
117
+ defer: probe.release()
118
118
  var recv_task = socket.recv_from(512)
119
119
 
120
120
  var c: uint = 0
data/std/net/rpc.mt CHANGED
@@ -63,7 +63,7 @@ public async function call_and_wait(
63
63
  payload: span[ubyte]
64
64
  ) -> Result[bytes.Bytes, Error]:
65
65
  var call_packet = build_call(request_id, payload)
66
- defer call_packet.release()
66
+ defer: call_packet.release()
67
67
 
68
68
  let send_result = await conn.mux_send(channel_id, call_type_id, call_packet.as_span(), mux.flag_reliable)
69
69
  match send_result:
@@ -78,7 +78,7 @@ public async function call_and_wait(
78
78
  match msg_opt:
79
79
  Option.some as mp:
80
80
  var msg = mp.value
81
- defer msg.release()
81
+ defer: msg.release()
82
82
  if msg.type_id == response_type_id and msg.channel_id == channel_id:
83
83
  let id_result = parse_request_id(msg.payload.as_span())
84
84
  match id_result:
@@ -110,7 +110,7 @@ public async function send_reply(
110
110
  payload: span[ubyte]
111
111
  ) -> Result[bool, Error]:
112
112
  var reply_packet = build_reply(request_id, payload)
113
- defer reply_packet.release()
113
+ defer: reply_packet.release()
114
114
  let send_result = await conn.mux_send(channel_id, response_type_id, reply_packet.as_span(), mux.flag_reliable)
115
115
  match send_result:
116
116
  Result.failure:
data/std/net/session.mt CHANGED
@@ -312,7 +312,7 @@ extending Connection:
312
312
  if this.state == ConnectionState.connected:
313
313
  if frame >= this.last_heartbeat_sent + this.heartbeat_interval:
314
314
  var hb = build_heartbeat(frame)
315
- defer hb.release()
315
+ defer: hb.release()
316
316
  let send_result = await this.channel.send(hb.as_span())
317
317
  match send_result:
318
318
  Result.failure:
@@ -395,7 +395,7 @@ extending Connection:
395
395
  ))
396
396
 
397
397
  var framed = build_user_data(data)
398
- defer framed.release()
398
+ defer: framed.release()
399
399
  let send_result = await this.channel.send(framed.as_span())
400
400
  match send_result:
401
401
  Result.failure as payload:
@@ -415,7 +415,7 @@ extending Connection:
415
415
  ))
416
416
 
417
417
  var framed = build_user_data(data)
418
- defer framed.release()
418
+ defer: framed.release()
419
419
  let send_result = await this.channel.send_reliable(framed.as_span(), frame)
420
420
  match send_result:
421
421
  Result.failure as payload:
@@ -444,7 +444,7 @@ extending Connection:
444
444
  Result.success as ksp:
445
445
  key = ksp.value
446
446
  var req = build_connect_request(this.protocol_version, key)
447
- defer req.release()
447
+ defer: req.release()
448
448
  let send_result = await this.channel.send_reliable(req.as_span(), this.last_heartbeat_sent)
449
449
  match send_result:
450
450
  Result.failure as send_payload:
@@ -463,7 +463,7 @@ extending Connection:
463
463
  ))
464
464
 
465
465
  var d = build_disconnect(disconnect_reason_local)
466
- defer d.release()
466
+ defer: d.release()
467
467
  let send_result = await this.channel.send_reliable(d.as_span(), 0)
468
468
  this.state = ConnectionState.disconnected
469
469
  match send_result:
@@ -588,7 +588,7 @@ async function drain_outgoing_conn(conn: ref[Connection]) -> Result[bool, net.Er
588
588
  return Result[bool, net.Error].success(value = true)
589
589
  Option.some as payload:
590
590
  var outgoing = payload.value
591
- defer outgoing.release()
591
+ defer: outgoing.release()
592
592
  if outgoing.reliable:
593
593
  let _ = await conn.channel.send_reliable(
594
594
  outgoing.payload.as_span(),
@@ -648,13 +648,13 @@ extending Session:
648
648
  if unsafe: read(peer_ptr).channel_state == ConnectionState.connected:
649
649
  if frame >= unsafe: read(peer_ptr).last_heartbeat_sent + this.config.heartbeat_interval:
650
650
  var hb = build_heartbeat(frame)
651
- defer hb.release()
651
+ defer: hb.release()
652
652
  let peer_id = unsafe: read(peer_ptr).peer_id
653
653
  let peer_address_result = find_peer_address(ref_of(this), peer_id)
654
654
  match peer_address_result:
655
655
  Result.success as addr_payload:
656
656
  var addr = addr_payload.value
657
- defer addr.release()
657
+ defer: addr.release()
658
658
  let send_result = await this.host.send(addr, hb.as_span())
659
659
  match send_result:
660
660
  Result.failure:
@@ -748,9 +748,9 @@ extending Session:
748
748
  return Result[bool, net.Error].failure(error = payload.error)
749
749
  Result.success as payload:
750
750
  var address = payload.value
751
- defer address.release()
751
+ defer: address.release()
752
752
  var framed = build_user_data(data)
753
- defer framed.release()
753
+ defer: framed.release()
754
754
  let send_result = await this.host.send(address, framed.as_span())
755
755
  match send_result:
756
756
  Result.failure as send_payload:
@@ -773,9 +773,9 @@ extending Session:
773
773
  return Result[bool, net.Error].failure(error = payload.error)
774
774
  Result.success as payload:
775
775
  var address = payload.value
776
- defer address.release()
776
+ defer: address.release()
777
777
  var framed = build_user_data(data)
778
- defer framed.release()
778
+ defer: framed.release()
779
779
  let send_result = await this.host.send_reliable(address, framed.as_span(), frame)
780
780
  match send_result:
781
781
  Result.failure as send_payload:
@@ -794,9 +794,9 @@ extending Session:
794
794
  return Result[bool, net.Error].failure(error = payload.error)
795
795
  Result.success as payload:
796
796
  var address = payload.value
797
- defer address.release()
797
+ defer: address.release()
798
798
  var d = build_disconnect(reason)
799
- defer d.release()
799
+ defer: d.release()
800
800
  let send_result = await this.host.send_reliable(address, d.as_span(), 0)
801
801
  match send_result:
802
802
  Result.failure:
@@ -1054,7 +1054,7 @@ async function drain_outgoing_session(session: ref[Session]) -> Result[bool, net
1054
1054
  return Result[bool, net.Error].success(value = true)
1055
1055
  Option.some as payload:
1056
1056
  var outgoing = payload.value
1057
- defer outgoing.release()
1057
+ defer: outgoing.release()
1058
1058
  if outgoing.reliable:
1059
1059
  let send_result = await session.host.send_reliable(
1060
1060
  outgoing.address,
data/std/net/stun.mt CHANGED
@@ -150,7 +150,7 @@ public function parse_binding_response(
150
150
  let xaddr = read_uint_be(data, offset + 8z)
151
151
  let ip = xaddr ^ stun_magic_cookie
152
152
  var ip_str = format_ipv4(ip)
153
- defer ip_str.release()
153
+ defer: ip_str.release()
154
154
  let addr_result = net.ipv4(ip_str.as_str(), int<-port)
155
155
  match addr_result:
156
156
  Result.failure:
@@ -185,7 +185,7 @@ public async function resolve_public_address(
185
185
  let tid = transaction_id_from_bytes(rp.value)
186
186
  rp.value.release()
187
187
  var request = build_binding_request(tid)
188
- defer request.release()
188
+ defer: request.release()
189
189
  let send_result = await socket.send_to(request.as_span(), stun_server)
190
190
  match send_result:
191
191
  Result.failure:
@@ -233,7 +233,7 @@ public async function resolve_public_address_on(
233
233
  )
234
234
  Result.success as bp:
235
235
  var socket = bp.value
236
- defer socket.release()
236
+ defer: socket.release()
237
237
  return await resolve_public_address(socket, stun_server)
238
238
 
239
239
 
@@ -248,5 +248,5 @@ public async function resolve(
248
248
  )
249
249
  Result.success as la:
250
250
  var local_addr = la.value
251
- defer local_addr.release()
251
+ defer: local_addr.release()
252
252
  return await resolve_public_address_on(aio.current_runtime(), local_addr, stun_server)
data/std/net/turn.mt CHANGED
@@ -188,7 +188,7 @@ public function parse_allocate_response(
188
188
  let xaddr = read_uint_be(data, offset + 8z)
189
189
  let ip = xaddr ^ stun_magic_cookie
190
190
  var ip_str = format_ipv4(ip)
191
- defer ip_str.release()
191
+ defer: ip_str.release()
192
192
  let addr_result = net.ipv4(ip_str.as_str(), int<-port)
193
193
  match addr_result:
194
194
  Result.success as ap:
@@ -220,7 +220,7 @@ public async function allocate(
220
220
  let tid = transaction_id_from_bytes(rp.value)
221
221
  rp.value.release()
222
222
  var request = build_allocate_request(tid)
223
- defer request.release()
223
+ defer: request.release()
224
224
  let send_result = await socket.send_to(request.as_span(), turn_server)
225
225
  match send_result:
226
226
  Result.failure:
@@ -363,7 +363,7 @@ public function parse_data_indication(
363
363
  let xaddr = read_uint_be(data, offset + 8z)
364
364
  let ip = xaddr ^ stun_magic_cookie
365
365
  var ip_str = format_ipv4(ip)
366
- defer ip_str.release()
366
+ defer: ip_str.release()
367
367
  let addr_result = net.ipv4(ip_str.as_str(), int<-port)
368
368
  match addr_result:
369
369
  Result.success as ap:
@@ -417,7 +417,7 @@ public async function send_data(
417
417
  return Result[ptr_uint, Error].failure(error = bp.error)
418
418
  Result.success as bp:
419
419
  var packet = bp.value
420
- defer packet.release()
420
+ defer: packet.release()
421
421
  let send_result = await socket.send_to(packet.as_span(), turn_server)
422
422
  match send_result:
423
423
  Result.failure as sp:
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)