mt-lang 0.3.14 → 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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/docs/index.html +8 -8
- data/docs/language-design.md +4 -8
- data/docs/language-manual.md +17 -5
- data/lib/milk_tea/base.rb +1 -1
- data/lib/milk_tea/core/ast.rb +2 -2
- data/lib/milk_tea/core/control_flow/builder.rb +62 -2
- data/lib/milk_tea/core/lowering/async/analysis.rb +3 -9
- data/lib/milk_tea/core/lowering/async/lowering.rb +2 -10
- data/lib/milk_tea/core/lowering/async/normalization.rb +2 -7
- data/lib/milk_tea/core/lowering/block.rb +1 -5
- data/lib/milk_tea/core/lowering/proc.rb +1 -5
- data/lib/milk_tea/core/lowering/scans.rb +3 -1
- data/lib/milk_tea/core/lowering/utils.rb +1 -27
- data/lib/milk_tea/core/parser/statements.rb +18 -12
- data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +3 -11
- data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +2 -3
- data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +1 -1
- data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +1 -2
- data/lib/milk_tea/core/semantic_analyzer/nullability.rb +2 -4
- data/lib/milk_tea/core/semantic_analyzer/statements.rb +2 -8
- data/lib/milk_tea/tooling/linter/imports_platform.rb +2 -4
- data/lib/milk_tea/tooling/linter/release_rules.rb +1 -6
- data/lib/milk_tea/tooling/linter/source_helpers.rb +0 -6
- data/lib/milk_tea/tooling/linter/visitors.rb +4 -8
- data/lib/milk_tea/tooling/sexpr_dumper.rb +2 -0
- data/std/asset_pack.mt +1 -1
- data/std/async/libuv_runtime.mt +6 -6
- data/std/async/mailbox.mt +4 -4
- data/std/cookie.mt +2 -2
- data/std/crypto.mt +1 -1
- data/std/curl/runtime.mt +10 -10
- data/std/fs.linux.mt +26 -26
- data/std/fs.windows.mt +22 -22
- data/std/goap.mt +2 -2
- data/std/http/server.mt +21 -21
- data/std/http.mt +14 -14
- data/std/jobs.mt +4 -4
- data/std/json.mt +5 -5
- data/std/log.mt +1 -1
- data/std/mem/tracking.mt +1 -1
- data/std/net/channel.mt +4 -4
- data/std/net/clock.mt +6 -6
- data/std/net/discovery.mt +7 -7
- data/std/net/lobby.mt +10 -10
- data/std/net/manager.mt +1 -1
- data/std/net/mux.mt +4 -4
- data/std/net/nat.mt +4 -4
- data/std/net/packet.mt +3 -3
- data/std/net/punch.mt +3 -3
- data/std/net/rpc.mt +3 -3
- data/std/net/session.mt +15 -15
- data/std/net/stun.mt +4 -4
- data/std/net/turn.mt +4 -4
- data/std/oauth2.mt +12 -12
- data/std/path.mt +8 -8
- data/std/process.mt +4 -4
- data/std/raylib/packed_assets.mt +5 -5
- data/std/serialize.mt +1 -1
- data/std/tar.mt +10 -10
- data/std/terminal.mt +18 -18
- data/std/tls.mt +8 -8
- data/std/uri.mt +1 -1
- data/std/utility.mt +1 -1
- metadata +2 -2
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())
|
data/std/jobs.mt
CHANGED
|
@@ -53,7 +53,7 @@ function noop_completion(arg: ptr[void]) -> void:
|
|
|
53
53
|
function stop_pool_state(state: ptr[PoolState]) -> void:
|
|
54
54
|
let mutex = unsafe: read(state).mutex
|
|
55
55
|
mutex.lock()
|
|
56
|
-
defer mutex.unlock()
|
|
56
|
+
defer: mutex.unlock()
|
|
57
57
|
unsafe: read(state).stopping = true
|
|
58
58
|
let condition = unsafe: read(state).condition
|
|
59
59
|
condition.broadcast()
|
|
@@ -229,7 +229,7 @@ extending Pool:
|
|
|
229
229
|
|
|
230
230
|
let mutex = unsafe: read(state).mutex
|
|
231
231
|
mutex.lock()
|
|
232
|
-
defer mutex.unlock()
|
|
232
|
+
defer: mutex.unlock()
|
|
233
233
|
|
|
234
234
|
if unsafe: read(state).stopping:
|
|
235
235
|
return Result[bool, Error].failure(error = jobs_error(-1, "jobs pool is stopping"))
|
|
@@ -270,7 +270,7 @@ extending Pool:
|
|
|
270
270
|
|
|
271
271
|
let mutex = unsafe: read(state).mutex
|
|
272
272
|
mutex.lock()
|
|
273
|
-
defer mutex.unlock()
|
|
273
|
+
defer: mutex.unlock()
|
|
274
274
|
return unsafe: read(state).queued_jobs
|
|
275
275
|
|
|
276
276
|
|
|
@@ -280,7 +280,7 @@ extending Pool:
|
|
|
280
280
|
|
|
281
281
|
let mutex = unsafe: read(state).mutex
|
|
282
282
|
mutex.lock()
|
|
283
|
-
defer mutex.unlock()
|
|
283
|
+
defer: mutex.unlock()
|
|
284
284
|
return unsafe: read(state).queued_jobs + read(state).running_jobs
|
|
285
285
|
|
|
286
286
|
|
data/std/json.mt
CHANGED
|
@@ -375,12 +375,12 @@ function build_raw_value(value: Value) -> Result[ptr[cjson.JSON], Error]:
|
|
|
375
375
|
|
|
376
376
|
function render_with_mode(value: Value, pretty: bool) -> Result[string.String, Error]:
|
|
377
377
|
let raw_value = build_raw_value(value)?
|
|
378
|
-
defer cjson.delete(raw_value)
|
|
378
|
+
defer: cjson.delete(raw_value)
|
|
379
379
|
|
|
380
380
|
if pretty:
|
|
381
381
|
let rendered_ptr = cjson.print(raw_value) else:
|
|
382
382
|
return Result[string.String, Error].failure(error = error_message("json print failed"))
|
|
383
|
-
defer raw.cJSON_free(unsafe: rendered_ptr)
|
|
383
|
+
defer: raw.cJSON_free(unsafe: rendered_ptr)
|
|
384
384
|
return Result[
|
|
385
385
|
string.String,
|
|
386
386
|
Error
|
|
@@ -388,13 +388,13 @@ function render_with_mode(value: Value, pretty: bool) -> Result[string.String, E
|
|
|
388
388
|
|
|
389
389
|
let rendered_ptr = cjson.print_unformatted(raw_value) else:
|
|
390
390
|
return Result[string.String, Error].failure(error = error_message("json print failed"))
|
|
391
|
-
defer raw.cJSON_free(unsafe: rendered_ptr)
|
|
391
|
+
defer: raw.cJSON_free(unsafe: rendered_ptr)
|
|
392
392
|
return Result[string.String, Error].success(value = string.String.from_str(text.chars_as_str(rendered_ptr)))
|
|
393
393
|
|
|
394
394
|
|
|
395
395
|
public function parse(text_value: str) -> Result[Value, Error]:
|
|
396
396
|
var storage = arena.create(text_value.len + 1)
|
|
397
|
-
defer storage.release()
|
|
397
|
+
defer: storage.release()
|
|
398
398
|
|
|
399
399
|
let c_text = storage.to_cstr(text_value)
|
|
400
400
|
let raw_value = raw.cJSON_Parse(c_text) else:
|
|
@@ -406,7 +406,7 @@ public function parse(text_value: str) -> Result[Value, Error]:
|
|
|
406
406
|
return Result[Value, Error].failure(error = error_message("json parse failed"))
|
|
407
407
|
return Result[Value, Error].failure(error = Error(message = string.String.from_str(error_text)))
|
|
408
408
|
|
|
409
|
-
defer raw.cJSON_Delete(raw_value)
|
|
409
|
+
defer: raw.cJSON_Delete(raw_value)
|
|
410
410
|
return convert_raw_value(unsafe: ptr[cjson.JSON]?<-raw_value)
|
|
411
411
|
|
|
412
412
|
|
data/std/log.mt
CHANGED
|
@@ -34,7 +34,7 @@ public function log(level: Level, message: str) -> void:
|
|
|
34
34
|
if int<-level < int<-global_level:
|
|
35
35
|
return
|
|
36
36
|
var output = string.String.create()
|
|
37
|
-
defer output.release()
|
|
37
|
+
defer: output.release()
|
|
38
38
|
output.append("[")
|
|
39
39
|
output.append(level_label(level))
|
|
40
40
|
output.append("] ")
|
data/std/mem/tracking.mt
CHANGED
data/std/net/channel.mt
CHANGED
|
@@ -154,7 +154,7 @@ function build_packet(
|
|
|
154
154
|
content: span[ubyte]
|
|
155
155
|
) -> bytes.Bytes:
|
|
156
156
|
var buffer = vec.Vec[ubyte].with_capacity(header_bytes + content.len)
|
|
157
|
-
defer buffer.release()
|
|
157
|
+
defer: buffer.release()
|
|
158
158
|
|
|
159
159
|
buffer.append_array(encode_uint(header_magic))
|
|
160
160
|
buffer.append_array(encode_uint(sequence))
|
|
@@ -275,7 +275,7 @@ async function send_connected_packet(
|
|
|
275
275
|
ack_bits = unsafe: read(protocol).received_mask
|
|
276
276
|
|
|
277
277
|
var framed = build_packet(sequence, ack, ack_bits, packet_flags, content)
|
|
278
|
-
defer framed.release()
|
|
278
|
+
defer: framed.release()
|
|
279
279
|
|
|
280
280
|
(await socket.send(framed.as_span()))?
|
|
281
281
|
return Result[bool, net.Error].success(value = true)
|
|
@@ -297,7 +297,7 @@ async function send_packet_to(
|
|
|
297
297
|
ack_bits = unsafe: read(protocol).received_mask
|
|
298
298
|
|
|
299
299
|
var framed = build_packet(sequence, ack, ack_bits, packet_flags, content)
|
|
300
|
-
defer framed.release()
|
|
300
|
+
defer: framed.release()
|
|
301
301
|
|
|
302
302
|
(await socket.send_to(framed.as_span(), destination))?
|
|
303
303
|
return Result[bool, net.Error].success(value = true)
|
|
@@ -475,7 +475,7 @@ extending Channel:
|
|
|
475
475
|
|
|
476
476
|
public async editable function recv() -> Result[Option[Message], net.Error]:
|
|
477
477
|
var packet = (await this.socket.recv(this.config.max_payload_bytes + header_bytes))?
|
|
478
|
-
defer packet.release()
|
|
478
|
+
defer: packet.release()
|
|
479
479
|
|
|
480
480
|
let header = decode_header(packet)?
|
|
481
481
|
let protocol = unsafe: ptr_of(this.protocol)
|
data/std/net/clock.mt
CHANGED
|
@@ -137,7 +137,7 @@ public async function measure_offset(
|
|
|
137
137
|
) -> Result[ClockSync, Error]:
|
|
138
138
|
let t1 = libuv.hrtime()
|
|
139
139
|
var request = build_request(t1)
|
|
140
|
-
defer request.release()
|
|
140
|
+
defer: request.release()
|
|
141
141
|
(await socket.send_to(request.as_span(), peer)).map_error(proc(_: net.Error) -> Error:
|
|
142
142
|
clock_error(err_send_failed, "failed to send sync request")
|
|
143
143
|
)?
|
|
@@ -154,8 +154,8 @@ public async function measure_offset(
|
|
|
154
154
|
)
|
|
155
155
|
Result.success as dp:
|
|
156
156
|
var datagram = dp.value
|
|
157
|
-
defer datagram.data.release()
|
|
158
|
-
defer datagram.source.release()
|
|
157
|
+
defer: datagram.data.release()
|
|
158
|
+
defer: datagram.source.release()
|
|
159
159
|
if is_clock_packet(datagram.data.as_span()):
|
|
160
160
|
let parse_result = parse_response(datagram.data.as_span())
|
|
161
161
|
match parse_result:
|
|
@@ -182,15 +182,15 @@ public async function respond_to_sync(
|
|
|
182
182
|
match recv_result:
|
|
183
183
|
Result.success as dp:
|
|
184
184
|
var datagram = dp.value
|
|
185
|
-
defer datagram.data.release()
|
|
186
|
-
defer datagram.source.release()
|
|
185
|
+
defer: datagram.data.release()
|
|
186
|
+
defer: datagram.source.release()
|
|
187
187
|
if is_clock_packet(datagram.data.as_span()):
|
|
188
188
|
let parse_result = parse_request(datagram.data.as_span())
|
|
189
189
|
match parse_result:
|
|
190
190
|
Result.success as tp:
|
|
191
191
|
let t2 = libuv.hrtime()
|
|
192
192
|
var resp = build_response(tp.value, t2)
|
|
193
|
-
defer resp.release()
|
|
193
|
+
defer: resp.release()
|
|
194
194
|
let _ = await socket.send_to(resp.as_span(), datagram.source)
|
|
195
195
|
Result.failure:
|
|
196
196
|
pass
|