Skip to content

Commit

Permalink
Merge pull request google#46 from waywardgeek/main
Browse files Browse the repository at this point in the history
Got first unittest in bootstrap/database/block.rn to pass.
  • Loading branch information
waywardgeek authored Mar 18, 2023
2 parents 48335a0 + 3f99414 commit 5c5a827
Show file tree
Hide file tree
Showing 11 changed files with 101 additions and 61 deletions.
38 changes: 37 additions & 1 deletion bind/bind.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,41 @@ static void destroyUnusedTclassesContents(void) {
}
}

// Resolve a null type, e.g. null(Foo), rather than null(Foo(u32)). For
// tclasses that have only one class instantiated, we can resolve the null type
// to null for that class.
static bool resolveNullType(deVariable var) {
deDatatype datatype = deVariableGetDatatype(var);
utAssert(deDatatypeGetType(datatype) == DE_TYPE_NULL);
deTclass tclass = deDatatypeGetTclass(datatype);
if (deTclassGetNumClasses(tclass) != 1) {
return false;
}
deClass theClass = deTclassGetFirstClass(tclass);
deDatatype newDatatype = deSetDatatypeNullable(deClassDatatypeCreate(theClass),
true, deVariableGetLine(var));
deVariableSetDatatype(var, newDatatype);
return true;
}

// Assign default null values for classes that have a constructor call but no
// template parameters.
void deAssignDefaultNullValues(void) {
deEvent event;
deSafeForeachRootEvent(deTheRoot, event) {
if (deEventGetType(event) == DE_EVENT_VARIABLE) {
deVariable var = deEventGetVariable(event);
deDatatype datatype = deVariableGetDatatype(var);
if (deDatatypeGetType(datatype) == DE_TYPE_NULL) {
if (resolveNullType(var)) {
deQueueEventBlockedBindings(event);
}
}
}
} deEndSafeRootEvent;
deBindAllSignatures();
}

// Report the event and exit.
static void reportEvent(deEvent event) {
deBinding binding = deEventGetFirstBinding(event);
Expand Down Expand Up @@ -615,7 +650,7 @@ void deReportEvents(void) {
}

// Bind expressions everywhere.
void deBind2(void) {
void deBind(void) {
deBlock rootBlock = deRootGetBlock(deTheRoot);
deFunction mainFunc = deBlockGetOwningFunction(rootBlock);
deSignature mainSignature = deSignatureCreate(mainFunc,
Expand All @@ -624,6 +659,7 @@ void deBind2(void) {
deQueueSignature(mainSignature);
deBindAllSignatures();
destroyUnusedTclassesContents();
deAssignDefaultNullValues();
deReportEvents();
}

Expand Down
2 changes: 2 additions & 0 deletions bootstrap/database/block.rn
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ unittest {
}
}

/*
unittest dumpBlockTest {
block = createPrintlnBlock("Hello, World!")
block.dump()
Expand Down Expand Up @@ -281,3 +282,4 @@ unittest createUniqueSymTest {
createPrintlnFunction(topBlock, newSym.name, "func3")
topBlock.dump()
}
*/
8 changes: 4 additions & 4 deletions builtin/arraylist.rn
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ generator ArrayList(A: Class, B: Class, cascadeDelete:bool = false,
for i in range(num$labelB$pluralB, length) {
child = self.$labelB$pluralB[i]
if !isnull(child) {
self.remove$labelB$B(child)
self.remove$labelB$B(child!)
}
}
} else {
Expand Down Expand Up @@ -73,7 +73,7 @@ generator ArrayList(A: Class, B: Class, cascadeDelete:bool = false,
for i in range(self.$labelB$pluralB.length()) {
child$labelB$B = self.$labelB$pluralB[i]
if !isnull(child$labelB$B) {
child$labelB$B.destroy()
child$labelB$B!.destroy()
}
}
}
Expand All @@ -83,7 +83,7 @@ generator ArrayList(A: Class, B: Class, cascadeDelete:bool = false,
for i in range(self.$labelB$pluralB.length()) {
child$labelB$B = self.$labelB$pluralB[i]
if !isnull(child$labelB$B) {
self.remove$labelB$B(child$labelB$B)
self.remove$labelB$B(child$labelB$B!)
}
}
}
Expand All @@ -97,7 +97,7 @@ generator ArrayList(A: Class, B: Class, cascadeDelete:bool = false,
// Remove self from A on destruction.
prependcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
18 changes: 9 additions & 9 deletions builtin/doublylinked.rn
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
self.last$labelB$B = child
} else {
first.prev$A$labelB$B = child
child.next$A$labelB$B = first
child.next$A$labelB$B = first!
}
self.first$labelB$B = child
child.$labelA$A = self
Expand All @@ -52,8 +52,8 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
if isnull(nextChild) {
self.append$labelB$B(child)
} else {
child.next$A$labelB$B = prevChild.next$A$labelB$B
child.prev$A$labelB$B = nextChild.prev$A$labelB$B
child.next$A$labelB$B = prevChild!.next$A$labelB$B
child.prev$A$labelB$B = nextChild!.prev$A$labelB$B
prevChild.next$A$labelB$B = child
nextChild.prev$A$labelB$B = child
child.$labelA$A = self
Expand All @@ -73,7 +73,7 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
self.first$labelB$B = child
} else {
last.next$A$labelB$B = child
child.prev$A$labelB$B = last
child.prev$A$labelB$B = last!
}
self.last$labelB$B = child
child.$labelA$A = self
Expand All @@ -89,12 +89,12 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
next = child.next$A$labelB$B
prev = child.prev$A$labelB$B
if !isnull(prev) {
prev.next$A$labelB$B = next
prev!.next$A$labelB$B = next
} else if self.first$labelB$B == child {
self.first$labelB$B = next
}
if !isnull(next) {
next.prev$A$labelB$B = prev
next!.prev$A$labelB$B = prev
} else if self.last$labelB$B == child {
self.last$labelB$B = prev
}
Expand Down Expand Up @@ -160,7 +160,7 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.first$labelB$B
} while !isnull(child$labelB$B) {
child$labelB$B.destroy()
child$labelB$B!.destroy()
}
}
} else {
Expand All @@ -169,7 +169,7 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.first$labelB$B
} while !isnull(child$labelB$B) {
self.remove$labelB$B(child$labelB$B)
self.remove$labelB$B(child$labelB$B!)
}
}
}
Expand All @@ -183,7 +183,7 @@ generator DoublyLinked(A: Class, B: Class, cascadeDelete:bool = false,
// Remove self from A on destruction.
prependcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
46 changes: 23 additions & 23 deletions builtin/hashed.rn
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
hash = hashValue(key) & <u64>(self.$labelB$B_Table.length() - 1)
entry = self.$labelB$B_Table[hash]
while !isnull(entry) {
if key == entry.$keyField {
return entry
if key == entry!.$keyField {
return entry!
}
entry = entry.nextHashed$A$labelB$B
entry = entry!.nextHashed$A$labelB$B
}
return null(entry)
}
Expand All @@ -106,20 +106,20 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
newLength = self.$labelB$B_Table.length()
mask = <u64>(newLength - 1)
while !isnull(entry) {
hash = hashValue(entry.$keyField) & mask
hash = hashValue(entry!.$keyField) & mask
if hash >> (newLength - 2) != 0 {
nextEntry = entry.nextHashed$A$labelB$B
nextEntry = entry!.nextHashed$A$labelB$B
// Remove entry.
if isnull(prevEntry) {
self.$labelB$B_Table[i] = nextEntry
} else {
prevEntry.nextHashed$A$labelB$B = nextEntry
prevEntry!.nextHashed$A$labelB$B = nextEntry
}
// Insert entry.
entry.nextHashed$A$labelB$B = self.$labelB$B_Table[hash]
self.$labelB$B_Table[hash] = entry
entry!.nextHashed$A$labelB$B = self.$labelB$B_Table[hash]
self.$labelB$B_Table[hash] = entry!
}
prevEntry = entry
prevEntry = entry!
entry = nextEntry
}
}
Expand Down Expand Up @@ -154,19 +154,19 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
entry = self.$labelB$B_Table[hash]
prev = null(entry)
while !isnull(entry) {
if entry == child {
if entry! == child {
if isnull(prev) {
self.$labelB$B_Table[hash] = child.nextHashed$A$labelB$B
} else {
prev.nextHashed$A$labelB$B = child.nextHashed$A$labelB$B
prev!.nextHashed$A$labelB$B = child.nextHashed$A$labelB$B
}
child.nextHashed$A$labelB$B = null(child)
child.$labelA$A = null(self)
unref child
return
}
prev = entry
entry = entry.nextHashed$A$labelB$B
prev = entry!
entry = entry!.nextHashed$A$labelB$B
}
throw "Entry not found in map"
}
Expand All @@ -176,7 +176,7 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
entry = self.$labelB$B_Table[i]
while !isnull(entry) {
yield entry!
entry = entry.nextHashed$A$labelB$B
entry = entry!.nextHashed$A$labelB$B
}
}
}
Expand All @@ -185,7 +185,7 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
for i in range(self.$labelB$B_Table.length()) {
entry = self.$labelB$B_Table[i]
while !isnull(entry) {
nextEntry = entry.nextHashed$A$labelB$B
nextEntry = entry!.nextHashed$A$labelB$B
yield entry!
entry = nextEntry
}
Expand All @@ -200,10 +200,10 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
for x$labelB$B in range(self.$labelB$B_Table.length()) {
$labelB$B_Entry = self.$labelB$B_Table[x$labelB$B]
while !isnull($labelB$B_Entry) {
next$labelB$B_Entry = $labelB$B_Entry.nextHashed$A$labelB$B
$labelB$B_Entry.nextHashed$A$labelB$B = null($labelB$B_Entry)
$labelB$B_Entry.$labelA$A = null(self)
$labelB$B_Entry.destroy()
next$labelB$B_Entry = $labelB$B_Entry!.nextHashed$A$labelB$B
$labelB$B_Entry!.nextHashed$A$labelB$B = null($labelB$B_Entry!)
$labelB$B_Entry!.$labelA$A = null(self)
$labelB$B_Entry!.destroy()
$labelB$B_Entry = next$labelB$B_Entry
}
self.$labelB$B_Table[x$labelB$B] = null($labelB$B_Entry)
Expand All @@ -214,9 +214,9 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
for x$labelB$B in range(self.$labelB$B_Table.length()) {
$labelB$B_Entry = self.$labelB$B_Table[x$labelB$B]
while !isnull($labelB$B_Entry) {
next$labelB$B_Entry = $labelB$B_Entry.nextHashed$A$labelB$B
$labelB$B_Entry.nextHashed$A$labelB$B = null($labelB$B_Entry)
$labelB$B_Entry.$labelA$A = null(self)
next$labelB$B_Entry = $labelB$B_Entry!.nextHashed$A$labelB$B
$labelB$B_Entry!.nextHashed$A$labelB$B = null($labelB$B_Entry)
$labelB$B_Entry!.$labelA$A = null(self)
$labelB$B_Entry = next$labelB$B_Entry
}
self.$labelB$B_Table[x$labelB$B] = null($labelB$B_Entry)
Expand All @@ -231,7 +231,7 @@ generator Hashed(A: Class, B: Class, cascadeDelete: bool = false,
// Remove self from A on destruction.
appendcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
6 changes: 3 additions & 3 deletions builtin/heapqlist.rn
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ generator HeapqList(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.pop$labelB$B()
} while !isnull(child$labelB$B) {
child$labelB$B.destroy()
child$labelB$B!.destroy()
}
}
} else {
Expand All @@ -156,7 +156,7 @@ generator HeapqList(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.pop$labelB$B()
} while !isnull(child$labelB$B) {
self.remove$labelB$B(child$labelB$B)
self.remove$labelB$B(child$labelB$B!)
}
}
}
Expand All @@ -169,7 +169,7 @@ generator HeapqList(A: Class, B: Class, cascadeDelete:bool = false,
// Remove self from A on destruction.
prependcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
12 changes: 6 additions & 6 deletions builtin/linkedlist.rn
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ generator LinkedList(A: Class, B: Class, cascadeDelete:bool = false,
if isnull(prevChild) {
self.insert$labelB$B(child)
} else {
child.next$A$labelB$B = prevChild.next$A$labelB$B
prevChild.next$A$labelB$B = child
child.next$A$labelB$B = prevChild!.next$A$labelB$B
prevChild!.next$A$labelB$B = child
child.$labelA$A = self
ref child
}
Expand Down Expand Up @@ -103,7 +103,7 @@ generator LinkedList(A: Class, B: Class, cascadeDelete:bool = false,
iterator safe$labelB$pluralB(self) {
child = self.first$labelB$B
while !isnull(child) {
next$A$labelB$B = child.next$A$labelB$B
next$A$labelB$B = child!.next$A$labelB$B
yield child!
child = next$A$labelB$B
}
Expand All @@ -116,7 +116,7 @@ generator LinkedList(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.first$labelB$B
} while !isnull(child$labelB$B) {
child$labelB$B.destroy()
child$labelB$B!.destroy()
}
}
} else {
Expand All @@ -125,7 +125,7 @@ generator LinkedList(A: Class, B: Class, cascadeDelete:bool = false,
do {
child$labelB$B = self.first$labelB$B
} while !isnull(child$labelB$B) {
self.remove(child$labelB$B)
self.remove(child$labelB$B!)
}
}
}
Expand All @@ -138,7 +138,7 @@ generator LinkedList(A: Class, B: Class, cascadeDelete:bool = false,
// Remove self from A on destruction.
prependcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
6 changes: 3 additions & 3 deletions builtin/onetoone.rn
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ generator OneToOne(A: Class, B: Class, cascadeDelete:bool = false,
appendcode A.destroy {
child$labelB$B = self.$labelB$B
if !isnull(child$labelB$B) {
child$labelB$B.destroy()
child$labelB$B!.destroy()
}
}
} else {
prependcode A.destroy {
child$labelB$B = self.$labelB$B
if !isnull(child$labelB$B) {
self.remove$labelB$B(child$labelB$B)
self.remove$labelB$B(child$labelB$B!)
}
}
}
Expand All @@ -64,7 +64,7 @@ generator OneToOne(A: Class, B: Class, cascadeDelete:bool = false,
// Remove self from A on destruction.
prependcode B.destroy {
if !isnull(self.$labelA$A) {
self.$labelA$A.remove$labelB$B(self)
self.$labelA$A!.remove$labelB$B(self)
}
}
}
Loading

0 comments on commit 5c5a827

Please sign in to comment.