diff --git a/k.krak b/k.krak index 78428c3..68cf301 100644 --- a/k.krak +++ b/k.krak @@ -231,7 +231,7 @@ fun main(argc: int, argv: **char): int { pass_poset.add_close_dep(make_pair(item, str("emit_C")), make_pair(b.third, str("emit_C"))) else if (is_identifier(b.third) && is_declaration(b.third->parent) && is_top_level_item(b.third->parent)) pass_poset.add_close_dep(make_pair(item, str("emit_C")), make_pair(b.third->parent, str("emit_C"))) - C_str += get_c_name(b.third) + C_str += idt + get_c_name(b.third) } ast::_type_def(b) { error("type_def gen unimplemented"); } ast::_adt_def(b) { error("no adt_def should remain at C emit"); } @@ -324,7 +324,7 @@ fun main(argc: int, argv: **char): int { for (var i = 1; i < t->children.size; i++;) { if (i != 1) C_str += ", " - emit_C(t->children[i], level+1) + emit_C(t->children[i], 0) } C_str += ")" } diff --git a/stdlib/poset.krak b/stdlib/poset.krak index 1db6e0e..cc90a1b 100644 --- a/stdlib/poset.krak +++ b/stdlib/poset.krak @@ -12,20 +12,17 @@ fun poset(): poset { obj poset (Object) { var open_deps: map> var close_deps: map> - var opened: set - var closed: set + var done: set fun construct(): *poset { open_deps.construct() close_deps.construct() - opened.construct() - closed.construct() + done.construct() return this } fun copy_construct(old: *poset) { open_deps.copy_construct(&old->open_deps) close_deps.copy_construct(&old->close_deps) - opened.copy_construct(&old->opened) - closed.copy_construct(&old->closed) + done.copy_construct(&old->done) } fun operator=(other: ref poset) { destruct() @@ -34,8 +31,7 @@ obj poset (Object) { fun destruct() { open_deps.destruct() close_deps.destruct() - opened.destruct() - closed.destruct() + done.destruct() } fun size(): int { return open_deps.size() @@ -44,11 +40,21 @@ obj poset (Object) { add_job(first) add_job(second) open_deps[first].add(second) + // also add all of the closed deps of what we depend on + close_deps[second].for_each(fun(cd: T) { + add_open_dep(first, cd) + }) } fun add_close_dep(first: T, second: T) { add_job(first) add_job(second) close_deps[first].add(second) + // patch this one in to everything that currently depends on first + open_deps.for_each(fun(v: T, ods: set) { + if ods.contains(first) { + add_open_dep(v, second) + } + }) } fun add_job(vertex: T) { if (open_deps.contains_key(vertex)) @@ -57,26 +63,19 @@ obj poset (Object) { close_deps.set(vertex, set()) } fun done(job: T): bool { - return closed.contains(job) + return done.contains(job) } fun run(f: fun(T): void) { - opened = set() - closed = set() - while closed.size() != size() { + done = set() + while done.size() != size() { var changed = false // intentionally not refs, as it can change out from under us open_deps.for_each(fun(v: T, ods: set) { - if !closed.contains(v) && closed.contains(ods) { - if !opened.contains(v) { - changed = true - f(v) - if closed.contains(open_deps[v]) { - opened.add(v) - } - } - if closed.contains(open_deps[v]) && closed.contains(close_deps[v]) { - changed = true - closed.add(v) + if !done.contains(v) && done.contains(ods) { + changed = true + f(v) + if done.contains(open_deps[v]) { + done.add(v) } } })