Skip to content

Commit 81c4522

Browse files
committed
This is an early snapshot of functionality still under review internally at Google. These enhancements are significant enough that I'm sharing them now while the review process continues. A later push will include changes implemented during the review process.
1 parent 879c7aa commit 81c4522

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+2194
-1722
lines changed

benchmarks/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CPP=clang++-9
1+
CPP=clang++
22
CCFLAGS=-Wall -O3
33

44
all: priority_queue fh binary_trees_cc

benchmarks/binary_trees.rn

-5
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ relation OneToOne Node:"ParentLeft" Node:"Left" cascade
3434
relation OneToOne Node:"ParentRight" Node:"Right" cascade
3535

3636
func makeTree(depth) {
37-
if false {
38-
// This is a hint for type resolution under recursion.
39-
// TODO: Enhance recursive type detection to jump ahead to later returns.
40-
return Node()
41-
}
4237
node = Node()
4338
if depth != 0 {
4439
left = makeTree(depth - 1)

benchmarks/fh.rn

+5-5
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ for i in range(1u32 << 10) {
4141
}
4242

4343
for i in range(10u32) {
44-
for element in root.elements() {
45-
root.pushHeapElement(element)
44+
for elem1 in root.elements() {
45+
root.pushHeapElement(elem1)
4646
}
4747
totalHash = 0u32
4848
do {
49-
element = root.popHeapElement()
50-
} while !isnull(element) {
51-
totalHash = hashValues(totalHash, element!.cost)
49+
elem2 = root.popHeapElement()
50+
} while !isnull(elem2) {
51+
totalHash = hashValues(totalHash, elem2!.cost)
5252
}
5353
println totalHash
5454
}

bind/bind.c

+19-46
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ static deDatatype findStructDatatype(deSignature signature) {
393393
deForeachBlockVariable(block, var) {
394394
deDatatypeArrayAppendDatatype(types, deVariableGetDatatype(var));
395395
} deEndBlockVariable;
396-
return deStructDatatypeCreate(deBlockGetOwningFunction(block), types,
396+
return deStructDatatypeCreate(deSignatureGetUniquifiedFunction(signature), types,
397397
deSignatureGetLine(signature));
398398
}
399399

@@ -408,7 +408,7 @@ static void updateExternSignature(deSignature signature) {
408408
deDatatype datatype = deExpressionGetDatatype(typeExpr);
409409
if (datatype == deDatatypeNull || !deDatatypeConcrete(datatype)) {
410410
printf("Extern function return type: %s\n", deDatatypeGetTypeString(datatype));
411-
deError(deSignatureGetLine(signature), "Extern function return types must be concrete");
411+
deSigError(signature, "Extern function return types must be concrete");
412412
}
413413
deSignatureSetReturnType(signature, datatype);
414414
}
@@ -420,7 +420,7 @@ static void updateExternSignature(deSignature signature) {
420420
utAssert(datatype != deDatatypeNull);
421421
if (!deDatatypeConcrete(datatype)) {
422422
printf("%s type: %s\n", deVariableGetName(var), deDatatypeGetTypeString(datatype));
423-
deError(deSignatureGetLine(signature), "Extern function parameter types must be concrete");
423+
deSigError(signature, "Extern function parameter types must be concrete");
424424
}
425425
deVariableSetInstantiated(var, true);
426426
deParamspecSetInstantiated(param, true);
@@ -442,7 +442,7 @@ static void verifyCaseTypes(deBlock block) {
442442
deExpression switchExpr = deStatementGetExpression(statement);
443443
deDatatype datatype = deExpressionGetDatatype(switchExpr);
444444
if (deExpressionIsType(switchExpr)) {
445-
deError(deExpressionGetLine(switchExpr),
445+
deExprError(switchExpr,
446446
"Cannot switch on a type. Did you mean typeswitch?");
447447
}
448448
deStatement caseStatement;
@@ -452,7 +452,7 @@ static void verifyCaseTypes(deBlock block) {
452452
deExpression expression;
453453
deForeachExpressionExpression(listExpression, expression) {
454454
if (deExpressionGetDatatype(expression) != datatype) {
455-
deError(deExpressionGetLine(expression),
455+
deExprError(expression,
456456
"Case expression has different type than switch expression:%s",
457457
deGetOldVsNewDatatypeStrings(deExpressionGetDatatype(expression), datatype));
458458
}
@@ -484,8 +484,7 @@ static void updateSignature(deSignature signature) {
484484
utAssert(var == deVariableNull || deVariableGetType(var) != DE_VAR_PARAMETER);
485485
deForeachBlockVariable(deSignatureGetBlock(signature), var) {
486486
if (deVariableIsType(var) && deVariableInstantiated(var)) {
487-
deLine line = deVariableGetLine(var);
488-
deError(line, "Variable %s is assigned a type, but also instantiated",
487+
deSigError(signature, "Variable %s is assigned a type, but also instantiated",
489488
deVariableGetName(var));
490489
}
491490
} deEndBlockVariable;
@@ -579,46 +578,16 @@ static void destroyUnusedTclassesContents(void) {
579578
}
580579
}
581580

582-
// Resolve a null type, e.g. null(Foo), rather than null(Foo(u32)). For
583-
// tclasses that have only one class instantiated, we can resolve the null type
584-
// to null for that class.
585-
static bool resolveNullType(deVariable var) {
586-
deDatatype datatype = deVariableGetDatatype(var);
587-
utAssert(deDatatypeGetType(datatype) == DE_TYPE_NULL);
588-
deTclass tclass = deDatatypeGetTclass(datatype);
589-
if (deTclassGetNumClasses(tclass) != 1) {
590-
return false;
591-
}
592-
deClass theClass = deTclassGetFirstClass(tclass);
593-
deDatatype newDatatype = deSetDatatypeNullable(deClassDatatypeCreate(theClass),
594-
true, deVariableGetLine(var));
595-
deVariableSetDatatype(var, newDatatype);
596-
return true;
597-
}
598-
599-
// Assign default null values for classes that have a constructor call but no
600-
// template parameters.
601-
void deAssignDefaultNullValues(void) {
602-
deEvent event;
603-
deSafeForeachRootEvent(deTheRoot, event) {
604-
if (deEventGetType(event) == DE_EVENT_VARIABLE) {
605-
deVariable var = deEventGetVariable(event);
606-
deDatatype datatype = deVariableGetDatatype(var);
607-
if (datatype != deDatatypeNull && deDatatypeGetType(datatype) == DE_TYPE_NULL) {
608-
if (resolveNullType(var)) {
609-
deQueueEventBlockedBindings(event);
610-
}
611-
}
612-
}
613-
} deEndSafeRootEvent;
614-
deBindAllSignatures();
615-
}
616-
617581
// Report the event and exit.
618582
static void reportEvent(deEvent event) {
619583
deBinding binding = deEventGetFirstBinding(event);
620584
utAssert(binding != deBindingNull);
621-
deSignature signature = deEventGetReturnSignature(event);
585+
deSignature signature = deBindingGetSignature(binding);
586+
if (signature != deSignatureNull) {
587+
deCurrentSignature = signature;
588+
deCurrentStatement = deSignatureGetCallStatement(signature);
589+
}
590+
signature = deEventGetReturnSignature(event);
622591
if (signature != deSignatureNull) {
623592
deDumpSignature(signature);
624593
putchar('\n');
@@ -645,7 +614,12 @@ void deReportEvents(void) {
645614
if (deEventGetFirstBinding(event) == deBindingNull) {
646615
// This can happen if we destroy the statements that were blocked.
647616
deEventDestroy(event);
648-
} else {
617+
} else if (deEventGetType(event) == DE_EVENT_UNDEFINED) {
618+
reportEvent(event);
619+
}
620+
} deEndSafeRootEvent;
621+
deSafeForeachRootEvent(deTheRoot, event) {
622+
if (deEventGetType(event) != DE_EVENT_UNDEFINED) {
649623
reportEvent(event);
650624
}
651625
} deEndSafeRootEvent;
@@ -663,8 +637,7 @@ void deBind(void) {
663637
deSignatureSetInstantiated(mainSignature, true);
664638
deQueueSignature(mainSignature);
665639
deBindAllSignatures();
666-
destroyUnusedTclassesContents();
667-
deAssignDefaultNullValues();
640+
// destroyUnusedTclassesContents();
668641
deReportEvents();
669642
}
670643

0 commit comments

Comments
 (0)