mt-lang 0.3.14 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/docs/index.html +8 -8
- data/docs/language-design.md +7 -12
- data/docs/language-manual.md +20 -8
- data/lib/milk_tea/base.rb +1 -1
- data/lib/milk_tea/core/ast.rb +2 -2
- data/lib/milk_tea/core/{binding_types.rb → bindings.rb} +1 -1
- data/lib/milk_tea/core/c_backend.rb +14 -15
- data/lib/milk_tea/core/compile_time.rb +181 -2
- data/lib/milk_tea/core/control_flow/builder.rb +62 -2
- data/lib/milk_tea/core/control_flow/constant_propagation.rb +1 -1
- data/lib/milk_tea/core/{compatibility_helpers.rb → intrinsics.rb} +2 -2
- data/lib/milk_tea/core/lexer.rb +10 -14
- 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/lowering.rb +18 -18
- data/lib/milk_tea/core/module_loader.rb +26 -15
- data/lib/milk_tea/core/parser/statements.rb +18 -12
- data/lib/milk_tea/core/parser.rb +17 -17
- 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.rb +1 -1
- data/lib/milk_tea/core.rb +6 -2
- data/lib/milk_tea/dap/lldb_dap_backend.rb +153 -0
- data/lib/milk_tea/dap/server/lldb_backend.rb +1 -1
- data/lib/milk_tea/dap.rb +1 -1
- data/lib/milk_tea/lsp.rb +1 -7
- data/lib/milk_tea/{bindings/cli.rb → tooling/bindgen_cli.rb} +1 -1
- 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/lib/milk_tea/tooling.rb +1 -1
- 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 +7 -9
- data/lib/milk_tea/core/compile_time/const_eval.rb +0 -182
- data/lib/milk_tea/core/module_loader/errors.rb +0 -23
- data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -156
- /data/lib/milk_tea/core/lowering/{async.rb → async/frame_builder.rb} +0 -0
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)
|
data/std/terminal.mt
CHANGED
|
@@ -695,7 +695,7 @@ public function flush_stderr() -> Result[bool, Error]:
|
|
|
695
695
|
|
|
696
696
|
public function clear_screen() -> Result[bool, Error]:
|
|
697
697
|
var sequence = string.String.with_capacity(8)
|
|
698
|
-
defer sequence.release()
|
|
698
|
+
defer: sequence.release()
|
|
699
699
|
append_csi(ref_of(sequence), "2J")
|
|
700
700
|
append_csi(ref_of(sequence), "H")
|
|
701
701
|
return write_stdout_sequence(sequence, "terminal clear screen failed")
|
|
@@ -703,21 +703,21 @@ public function clear_screen() -> Result[bool, Error]:
|
|
|
703
703
|
|
|
704
704
|
public function clear_line() -> Result[bool, Error]:
|
|
705
705
|
var sequence = string.String.with_capacity(5)
|
|
706
|
-
defer sequence.release()
|
|
706
|
+
defer: sequence.release()
|
|
707
707
|
append_csi(ref_of(sequence), "2K")
|
|
708
708
|
return write_stdout_sequence(sequence, "terminal clear line failed")
|
|
709
709
|
|
|
710
710
|
|
|
711
711
|
public function cursor_home() -> Result[bool, Error]:
|
|
712
712
|
var sequence = string.String.with_capacity(4)
|
|
713
|
-
defer sequence.release()
|
|
713
|
+
defer: sequence.release()
|
|
714
714
|
append_csi(ref_of(sequence), "H")
|
|
715
715
|
return write_stdout_sequence(sequence, "terminal cursor home failed")
|
|
716
716
|
|
|
717
717
|
|
|
718
718
|
public function move_cursor(row: int, column: int) -> Result[bool, Error]:
|
|
719
719
|
var sequence = string.String.with_capacity(24)
|
|
720
|
-
defer sequence.release()
|
|
720
|
+
defer: sequence.release()
|
|
721
721
|
append_escape(ref_of(sequence))
|
|
722
722
|
sequence.append_format(f"[#{clamp_cursor_position_1based(row)};#{clamp_cursor_position_1based(column)}H")
|
|
723
723
|
return write_stdout_sequence(sequence, "terminal move cursor failed")
|
|
@@ -725,35 +725,35 @@ public function move_cursor(row: int, column: int) -> Result[bool, Error]:
|
|
|
725
725
|
|
|
726
726
|
public function hide_cursor() -> Result[bool, Error]:
|
|
727
727
|
var sequence = string.String.with_capacity(8)
|
|
728
|
-
defer sequence.release()
|
|
728
|
+
defer: sequence.release()
|
|
729
729
|
append_csi(ref_of(sequence), "?25l")
|
|
730
730
|
return write_stdout_sequence(sequence, "terminal hide cursor failed")
|
|
731
731
|
|
|
732
732
|
|
|
733
733
|
public function show_cursor() -> Result[bool, Error]:
|
|
734
734
|
var sequence = string.String.with_capacity(8)
|
|
735
|
-
defer sequence.release()
|
|
735
|
+
defer: sequence.release()
|
|
736
736
|
append_csi(ref_of(sequence), "?25h")
|
|
737
737
|
return write_stdout_sequence(sequence, "terminal show cursor failed")
|
|
738
738
|
|
|
739
739
|
|
|
740
740
|
public function enter_alternate_screen() -> Result[bool, Error]:
|
|
741
741
|
var sequence = string.String.with_capacity(10)
|
|
742
|
-
defer sequence.release()
|
|
742
|
+
defer: sequence.release()
|
|
743
743
|
append_csi(ref_of(sequence), "?1049h")
|
|
744
744
|
return write_stdout_sequence(sequence, "terminal alternate screen failed")
|
|
745
745
|
|
|
746
746
|
|
|
747
747
|
public function leave_alternate_screen() -> Result[bool, Error]:
|
|
748
748
|
var sequence = string.String.with_capacity(10)
|
|
749
|
-
defer sequence.release()
|
|
749
|
+
defer: sequence.release()
|
|
750
750
|
append_csi(ref_of(sequence), "?1049l")
|
|
751
751
|
return write_stdout_sequence(sequence, "terminal alternate screen failed")
|
|
752
752
|
|
|
753
753
|
|
|
754
754
|
public function enable_mouse() -> Result[bool, Error]:
|
|
755
755
|
var sequence = string.String.with_capacity(24)
|
|
756
|
-
defer sequence.release()
|
|
756
|
+
defer: sequence.release()
|
|
757
757
|
append_csi(ref_of(sequence), "?1000h")
|
|
758
758
|
append_csi(ref_of(sequence), "?1002h")
|
|
759
759
|
append_csi(ref_of(sequence), "?1006h")
|
|
@@ -762,7 +762,7 @@ public function enable_mouse() -> Result[bool, Error]:
|
|
|
762
762
|
|
|
763
763
|
public function disable_mouse() -> Result[bool, Error]:
|
|
764
764
|
var sequence = string.String.with_capacity(24)
|
|
765
|
-
defer sequence.release()
|
|
765
|
+
defer: sequence.release()
|
|
766
766
|
append_csi(ref_of(sequence), "?1006l")
|
|
767
767
|
append_csi(ref_of(sequence), "?1002l")
|
|
768
768
|
append_csi(ref_of(sequence), "?1000l")
|
|
@@ -771,7 +771,7 @@ public function disable_mouse() -> Result[bool, Error]:
|
|
|
771
771
|
|
|
772
772
|
public function set_foreground(color: Color) -> Result[bool, Error]:
|
|
773
773
|
var sequence = string.String.with_capacity(10)
|
|
774
|
-
defer sequence.release()
|
|
774
|
+
defer: sequence.release()
|
|
775
775
|
append_escape(ref_of(sequence))
|
|
776
776
|
sequence.append("[")
|
|
777
777
|
append_color_code(ref_of(sequence), color, false)
|
|
@@ -781,7 +781,7 @@ public function set_foreground(color: Color) -> Result[bool, Error]:
|
|
|
781
781
|
|
|
782
782
|
public function set_background(color: Color) -> Result[bool, Error]:
|
|
783
783
|
var sequence = string.String.with_capacity(10)
|
|
784
|
-
defer sequence.release()
|
|
784
|
+
defer: sequence.release()
|
|
785
785
|
append_escape(ref_of(sequence))
|
|
786
786
|
sequence.append("[")
|
|
787
787
|
append_color_code(ref_of(sequence), color, true)
|
|
@@ -791,7 +791,7 @@ public function set_background(color: Color) -> Result[bool, Error]:
|
|
|
791
791
|
|
|
792
792
|
public function set_rgb_foreground(red: int, green: int, blue: int) -> Result[bool, Error]:
|
|
793
793
|
var sequence = string.String.with_capacity(24)
|
|
794
|
-
defer sequence.release()
|
|
794
|
+
defer: sequence.release()
|
|
795
795
|
append_escape(ref_of(sequence))
|
|
796
796
|
sequence.append_format(
|
|
797
797
|
f"[38;2;#{clamp_color_channel(red)};#{clamp_color_channel(green)};#{clamp_color_channel(blue)}m"
|
|
@@ -801,7 +801,7 @@ public function set_rgb_foreground(red: int, green: int, blue: int) -> Result[bo
|
|
|
801
801
|
|
|
802
802
|
public function set_rgb_background(red: int, green: int, blue: int) -> Result[bool, Error]:
|
|
803
803
|
var sequence = string.String.with_capacity(24)
|
|
804
|
-
defer sequence.release()
|
|
804
|
+
defer: sequence.release()
|
|
805
805
|
append_escape(ref_of(sequence))
|
|
806
806
|
sequence.append_format(
|
|
807
807
|
f"[48;2;#{clamp_color_channel(red)};#{clamp_color_channel(green)};#{clamp_color_channel(blue)}m"
|
|
@@ -811,7 +811,7 @@ public function set_rgb_background(red: int, green: int, blue: int) -> Result[bo
|
|
|
811
811
|
|
|
812
812
|
public function set_bold(enabled: bool) -> Result[bool, Error]:
|
|
813
813
|
var sequence = string.String.with_capacity(6)
|
|
814
|
-
defer sequence.release()
|
|
814
|
+
defer: sequence.release()
|
|
815
815
|
if enabled:
|
|
816
816
|
append_csi(ref_of(sequence), "1m")
|
|
817
817
|
else:
|
|
@@ -821,7 +821,7 @@ public function set_bold(enabled: bool) -> Result[bool, Error]:
|
|
|
821
821
|
|
|
822
822
|
public function set_underline(enabled: bool) -> Result[bool, Error]:
|
|
823
823
|
var sequence = string.String.with_capacity(6)
|
|
824
|
-
defer sequence.release()
|
|
824
|
+
defer: sequence.release()
|
|
825
825
|
if enabled:
|
|
826
826
|
append_csi(ref_of(sequence), "4m")
|
|
827
827
|
else:
|
|
@@ -831,7 +831,7 @@ public function set_underline(enabled: bool) -> Result[bool, Error]:
|
|
|
831
831
|
|
|
832
832
|
public function reset_style() -> Result[bool, Error]:
|
|
833
833
|
var sequence = string.String.with_capacity(5)
|
|
834
|
-
defer sequence.release()
|
|
834
|
+
defer: sequence.release()
|
|
835
835
|
append_csi(ref_of(sequence), "0m")
|
|
836
836
|
return write_stdout_sequence(sequence, "terminal style reset failed")
|
|
837
837
|
|
|
@@ -958,7 +958,7 @@ extending Terminal:
|
|
|
958
958
|
return Result[Option[Event], Error].success(value= Option[Event].some(value= ev.unwrap()))
|
|
959
959
|
|
|
960
960
|
var bytes = read_stdin(timeout_ms)?
|
|
961
|
-
defer bytes.release()
|
|
961
|
+
defer: bytes.release()
|
|
962
962
|
if not bytes.is_empty():
|
|
963
963
|
this.input.append_span(bytes.as_span())
|
|
964
964
|
|
data/std/tls.mt
CHANGED
|
@@ -335,7 +335,7 @@ function end_stream_operation(state: ptr[StreamState]) -> void:
|
|
|
335
335
|
|
|
336
336
|
async function handshake_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -> Result[bool, Error]:
|
|
337
337
|
let state = begin_stream_operation(state_raw)?
|
|
338
|
-
defer end_stream_operation(state)
|
|
338
|
+
defer: end_stream_operation(state)
|
|
339
339
|
|
|
340
340
|
while true:
|
|
341
341
|
let client = unsafe: read(state).client else:
|
|
@@ -366,7 +366,7 @@ async function write_on(
|
|
|
366
366
|
return Result[ptr_uint, Error].success(value = 0)
|
|
367
367
|
|
|
368
368
|
let state = begin_stream_operation(state_raw)?
|
|
369
|
-
defer end_stream_operation(state)
|
|
369
|
+
defer: end_stream_operation(state)
|
|
370
370
|
|
|
371
371
|
var offset: ptr_uint = 0
|
|
372
372
|
while offset < content.len:
|
|
@@ -411,7 +411,7 @@ async function read_once_on(
|
|
|
411
411
|
return Result[bytes.Bytes, Error].failure(error = tls_error("tls read requires max_bytes > 0"))
|
|
412
412
|
|
|
413
413
|
let state = begin_stream_operation(state_raw)?
|
|
414
|
-
defer end_stream_operation(state)
|
|
414
|
+
defer: end_stream_operation(state)
|
|
415
415
|
|
|
416
416
|
let buffer = heap.must_alloc[ubyte](max_bytes)
|
|
417
417
|
while true:
|
|
@@ -449,7 +449,7 @@ async function read_once_on(
|
|
|
449
449
|
|
|
450
450
|
async function shutdown_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -> Result[bool, Error]:
|
|
451
451
|
let state = begin_stream_operation(state_raw)?
|
|
452
|
-
defer end_stream_operation(state)
|
|
452
|
+
defer: end_stream_operation(state)
|
|
453
453
|
|
|
454
454
|
while true:
|
|
455
455
|
let client = unsafe: read(state).client else:
|
|
@@ -470,7 +470,7 @@ async function shutdown_on(runtime: aio.Runtime, state_raw: ptr[StreamState]?) -
|
|
|
470
470
|
|
|
471
471
|
public async function connect_on(runtime: aio.Runtime, host: str, port: int) -> Result[Stream, Error]:
|
|
472
472
|
var service = fmt.to_string_int(port)
|
|
473
|
-
defer service.release()
|
|
473
|
+
defer: service.release()
|
|
474
474
|
|
|
475
475
|
let addresses_result = await net.resolve_all_on(runtime, host, service.as_str())
|
|
476
476
|
match addresses_result:
|
|
@@ -478,7 +478,7 @@ public async function connect_on(runtime: aio.Runtime, host: str, port: int) ->
|
|
|
478
478
|
return Result[Stream, Error].failure(error = take_net_error(payload.error))
|
|
479
479
|
Result.success as payload:
|
|
480
480
|
var addresses = payload.value
|
|
481
|
-
defer release_socket_addresses(ref_of(addresses))
|
|
481
|
+
defer: release_socket_addresses(ref_of(addresses))
|
|
482
482
|
|
|
483
483
|
var last_error = tls_error("tls connect failed")
|
|
484
484
|
var last_error_owned = true
|
|
@@ -523,7 +523,7 @@ public async function client_on(runtime: aio.Runtime, host: str, transport: net.
|
|
|
523
523
|
Result.success as payload:
|
|
524
524
|
var raw_client: ptr[c.mt_tls_client]? = null
|
|
525
525
|
var host_storage = arena.create(host.len + 1)
|
|
526
|
-
defer host_storage.release()
|
|
526
|
+
defer: host_storage.release()
|
|
527
527
|
|
|
528
528
|
var raw_error = zero[c.mt_tls_error]
|
|
529
529
|
let create_status = c.mt_tls_client_create(host_storage.to_cstr(host), payload.value, raw_client, raw_error)
|
|
@@ -598,7 +598,7 @@ extending Stream:
|
|
|
598
598
|
|
|
599
599
|
public function exchange(host: str, port: int, request: span[ubyte]) -> Result[bytes.Bytes, Error]:
|
|
600
600
|
var host_storage = arena.create(host.len + 1)
|
|
601
|
-
defer host_storage.release()
|
|
601
|
+
defer: host_storage.release()
|
|
602
602
|
|
|
603
603
|
var raw_response = zero[c.mt_tls_bytes]
|
|
604
604
|
var raw_error = zero[c.mt_tls_error]
|
data/std/uri.mt
CHANGED
|
@@ -7,7 +7,7 @@ const FILE_URI_PREFIX: str = "file://"
|
|
|
7
7
|
|
|
8
8
|
public function file_uri_from_path(path_text: str) -> string.String:
|
|
9
9
|
var normalized = path.normalize_separators(path_text)
|
|
10
|
-
defer normalized.release()
|
|
10
|
+
defer: normalized.release()
|
|
11
11
|
|
|
12
12
|
var result = string.String.from_str(FILE_URI_PREFIX)
|
|
13
13
|
append_percent_encoded_path(ref_of(result), normalized.as_str())
|
data/std/utility.mt
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mt-lang
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.17
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Long (Teefan) Tran
|
|
@@ -158,7 +158,6 @@ files:
|
|
|
158
158
|
- lib/milk_tea/bindings/bindgen/emitter.rb
|
|
159
159
|
- lib/milk_tea/bindings/bindgen/overrides.rb
|
|
160
160
|
- lib/milk_tea/bindings/bindgen/type_mapper.rb
|
|
161
|
-
- lib/milk_tea/bindings/cli.rb
|
|
162
161
|
- lib/milk_tea/bindings/imported_bindings.rb
|
|
163
162
|
- lib/milk_tea/bindings/imported_bindings/defaults.rb
|
|
164
163
|
- lib/milk_tea/bindings/imported_bindings/generator.rb
|
|
@@ -185,7 +184,7 @@ files:
|
|
|
185
184
|
- lib/milk_tea/core.rb
|
|
186
185
|
- lib/milk_tea/core/ast.rb
|
|
187
186
|
- lib/milk_tea/core/async_runtime_installer.rb
|
|
188
|
-
- lib/milk_tea/core/
|
|
187
|
+
- lib/milk_tea/core/bindings.rb
|
|
189
188
|
- lib/milk_tea/core/bindings/attribute_binding.rb
|
|
190
189
|
- lib/milk_tea/core/bindings/function_binding.rb
|
|
191
190
|
- lib/milk_tea/core/bindings/module_binding.rb
|
|
@@ -203,9 +202,7 @@ files:
|
|
|
203
202
|
- lib/milk_tea/core/c_backend/type_collectors.rb
|
|
204
203
|
- lib/milk_tea/core/c_backend/type_declaration.rb
|
|
205
204
|
- lib/milk_tea/core/c_backend/type_system.rb
|
|
206
|
-
- lib/milk_tea/core/compatibility_helpers.rb
|
|
207
205
|
- lib/milk_tea/core/compile_time.rb
|
|
208
|
-
- lib/milk_tea/core/compile_time/const_eval.rb
|
|
209
206
|
- lib/milk_tea/core/control_flow.rb
|
|
210
207
|
- lib/milk_tea/core/control_flow/builder.rb
|
|
211
208
|
- lib/milk_tea/core/control_flow/constant_propagation.rb
|
|
@@ -218,6 +215,7 @@ files:
|
|
|
218
215
|
- lib/milk_tea/core/control_flow/termination.rb
|
|
219
216
|
- lib/milk_tea/core/cst.rb
|
|
220
217
|
- lib/milk_tea/core/cst_builder.rb
|
|
218
|
+
- lib/milk_tea/core/intrinsics.rb
|
|
221
219
|
- lib/milk_tea/core/ir.rb
|
|
222
220
|
- lib/milk_tea/core/keywords.rb
|
|
223
221
|
- lib/milk_tea/core/lexer.rb
|
|
@@ -232,8 +230,8 @@ files:
|
|
|
232
230
|
- lib/milk_tea/core/lexer/trivia.rb
|
|
233
231
|
- lib/milk_tea/core/lowering.rb
|
|
234
232
|
- lib/milk_tea/core/lowering/artifacts.rb
|
|
235
|
-
- lib/milk_tea/core/lowering/async.rb
|
|
236
233
|
- lib/milk_tea/core/lowering/async/analysis.rb
|
|
234
|
+
- lib/milk_tea/core/lowering/async/frame_builder.rb
|
|
237
235
|
- lib/milk_tea/core/lowering/async/lowering.rb
|
|
238
236
|
- lib/milk_tea/core/lowering/async/normalization.rb
|
|
239
237
|
- lib/milk_tea/core/lowering/block.rb
|
|
@@ -253,7 +251,6 @@ files:
|
|
|
253
251
|
- lib/milk_tea/core/lowering/utils.rb
|
|
254
252
|
- lib/milk_tea/core/module_binder.rb
|
|
255
253
|
- lib/milk_tea/core/module_loader.rb
|
|
256
|
-
- lib/milk_tea/core/module_loader/errors.rb
|
|
257
254
|
- lib/milk_tea/core/module_path_resolver.rb
|
|
258
255
|
- lib/milk_tea/core/module_roots.rb
|
|
259
256
|
- lib/milk_tea/core/parser.rb
|
|
@@ -294,7 +291,7 @@ files:
|
|
|
294
291
|
- lib/milk_tea/core/types/registry.rb
|
|
295
292
|
- lib/milk_tea/core/types/visitor.rb
|
|
296
293
|
- lib/milk_tea/dap.rb
|
|
297
|
-
- lib/milk_tea/dap/
|
|
294
|
+
- lib/milk_tea/dap/lldb_dap_backend.rb
|
|
298
295
|
- lib/milk_tea/dap/protocol.rb
|
|
299
296
|
- lib/milk_tea/dap/server.rb
|
|
300
297
|
- lib/milk_tea/dap/server/breakpoints.rb
|
|
@@ -361,6 +358,7 @@ files:
|
|
|
361
358
|
- lib/milk_tea/packages/version.rb
|
|
362
359
|
- lib/milk_tea/tooling.rb
|
|
363
360
|
- lib/milk_tea/tooling/asset_pack.rb
|
|
361
|
+
- lib/milk_tea/tooling/bindgen_cli.rb
|
|
364
362
|
- lib/milk_tea/tooling/build.rb
|
|
365
363
|
- lib/milk_tea/tooling/build_cache.rb
|
|
366
364
|
- lib/milk_tea/tooling/cli.rb
|
|
@@ -605,7 +603,7 @@ metadata:
|
|
|
605
603
|
homepage_uri: https://teefan.github.io/mt-lang/
|
|
606
604
|
source_code_uri: https://github.com/teefan/mt-lang
|
|
607
605
|
post_install_message: |
|
|
608
|
-
Milk Tea 0.3.
|
|
606
|
+
Milk Tea 0.3.17 installed!
|
|
609
607
|
|
|
610
608
|
System requirements:
|
|
611
609
|
- A C compiler (gcc or clang) must be available on PATH
|