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
|
@@ -169,9 +169,6 @@ module MilkTea
|
|
|
169
169
|
when AST::UnsafeStmt
|
|
170
170
|
_collect_own_released_names(stmt.body, result)
|
|
171
171
|
when AST::DeferStmt
|
|
172
|
-
if stmt.expression
|
|
173
|
-
_collect_heap_release_names(stmt.expression, result)
|
|
174
|
-
end
|
|
175
172
|
_collect_own_released_names(stmt.body, result) if stmt.body.is_a?(Array)
|
|
176
173
|
end
|
|
177
174
|
end
|
|
@@ -476,7 +473,6 @@ module MilkTea
|
|
|
476
473
|
when AST::UnsafeStmt
|
|
477
474
|
_collect_released_names(stmt.body, result)
|
|
478
475
|
when AST::DeferStmt
|
|
479
|
-
_collect_released_names_in_expr(stmt.expression, result) if stmt.expression
|
|
480
476
|
_collect_released_names(stmt.body, result) if stmt.body.is_a?(Array)
|
|
481
477
|
end
|
|
482
478
|
end
|
|
@@ -611,9 +607,8 @@ module MilkTea
|
|
|
611
607
|
def release_call_in_stmt?(stmt, name)
|
|
612
608
|
return false unless stmt
|
|
613
609
|
|
|
614
|
-
# DeferStmt:
|
|
610
|
+
# DeferStmt: block form `defer: …` (inline defers are a single-statement body)
|
|
615
611
|
if stmt.is_a?(AST::DeferStmt)
|
|
616
|
-
return true if stmt.expression && _expr_has_release?(stmt.expression, name)
|
|
617
612
|
return stmt.body.is_a?(Array) && stmt.body.any? { |s| release_call_in_stmt?(s, name) }
|
|
618
613
|
end
|
|
619
614
|
|
|
@@ -240,8 +240,6 @@ module MilkTea
|
|
|
240
240
|
expression_column(statement.expression)
|
|
241
241
|
when AST::ReturnStmt
|
|
242
242
|
expression_column(statement.value)
|
|
243
|
-
when AST::DeferStmt
|
|
244
|
-
expression_column(statement.expression)
|
|
245
243
|
when AST::ExpressionStmt
|
|
246
244
|
expression_column(statement.expression) || source_statement_span(statement.line)&.first
|
|
247
245
|
else
|
|
@@ -267,8 +265,6 @@ module MilkTea
|
|
|
267
265
|
expression_length(statement.expression)
|
|
268
266
|
when AST::ReturnStmt
|
|
269
267
|
expression_length(statement.value)
|
|
270
|
-
when AST::DeferStmt
|
|
271
|
-
expression_length(statement.expression)
|
|
272
268
|
when AST::ExpressionStmt
|
|
273
269
|
expression_length(statement.expression) || source_statement_span(statement.line)&.last
|
|
274
270
|
else
|
|
@@ -326,8 +322,6 @@ module MilkTea
|
|
|
326
322
|
walk_expression_tree(statement.expression, &block)
|
|
327
323
|
when AST::ReturnStmt
|
|
328
324
|
walk_expression_tree(statement.value, &block)
|
|
329
|
-
when AST::DeferStmt
|
|
330
|
-
walk_expression_tree(statement.expression, &block)
|
|
331
325
|
when AST::ExpressionStmt
|
|
332
326
|
walk_expression_tree(statement.expression, &block)
|
|
333
327
|
when AST::StaticAssert
|
|
@@ -225,8 +225,7 @@ module MilkTea
|
|
|
225
225
|
visit_expression(statement.value) if statement.value
|
|
226
226
|
flag_redundant_widening_cast(statement.value) if statement.value
|
|
227
227
|
when AST::DeferStmt
|
|
228
|
-
|
|
229
|
-
with_scope { visit_statement_list(statement.body) } if statement.body
|
|
228
|
+
with_scope { visit_statement_list(statement.body) }
|
|
230
229
|
when AST::ExpressionStmt
|
|
231
230
|
visit_expression(statement.expression)
|
|
232
231
|
check_useless_expression(statement)
|
|
@@ -1252,8 +1251,7 @@ module MilkTea
|
|
|
1252
1251
|
when AST::UnsafeStmt
|
|
1253
1252
|
stmt.body.each { |s| collect_borrows_from_stmt(s, names) }
|
|
1254
1253
|
when AST::DeferStmt
|
|
1255
|
-
|
|
1256
|
-
stmt.body&.each { |s| collect_borrows_from_stmt(s, names) }
|
|
1254
|
+
stmt.body.each { |s| collect_borrows_from_stmt(s, names) }
|
|
1257
1255
|
when AST::WhenStmt
|
|
1258
1256
|
collect_borrows_from_expr(stmt.discriminant, names)
|
|
1259
1257
|
stmt.branches.each { |b| b.body.each { |s| collect_borrows_from_stmt(s, names) } }
|
|
@@ -1319,7 +1317,7 @@ module MilkTea
|
|
|
1319
1317
|
when AST::UnsafeStmt
|
|
1320
1318
|
stmt.body.each { |s| collect_writes_from_stmt(s, names) }
|
|
1321
1319
|
when AST::DeferStmt
|
|
1322
|
-
stmt.body
|
|
1320
|
+
stmt.body.each { |s| collect_writes_from_stmt(s, names) }
|
|
1323
1321
|
end
|
|
1324
1322
|
end
|
|
1325
1323
|
|
|
@@ -1376,9 +1374,7 @@ module MilkTea
|
|
|
1376
1374
|
stmt.body.each { |s| location = find_borrow_location_in_stmt(s, name); return location if location }
|
|
1377
1375
|
nil
|
|
1378
1376
|
when AST::DeferStmt
|
|
1379
|
-
location =
|
|
1380
|
-
return location if location
|
|
1381
|
-
stmt.body&.each { |s| location = find_borrow_location_in_stmt(s, name); return location if location }
|
|
1377
|
+
stmt.body.each { |s| location = find_borrow_location_in_stmt(s, name); return location if location }
|
|
1382
1378
|
nil
|
|
1383
1379
|
when AST::WhenStmt
|
|
1384
1380
|
location = find_borrow_location_in_expr(stmt.discriminant, name)
|
|
@@ -38,6 +38,7 @@ module MilkTea
|
|
|
38
38
|
when Float then buf << format_float(value)
|
|
39
39
|
when String then emit_string(value, buf)
|
|
40
40
|
when Symbol then buf << ":" << value.to_s.tr("_", "-")
|
|
41
|
+
when Hash, Set then nil
|
|
41
42
|
else buf << escape_string(value.to_s)
|
|
42
43
|
end
|
|
43
44
|
end
|
|
@@ -50,6 +51,7 @@ module MilkTea
|
|
|
50
51
|
buf << "(" << type_name
|
|
51
52
|
members.each do |field|
|
|
52
53
|
val = node.public_send(field)
|
|
54
|
+
next if val.is_a?(Hash) || val.is_a?(Set)
|
|
53
55
|
buf << " :" << field.to_s << " "
|
|
54
56
|
emit_value(val, buf)
|
|
55
57
|
end
|
data/std/asset_pack.mt
CHANGED
|
@@ -187,7 +187,7 @@ function read_entry_metadata(file: stdio.File?) -> Result[EntryMetadata, Error]:
|
|
|
187
187
|
|
|
188
188
|
function read_path_matches(file: stdio.File?, path_length: ptr_uint, logical_path: str) -> Result[bool, Error]:
|
|
189
189
|
let path_buffer = heap.must_alloc[ubyte](path_length)
|
|
190
|
-
defer heap.release(path_buffer)
|
|
190
|
+
defer: heap.release(path_buffer)
|
|
191
191
|
|
|
192
192
|
if not read_exact(file, path_buffer, path_length):
|
|
193
193
|
return Result[bool, Error].failure(error= Error.malformed_index)
|
data/std/async/libuv_runtime.mt
CHANGED
|
@@ -475,7 +475,7 @@ public function result[T](task: Task[T]) -> T:
|
|
|
475
475
|
if not completed[T](task):
|
|
476
476
|
fatal(c"async.result called before task completed")
|
|
477
477
|
|
|
478
|
-
defer task.release(task.frame)
|
|
478
|
+
defer: task.release(task.frame)
|
|
479
479
|
return task.take_result(task.frame)
|
|
480
480
|
|
|
481
481
|
|
|
@@ -484,7 +484,7 @@ public function wait_on[T](runtime: Runtime, task: Task[T]) -> T:
|
|
|
484
484
|
while not task.ready(task.frame):
|
|
485
485
|
runtime_poll(runtime)
|
|
486
486
|
|
|
487
|
-
defer task.release(task.frame)
|
|
487
|
+
defer: task.release(task.frame)
|
|
488
488
|
return task.take_result(task.frame)
|
|
489
489
|
|
|
490
490
|
|
|
@@ -503,7 +503,7 @@ public function wait[T](root: proc() -> Task[T]) -> T:
|
|
|
503
503
|
|
|
504
504
|
var runtime = runtime_create()
|
|
505
505
|
runtime_activate(runtime)
|
|
506
|
-
defer runtime_release(ref_of(runtime))
|
|
506
|
+
defer: runtime_release(ref_of(runtime))
|
|
507
507
|
return wait_on[T](runtime, root())
|
|
508
508
|
|
|
509
509
|
|
|
@@ -514,7 +514,7 @@ public function run(root: proc() -> Task[void]) -> void:
|
|
|
514
514
|
|
|
515
515
|
var runtime = runtime_create()
|
|
516
516
|
runtime_activate(runtime)
|
|
517
|
-
defer runtime_release(ref_of(runtime))
|
|
517
|
+
defer: runtime_release(ref_of(runtime))
|
|
518
518
|
run_on(runtime, root())
|
|
519
519
|
|
|
520
520
|
|
|
@@ -524,7 +524,7 @@ public function with_runtime[T](body: proc(runtime: Runtime) -> T) -> T:
|
|
|
524
524
|
|
|
525
525
|
var runtime = runtime_create()
|
|
526
526
|
runtime_activate(runtime)
|
|
527
|
-
defer runtime_release(ref_of(runtime))
|
|
527
|
+
defer: runtime_release(ref_of(runtime))
|
|
528
528
|
return body(runtime)
|
|
529
529
|
|
|
530
530
|
|
|
@@ -535,5 +535,5 @@ public function run_with_runtime(body: proc(runtime: Runtime) -> void) -> void:
|
|
|
535
535
|
|
|
536
536
|
var runtime = runtime_create()
|
|
537
537
|
runtime_activate(runtime)
|
|
538
|
-
defer runtime_release(ref_of(runtime))
|
|
538
|
+
defer: runtime_release(ref_of(runtime))
|
|
539
539
|
body(runtime)
|
data/std/async/mailbox.mt
CHANGED
|
@@ -138,7 +138,7 @@ extending Mailbox[T]:
|
|
|
138
138
|
|
|
139
139
|
var mutex = unsafe: read(state).mutex
|
|
140
140
|
mutex.lock()
|
|
141
|
-
defer mutex.unlock()
|
|
141
|
+
defer: mutex.unlock()
|
|
142
142
|
|
|
143
143
|
let handle = unsafe: read(state).handle else:
|
|
144
144
|
return Result[bool, Error].failure(error = mailbox_error("mailbox is closed"))
|
|
@@ -161,7 +161,7 @@ extending Mailbox[T]:
|
|
|
161
161
|
|
|
162
162
|
var mutex = unsafe: read(state).mutex
|
|
163
163
|
mutex.lock()
|
|
164
|
-
defer mutex.unlock()
|
|
164
|
+
defer: mutex.unlock()
|
|
165
165
|
return unsafe: read(state).queue.pop_front()
|
|
166
166
|
|
|
167
167
|
|
|
@@ -171,7 +171,7 @@ extending Mailbox[T]:
|
|
|
171
171
|
|
|
172
172
|
var mutex = unsafe: read(state).mutex
|
|
173
173
|
mutex.lock()
|
|
174
|
-
defer mutex.unlock()
|
|
174
|
+
defer: mutex.unlock()
|
|
175
175
|
|
|
176
176
|
var drained = vec.Vec[T].with_capacity(unsafe: read(state).queue.len())
|
|
177
177
|
while true:
|
|
@@ -187,5 +187,5 @@ extending Mailbox[T]:
|
|
|
187
187
|
|
|
188
188
|
var mutex = unsafe: read(state).mutex
|
|
189
189
|
mutex.lock()
|
|
190
|
-
defer mutex.unlock()
|
|
190
|
+
defer: mutex.unlock()
|
|
191
191
|
return unsafe: read(state).queue.is_empty()
|
data/std/cookie.mt
CHANGED
|
@@ -94,7 +94,7 @@ function apply_attribute(cookie: ref[Cookie], attribute_text: str) -> void:
|
|
|
94
94
|
match eq:
|
|
95
95
|
Option.none:
|
|
96
96
|
var normalized = ascii_lower(attribute_text)
|
|
97
|
-
defer normalized.release()
|
|
97
|
+
defer: normalized.release()
|
|
98
98
|
|
|
99
99
|
if normalized.as_str().equal("secure"):
|
|
100
100
|
cookie.secure = true
|
|
@@ -106,7 +106,7 @@ function apply_attribute(cookie: ref[Cookie], attribute_text: str) -> void:
|
|
|
106
106
|
let value_text = attribute_text.slice(e.value + 1, attribute_text.len - e.value - 1).trim_ascii_whitespace()
|
|
107
107
|
|
|
108
108
|
var normalized_key = ascii_lower(key_text)
|
|
109
|
-
defer normalized_key.release()
|
|
109
|
+
defer: normalized_key.release()
|
|
110
110
|
|
|
111
111
|
if normalized_key.as_str().equal("domain"):
|
|
112
112
|
cookie.domain = Option[string.String].some(value = string.String.from_str(value_text))
|
data/std/crypto.mt
CHANGED
|
@@ -23,7 +23,7 @@ public function sha256(data: span[ubyte]) -> bytes.Bytes:
|
|
|
23
23
|
|
|
24
24
|
public function sha256_to_str(data: span[ubyte]) -> string.String:
|
|
25
25
|
var digest = sha256(data)
|
|
26
|
-
defer digest.release()
|
|
26
|
+
defer: digest.release()
|
|
27
27
|
|
|
28
28
|
var result = string.String.with_capacity(raw.SHA256_DIGEST_LENGTH * 2)
|
|
29
29
|
var index: ptr_uint = 0
|
data/std/curl/runtime.mt
CHANGED
|
@@ -69,21 +69,21 @@ public function get_bytes(url: str) -> Result[bytes.Bytes, curl.Code]:
|
|
|
69
69
|
return Result[bytes.Bytes, curl.Code].failure(error= curl.Code<-CURLE_URL_MALFORMAT_CODE)
|
|
70
70
|
|
|
71
71
|
var scratch = arena.create(url.len + 1)
|
|
72
|
-
defer scratch.release()
|
|
72
|
+
defer: scratch.release()
|
|
73
73
|
|
|
74
74
|
let url_cstr = scratch.to_cstr(url)
|
|
75
75
|
|
|
76
76
|
let global_status = curl.global_init(curl.CURL_GLOBAL_NOTHING)
|
|
77
77
|
if int<-global_status != CURLE_OK_CODE:
|
|
78
78
|
return Result[bytes.Bytes, curl.Code].failure(error= global_status)
|
|
79
|
-
defer curl.global_cleanup()
|
|
79
|
+
defer: curl.global_cleanup()
|
|
80
80
|
|
|
81
81
|
let handle = curl.easy_init() else:
|
|
82
82
|
return Result[bytes.Bytes, curl.Code].failure(error= curl.Code<-CURLE_FAILED_INIT_CODE)
|
|
83
|
-
defer curl.easy_cleanup(handle)
|
|
83
|
+
defer: curl.easy_cleanup(handle)
|
|
84
84
|
|
|
85
85
|
var body = vec.Vec[ubyte].create()
|
|
86
|
-
defer body.release()
|
|
86
|
+
defer: body.release()
|
|
87
87
|
|
|
88
88
|
let write_function_status = easy_setopt_writefunction(handle, write_response_chunk)
|
|
89
89
|
if int<-write_function_status != CURLE_OK_CODE:
|
|
@@ -199,7 +199,7 @@ function do_request(
|
|
|
199
199
|
let global_status = curl.global_init(curl.CURL_GLOBAL_NOTHING)
|
|
200
200
|
if int<-global_status != CURLE_OK_CODE:
|
|
201
201
|
return Result[HttpResponse, HttpError].failure(error = http_error(global_status))
|
|
202
|
-
defer curl.global_cleanup()
|
|
202
|
+
defer: curl.global_cleanup()
|
|
203
203
|
|
|
204
204
|
let handle = curl.easy_init() else:
|
|
205
205
|
return Result[HttpResponse, HttpError].failure(
|
|
@@ -208,10 +208,10 @@ function do_request(
|
|
|
208
208
|
message = string.String.from_str("curl_easy_init failed")
|
|
209
209
|
)
|
|
210
210
|
)
|
|
211
|
-
defer curl.easy_cleanup(handle)
|
|
211
|
+
defer: curl.easy_cleanup(handle)
|
|
212
212
|
|
|
213
213
|
var buffer = vec.Vec[ubyte].create()
|
|
214
|
-
defer buffer.release()
|
|
214
|
+
defer: buffer.release()
|
|
215
215
|
|
|
216
216
|
let _wfn = easy_setopt_writefunction(handle, write_response_chunk)
|
|
217
217
|
let _wdata = easy_setopt_writedata(handle, unsafe: ptr[void]<-ptr_of(buffer))
|
|
@@ -225,7 +225,7 @@ function do_request(
|
|
|
225
225
|
)
|
|
226
226
|
|
|
227
227
|
var scratch = arena.create(url.len + 1)
|
|
228
|
-
defer scratch.release()
|
|
228
|
+
defer: scratch.release()
|
|
229
229
|
|
|
230
230
|
let url_cstr = scratch.to_cstr(url)
|
|
231
231
|
let _url = easy_setopt_url(handle, url_cstr)
|
|
@@ -237,12 +237,12 @@ function do_request(
|
|
|
237
237
|
if body.is_some():
|
|
238
238
|
let body_content = body.unwrap()
|
|
239
239
|
var body_scratch = arena.create(body_content.len + 1)
|
|
240
|
-
defer body_scratch.release()
|
|
240
|
+
defer: body_scratch.release()
|
|
241
241
|
let _pf = easy_setopt_postfields(handle, body_scratch.to_cstr(body_content))
|
|
242
242
|
|
|
243
243
|
if method.len > 0 and not method.starts_with("GET"):
|
|
244
244
|
var method_scratch = arena.create(method.len + 1)
|
|
245
|
-
defer method_scratch.release()
|
|
245
|
+
defer: method_scratch.release()
|
|
246
246
|
let _method = easy_setopt_customrequest(handle, method_scratch.to_cstr(method))
|
|
247
247
|
|
|
248
248
|
if method.starts_with("HEAD"):
|
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():
|