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/fs.linux.mt CHANGED
@@ -89,7 +89,7 @@ function release_string_values(values: ref[vec.Vec[string.String]]) -> void:
89
89
 
90
90
  function path_kind(path: str) -> int:
91
91
  var storage = arena.create(path.len + 1)
92
- defer storage.release()
92
+ defer: storage.release()
93
93
  return c.mt_fs_path_kind(storage.to_cstr(path))
94
94
 
95
95
 
@@ -170,7 +170,7 @@ public function is_directory(path: str) -> bool:
170
170
 
171
171
  public function read_text(path: str) -> Result[string.String, Error]:
172
172
  var storage = arena.create(path.len + 1)
173
- defer storage.release()
173
+ defer: storage.release()
174
174
 
175
175
  var raw_text = zero[c.mt_fs_string]
176
176
  var raw_error = zero[c.mt_fs_error]
@@ -187,7 +187,7 @@ public function read_lines(path: str) -> Result[Entries, Error]:
187
187
  return Result[Entries, Error].failure(error= payload.error)
188
188
  Result.success as payload:
189
189
  var content = payload.value
190
- defer content.release()
190
+ defer: content.release()
191
191
 
192
192
  var values = vec.Vec[string.String].create()
193
193
  let content_text = content.as_str()
@@ -216,7 +216,7 @@ public function read_lines(path: str) -> Result[Entries, Error]:
216
216
 
217
217
  public function read_bytes(path: str) -> Result[bytes.Bytes, Error]:
218
218
  var storage = arena.create(path.len + 1)
219
- defer storage.release()
219
+ defer: storage.release()
220
220
 
221
221
  var raw_bytes = zero[c.mt_fs_string]
222
222
  var raw_error = zero[c.mt_fs_error]
@@ -229,7 +229,7 @@ public function read_bytes(path: str) -> Result[bytes.Bytes, Error]:
229
229
 
230
230
  public function metadata(path: str) -> Result[Metadata, Error]:
231
231
  var storage = arena.create(path.len + 1)
232
- defer storage.release()
232
+ defer: storage.release()
233
233
 
234
234
  var raw_metadata = zero[c.mt_fs_metadata]
235
235
  var raw_error = zero[c.mt_fs_error]
@@ -248,7 +248,7 @@ public function metadata(path: str) -> Result[Metadata, Error]:
248
248
 
249
249
  public function write_text(path: str, content: str) -> Result[bool, Error]:
250
250
  var storage = arena.create(path.len + 1)
251
- defer storage.release()
251
+ defer: storage.release()
252
252
 
253
253
  var raw_error = zero[c.mt_fs_error]
254
254
  let status_code = c.mt_fs_write_text(storage.to_cstr(path), content.data, content.len, raw_error)
@@ -260,7 +260,7 @@ public function write_text(path: str, content: str) -> Result[bool, Error]:
260
260
 
261
261
  public function write_bytes(path: str, content: span[ubyte]) -> Result[bool, Error]:
262
262
  var storage = arena.create(path.len + 1)
263
- defer storage.release()
263
+ defer: storage.release()
264
264
 
265
265
  var raw_error = zero[c.mt_fs_error]
266
266
  let status_code = c.mt_fs_write_bytes(storage.to_cstr(path), content.data, content.len, raw_error)
@@ -272,7 +272,7 @@ public function write_bytes(path: str, content: span[ubyte]) -> Result[bool, Err
272
272
 
273
273
  public function set_permissions(path: str, mode: int) -> Result[bool, Error]:
274
274
  var storage = arena.create(path.len + 1)
275
- defer storage.release()
275
+ defer: storage.release()
276
276
 
277
277
  var raw_error = zero[c.mt_fs_error]
278
278
  let status_code = c.mt_fs_set_permissions(storage.to_cstr(path), mode, raw_error)
@@ -284,7 +284,7 @@ public function set_permissions(path: str, mode: int) -> Result[bool, Error]:
284
284
 
285
285
  public function create_directories(path: str) -> Result[bool, Error]:
286
286
  var storage = arena.create(path.len + 1)
287
- defer storage.release()
287
+ defer: storage.release()
288
288
 
289
289
  var raw_error = zero[c.mt_fs_error]
290
290
  let status_code = c.mt_fs_create_directories(storage.to_cstr(path), raw_error)
@@ -307,7 +307,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
307
307
  return Result[bool, Error].failure(error= payload.error)
308
308
  Result.success as payload:
309
309
  var data = payload.value
310
- defer data.release()
310
+ defer: data.release()
311
311
  return write_bytes(target_path, data.as_span())
312
312
 
313
313
  if is_directory(source_path):
@@ -322,7 +322,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
322
322
  return Result[bool, Error].failure(error= payload.error)
323
323
  Result.success as payload:
324
324
  var entries = payload.value
325
- defer entries.release()
325
+ defer: entries.release()
326
326
 
327
327
  var index: ptr_uint = 0
328
328
  while index < entries.len():
@@ -334,9 +334,9 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
334
334
  ].failure(error= static_error("fs copy entry missing source entry"))
335
335
  Option.some as entry_payload:
336
336
  var child_source = path_ops.join(source_path, entry_payload.value)
337
- defer child_source.release()
337
+ defer: child_source.release()
338
338
  var child_target = path_ops.join(target_path, entry_payload.value)
339
- defer child_target.release()
339
+ defer: child_target.release()
340
340
  match copy_entry(child_source.as_str(), child_target.as_str()):
341
341
  Result.failure as child_payload:
342
342
  return Result[bool, Error].failure(error= child_payload.error)
@@ -357,7 +357,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
357
357
 
358
358
  public function remove(path: str) -> Result[bool, Error]:
359
359
  var storage = arena.create(path.len + 1)
360
- defer storage.release()
360
+ defer: storage.release()
361
361
 
362
362
  var raw_error = zero[c.mt_fs_error]
363
363
  let status_code = c.mt_fs_remove(storage.to_cstr(path), raw_error)
@@ -374,7 +374,7 @@ public function remove_tree(path: str) -> Result[bool, Error]:
374
374
  return Result[bool, Error].failure(error= payload.error)
375
375
  Result.success as payload:
376
376
  var entries = payload.value
377
- defer entries.release()
377
+ defer: entries.release()
378
378
 
379
379
  var index: ptr_uint = 0
380
380
  while index < entries.len():
@@ -383,7 +383,7 @@ public function remove_tree(path: str) -> Result[bool, Error]:
383
383
  return Result[bool, Error].failure(error= static_error("fs remove tree missing entry"))
384
384
  Option.some as entry_payload:
385
385
  var child_path = path_ops.join(path, entry_payload.value)
386
- defer child_path.release()
386
+ defer: child_path.release()
387
387
  match remove_tree(child_path.as_str()):
388
388
  Result.failure as child_payload:
389
389
  return Result[bool, Error].failure(error= child_payload.error)
@@ -401,9 +401,9 @@ public function remove_tree(path: str) -> Result[bool, Error]:
401
401
 
402
402
  public function rename(source_path: str, target_path: str) -> Result[bool, Error]:
403
403
  var source_storage = arena.create(source_path.len + 1)
404
- defer source_storage.release()
404
+ defer: source_storage.release()
405
405
  var target_storage = arena.create(target_path.len + 1)
406
- defer target_storage.release()
406
+ defer: target_storage.release()
407
407
 
408
408
  var raw_error = zero[c.mt_fs_error]
409
409
  let status_code = c.mt_fs_rename(
@@ -438,7 +438,7 @@ public function find_ancestor_containing(path: str, entry_name: str) -> Option[s
438
438
 
439
439
  while true:
440
440
  var candidate = path_ops.join(current.as_str(), entry_name)
441
- defer candidate.release()
441
+ defer: candidate.release()
442
442
  let found = exists(candidate.as_str())
443
443
  if found:
444
444
  return Option[string.String].some(value= current)
@@ -486,7 +486,7 @@ public function temporary_directory() -> string.String:
486
486
 
487
487
  public function canonicalize(path: str) -> Result[string.String, Error]:
488
488
  var storage = arena.create(path.len + 1)
489
- defer storage.release()
489
+ defer: storage.release()
490
490
 
491
491
  var raw_text = zero[c.mt_fs_string]
492
492
  var raw_error = zero[c.mt_fs_error]
@@ -505,7 +505,7 @@ public function create_temporary_directory(parent_dir: str, prefix: str) -> Resu
505
505
  ].failure(error= static_error("fs.create_temporary_directory requires a non-empty prefix"))
506
506
 
507
507
  var storage = arena.create(parent_dir.len + prefix.len + 2)
508
- defer storage.release()
508
+ defer: storage.release()
509
509
 
510
510
  var raw_text = zero[c.mt_fs_string]
511
511
  var raw_error = zero[c.mt_fs_error]
@@ -529,7 +529,7 @@ public function create_temporary_directory(parent_dir: str, prefix: str) -> Resu
529
529
 
530
530
  public function create_temporary_directory_in_system_temp(prefix: str) -> Result[string.String, Error]:
531
531
  var root = temporary_directory()
532
- defer root.release()
532
+ defer: root.release()
533
533
  return create_temporary_directory(root.as_str(), prefix)
534
534
 
535
535
 
@@ -541,7 +541,7 @@ public function create_temporary_file(parent_dir: str, prefix: str, suffix: str)
541
541
  ].failure(error= static_error("fs.create_temporary_file requires a non-empty prefix"))
542
542
 
543
543
  var storage = arena.create(parent_dir.len + prefix.len + suffix.len + 3)
544
- defer storage.release()
544
+ defer: storage.release()
545
545
 
546
546
  var raw_text = zero[c.mt_fs_string]
547
547
  var raw_error = zero[c.mt_fs_error]
@@ -563,13 +563,13 @@ public function create_temporary_file(parent_dir: str, prefix: str, suffix: str)
563
563
 
564
564
  public function create_temporary_file_in_system_temp(prefix: str, suffix: str) -> Result[string.String, Error]:
565
565
  var root = temporary_directory()
566
- defer root.release()
566
+ defer: root.release()
567
567
  return create_temporary_file(root.as_str(), prefix, suffix)
568
568
 
569
569
 
570
570
  public function list_entries(path: str) -> Result[Entries, Error]:
571
571
  var storage = arena.create(path.len + 1)
572
- defer storage.release()
572
+ defer: storage.release()
573
573
 
574
574
  var raw_entries = zero[c.mt_fs_entries]
575
575
  var raw_error = zero[c.mt_fs_error]
@@ -644,7 +644,7 @@ function collect_files_recursive(path: str, output: ref[vec.Vec[string.String]])
644
644
  return Result[bool, Error].failure(error= payload.error)
645
645
  Result.success as payload:
646
646
  var entries = payload.value
647
- defer entries.release()
647
+ defer: entries.release()
648
648
 
649
649
  var index: ptr_uint = 0
650
650
  while index < entries.len():
data/std/fs.windows.mt CHANGED
@@ -89,7 +89,7 @@ function release_string_values(values: ref[vec.Vec[string.String]]) -> void:
89
89
 
90
90
  function path_kind(path: str) -> int:
91
91
  var storage = arena.create(path.len + 1)
92
- defer storage.release()
92
+ defer: storage.release()
93
93
  return c.mt_fs_path_kind(storage.to_cstr(path))
94
94
 
95
95
 
@@ -170,7 +170,7 @@ public function is_directory(path: str) -> bool:
170
170
 
171
171
  public function read_text(path: str) -> Result[string.String, Error]:
172
172
  var storage = arena.create(path.len + 1)
173
- defer storage.release()
173
+ defer: storage.release()
174
174
 
175
175
  var raw_text = zero[c.mt_fs_string]
176
176
  var raw_error = zero[c.mt_fs_error]
@@ -187,7 +187,7 @@ public function read_lines(path: str) -> Result[Entries, Error]:
187
187
  return Result[Entries, Error].failure(error= payload.error)
188
188
  Result.success as payload:
189
189
  var content = payload.value
190
- defer content.release()
190
+ defer: content.release()
191
191
 
192
192
  var values = vec.Vec[string.String].create()
193
193
  let content_text = content.as_str()
@@ -216,7 +216,7 @@ public function read_lines(path: str) -> Result[Entries, Error]:
216
216
 
217
217
  public function read_bytes(path: str) -> Result[bytes.Bytes, Error]:
218
218
  var storage = arena.create(path.len + 1)
219
- defer storage.release()
219
+ defer: storage.release()
220
220
 
221
221
  var raw_bytes = zero[c.mt_fs_string]
222
222
  var raw_error = zero[c.mt_fs_error]
@@ -229,7 +229,7 @@ public function read_bytes(path: str) -> Result[bytes.Bytes, Error]:
229
229
 
230
230
  public function metadata(path: str) -> Result[Metadata, Error]:
231
231
  var storage = arena.create(path.len + 1)
232
- defer storage.release()
232
+ defer: storage.release()
233
233
 
234
234
  var raw_metadata = zero[c.mt_fs_metadata]
235
235
  var raw_error = zero[c.mt_fs_error]
@@ -248,7 +248,7 @@ public function metadata(path: str) -> Result[Metadata, Error]:
248
248
 
249
249
  public function write_text(path: str, content: str) -> Result[bool, Error]:
250
250
  var storage = arena.create(path.len + 1)
251
- defer storage.release()
251
+ defer: storage.release()
252
252
 
253
253
  var raw_error = zero[c.mt_fs_error]
254
254
  let status_code = c.mt_fs_write_text(storage.to_cstr(path), content.data, content.len, raw_error)
@@ -260,7 +260,7 @@ public function write_text(path: str, content: str) -> Result[bool, Error]:
260
260
 
261
261
  public function write_bytes(path: str, content: span[ubyte]) -> Result[bool, Error]:
262
262
  var storage = arena.create(path.len + 1)
263
- defer storage.release()
263
+ defer: storage.release()
264
264
 
265
265
  var raw_error = zero[c.mt_fs_error]
266
266
  let status_code = c.mt_fs_write_bytes(storage.to_cstr(path), content.data, content.len, raw_error)
@@ -272,7 +272,7 @@ public function write_bytes(path: str, content: span[ubyte]) -> Result[bool, Err
272
272
 
273
273
  public function set_permissions(path: str, mode: int) -> Result[bool, Error]:
274
274
  var storage = arena.create(path.len + 1)
275
- defer storage.release()
275
+ defer: storage.release()
276
276
 
277
277
  var raw_error = zero[c.mt_fs_error]
278
278
  let status_code = c.mt_fs_set_permissions(storage.to_cstr(path), mode, raw_error)
@@ -284,7 +284,7 @@ public function set_permissions(path: str, mode: int) -> Result[bool, Error]:
284
284
 
285
285
  public function create_directories(path: str) -> Result[bool, Error]:
286
286
  var storage = arena.create(path.len + 1)
287
- defer storage.release()
287
+ defer: storage.release()
288
288
 
289
289
  var raw_error = zero[c.mt_fs_error]
290
290
  let status_code = c.mt_fs_create_directories(storage.to_cstr(path), raw_error)
@@ -307,7 +307,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
307
307
  return Result[bool, Error].failure(error= payload.error)
308
308
  Result.success as payload:
309
309
  var data = payload.value
310
- defer data.release()
310
+ defer: data.release()
311
311
  return write_bytes(target_path, data.as_span())
312
312
 
313
313
  if is_directory(source_path):
@@ -322,7 +322,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
322
322
  return Result[bool, Error].failure(error= payload.error)
323
323
  Result.success as payload:
324
324
  var entries = payload.value
325
- defer entries.release()
325
+ defer: entries.release()
326
326
 
327
327
  var index: ptr_uint = 0
328
328
  while index < entries.len():
@@ -359,7 +359,7 @@ public function copy_entry(source_path: str, target_path: str) -> Result[bool, E
359
359
 
360
360
  public function remove(path: str) -> Result[bool, Error]:
361
361
  var storage = arena.create(path.len + 1)
362
- defer storage.release()
362
+ defer: storage.release()
363
363
 
364
364
  var raw_error = zero[c.mt_fs_error]
365
365
  let status_code = c.mt_fs_remove(storage.to_cstr(path), raw_error)
@@ -376,7 +376,7 @@ public function remove_tree(path: str) -> Result[bool, Error]:
376
376
  return Result[bool, Error].failure(error= payload.error)
377
377
  Result.success as payload:
378
378
  var entries = payload.value
379
- defer entries.release()
379
+ defer: entries.release()
380
380
 
381
381
  var index: ptr_uint = 0
382
382
  while index < entries.len():
@@ -404,9 +404,9 @@ public function remove_tree(path: str) -> Result[bool, Error]:
404
404
 
405
405
  public function rename(source_path: str, target_path: str) -> Result[bool, Error]:
406
406
  var source_storage = arena.create(source_path.len + 1)
407
- defer source_storage.release()
407
+ defer: source_storage.release()
408
408
  var target_storage = arena.create(target_path.len + 1)
409
- defer target_storage.release()
409
+ defer: target_storage.release()
410
410
 
411
411
  var raw_error = zero[c.mt_fs_error]
412
412
  let status_code = c.mt_fs_rename(
@@ -501,7 +501,7 @@ public function temporary_directory() -> string.String:
501
501
 
502
502
  public function canonicalize(path: str) -> Result[string.String, Error]:
503
503
  var storage = arena.create(path.len + 1)
504
- defer storage.release()
504
+ defer: storage.release()
505
505
 
506
506
  var raw_text = zero[c.mt_fs_string]
507
507
  var raw_error = zero[c.mt_fs_error]
@@ -520,7 +520,7 @@ public function create_temporary_directory(parent_dir: str, prefix: str) -> Resu
520
520
  ].failure(error= static_error("fs.create_temporary_directory requires a non-empty prefix"))
521
521
 
522
522
  var storage = arena.create(parent_dir.len + prefix.len + 2)
523
- defer storage.release()
523
+ defer: storage.release()
524
524
 
525
525
  var raw_text = zero[c.mt_fs_string]
526
526
  var raw_error = zero[c.mt_fs_error]
@@ -544,7 +544,7 @@ public function create_temporary_directory(parent_dir: str, prefix: str) -> Resu
544
544
 
545
545
  public function create_temporary_directory_in_system_temp(prefix: str) -> Result[string.String, Error]:
546
546
  var root = temporary_directory()
547
- defer root.release()
547
+ defer: root.release()
548
548
  return create_temporary_directory(root.as_str(), prefix)
549
549
 
550
550
 
@@ -556,7 +556,7 @@ public function create_temporary_file(parent_dir: str, prefix: str, suffix: str)
556
556
  ].failure(error= static_error("fs.create_temporary_file requires a non-empty prefix"))
557
557
 
558
558
  var storage = arena.create(parent_dir.len + prefix.len + suffix.len + 3)
559
- defer storage.release()
559
+ defer: storage.release()
560
560
 
561
561
  var raw_text = zero[c.mt_fs_string]
562
562
  var raw_error = zero[c.mt_fs_error]
@@ -578,13 +578,13 @@ public function create_temporary_file(parent_dir: str, prefix: str, suffix: str)
578
578
 
579
579
  public function create_temporary_file_in_system_temp(prefix: str, suffix: str) -> Result[string.String, Error]:
580
580
  var root = temporary_directory()
581
- defer root.release()
581
+ defer: root.release()
582
582
  return create_temporary_file(root.as_str(), prefix, suffix)
583
583
 
584
584
 
585
585
  public function list_entries(path: str) -> Result[Entries, Error]:
586
586
  var storage = arena.create(path.len + 1)
587
- defer storage.release()
587
+ defer: storage.release()
588
588
 
589
589
  var raw_entries = zero[c.mt_fs_entries]
590
590
  var raw_error = zero[c.mt_fs_error]
@@ -659,7 +659,7 @@ function collect_files_recursive(path: str, output: ref[vec.Vec[string.String]])
659
659
  return Result[bool, Error].failure(error= payload.error)
660
660
  Result.success as payload:
661
661
  var entries = payload.value
662
- defer entries.release()
662
+ defer: entries.release()
663
663
 
664
664
  var index: ptr_uint = 0
665
665
  while index < entries.len():
data/std/goap.mt CHANGED
@@ -233,9 +233,9 @@ extending Planner[World, Goal, Context]:
233
233
 
234
234
  public editable function plan(context: ref[Context], initial_world: World, goal: Goal) -> PlanningResult[World]:
235
235
  var nodes = vec.Vec[SearchNode[World]].create()
236
- defer nodes.release()
236
+ defer: nodes.release()
237
237
  var open_list = vec.Vec[ptr_uint].create()
238
- defer open_list.release()
238
+ defer: open_list.release()
239
239
 
240
240
  nodes.push(
241
241
  SearchNode[World](
data/std/http/server.mt CHANGED
@@ -289,11 +289,11 @@ function ascii_case_equal(left: str, right: str) -> bool:
289
289
 
290
290
  public async function write_response(stream: net.TcpStream, response: ref[Response]) -> Result[ptr_uint, net.Error]:
291
291
  var header_text = string.String.with_capacity(256)
292
- defer header_text.release()
292
+ defer: header_text.release()
293
293
 
294
294
  let reason_str = response.reason.as_str()
295
295
  var status_text = string.String.create()
296
- defer status_text.release()
296
+ defer: status_text.release()
297
297
  append_ptr_uint(ref_of(status_text), ptr_uint<-response.status_code)
298
298
 
299
299
  header_text.append("HTTP/1.1 ")
@@ -303,7 +303,7 @@ public async function write_response(stream: net.TcpStream, response: ref[Respon
303
303
  header_text.append("\r\n")
304
304
 
305
305
  var body_len_text = string.String.create()
306
- defer body_len_text.release()
306
+ defer: body_len_text.release()
307
307
  append_ptr_uint(ref_of(body_len_text), response.body.len)
308
308
 
309
309
  var has_content_type = false
@@ -521,10 +521,10 @@ function has_header_end(data: span[ubyte]) -> bool:
521
521
 
522
522
  async function send_error(stream: net.TcpStream, code: int, message: str) -> void:
523
523
  var code_str = fmt.to_string_int(code)
524
- defer code_str.release()
524
+ defer: code_str.release()
525
525
  let body_text = f"<html><body><h1>#{code_str.as_str()} #{message}</h1></body></html>\r\n"
526
526
  var body_len_str = fmt.to_string_ptr_uint(body_text.len)
527
- defer body_len_str.release()
527
+ defer: body_len_str.release()
528
528
  let header_text = f"HTTP/1.1 #{code_str.as_str()} #{message}\r\nContent-Type: text/html\r\nContent-Length: #{body_len_str.as_str()}\r\nConnection: close\r\n\r\n"
529
529
  await stream.write_bytes(text.as_byte_span(header_text))
530
530
  await stream.write_bytes(text.as_byte_span(body_text))
@@ -539,9 +539,9 @@ async function send_file_response(
539
539
  head_only: bool
540
540
  ) -> void:
541
541
  var code_str = fmt.to_string_int(code)
542
- defer code_str.release()
542
+ defer: code_str.release()
543
543
  var body_len_str = fmt.to_string_ptr_uint(body.len)
544
- defer body_len_str.release()
544
+ defer: body_len_str.release()
545
545
  let header_text = f"HTTP/1.1 #{code_str.as_str()} #{message}\r\nContent-Type: #{content_type}\r\nContent-Length: #{body_len_str.as_str()}\r\nConnection: close\r\n\r\n"
546
546
  await stream.write_bytes(text.as_byte_span(header_text))
547
547
  if not head_only:
@@ -620,13 +620,13 @@ async function serve_directory_index(stream: net.TcpStream, dir_path: str, url_p
620
620
  var entries = fs.list_entries(dir_path) else:
621
621
  await send_error(stream, 500, "Internal Server Error")
622
622
  return
623
- defer entries.release()
623
+ defer: entries.release()
624
624
 
625
625
  var names = vec.Vec[string.String].create()
626
- defer release_string_vec(ref_of(names))
626
+ defer: release_string_vec(ref_of(names))
627
627
 
628
628
  var is_dir = vec.Vec[bool].create()
629
- defer is_dir.release()
629
+ defer: is_dir.release()
630
630
 
631
631
  var index: ptr_uint = 0
632
632
  while index < entries.len():
@@ -635,16 +635,16 @@ async function serve_directory_index(stream: net.TcpStream, dir_path: str, url_p
635
635
  let entry_name = entry_ptr.unwrap()
636
636
  let name_str = entry_name
637
637
  var child_path = path_ops.join(dir_path, name_str)
638
- defer child_path.release()
638
+ defer: child_path.release()
639
639
  let dir_flag = fs.is_directory(child_path.as_str())
640
640
  sorted_insert(ref_of(names), ref_of(is_dir), string.String.from_str(name_str), dir_flag)
641
641
  index += 1
642
642
 
643
643
  var body = string.String.with_capacity(4096)
644
- defer body.release()
644
+ defer: body.release()
645
645
 
646
646
  var escaped_path = html_escape(url_prefix)
647
- defer escaped_path.release()
647
+ defer: escaped_path.release()
648
648
 
649
649
  body.append("<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><title>Index of ")
650
650
  body.append(escaped_path.as_str())
@@ -667,10 +667,10 @@ async function serve_directory_index(stream: net.TcpStream, dir_path: str, url_p
667
667
  let is_directory = read(dir_flag_ptr)
668
668
 
669
669
  var line = string.String.with_capacity(name_str.len + 64)
670
- defer line.release()
670
+ defer: line.release()
671
671
 
672
672
  var escaped_name = html_escape(name_str)
673
- defer escaped_name.release()
673
+ defer: escaped_name.release()
674
674
 
675
675
  if is_directory:
676
676
  line.append("<a href=\"")
@@ -698,10 +698,10 @@ async function serve_directory_index(stream: net.TcpStream, dir_path: str, url_p
698
698
 
699
699
  async function handle_connection(stream: net.TcpStream, serve_dir: str) -> void:
700
700
  var conn = stream
701
- defer conn.release()
701
+ defer: conn.release()
702
702
 
703
703
  var buffer = vec.Vec[ubyte].with_capacity(READ_BUFFER_SIZE)
704
- defer buffer.release()
704
+ defer: buffer.release()
705
705
 
706
706
  var headers_done = false
707
707
  while not headers_done:
@@ -750,13 +750,13 @@ async function handle_connection(stream: net.TcpStream, serve_dir: str) -> void:
750
750
  url_path = stripped
751
751
 
752
752
  var file_path = path_ops.join(serve_dir, url_path)
753
- defer file_path.release()
753
+ defer: file_path.release()
754
754
 
755
755
  let content_result = fs.read_bytes(file_path.as_str())
756
756
  match content_result:
757
757
  Result.success as content_ok:
758
758
  var content = content_ok.value
759
- defer content.release()
759
+ defer: content.release()
760
760
 
761
761
  let mime = guess_mime(file_path.as_str())
762
762
  await send_file_response(conn, 200, "OK", mime, content.as_span(), method.equal("HEAD"))
@@ -786,7 +786,7 @@ async function main(args: span[str]) -> void:
786
786
  let serve_dir = parse_serve_dir(args)
787
787
 
788
788
  var port_str = fmt.to_string_int(port)
789
- defer port_str.release()
789
+ defer: port_str.release()
790
790
 
791
791
  stdio.print_format("Serving HTTP on http://0.0.0.0:%d (dir: %s)\n", port, serve_dir)
792
792
 
@@ -798,7 +798,7 @@ async function main(args: span[str]) -> void:
798
798
  stdio.print_format("failed to listen\n")
799
799
  return
800
800
 
801
- defer listener.release()
801
+ defer: listener.release()
802
802
 
803
803
  while true:
804
804
  let accept_result = await listener.accept()
data/std/http.mt CHANGED
@@ -399,7 +399,7 @@ function build_request(
399
399
 
400
400
  if not content_length_seen:
401
401
  var content_length = fmt.to_string_ptr_uint(body_length)
402
- defer content_length.release()
402
+ defer: content_length.release()
403
403
  append_request_header_line(ref_of(request), "Content-Length", content_length.as_str())
404
404
 
405
405
  index = 0
@@ -654,7 +654,7 @@ function parse_response_head(header_text: str) -> Result[ResponseHead, Error]:
654
654
 
655
655
  function decode_buffered_chunked_body(encoded: span[ubyte]) -> Result[bytes.Bytes, Error]:
656
656
  var body = vec.Vec[ubyte].with_capacity(encoded.len)
657
- defer body.release()
657
+ defer: body.release()
658
658
 
659
659
  var cursor: ptr_uint = 0
660
660
  while true:
@@ -775,10 +775,10 @@ function parse_buffered_response(raw_response: span[ubyte]) -> Result[Response,
775
775
 
776
776
  async function read_chunked_body(stream: net.TcpStream, prefix: span[ubyte]) -> Result[bytes.Bytes, Error]:
777
777
  var body = vec.Vec[ubyte].with_capacity(prefix.len)
778
- defer body.release()
778
+ defer: body.release()
779
779
 
780
780
  var buffer = vec.Vec[ubyte].with_capacity(prefix.len + 64)
781
- defer buffer.release()
781
+ defer: buffer.release()
782
782
  buffer.append_span(prefix)
783
783
 
784
784
  var cursor: ptr_uint = 0
@@ -906,7 +906,7 @@ async function read_body(
906
906
  return Result[bytes.Bytes, Error].failure(error = response_error("body exceeded Content-Length"))
907
907
 
908
908
  var body = vec.Vec[ubyte].with_capacity(total_length)
909
- defer body.release()
909
+ defer: body.release()
910
910
 
911
911
  body.append_span(prefix)
912
912
 
@@ -924,7 +924,7 @@ async function read_body(
924
924
  return Result[bytes.Bytes, Error].success(value = bytes.Bytes.copy(body.as_span()))
925
925
  Option.none:
926
926
  var body = vec.Vec[ubyte].with_capacity(prefix.len)
927
- defer body.release()
927
+ defer: body.release()
928
928
 
929
929
  body.append_span(prefix)
930
930
 
@@ -947,7 +947,7 @@ async function read_body(
947
947
 
948
948
  async function read_response(stream: net.TcpStream) -> Result[Response, Error]:
949
949
  var received = vec.Vec[ubyte].create()
950
- defer received.release()
950
+ defer: received.release()
951
951
 
952
952
  var header_length: ptr_uint = 0
953
953
  var headers_ready = false
@@ -1008,7 +1008,7 @@ async function read_response(stream: net.TcpStream) -> Result[Response, Error]:
1008
1008
 
1009
1009
  async function request_http(parsed: ParsedUrl, request_bytes: span[ubyte]) -> Result[Response, Error]:
1010
1010
  var service = fmt.to_string_int(parsed.port)
1011
- defer service.release()
1011
+ defer: service.release()
1012
1012
 
1013
1013
  let address_result = await net.resolve_first(parsed.host.as_str(), service.as_str())
1014
1014
  match address_result:
@@ -1016,7 +1016,7 @@ async function request_http(parsed: ParsedUrl, request_bytes: span[ubyte]) -> Re
1016
1016
  return Result[Response, Error].failure(error = status_net_error(address_error_payload.error))
1017
1017
  Result.success as address_payload:
1018
1018
  var address = address_payload.value
1019
- defer address.release()
1019
+ defer: address.release()
1020
1020
 
1021
1021
  let connect_result = await net.connect(address)
1022
1022
  match connect_result:
@@ -1024,7 +1024,7 @@ async function request_http(parsed: ParsedUrl, request_bytes: span[ubyte]) -> Re
1024
1024
  return Result[Response, Error].failure(error = status_net_error(connect_error_payload.error))
1025
1025
  Result.success as connect_payload:
1026
1026
  var stream = connect_payload.value
1027
- defer stream.release()
1027
+ defer: stream.release()
1028
1028
 
1029
1029
  let write_result = await stream.write_bytes(request_bytes)
1030
1030
  match write_result:
@@ -1042,7 +1042,7 @@ async function request_http(parsed: ParsedUrl, request_bytes: span[ubyte]) -> Re
1042
1042
 
1043
1043
  async function read_buffered_tls_response(stream: tls.Stream) -> Result[Response, Error]:
1044
1044
  var received = vec.Vec[ubyte].create()
1045
- defer received.release()
1045
+ defer: received.release()
1046
1046
 
1047
1047
  while true:
1048
1048
  let chunk_result = await stream.read_once(4096)
@@ -1068,7 +1068,7 @@ async function request_https(parsed: ParsedUrl, request_bytes: span[ubyte]) -> R
1068
1068
  return Result[Response, Error].failure(error = status_tls_error(payload.error))
1069
1069
  Result.success as payload:
1070
1070
  var stream = payload.value
1071
- defer stream.release()
1071
+ defer: stream.release()
1072
1072
 
1073
1073
  let write_result = await stream.write_bytes(request_bytes)
1074
1074
  match write_result:
@@ -1214,7 +1214,7 @@ public async function request(
1214
1214
  return Result[Response, Error].failure(error = payload.error)
1215
1215
  Result.success as payload:
1216
1216
  var parsed = payload.value
1217
- defer parsed.release()
1217
+ defer: parsed.release()
1218
1218
 
1219
1219
  let request_result = build_request(parsed, method, headers, body)
1220
1220
  match request_result:
@@ -1222,6 +1222,6 @@ public async function request(
1222
1222
  return Result[Response, Error].failure(error = request_error_payload.error)
1223
1223
  Result.success as request_payload:
1224
1224
  var request_bytes = request_payload.value
1225
- defer request_bytes.release()
1225
+ defer: request_bytes.release()
1226
1226
 
1227
1227
  return await request_with_transport(parsed, request_bytes.as_span())