mirror of
https://git.sfja.dk/Mikkel/slige.git
synced 2025-01-18 12:46:31 +00:00
fix flame graph
This commit is contained in:
parent
28225fde52
commit
cee24abfc7
@ -119,8 +119,10 @@ export class Checker {
|
|||||||
throw new Error();
|
throw new Error();
|
||||||
}
|
}
|
||||||
|
|
||||||
const isBuiltin = stmt.kind.anno && stmt.kind.anno.ident === "builtin";
|
if (
|
||||||
if (isBuiltin) {
|
stmt.kind.anno?.ident === "remainder" ||
|
||||||
|
stmt.kind.anno?.ident === "builtin"
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ export class SpecialLoopDesugarer implements AstVisitor {
|
|||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
}),
|
}, cond.pos),
|
||||||
),
|
),
|
||||||
Stmt({
|
Stmt({
|
||||||
type: "expr",
|
type: "expr",
|
||||||
|
@ -12,6 +12,7 @@ export class Lowerer {
|
|||||||
private locals: Locals = new LocalsFnRoot();
|
private locals: Locals = new LocalsFnRoot();
|
||||||
private fnStmtIdLabelMap: { [stmtId: number]: string } = {};
|
private fnStmtIdLabelMap: { [stmtId: number]: string } = {};
|
||||||
private fnLabelNameMap: { [name: string]: string } = {};
|
private fnLabelNameMap: { [name: string]: string } = {};
|
||||||
|
private returnStack: Label[] = [];
|
||||||
private breakStack: Label[] = [];
|
private breakStack: Label[] = [];
|
||||||
|
|
||||||
public constructor(private lastPos: Pos) {}
|
public constructor(private lastPos: Pos) {}
|
||||||
@ -83,7 +84,7 @@ export class Lowerer {
|
|||||||
case "break":
|
case "break":
|
||||||
return this.lowerBreakStmt(stmt);
|
return this.lowerBreakStmt(stmt);
|
||||||
case "return":
|
case "return":
|
||||||
break;
|
return this.lowerReturnStmt(stmt);
|
||||||
case "fn":
|
case "fn":
|
||||||
return this.lowerFnStmt(stmt);
|
return this.lowerFnStmt(stmt);
|
||||||
case "let":
|
case "let":
|
||||||
@ -128,6 +129,18 @@ export class Lowerer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lowerReturnStmt(stmt: Stmt) {
|
||||||
|
if (stmt.kind.type !== "return") {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
if (stmt.kind.expr) {
|
||||||
|
this.lowerExpr(stmt.kind.expr);
|
||||||
|
}
|
||||||
|
this.addClearingSourceMap();
|
||||||
|
this.program.add(Ops.PushPtr, this.returnStack.at(-1)!);
|
||||||
|
this.program.add(Ops.Jump);
|
||||||
|
}
|
||||||
|
|
||||||
private lowerBreakStmt(stmt: Stmt) {
|
private lowerBreakStmt(stmt: Stmt) {
|
||||||
if (stmt.kind.type !== "break") {
|
if (stmt.kind.type !== "break") {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
@ -155,6 +168,9 @@ export class Lowerer {
|
|||||||
const fnRoot = new LocalsFnRoot(outerLocals);
|
const fnRoot = new LocalsFnRoot(outerLocals);
|
||||||
const outerProgram = this.program;
|
const outerProgram = this.program;
|
||||||
|
|
||||||
|
const returnLabel = this.program.makeLabel();
|
||||||
|
this.returnStack.push(returnLabel);
|
||||||
|
|
||||||
this.program = new Assembler();
|
this.program = new Assembler();
|
||||||
this.locals = fnRoot;
|
this.locals = fnRoot;
|
||||||
for (const { ident } of stmt.kind.params) {
|
for (const { ident } of stmt.kind.params) {
|
||||||
@ -162,11 +178,16 @@ export class Lowerer {
|
|||||||
}
|
}
|
||||||
if (stmt.kind.anno?.ident === "builtin") {
|
if (stmt.kind.anno?.ident === "builtin") {
|
||||||
this.lowerFnBuiltinBody(stmt.kind.anno.values);
|
this.lowerFnBuiltinBody(stmt.kind.anno.values);
|
||||||
|
} else if (stmt.kind.anno?.ident === "remainder") {
|
||||||
|
this.program.add(Ops.Remainder);
|
||||||
} else {
|
} else {
|
||||||
this.lowerExpr(stmt.kind.body);
|
this.lowerExpr(stmt.kind.body);
|
||||||
}
|
}
|
||||||
this.locals = outerLocals;
|
this.locals = outerLocals;
|
||||||
|
|
||||||
|
this.returnStack.pop();
|
||||||
|
this.program.setLabel(returnLabel);
|
||||||
|
|
||||||
const localAmount = fnRoot.stackReserved() -
|
const localAmount = fnRoot.stackReserved() -
|
||||||
stmt.kind.params.length;
|
stmt.kind.params.length;
|
||||||
for (let i = 0; i < localAmount; ++i) {
|
for (let i = 0; i < localAmount; ++i) {
|
||||||
@ -224,7 +245,7 @@ export class Lowerer {
|
|||||||
case "int":
|
case "int":
|
||||||
return this.lowerIntExpr(expr);
|
return this.lowerIntExpr(expr);
|
||||||
case "bool":
|
case "bool":
|
||||||
break;
|
return this.lowerBoolExpr(expr);
|
||||||
case "string":
|
case "string":
|
||||||
return this.lowerStringExpr(expr);
|
return this.lowerStringExpr(expr);
|
||||||
case "ident":
|
case "ident":
|
||||||
@ -300,6 +321,13 @@ export class Lowerer {
|
|||||||
this.program.add(Ops.PushInt, expr.kind.value);
|
this.program.add(Ops.PushInt, expr.kind.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lowerBoolExpr(expr: Expr) {
|
||||||
|
if (expr.kind.type !== "bool") {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
this.program.add(Ops.PushBool, expr.kind.value);
|
||||||
|
}
|
||||||
|
|
||||||
private lowerStringExpr(expr: Expr) {
|
private lowerStringExpr(expr: Expr) {
|
||||||
if (expr.kind.type !== "string") {
|
if (expr.kind.type !== "string") {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
@ -375,6 +403,12 @@ export class Lowerer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (vtype.type === "bool") {
|
||||||
|
if (expr.kind.binaryType === "or") {
|
||||||
|
this.program.add(Ops.Or);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`unhandled binaryType` +
|
`unhandled binaryType` +
|
||||||
` '${vtypeToString(expr.vtype!)}' aka. ` +
|
` '${vtypeToString(expr.vtype!)}' aka. ` +
|
||||||
|
24
examples/infinite_loop.slg
Normal file
24
examples/infinite_loop.slg
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
fn ten_times() {
|
||||||
|
for (let i = 0; i < 10; i += 1) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn twenty_times() {
|
||||||
|
let i = 0;
|
||||||
|
loop {
|
||||||
|
if not (i < 20) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
loop {
|
||||||
|
ten_times();
|
||||||
|
twenty_times();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
80
examples/primes_10000.slg
Normal file
80
examples/primes_10000.slg
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
|
||||||
|
fn remainder(left: int, right: int) -> int #[remainder()] {}
|
||||||
|
|
||||||
|
fn int_to_string(v: int) -> string #[builtin(IntToString)] {}
|
||||||
|
|
||||||
|
fn string_push_char(str: string, value: int) -> string #[builtin(StringPushChar)] {}
|
||||||
|
fn string_char_at(str: string, index: int) -> int #[builtin(StringCharAt)] {}
|
||||||
|
fn string_length(str: string) -> int #[builtin(StringLength)] {}
|
||||||
|
fn string_to_int(v: string) -> int #[builtin(StringToInt)] {}
|
||||||
|
|
||||||
|
fn string_array_new() -> [string] #[builtin(ArrayNew)] {}
|
||||||
|
fn string_array_push(array: [string], value: string) #[builtin(ArrayPush)] {}
|
||||||
|
fn string_array_length(array: [string]) -> int #[builtin(ArrayLength)] {}
|
||||||
|
fn string_array_at(array: [string], index: int) -> string #[builtin(ArrayAt)] {}
|
||||||
|
|
||||||
|
fn int_array_new() -> [int] #[builtin(ArrayNew)] {}
|
||||||
|
fn int_array_push(array: [int], value: int) #[builtin(ArrayPush)] {}
|
||||||
|
fn int_array_length(array: [int]) -> int #[builtin(ArrayLength)] {}
|
||||||
|
fn int_array_at(array: [int], index: int) -> int #[builtin(ArrayAt)] {}
|
||||||
|
|
||||||
|
fn file_open(filename: string, mode: string) -> int #[builtin(FileOpen)] {}
|
||||||
|
fn file_close(file: int) #[builtin(FileClose)] {}
|
||||||
|
fn file_write_string(file: int, content: string) -> int #[builtin(FileWriteString)] {}
|
||||||
|
fn file_read_char(file: int) -> int #[builtin(FileReadChar)] {}
|
||||||
|
fn file_read_to_string(file: int) -> string #[builtin(FileReadToString)] {}
|
||||||
|
fn file_flush(file: int) #[builtin(FileFlush)] {}
|
||||||
|
fn file_eof(file: int) -> bool #[builtin(FileEof)] {}
|
||||||
|
|
||||||
|
fn stdin() -> int { 0 }
|
||||||
|
fn stdout() -> int { 1 }
|
||||||
|
fn stderr() -> int { 2 }
|
||||||
|
|
||||||
|
fn file_read_line(file: int) -> string {
|
||||||
|
let line = "";
|
||||||
|
loop {
|
||||||
|
if file_eof(file) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let ch = file_read_char(file);
|
||||||
|
if ch == "\n"[0] {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
line = string_push_char(line, ch);
|
||||||
|
}
|
||||||
|
line
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print(msg: string) #[builtin(Print)] {}
|
||||||
|
fn println(msg: string) { print(msg + "\n") }
|
||||||
|
|
||||||
|
fn input(prompt: string) -> string {
|
||||||
|
print("> ");
|
||||||
|
file_flush(stdout());
|
||||||
|
file_read_line(stdin())
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
fn is_prime(n: int) -> bool {
|
||||||
|
if n == 1 or n == 0{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 2; i < n; i += 1) {
|
||||||
|
if remainder(n, i) == 0 {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
for (let i = 1; i < 10000; i += 1) {
|
||||||
|
if is_prime(i) {
|
||||||
|
print(int_to_string(i) + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("");
|
||||||
|
}
|
||||||
|
|
@ -9,7 +9,7 @@ ifeq ($(RELEASE),1)
|
|||||||
|
|
||||||
CXX_FLAGS = \
|
CXX_FLAGS = \
|
||||||
-std=c++23 \
|
-std=c++23 \
|
||||||
-O2 \
|
-O3 \
|
||||||
-pedantic -pedantic-errors \
|
-pedantic -pedantic-errors \
|
||||||
-Wall -Wextra -Wpedantic -Wconversion -Werror\
|
-Wall -Wextra -Wpedantic -Wconversion -Werror\
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <format>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -89,13 +87,12 @@ private:
|
|||||||
|
|
||||||
inline void calculate_node_midway_result(int64_t ic, size_t node_index)
|
inline void calculate_node_midway_result(int64_t ic, size_t node_index)
|
||||||
{
|
{
|
||||||
int64_t diff = ic - this->nodes[this->current].ic_start;
|
int64_t diff = ic - this->nodes[node_index].ic_start;
|
||||||
this->nodes[this->current].acc += diff;
|
this->nodes[node_index].acc += diff;
|
||||||
this->nodes[this->current].ic_start = ic;
|
this->nodes[node_index].ic_start = ic;
|
||||||
// TODO this was a hack, idk if correct
|
if (node_index == 0)
|
||||||
if (node_index == this->nodes[this->current].parent)
|
|
||||||
return;
|
return;
|
||||||
calculate_node_midway_result(ic, this->nodes[this->current].parent);
|
calculate_node_midway_result(ic, this->nodes[node_index].parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fg_node_to_json(json::Writer& writer, size_t node_index) const;
|
void fg_node_to_json(json::Writer& writer, size_t node_index) const;
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
fn add(a, b) {
|
|
||||||
+ a b
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = 0;
|
|
||||||
let i = 0;
|
|
||||||
loop {
|
|
||||||
if >= i 10 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
result = add(result, 5);
|
|
||||||
i = + i 1;
|
|
||||||
}
|
|
||||||
|
|
@ -346,9 +346,6 @@ async function main() {
|
|||||||
view.replaceChildren(outerContainer);
|
view.replaceChildren(outerContainer);
|
||||||
},
|
},
|
||||||
"code-coverage": async () => {
|
"code-coverage": async () => {
|
||||||
if (await data.status().then((r) => r.running)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const codeCoverageData = await data.codeCoverageData();
|
const codeCoverageData = await data.codeCoverageData();
|
||||||
|
|
||||||
const outerContainer = document.createElement("div");
|
const outerContainer = document.createElement("div");
|
||||||
@ -375,9 +372,6 @@ async function main() {
|
|||||||
view.replaceChildren(outerContainer, tooltip);
|
view.replaceChildren(outerContainer, tooltip);
|
||||||
},
|
},
|
||||||
"flame-graph": async () => {
|
"flame-graph": async () => {
|
||||||
if (await data.status().then((r) => r.running)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const flameGraphData = await data.flameGraphData();
|
const flameGraphData = await data.flameGraphData();
|
||||||
const flameGraphFnNames = await data.flameGraphFnNames();
|
const flameGraphFnNames = await data.flameGraphFnNames();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user