mt-lang 0.3.13 → 0.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/docs/index.html +31 -23
- data/docs/language-design.md +13 -17
- data/docs/language-manual.md +19 -7
- 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/expressions.rb +47 -3
- data/lib/milk_tea/core/lowering/proc.rb +1 -5
- data/lib/milk_tea/core/lowering/resolve.rb +26 -2
- data/lib/milk_tea/core/lowering/scans.rb +3 -1
- data/lib/milk_tea/core/lowering/utils.rb +7 -28
- 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/core/semantic_analyzer/type_compatibility.rb +29 -2
- data/lib/milk_tea/core/types.rb +0 -6
- 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/{cell.mt → box.mt} +9 -9
- 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 +3 -3
data/std/net/punch.mt
CHANGED
|
@@ -104,8 +104,8 @@ function poll_recv(
|
|
|
104
104
|
return Option[PunchResult].none()
|
|
105
105
|
Result.success as dp:
|
|
106
106
|
var dg = dp.value
|
|
107
|
-
defer dg.data.release()
|
|
108
|
-
defer dg.source.release()
|
|
107
|
+
defer: dg.data.release()
|
|
108
|
+
defer: dg.source.release()
|
|
109
109
|
return result_from_datagram(dg, remote_candidates)
|
|
110
110
|
|
|
111
111
|
|
|
@@ -114,7 +114,7 @@ public async function punch(
|
|
|
114
114
|
remote_candidates: vec.Vec[Candidate]
|
|
115
115
|
) -> Result[PunchResult, Error]:
|
|
116
116
|
var probe = build_punch_probe()
|
|
117
|
-
defer probe.release()
|
|
117
|
+
defer: probe.release()
|
|
118
118
|
var recv_task = socket.recv_from(512)
|
|
119
119
|
|
|
120
120
|
var c: uint = 0
|
data/std/net/rpc.mt
CHANGED
|
@@ -63,7 +63,7 @@ public async function call_and_wait(
|
|
|
63
63
|
payload: span[ubyte]
|
|
64
64
|
) -> Result[bytes.Bytes, Error]:
|
|
65
65
|
var call_packet = build_call(request_id, payload)
|
|
66
|
-
defer call_packet.release()
|
|
66
|
+
defer: call_packet.release()
|
|
67
67
|
|
|
68
68
|
let send_result = await conn.mux_send(channel_id, call_type_id, call_packet.as_span(), mux.flag_reliable)
|
|
69
69
|
match send_result:
|
|
@@ -78,7 +78,7 @@ public async function call_and_wait(
|
|
|
78
78
|
match msg_opt:
|
|
79
79
|
Option.some as mp:
|
|
80
80
|
var msg = mp.value
|
|
81
|
-
defer msg.release()
|
|
81
|
+
defer: msg.release()
|
|
82
82
|
if msg.type_id == response_type_id and msg.channel_id == channel_id:
|
|
83
83
|
let id_result = parse_request_id(msg.payload.as_span())
|
|
84
84
|
match id_result:
|
|
@@ -110,7 +110,7 @@ public async function send_reply(
|
|
|
110
110
|
payload: span[ubyte]
|
|
111
111
|
) -> Result[bool, Error]:
|
|
112
112
|
var reply_packet = build_reply(request_id, payload)
|
|
113
|
-
defer reply_packet.release()
|
|
113
|
+
defer: reply_packet.release()
|
|
114
114
|
let send_result = await conn.mux_send(channel_id, response_type_id, reply_packet.as_span(), mux.flag_reliable)
|
|
115
115
|
match send_result:
|
|
116
116
|
Result.failure:
|
data/std/net/session.mt
CHANGED
|
@@ -312,7 +312,7 @@ extending Connection:
|
|
|
312
312
|
if this.state == ConnectionState.connected:
|
|
313
313
|
if frame >= this.last_heartbeat_sent + this.heartbeat_interval:
|
|
314
314
|
var hb = build_heartbeat(frame)
|
|
315
|
-
defer hb.release()
|
|
315
|
+
defer: hb.release()
|
|
316
316
|
let send_result = await this.channel.send(hb.as_span())
|
|
317
317
|
match send_result:
|
|
318
318
|
Result.failure:
|
|
@@ -395,7 +395,7 @@ extending Connection:
|
|
|
395
395
|
))
|
|
396
396
|
|
|
397
397
|
var framed = build_user_data(data)
|
|
398
|
-
defer framed.release()
|
|
398
|
+
defer: framed.release()
|
|
399
399
|
let send_result = await this.channel.send(framed.as_span())
|
|
400
400
|
match send_result:
|
|
401
401
|
Result.failure as payload:
|
|
@@ -415,7 +415,7 @@ extending Connection:
|
|
|
415
415
|
))
|
|
416
416
|
|
|
417
417
|
var framed = build_user_data(data)
|
|
418
|
-
defer framed.release()
|
|
418
|
+
defer: framed.release()
|
|
419
419
|
let send_result = await this.channel.send_reliable(framed.as_span(), frame)
|
|
420
420
|
match send_result:
|
|
421
421
|
Result.failure as payload:
|
|
@@ -444,7 +444,7 @@ extending Connection:
|
|
|
444
444
|
Result.success as ksp:
|
|
445
445
|
key = ksp.value
|
|
446
446
|
var req = build_connect_request(this.protocol_version, key)
|
|
447
|
-
defer req.release()
|
|
447
|
+
defer: req.release()
|
|
448
448
|
let send_result = await this.channel.send_reliable(req.as_span(), this.last_heartbeat_sent)
|
|
449
449
|
match send_result:
|
|
450
450
|
Result.failure as send_payload:
|
|
@@ -463,7 +463,7 @@ extending Connection:
|
|
|
463
463
|
))
|
|
464
464
|
|
|
465
465
|
var d = build_disconnect(disconnect_reason_local)
|
|
466
|
-
defer d.release()
|
|
466
|
+
defer: d.release()
|
|
467
467
|
let send_result = await this.channel.send_reliable(d.as_span(), 0)
|
|
468
468
|
this.state = ConnectionState.disconnected
|
|
469
469
|
match send_result:
|
|
@@ -588,7 +588,7 @@ async function drain_outgoing_conn(conn: ref[Connection]) -> Result[bool, net.Er
|
|
|
588
588
|
return Result[bool, net.Error].success(value = true)
|
|
589
589
|
Option.some as payload:
|
|
590
590
|
var outgoing = payload.value
|
|
591
|
-
defer outgoing.release()
|
|
591
|
+
defer: outgoing.release()
|
|
592
592
|
if outgoing.reliable:
|
|
593
593
|
let _ = await conn.channel.send_reliable(
|
|
594
594
|
outgoing.payload.as_span(),
|
|
@@ -648,13 +648,13 @@ extending Session:
|
|
|
648
648
|
if unsafe: read(peer_ptr).channel_state == ConnectionState.connected:
|
|
649
649
|
if frame >= unsafe: read(peer_ptr).last_heartbeat_sent + this.config.heartbeat_interval:
|
|
650
650
|
var hb = build_heartbeat(frame)
|
|
651
|
-
defer hb.release()
|
|
651
|
+
defer: hb.release()
|
|
652
652
|
let peer_id = unsafe: read(peer_ptr).peer_id
|
|
653
653
|
let peer_address_result = find_peer_address(ref_of(this), peer_id)
|
|
654
654
|
match peer_address_result:
|
|
655
655
|
Result.success as addr_payload:
|
|
656
656
|
var addr = addr_payload.value
|
|
657
|
-
defer addr.release()
|
|
657
|
+
defer: addr.release()
|
|
658
658
|
let send_result = await this.host.send(addr, hb.as_span())
|
|
659
659
|
match send_result:
|
|
660
660
|
Result.failure:
|
|
@@ -748,9 +748,9 @@ extending Session:
|
|
|
748
748
|
return Result[bool, net.Error].failure(error = payload.error)
|
|
749
749
|
Result.success as payload:
|
|
750
750
|
var address = payload.value
|
|
751
|
-
defer address.release()
|
|
751
|
+
defer: address.release()
|
|
752
752
|
var framed = build_user_data(data)
|
|
753
|
-
defer framed.release()
|
|
753
|
+
defer: framed.release()
|
|
754
754
|
let send_result = await this.host.send(address, framed.as_span())
|
|
755
755
|
match send_result:
|
|
756
756
|
Result.failure as send_payload:
|
|
@@ -773,9 +773,9 @@ extending Session:
|
|
|
773
773
|
return Result[bool, net.Error].failure(error = payload.error)
|
|
774
774
|
Result.success as payload:
|
|
775
775
|
var address = payload.value
|
|
776
|
-
defer address.release()
|
|
776
|
+
defer: address.release()
|
|
777
777
|
var framed = build_user_data(data)
|
|
778
|
-
defer framed.release()
|
|
778
|
+
defer: framed.release()
|
|
779
779
|
let send_result = await this.host.send_reliable(address, framed.as_span(), frame)
|
|
780
780
|
match send_result:
|
|
781
781
|
Result.failure as send_payload:
|
|
@@ -794,9 +794,9 @@ extending Session:
|
|
|
794
794
|
return Result[bool, net.Error].failure(error = payload.error)
|
|
795
795
|
Result.success as payload:
|
|
796
796
|
var address = payload.value
|
|
797
|
-
defer address.release()
|
|
797
|
+
defer: address.release()
|
|
798
798
|
var d = build_disconnect(reason)
|
|
799
|
-
defer d.release()
|
|
799
|
+
defer: d.release()
|
|
800
800
|
let send_result = await this.host.send_reliable(address, d.as_span(), 0)
|
|
801
801
|
match send_result:
|
|
802
802
|
Result.failure:
|
|
@@ -1054,7 +1054,7 @@ async function drain_outgoing_session(session: ref[Session]) -> Result[bool, net
|
|
|
1054
1054
|
return Result[bool, net.Error].success(value = true)
|
|
1055
1055
|
Option.some as payload:
|
|
1056
1056
|
var outgoing = payload.value
|
|
1057
|
-
defer outgoing.release()
|
|
1057
|
+
defer: outgoing.release()
|
|
1058
1058
|
if outgoing.reliable:
|
|
1059
1059
|
let send_result = await session.host.send_reliable(
|
|
1060
1060
|
outgoing.address,
|
data/std/net/stun.mt
CHANGED
|
@@ -150,7 +150,7 @@ public function parse_binding_response(
|
|
|
150
150
|
let xaddr = read_uint_be(data, offset + 8z)
|
|
151
151
|
let ip = xaddr ^ stun_magic_cookie
|
|
152
152
|
var ip_str = format_ipv4(ip)
|
|
153
|
-
defer ip_str.release()
|
|
153
|
+
defer: ip_str.release()
|
|
154
154
|
let addr_result = net.ipv4(ip_str.as_str(), int<-port)
|
|
155
155
|
match addr_result:
|
|
156
156
|
Result.failure:
|
|
@@ -185,7 +185,7 @@ public async function resolve_public_address(
|
|
|
185
185
|
let tid = transaction_id_from_bytes(rp.value)
|
|
186
186
|
rp.value.release()
|
|
187
187
|
var request = build_binding_request(tid)
|
|
188
|
-
defer request.release()
|
|
188
|
+
defer: request.release()
|
|
189
189
|
let send_result = await socket.send_to(request.as_span(), stun_server)
|
|
190
190
|
match send_result:
|
|
191
191
|
Result.failure:
|
|
@@ -233,7 +233,7 @@ public async function resolve_public_address_on(
|
|
|
233
233
|
)
|
|
234
234
|
Result.success as bp:
|
|
235
235
|
var socket = bp.value
|
|
236
|
-
defer socket.release()
|
|
236
|
+
defer: socket.release()
|
|
237
237
|
return await resolve_public_address(socket, stun_server)
|
|
238
238
|
|
|
239
239
|
|
|
@@ -248,5 +248,5 @@ public async function resolve(
|
|
|
248
248
|
)
|
|
249
249
|
Result.success as la:
|
|
250
250
|
var local_addr = la.value
|
|
251
|
-
defer local_addr.release()
|
|
251
|
+
defer: local_addr.release()
|
|
252
252
|
return await resolve_public_address_on(aio.current_runtime(), local_addr, stun_server)
|
data/std/net/turn.mt
CHANGED
|
@@ -188,7 +188,7 @@ public function parse_allocate_response(
|
|
|
188
188
|
let xaddr = read_uint_be(data, offset + 8z)
|
|
189
189
|
let ip = xaddr ^ stun_magic_cookie
|
|
190
190
|
var ip_str = format_ipv4(ip)
|
|
191
|
-
defer ip_str.release()
|
|
191
|
+
defer: ip_str.release()
|
|
192
192
|
let addr_result = net.ipv4(ip_str.as_str(), int<-port)
|
|
193
193
|
match addr_result:
|
|
194
194
|
Result.success as ap:
|
|
@@ -220,7 +220,7 @@ public async function allocate(
|
|
|
220
220
|
let tid = transaction_id_from_bytes(rp.value)
|
|
221
221
|
rp.value.release()
|
|
222
222
|
var request = build_allocate_request(tid)
|
|
223
|
-
defer request.release()
|
|
223
|
+
defer: request.release()
|
|
224
224
|
let send_result = await socket.send_to(request.as_span(), turn_server)
|
|
225
225
|
match send_result:
|
|
226
226
|
Result.failure:
|
|
@@ -363,7 +363,7 @@ public function parse_data_indication(
|
|
|
363
363
|
let xaddr = read_uint_be(data, offset + 8z)
|
|
364
364
|
let ip = xaddr ^ stun_magic_cookie
|
|
365
365
|
var ip_str = format_ipv4(ip)
|
|
366
|
-
defer ip_str.release()
|
|
366
|
+
defer: ip_str.release()
|
|
367
367
|
let addr_result = net.ipv4(ip_str.as_str(), int<-port)
|
|
368
368
|
match addr_result:
|
|
369
369
|
Result.success as ap:
|
|
@@ -417,7 +417,7 @@ public async function send_data(
|
|
|
417
417
|
return Result[ptr_uint, Error].failure(error = bp.error)
|
|
418
418
|
Result.success as bp:
|
|
419
419
|
var packet = bp.value
|
|
420
|
-
defer packet.release()
|
|
420
|
+
defer: packet.release()
|
|
421
421
|
let send_result = await socket.send_to(packet.as_span(), turn_server)
|
|
422
422
|
match send_result:
|
|
423
423
|
Result.failure as sp:
|
data/std/oauth2.mt
CHANGED
|
@@ -78,7 +78,7 @@ public function generate_pkce() -> Result[PkcePair, Error]:
|
|
|
78
78
|
random_data.release()
|
|
79
79
|
|
|
80
80
|
var challenge = crypto.sha256(text.as_byte_span(verifier.as_str()))
|
|
81
|
-
defer challenge.release()
|
|
81
|
+
defer: challenge.release()
|
|
82
82
|
|
|
83
83
|
let challenge_b64 = base64.encode_urlsafe(challenge.as_span())
|
|
84
84
|
|
|
@@ -141,9 +141,9 @@ function append_query_param(target: ref[string.String], key: str, value: str) ->
|
|
|
141
141
|
target.push_byte(38)
|
|
142
142
|
|
|
143
143
|
var encoded_key = url.percent_encode(key)
|
|
144
|
-
defer encoded_key.release()
|
|
144
|
+
defer: encoded_key.release()
|
|
145
145
|
var encoded_value = url.percent_encode(value)
|
|
146
|
-
defer encoded_value.release()
|
|
146
|
+
defer: encoded_value.release()
|
|
147
147
|
|
|
148
148
|
target.append(encoded_key.as_str())
|
|
149
149
|
target.push_byte(61)
|
|
@@ -156,7 +156,7 @@ public async function exchange_code(
|
|
|
156
156
|
pkce_verifier: Option[str]
|
|
157
157
|
) -> Result[Tokens, Error]:
|
|
158
158
|
var body_params = vec.Vec[url.FormField].create()
|
|
159
|
-
defer release_form_fields(ref_of(body_params))
|
|
159
|
+
defer: release_form_fields(ref_of(body_params))
|
|
160
160
|
|
|
161
161
|
body_params.push(url.FormField(key = "grant_type", value = "authorization_code"))
|
|
162
162
|
body_params.push(url.FormField(key = "code", value = code))
|
|
@@ -170,10 +170,10 @@ public async function exchange_code(
|
|
|
170
170
|
body_params.push(url.FormField(key = "code_verifier", value = payload.value))
|
|
171
171
|
|
|
172
172
|
var form_body = url.encode_form(body_params.as_span())
|
|
173
|
-
defer form_body.release()
|
|
173
|
+
defer: form_body.release()
|
|
174
174
|
|
|
175
175
|
var auth_header = build_basic_auth_header(config.client_id.as_str(), config.client_secret.as_str())
|
|
176
|
-
defer auth_header.release()
|
|
176
|
+
defer: auth_header.release()
|
|
177
177
|
|
|
178
178
|
var headers = array[http.RequestHeader, 2](
|
|
179
179
|
http.RequestHeader(name = "Content-Type", value = "application/x-www-form-urlencoded"),
|
|
@@ -194,7 +194,7 @@ public async function exchange_code(
|
|
|
194
194
|
return Result[Tokens, Error].failure(error = http_error_to_oauth(payload.error))
|
|
195
195
|
Result.success as payload:
|
|
196
196
|
var response = payload.value
|
|
197
|
-
defer response.release()
|
|
197
|
+
defer: response.release()
|
|
198
198
|
|
|
199
199
|
let body_str = response.body_as_str() else:
|
|
200
200
|
return Result[Tokens, Error].failure(error = oauth_error("token response body is not valid UTF-8"))
|
|
@@ -226,7 +226,7 @@ function parse_token_response(body_str: str, status_code: int) -> Result[Tokens,
|
|
|
226
226
|
return Result[Tokens, Error].failure(error = oauth_error("token response is not valid JSON"))
|
|
227
227
|
Result.success as json_payload:
|
|
228
228
|
let json_value = json_payload.value
|
|
229
|
-
defer json.release_value(json_value)
|
|
229
|
+
defer: json.release_value(json_value)
|
|
230
230
|
|
|
231
231
|
if status_code != 200:
|
|
232
232
|
let object_ptr = json_value.as_object() else:
|
|
@@ -306,17 +306,17 @@ public async function refresh_access_token(
|
|
|
306
306
|
refresh_token: str
|
|
307
307
|
) -> Result[Tokens, Error]:
|
|
308
308
|
var body_params = vec.Vec[url.FormField].create()
|
|
309
|
-
defer release_form_fields(ref_of(body_params))
|
|
309
|
+
defer: release_form_fields(ref_of(body_params))
|
|
310
310
|
|
|
311
311
|
body_params.push(url.FormField(key = "grant_type", value = "refresh_token"))
|
|
312
312
|
body_params.push(url.FormField(key = "refresh_token", value = refresh_token))
|
|
313
313
|
body_params.push(url.FormField(key = "client_id", value = config.client_id.as_str()))
|
|
314
314
|
|
|
315
315
|
var form_body = url.encode_form(body_params.as_span())
|
|
316
|
-
defer form_body.release()
|
|
316
|
+
defer: form_body.release()
|
|
317
317
|
|
|
318
318
|
var auth_header = build_basic_auth_header(config.client_id.as_str(), config.client_secret.as_str())
|
|
319
|
-
defer auth_header.release()
|
|
319
|
+
defer: auth_header.release()
|
|
320
320
|
|
|
321
321
|
var headers = array[http.RequestHeader, 2](
|
|
322
322
|
http.RequestHeader(name = "Content-Type", value = "application/x-www-form-urlencoded"),
|
|
@@ -337,7 +337,7 @@ public async function refresh_access_token(
|
|
|
337
337
|
return Result[Tokens, Error].failure(error = http_error_to_oauth(payload.error))
|
|
338
338
|
Result.success as payload:
|
|
339
339
|
var response = payload.value
|
|
340
|
-
defer response.release()
|
|
340
|
+
defer: response.release()
|
|
341
341
|
|
|
342
342
|
let body_str = response.body_as_str() else:
|
|
343
343
|
return Result[Tokens, Error].failure(error = oauth_error("token response body is not valid UTF-8"))
|
data/std/path.mt
CHANGED
|
@@ -54,9 +54,9 @@ public function join(left: str, right: str) -> string.String:
|
|
|
54
54
|
|
|
55
55
|
public function relative_path(path: str, base: str) -> Option[string.String]:
|
|
56
56
|
var normalized_path = normalize_separators(path)
|
|
57
|
-
defer normalized_path.release()
|
|
57
|
+
defer: normalized_path.release()
|
|
58
58
|
var normalized_base = normalize_separators(base)
|
|
59
|
-
defer normalized_base.release()
|
|
59
|
+
defer: normalized_base.release()
|
|
60
60
|
|
|
61
61
|
let path_text = normalized_path.as_str()
|
|
62
62
|
let base_text = normalized_base.as_str()
|
|
@@ -66,11 +66,11 @@ public function relative_path(path: str, base: str) -> Option[string.String]:
|
|
|
66
66
|
return Option[string.String].none
|
|
67
67
|
|
|
68
68
|
var path_segments = vec.Vec[Segment].create()
|
|
69
|
-
defer path_segments.release()
|
|
69
|
+
defer: path_segments.release()
|
|
70
70
|
collect_normalized_segments(path_text, path_root, ref_of(path_segments))
|
|
71
71
|
|
|
72
72
|
var base_segments = vec.Vec[Segment].create()
|
|
73
|
-
defer base_segments.release()
|
|
73
|
+
defer: base_segments.release()
|
|
74
74
|
collect_normalized_segments(base_text, base_root, ref_of(base_segments))
|
|
75
75
|
|
|
76
76
|
var common: ptr_uint = 0
|
|
@@ -111,9 +111,9 @@ public function relative_path(path: str, base: str) -> Option[string.String]:
|
|
|
111
111
|
|
|
112
112
|
public function is_within_root(path: str, root: str) -> bool:
|
|
113
113
|
var normalized_path = normalize_separators(path)
|
|
114
|
-
defer normalized_path.release()
|
|
114
|
+
defer: normalized_path.release()
|
|
115
115
|
var normalized_root = normalize_separators(root)
|
|
116
|
-
defer normalized_root.release()
|
|
116
|
+
defer: normalized_root.release()
|
|
117
117
|
|
|
118
118
|
let path_text = normalized_path.as_str()
|
|
119
119
|
let root_text = normalized_root.as_str()
|
|
@@ -123,11 +123,11 @@ public function is_within_root(path: str, root: str) -> bool:
|
|
|
123
123
|
return false
|
|
124
124
|
|
|
125
125
|
var path_segments = vec.Vec[Segment].create()
|
|
126
|
-
defer path_segments.release()
|
|
126
|
+
defer: path_segments.release()
|
|
127
127
|
collect_normalized_segments(path_text, path_root, ref_of(path_segments))
|
|
128
128
|
|
|
129
129
|
var root_segments = vec.Vec[Segment].create()
|
|
130
|
-
defer root_segments.release()
|
|
130
|
+
defer: root_segments.release()
|
|
131
131
|
collect_normalized_segments(root_text, root_root, ref_of(root_segments))
|
|
132
132
|
|
|
133
133
|
if path_segments.len() < root_segments.len():
|
data/std/process.mt
CHANGED
|
@@ -437,7 +437,7 @@ function spawn_internal(
|
|
|
437
437
|
return Result[ChildProcess, ProcessError].failure(error= payload.error)
|
|
438
438
|
Result.success as payload:
|
|
439
439
|
var prepared = payload.value
|
|
440
|
-
defer prepared.release()
|
|
440
|
+
defer: prepared.release()
|
|
441
441
|
|
|
442
442
|
var raw_handle = zero[c.mt_process_spawn_handle]
|
|
443
443
|
var raw_error = zero[c.mt_process_error]
|
|
@@ -478,7 +478,7 @@ function spawn_pty_internal(
|
|
|
478
478
|
return Result[PtyProcess, ProcessError].failure(error= payload.error)
|
|
479
479
|
Result.success as payload:
|
|
480
480
|
var prepared = payload.value
|
|
481
|
-
defer prepared.release()
|
|
481
|
+
defer: prepared.release()
|
|
482
482
|
|
|
483
483
|
var raw_handle = zero[c.mt_process_pty_handle]
|
|
484
484
|
var raw_error = zero[c.mt_process_error]
|
|
@@ -512,7 +512,7 @@ function capture_internal(
|
|
|
512
512
|
return Result[CaptureResult, ProcessError].failure(error= payload.error)
|
|
513
513
|
Result.success as payload:
|
|
514
514
|
var prepared = payload.value
|
|
515
|
-
defer prepared.release()
|
|
515
|
+
defer: prepared.release()
|
|
516
516
|
|
|
517
517
|
var raw_result = zero[c.mt_process_capture_result]
|
|
518
518
|
var raw_error = zero[c.mt_process_error]
|
|
@@ -547,7 +547,7 @@ function spawn_detached_internal(
|
|
|
547
547
|
return Result[int, ProcessError].failure(error= payload.error)
|
|
548
548
|
Result.success as payload:
|
|
549
549
|
var prepared = payload.value
|
|
550
|
-
defer prepared.release()
|
|
550
|
+
defer: prepared.release()
|
|
551
551
|
|
|
552
552
|
var pid: int = 0
|
|
553
553
|
var raw_error = zero[c.mt_process_error]
|
data/std/raylib/packed_assets.mt
CHANGED
|
@@ -113,7 +113,7 @@ public function close_reader(reader: ref[Reader]) -> void:
|
|
|
113
113
|
public function load_image(reader: pack.Reader, logical_path: str) -> Result[rl.Image, Error]:
|
|
114
114
|
let file_type = detect_file_type(logical_path)?
|
|
115
115
|
var data = map_pack_result(reader.read_bytes(logical_path))?
|
|
116
|
-
defer data.release()
|
|
116
|
+
defer: data.release()
|
|
117
117
|
|
|
118
118
|
let image = rl.load_image_from_memory(file_type, data.as_span())
|
|
119
119
|
if not rl.is_image_valid(image):
|
|
@@ -124,7 +124,7 @@ public function load_image(reader: pack.Reader, logical_path: str) -> Result[rl.
|
|
|
124
124
|
|
|
125
125
|
public function load_texture(reader: pack.Reader, logical_path: str) -> Result[rl.Texture2D, Error]:
|
|
126
126
|
let image = load_image(reader, logical_path)?
|
|
127
|
-
defer rl.unload_image(image)
|
|
127
|
+
defer: rl.unload_image(image)
|
|
128
128
|
|
|
129
129
|
let texture = rl.load_texture_from_image(image)
|
|
130
130
|
if not rl.is_texture_valid(texture):
|
|
@@ -136,7 +136,7 @@ public function load_texture(reader: pack.Reader, logical_path: str) -> Result[r
|
|
|
136
136
|
public function load_wave(reader: pack.Reader, logical_path: str) -> Result[rl.Wave, Error]:
|
|
137
137
|
let file_type = detect_file_type(logical_path)?
|
|
138
138
|
var data = map_pack_result(reader.read_bytes(logical_path))?
|
|
139
|
-
defer data.release()
|
|
139
|
+
defer: data.release()
|
|
140
140
|
|
|
141
141
|
let wave = rl.load_wave_from_memory(file_type, data.as_span())
|
|
142
142
|
if not rl.is_wave_valid(wave):
|
|
@@ -147,7 +147,7 @@ public function load_wave(reader: pack.Reader, logical_path: str) -> Result[rl.W
|
|
|
147
147
|
|
|
148
148
|
public function load_sound(reader: pack.Reader, logical_path: str) -> Result[rl.Sound, Error]:
|
|
149
149
|
let wave = load_wave(reader, logical_path)?
|
|
150
|
-
defer rl.unload_wave(wave)
|
|
150
|
+
defer: rl.unload_wave(wave)
|
|
151
151
|
|
|
152
152
|
let sound = rl.load_sound_from_wave(wave)
|
|
153
153
|
if not rl.is_sound_valid(sound):
|
|
@@ -173,7 +173,7 @@ public function load_music(reader: pack.Reader, logical_path: str) -> Result[Pac
|
|
|
173
173
|
|
|
174
174
|
function open_pack_relative_to_application(pack_name: str) -> Result[pack.Reader, Error]:
|
|
175
175
|
var application_path = application_relative_path(pack_name)
|
|
176
|
-
defer application_path.release()
|
|
176
|
+
defer: application_path.release()
|
|
177
177
|
|
|
178
178
|
let application_result = pack.open(application_path.as_str())
|
|
179
179
|
match application_result:
|
data/std/serialize.mt
CHANGED
|
@@ -52,7 +52,7 @@ extending bin.Reader:
|
|
|
52
52
|
return Result[T, bin.Error].failure(error = p.error)
|
|
53
53
|
Result.success as bp:
|
|
54
54
|
var raw_bytes = bp.value
|
|
55
|
-
defer raw_bytes.release()
|
|
55
|
+
defer: raw_bytes.release()
|
|
56
56
|
|
|
57
57
|
let src_ptr = raw_bytes.data else:
|
|
58
58
|
return Result[T, bin.Error].failure(
|
data/std/tar.mt
CHANGED
|
@@ -358,7 +358,7 @@ function append_file_entry(source_path: str, archive_path: str, output: ref[vec.
|
|
|
358
358
|
return Result[bool, Error].failure(error = take_fs_error(payload.error))
|
|
359
359
|
Result.success as payload:
|
|
360
360
|
var data = payload.value
|
|
361
|
-
defer data.release()
|
|
361
|
+
defer: data.release()
|
|
362
362
|
output.append_span(data.as_span())
|
|
363
363
|
append_padding(output, data.len)
|
|
364
364
|
return Result[bool, Error].success(value = true)
|
|
@@ -387,14 +387,14 @@ function append_directory_tree(
|
|
|
387
387
|
return Result[bool, Error].failure(error = take_fs_error(payload.error))
|
|
388
388
|
Result.success as payload:
|
|
389
389
|
var entries = payload.value
|
|
390
|
-
defer entries.release()
|
|
390
|
+
defer: entries.release()
|
|
391
391
|
|
|
392
392
|
match copy_sorted_entry_names(entries, include_hidden):
|
|
393
393
|
Result.failure as names_payload:
|
|
394
394
|
return Result[bool, Error].failure(error = names_payload.error)
|
|
395
395
|
Result.success as names_payload:
|
|
396
396
|
var names = names_payload.value
|
|
397
|
-
defer release_string_values(ref_of(names))
|
|
397
|
+
defer: release_string_values(ref_of(names))
|
|
398
398
|
|
|
399
399
|
var index: ptr_uint = 0
|
|
400
400
|
while index < names.len():
|
|
@@ -520,10 +520,10 @@ function read_text_field(input: span[ubyte], offset: ptr_uint, field_len: ptr_ui
|
|
|
520
520
|
|
|
521
521
|
function parse_entry(input: span[ubyte], offset: ptr_uint) -> Result[ParsedEntry, Error]:
|
|
522
522
|
var name = read_text_field(input, offset + 0, 100)?
|
|
523
|
-
defer name.release()
|
|
523
|
+
defer: name.release()
|
|
524
524
|
|
|
525
525
|
var prefix = read_text_field(input, offset + 345, 155)?
|
|
526
|
-
defer prefix.release()
|
|
526
|
+
defer: prefix.release()
|
|
527
527
|
|
|
528
528
|
let name_text = name.as_str()
|
|
529
529
|
if name_text.len == 0:
|
|
@@ -590,7 +590,7 @@ function checked_destination_path(destination_root: str, relative_path: str) ->
|
|
|
590
590
|
].failure(error = error_message("tar extract path escapes destination root"))
|
|
591
591
|
Option.some as payload:
|
|
592
592
|
var normalized = payload.value
|
|
593
|
-
defer normalized.release()
|
|
593
|
+
defer: normalized.release()
|
|
594
594
|
let normalized_path = normalized.as_str()
|
|
595
595
|
let escapes_parent = normalized_path.len == 2 and normalized_path.byte_at(0) == 46 and normalized_path.byte_at(1) == 46
|
|
596
596
|
if escapes_parent or normalized_path.starts_with("../"):
|
|
@@ -648,7 +648,7 @@ public function archive_directory_gzip(
|
|
|
648
648
|
return Result[bytes.Bytes, Error].failure(error = payload.error)
|
|
649
649
|
Result.success as payload:
|
|
650
650
|
var archive = payload.value
|
|
651
|
-
defer archive.release()
|
|
651
|
+
defer: archive.release()
|
|
652
652
|
match gzip.compress_bytes(archive.as_span()):
|
|
653
653
|
Result.failure as gzip_payload:
|
|
654
654
|
return Result[bytes.Bytes, Error].failure(error = take_gzip_error(gzip_payload.error))
|
|
@@ -668,10 +668,10 @@ public function extract(archive: span[ubyte], destination_root: str) -> Result[b
|
|
|
668
668
|
return Result[bool, Error].success(value = true)
|
|
669
669
|
|
|
670
670
|
var entry = parse_entry(archive, offset)?
|
|
671
|
-
defer entry.release()
|
|
671
|
+
defer: entry.release()
|
|
672
672
|
|
|
673
673
|
var destination_path = checked_destination_path(destination_root, entry.path.as_str())?
|
|
674
|
-
defer destination_path.release()
|
|
674
|
+
defer: destination_path.release()
|
|
675
675
|
|
|
676
676
|
if entry.kind == EntryKind.directory:
|
|
677
677
|
fs.create_directories(destination_path.as_str()).map_error(take_fs_error)?
|
|
@@ -700,5 +700,5 @@ public function extract(archive: span[ubyte], destination_root: str) -> Result[b
|
|
|
700
700
|
|
|
701
701
|
public function extract_gzip(archive: span[ubyte], destination_root: str) -> Result[bool, Error]:
|
|
702
702
|
var decoded = gzip.decompress_bytes(archive).map_error(take_gzip_error)?
|
|
703
|
-
defer decoded.release()
|
|
703
|
+
defer: decoded.release()
|
|
704
704
|
return extract(decoded.as_span(), destination_root)
|