Skip to content

Commit a78fea6

Browse files
committed
fixes
1 parent 32970db commit a78fea6

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

source/app.d

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Flags:
4747
-al - Prints assembly line numbers for Callisto nodes
4848
-os OS - Sets the operating system for the backend (see below)
4949
-sc - Stop after stack check
50+
-scf - Show functions in stack checker
5051
--help - Shows this help text
5152
5253
Backends and their operating systems:
@@ -94,6 +95,7 @@ int main(string[] args) {
9495
string os = "DEFAULT";
9596
bool onlyStackCheck = false;
9697
bool noStackCheck;
98+
bool stackCheckerFunctions = false;
9799

98100
// choose default backend
99101
version (X86_64) {
@@ -299,6 +301,10 @@ int main(string[] args) {
299301
noStackCheck = true;
300302
break;
301303
}
304+
case "-scf": {
305+
stackCheckerFunctions = true;
306+
break;
307+
}
302308
case "--help": {
303309
writeln(usage.strip());
304310
return 0;
@@ -411,6 +417,9 @@ int main(string[] args) {
411417
if (!noStackCheck) stackChecker.Evaluate(nodes);
412418
}
413419
catch (StackCheckerError) {
420+
if (stackCheckerFunctions) {
421+
stackChecker.DumpFunctions();
422+
}
414423
return 1;
415424
}
416425

@@ -423,7 +432,12 @@ int main(string[] args) {
423432
}
424433
}
425434

435+
if (stackCheckerFunctions) {
436+
stackChecker.DumpFunctions();
437+
}
438+
426439
if (onlyStackCheck) {
440+
writeln("no errors");
427441
return 0;
428442
}
429443

source/stackCheck.d

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class StackChecker {
4343
identifiers ~= format("%s.%s", key, member);
4444
}
4545
}
46+
47+
identifiers ~= ["true", "false"];
4648
}
4749

4850
void ErrorNoThrow(Char, A...)(ErrorInfo error, in Char[] fmt, A args) {
@@ -186,6 +188,13 @@ class StackChecker {
186188

187189
stack = oldStack;
188190
}
191+
192+
if (stack.length > blockStack) {
193+
Pop(node, stack.length - blockStack);
194+
}
195+
else if (stack.length < blockStack) {
196+
Push(node, blockStack - stack.length);
197+
}
189198
}
190199

191200
void EvaluateWhile(WhileNode node) {
@@ -304,7 +313,20 @@ class StackChecker {
304313

305314
void EvaluateNode(Node node) {
306315
switch (node.type) {
307-
case NodeType.Word: EvaluateWord(cast(WordNode) node); break;
316+
case NodeType.Word: {
317+
auto wnode = cast(WordNode) node;
318+
319+
switch (wnode.name) {
320+
case "return": Pop(node, 1); break;
321+
case "continue": break;
322+
case "break": break;
323+
case "call": Error(node.error, "Call is unsafe"); break;
324+
case "throw": Pop(node, 1); break;
325+
case "error": Error(node.error, "Error thrown by code"); break;
326+
default: EvaluateWord(wnode);
327+
}
328+
break;
329+
}
308330
case NodeType.Integer: Push(node, 1); break;
309331
case NodeType.FuncDef: EvaluateFuncDef(cast(FuncDefNode) node); break;
310332
case NodeType.Asm: {
@@ -332,4 +354,15 @@ class StackChecker {
332354
EvaluateNode(node);
333355
}
334356
}
357+
358+
void DumpFunctions() {
359+
size_t spaces = words.keys().fold!((a, e) => e.length > a.length? e : a).length;
360+
361+
foreach (key, value ; words) {
362+
writefln(
363+
"%s %s= %d -> %d", key, replicate([' '], spaces - key.length),
364+
value.effect.pop, value.effect.push
365+
);
366+
}
367+
}
335368
}

0 commit comments

Comments
 (0)