Skip to content

Commit eb2c294

Browse files
authored
Merge pull request #73 from ExpHP/partial-zeroing
Partial zeroing
2 parents 6636a8e + af48268 commit eb2c294

29 files changed

+744
-499
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@
2020
* **Bitwise negation.** The unary `~` (bitwise not) operator has been added. No language natively provides it, but even when unavailable, it can be used (and will compile as `-1 - x`).
2121
* **`--no-builtin-mapfiles`** option for both compilation and decompilation. This will disable the core mapfiles which provide the builtin signatures and intrinsic mappings for all games, which can be useful if you are trying to design a comprehensive mapfile from scratch.
2222

23+
<<<<<<< HEAD
2324
## Other changes
25+
||||||| 919108a
26+
## Other bugfixes
27+
=======
28+
## Other changes
29+
30+
* Relative time labels and interrupts now accept expressions, so you can use consts. Technically this also makes negative relative time labels possible; whether you choose to write them as `+(-15):` or (gasp) `+-15:` is up to you...
31+
>>>>>>> re-zero-2
2432
2533
* The ternary operator `a ? b : c` can now be used in any expression, not just const expressions.
2634
* Relative time labels and interrupts now accept expressions, so you can use consts. Technically this also makes negative relative time labels possible; whether you choose to write them as `+(-15):` or (gasp) `+-15:` is up to you...

src/ast/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,10 @@ pub enum Expr {
454454
LitInt {
455455
value: raw::LangInt,
456456
/// A hint to the formatter on how it should write the integer.
457-
/// (not meaningful when parsing)
457+
///
458+
/// (not meaningful/left as default when parsing source code;
459+
/// if you want an integer in a diagnostic to appear as it was written,
460+
/// consider labeling its span in the message instead)
458461
format: IntFormat,
459462
},
460463
LitFloat { value: raw::LangFloat },

src/context/defs.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,34 +1252,18 @@ impl Signature {
12521252
signature_from_func_ast(ty_keyword, params)
12531253
}
12541254

1255-
pub(crate) fn validate(&self, ctx: &CompilerContext) -> Result<(), ErrorReported> {
1256-
self._check_non_optional_after_optional(ctx)
1257-
}
1258-
1259-
fn _check_non_optional_after_optional(&self, ctx: &CompilerContext) -> Result<(), ErrorReported> {
1260-
let mut first_optional = None;
1261-
for param in self.params.iter() {
1262-
if param.default.is_some() {
1263-
first_optional = Some(param);
1264-
} else if let Some(optional) = first_optional {
1265-
return Err(ctx.emitter.emit(error!(
1266-
message("invalid function signature"),
1267-
secondary(optional.useful_span, "optional parameter"),
1268-
primary(param.useful_span, "non-optional parameter after optional"),
1269-
)));
1270-
}
1271-
}
1255+
pub(crate) fn validate(&self, _ctx: &CompilerContext) -> Result<(), ErrorReported> {
12721256
Ok(())
12731257
}
12741258

12751259
/// Minimum number of arguments accepted.
12761260
pub fn min_args(&self) -> usize {
1277-
self.params.iter().take_while(|param| param.default.is_none()).count()
1261+
self.params.iter().fold(0, |count, param| count + param.default.is_none() as usize)
12781262
}
12791263

12801264
/// Maximum number of arguments accepted.
12811265
pub fn max_args(&self) -> usize {
1282-
self.params.len()
1266+
self.min_args()
12831267
}
12841268

12851269
/// Matches arguments at a call site to their corresponding parameters.

src/core_mapfiles/anm.rs

Lines changed: 79 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -49,35 +49,35 @@ static ANM_INS_06: &'static CoreSignatures = &CoreSignatures {
4949
(Th06, 0, Some(("", None))),
5050
(Th06, 1, Some(("n", None))),
5151
(Th06, 2, Some(("ff", None))),
52-
(Th06, 3, Some(("S", None))),
53-
(Th06, 4, Some(("C", None))),
52+
(Th06, 3, Some(("b(hex)---", None))),
53+
(Th06, 4, Some(("b(hex)b(hex)b(hex)-", None))),
5454
(Th06, 5, Some(("o", Some(IKind::Jmp)))),
5555
(Th06, 6, Some(("", None))),
5656
(Th06, 7, Some(("", None))),
5757
(Th06, 8, Some(("", None))),
5858
(Th06, 9, Some(("fff", None))),
5959
(Th06, 10, Some(("fff", None))),
6060
(Th06, 11, Some(("ff", None))),
61-
(Th06, 12, Some(("SS", None))),
61+
(Th06, 12, Some(("b(hex)---s--", None))),
6262
(Th06, 13, Some(("", None))),
6363
(Th06, 14, Some(("", None))),
6464
(Th06, 15, Some(("", None))),
65-
(Th06, 16, Some(("nS", None))),
65+
(Th06, 16, Some(("nu--", None))),
6666
(Th06, 17, Some(("fff", None))),
67-
(Th06, 18, Some(("fffS", None))),
68-
(Th06, 19, Some(("fffS", None))),
69-
(Th06, 20, Some(("fffS", None))),
67+
(Th06, 18, Some(("fffs--", None))),
68+
(Th06, 19, Some(("fffs--", None))),
69+
(Th06, 20, Some(("fffs--", None))),
7070
(Th06, 21, Some(("", None))),
7171
(Th06, 22, Some(("S", Some(IKind::InterruptLabel)))),
7272
(Th06, 23, Some(("", None))),
7373
(Th06, 24, Some(("", None))),
74-
(Th06, 25, Some(("S", None))),
75-
(Th06, 26, Some(("S", None))),
74+
(Th06, 25, Some((r#"U(enum="bool")"#, None))), // zero: U(enum="BitBool")
75+
(Th06, 26, Some(("s--", None))),
7676
(Th06, 27, Some(("f", None))),
7777
(Th06, 28, Some(("f", None))),
78-
(Th06, 29, Some(("S", None))),
79-
(Th06, 30, Some(("ffS", None))),
80-
(Th06, 31, Some(("S", None))),
78+
(Th06, 29, Some((r#"U(enum="bool")"#, None))), // zero: U(enum="BitBool")
79+
(Th06, 30, Some(("ffs--", None))),
80+
(Th06, 31, Some((r#"U(enum="bool")"#, None))), // zero: U(enum="BitBool")
8181
],
8282
var: &[],
8383
};
@@ -86,44 +86,44 @@ static ANM_INS_06: &'static CoreSignatures = &CoreSignatures {
8686
static ANM_INS_07_09: &'static CoreSignatures = &CoreSignatures {
8787
inherit: &[],
8888
ins: &[
89-
// v2
89+
// v2 (PCB)
9090
(Th07, 0, Some(("", None))),
9191
(Th07, 1, Some(("", None))),
9292
(Th07, 2, Some(("", None))),
9393
(Th07, 3, Some(("n", None))),
9494
(Th07, 4, Some(("ot", Some(IKind::Jmp)))),
95-
(Th07, 5, Some(("Sot", Some(IKind::CountJmp(B::Ne))))),
95+
(Th07, 5, Some(("Sot", Some(IKind::CountJmp(B::Gt))))),
9696
(Th07, 6, Some(("fff", None))),
9797
(Th07, 7, Some(("ff", None))),
98-
(Th07, 8, Some(("S", None))),
99-
(Th07, 9, Some(("S", None))),
98+
(Th07, 8, Some(("b(imm;hex)---", None))),
99+
(Th07, 9, Some(("b(imm;hex)b(imm;hex)b(imm;hex)-", None))),
100100
(Th07, 10, Some(("", None))),
101101
(Th07, 11, Some(("", None))),
102102
(Th07, 12, Some(("fff", None))),
103103
(Th07, 13, Some(("fff", None))),
104104
(Th07, 14, Some(("ff", None))),
105-
(Th07, 15, Some(("SS", None))),
106-
(Th07, 16, Some(("S", None))),
105+
(Th07, 15, Some(("b(imm;hex)---S", None))),
106+
(Th07, 16, Some(("U(imm)", None))),
107107
(Th07, 17, Some(("fffS", None))),
108108
(Th07, 18, Some(("fffS", None))),
109109
(Th07, 19, Some(("fffS", None))),
110110
(Th07, 20, Some(("", None))),
111-
(Th07, 21, Some(("S", Some(IKind::InterruptLabel)))),
111+
(Th07, 21, Some(("S(imm)", Some(IKind::InterruptLabel)))),
112112
(Th07, 22, Some(("", None))),
113113
(Th07, 23, Some(("", None))),
114-
(Th07, 24, Some(("S", None))),
115-
(Th07, 25, Some(("S", None))),
114+
(Th07, 24, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
115+
(Th07, 25, Some(("s(imm)--", None))),
116116
(Th07, 26, Some(("f", None))),
117117
(Th07, 27, Some(("f", None))),
118-
(Th07, 28, Some(("S", None))),
118+
(Th07, 28, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
119119
(Th07, 29, Some(("ffS", None))),
120-
(Th07, 30, Some(("S", None))),
121-
(Th07, 31, Some(("S", None))),
122-
(Th07, 32, Some(("SSfff", None))),
123-
(Th07, 33, Some(("SSS", None))),
124-
(Th07, 34, Some(("SSS", None))),
125-
(Th07, 35, Some(("SSfff", None))),
126-
(Th07, 36, Some(("SSff", None))),
120+
(Th07, 30, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
121+
(Th07, 31, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
122+
(Th07, 32, Some(("Sb(imm)---fff", None))),
123+
(Th07, 33, Some(("Sb(imm)---b(imm;hex)b(imm;hex)b(imm;hex)-", None))),
124+
(Th07, 34, Some(("Sb(imm)---b(imm;hex)---", None))),
125+
(Th07, 35, Some(("Sb(imm)---fff", None))),
126+
(Th07, 36, Some(("Sb(imm)---ff", None))),
127127
(Th07, 37, Some(("SS", Some(IKind::AssignOp(A::Assign, Ty::Int))))),
128128
(Th07, 38, Some(("ff", Some(IKind::AssignOp(A::Assign, Ty::Float))))),
129129
(Th07, 39, Some(("SS", Some(IKind::AssignOp(A::Add, Ty::Int))))),
@@ -146,7 +146,7 @@ static ANM_INS_07_09: &'static CoreSignatures = &CoreSignatures {
146146
(Th07, 56, Some(("fff", Some(IKind::BinOp(B::Div, Ty::Float))))),
147147
(Th07, 57, Some(("SSS", Some(IKind::BinOp(B::Rem, Ty::Int))))),
148148
(Th07, 58, Some(("fff", Some(IKind::BinOp(B::Rem, Ty::Float))))),
149-
(Th07, 59, Some(("SS", None))),
149+
(Th07, 59, Some(("SU", None))),
150150
(Th07, 60, Some(("ff", None))),
151151
(Th07, 61, Some(("ff", Some(IKind::UnOp(U::Sin, Ty::Float))))),
152152
(Th07, 62, Some(("ff", Some(IKind::UnOp(U::Cos, Ty::Float))))),
@@ -170,18 +170,22 @@ static ANM_INS_07_09: &'static CoreSignatures = &CoreSignatures {
170170
(Th07, 80, Some(("f", None))),
171171
(Th07, 81, Some(("f", None))),
172172

173-
// v3
174-
// color instructions changed to take 3 dwords
175-
(Th08, 9, Some(("SSS", None))),
176-
(Th08, 33, Some(("SSSSS", None))),
173+
// v3, v3b (IN, PoFV)
174+
// alpha/color/alphaTime/colorTime instructions changed to take dword variables
175+
// alphaTimeLinear not updated
176+
(Th08, 8, Some(("C", None))),
177+
(Th08, 9, Some(("CCC", None))),
178+
(Th08, 16, Some((r#"U(imm;enum="bool")"#, None))),
179+
(Th08, 33, Some(("Sb(imm)---CCC", None))),
180+
(Th08, 34, Some(("Sb(imm)---C", None))),
177181
// new instructions
178-
(Th08, 82, Some(("S", None))),
179-
(Th08, 83, Some(("S", None))),
180-
(Th08, 84, Some(("SSS", None))),
181-
(Th08, 85, Some(("S", None))),
182-
(Th08, 86, Some(("SSSSS", None))),
183-
(Th08, 87, Some(("SSS", None))),
184-
(Th08, 88, Some(("S", None))),
182+
(Th08, 82, Some(("U(imm)", None))),
183+
(Th08, 83, Some(("S(imm)", None))),
184+
(Th08, 84, Some(("CCC", None))),
185+
(Th08, 85, Some(("C", None))),
186+
(Th08, 86, Some(("Sb(imm)---CCC", None))),
187+
(Th08, 87, Some(("Sb(imm)---C", None))),
188+
(Th08, 88, Some(("-b(imm)--", None))),
185189
(Th08, 89, Some(("", None))),
186190
],
187191
var: &[],
@@ -191,6 +195,7 @@ static ANM_INS_07_09: &'static CoreSignatures = &CoreSignatures {
191195
static ANM_INS_095_128: &'static CoreSignatures = &CoreSignatures {
192196
inherit: &[],
193197
ins: &[
198+
// v4 (StB)
194199
(Th095, 0, Some(("", None))),
195200
(Th095, 1, Some(("", None))),
196201
(Th095, 2, Some(("", None))),
@@ -242,46 +247,49 @@ static ANM_INS_095_128: &'static CoreSignatures = &CoreSignatures {
242247
(Th095, 48, Some(("fff", None))),
243248
(Th095, 49, Some(("fff", None))),
244249
(Th095, 50, Some(("ff", None))),
245-
(Th095, 51, Some(("S", None))),
246-
(Th095, 52, Some(("SSS", None))),
250+
(Th095, 51, Some(("C", None))),
251+
(Th095, 52, Some(("CCC", None))),
247252
(Th095, 53, Some(("fff", None))),
248253
(Th095, 54, Some(("ff", None))),
249-
(Th095, 55, Some(("SS", None))),
250-
(Th095, 56, Some(("SSfff", None))),
251-
(Th095, 57, Some(("SSSSS", None))),
252-
(Th095, 58, Some(("SSS", None))),
253-
(Th095, 59, Some(("SSfff", None))),
254-
(Th095, 60, Some(("SSff", None))),
254+
(Th095, 55, Some(("b(imm;hex)---S", None))),
255+
(Th095, 56, Some(("Sb(imm)---fff", None))),
256+
(Th095, 57, Some(("Sb(imm)---CCC", None))),
257+
(Th095, 58, Some(("Sb(imm)---C", None))),
258+
(Th095, 59, Some(("Sb(imm)---fff", None))),
259+
(Th095, 60, Some(("Sb(imm)---ff", None))),
255260
(Th095, 61, Some(("", None))),
256261
(Th095, 62, Some(("", None))),
257262
(Th095, 63, Some(("", None))),
258-
(Th095, 64, Some(("S", Some(IKind::InterruptLabel)))),
259-
(Th095, 65, Some(("ss", None))),
260-
(Th095, 66, Some(("S", None))),
261-
(Th095, 67, Some(("S", None))),
262-
(Th095, 68, Some(("S", None))),
263+
(Th095, 64, Some(("S(imm)", Some(IKind::InterruptLabel)))),
264+
(Th095, 65, Some(("u(imm)u(imm)", None))),
265+
(Th095, 66, Some(("U(imm)", None))),
266+
(Th095, 67, Some(("U(imm)", None))),
267+
(Th095, 68, Some(("b(imm)---", None))),
263268
(Th095, 69, Some(("", None))),
264269
(Th095, 70, Some(("f", None))),
265270
(Th095, 71, Some(("f", None))),
266-
(Th095, 72, Some(("S", None))),
267-
(Th095, 73, Some(("S", None))),
268-
(Th095, 74, Some(("S", None))),
271+
(Th095, 72, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
272+
(Th095, 73, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
273+
(Th095, 74, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
269274
(Th095, 75, Some(("S", None))),
270275
(Th095, 76, Some(("SSS", None))),
271276
(Th095, 77, Some(("S", None))),
272277
(Th095, 78, Some(("SSSSS", None))),
273278
(Th095, 79, Some(("SSS", None))),
274-
(Th095, 80, Some(("S", None))),
279+
(Th095, 80, Some(("b(imm)---", None))),
275280
(Th095, 81, Some(("", None))),
276-
(Th095, 82, Some(("S", None))),
281+
(Th095, 82, Some((r#"b(imm;enum="bool")---"#, None))), // zero: b(imm;enum="BitBool")---
277282
(Th095, 83, Some(("", None))),
278283
(Th095, 84, Some(("S", None))),
279-
(Th095, 85, Some(("S", None))),
280-
(Th095, 86, Some(("S", None))),
281-
(Th095, 87, Some(("S", None))),
284+
(Th095, 85, Some((r#"b(imm;enum="bool")---"#, None))), // zero: b(imm;enum="BitBool")---
285+
(Th095, 86, Some((r#"U(enum="bool")"#, None))), // zero: U(enum="BitBool")
286+
(Th095, 87, Some(("b(imm)---", None))),
282287

288+
// v4b (MoF)
289+
(Th10, 56, Some(("SU(imm)fff", None))),
290+
(Th10, 59, Some(("SU(imm)fff", None))),
283291
(Th10, 88, Some(("N", None))),
284-
(Th10, 89, Some(("S", None))),
292+
(Th10, 89, Some((r#"U(imm;enum="bool")"#, None))), // zero: U(imm;enum="BitBool")
285293
(Th10, 90, Some(("N", None))),
286294
(Th10, 91, Some(("N", None))),
287295
(Th10, 92, Some(("N", None))),
@@ -475,6 +483,7 @@ static ANM_VAR: &'static CoreSignatures = &CoreSignatures {
475483
inherit: &[],
476484
ins: &[],
477485
var: &[
486+
// v2, v3 (PCB, IN)
478487
(Th07, 10000, Some("$")),
479488
(Th07, 10001, Some("$")),
480489
(Th07, 10002, Some("$")),
@@ -486,13 +495,17 @@ static ANM_VAR: &'static CoreSignatures = &CoreSignatures {
486495
(Th07, 10008, Some("$")),
487496
(Th07, 10009, Some("$")),
488497

489-
(Th095, 10010, Some("%")),
490-
(Th095, 10011, Some("%")),
491-
(Th095, 10012, Some("%")),
498+
// v3b (PoFV)
499+
(Th09, 10010, Some("%")),
500+
(Th09, 10011, Some("%")),
501+
(Th09, 10012, Some("%")),
502+
503+
// v4 (StB)
492504
(Th095, 10013, Some("%")),
493505
(Th095, 10014, Some("%")),
494506
(Th095, 10015, Some("%")),
495507

508+
// v4b (MoF)
496509
(Th10, 10016, Some("%")),
497510
(Th10, 10017, Some("%")),
498511
(Th10, 10018, Some("%")),

0 commit comments

Comments
 (0)