@@ -393,7 +393,7 @@ static deDatatype findStructDatatype(deSignature signature) {
393
393
deForeachBlockVariable (block , var ) {
394
394
deDatatypeArrayAppendDatatype (types , deVariableGetDatatype (var ));
395
395
} deEndBlockVariable ;
396
- return deStructDatatypeCreate (deBlockGetOwningFunction ( block ), types ,
396
+ return deStructDatatypeCreate (deSignatureGetUniquifiedFunction ( signature ), types ,
397
397
deSignatureGetLine (signature ));
398
398
}
399
399
@@ -408,7 +408,7 @@ static void updateExternSignature(deSignature signature) {
408
408
deDatatype datatype = deExpressionGetDatatype (typeExpr );
409
409
if (datatype == deDatatypeNull || !deDatatypeConcrete (datatype )) {
410
410
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" );
412
412
}
413
413
deSignatureSetReturnType (signature , datatype );
414
414
}
@@ -420,7 +420,7 @@ static void updateExternSignature(deSignature signature) {
420
420
utAssert (datatype != deDatatypeNull );
421
421
if (!deDatatypeConcrete (datatype )) {
422
422
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" );
424
424
}
425
425
deVariableSetInstantiated (var , true);
426
426
deParamspecSetInstantiated (param , true);
@@ -442,7 +442,7 @@ static void verifyCaseTypes(deBlock block) {
442
442
deExpression switchExpr = deStatementGetExpression (statement );
443
443
deDatatype datatype = deExpressionGetDatatype (switchExpr );
444
444
if (deExpressionIsType (switchExpr )) {
445
- deError ( deExpressionGetLine ( switchExpr ) ,
445
+ deExprError ( switchExpr ,
446
446
"Cannot switch on a type. Did you mean typeswitch?" );
447
447
}
448
448
deStatement caseStatement ;
@@ -452,7 +452,7 @@ static void verifyCaseTypes(deBlock block) {
452
452
deExpression expression ;
453
453
deForeachExpressionExpression (listExpression , expression ) {
454
454
if (deExpressionGetDatatype (expression ) != datatype ) {
455
- deError ( deExpressionGetLine ( expression ) ,
455
+ deExprError ( expression ,
456
456
"Case expression has different type than switch expression:%s" ,
457
457
deGetOldVsNewDatatypeStrings (deExpressionGetDatatype (expression ), datatype ));
458
458
}
@@ -484,8 +484,7 @@ static void updateSignature(deSignature signature) {
484
484
utAssert (var == deVariableNull || deVariableGetType (var ) != DE_VAR_PARAMETER );
485
485
deForeachBlockVariable (deSignatureGetBlock (signature ), var ) {
486
486
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" ,
489
488
deVariableGetName (var ));
490
489
}
491
490
} deEndBlockVariable ;
@@ -579,46 +578,16 @@ static void destroyUnusedTclassesContents(void) {
579
578
}
580
579
}
581
580
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
-
617
581
// Report the event and exit.
618
582
static void reportEvent (deEvent event ) {
619
583
deBinding binding = deEventGetFirstBinding (event );
620
584
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 );
622
591
if (signature != deSignatureNull ) {
623
592
deDumpSignature (signature );
624
593
putchar ('\n' );
@@ -645,7 +614,12 @@ void deReportEvents(void) {
645
614
if (deEventGetFirstBinding (event ) == deBindingNull ) {
646
615
// This can happen if we destroy the statements that were blocked.
647
616
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 ) {
649
623
reportEvent (event );
650
624
}
651
625
} deEndSafeRootEvent ;
@@ -663,8 +637,7 @@ void deBind(void) {
663
637
deSignatureSetInstantiated (mainSignature , true);
664
638
deQueueSignature (mainSignature );
665
639
deBindAllSignatures ();
666
- destroyUnusedTclassesContents ();
667
- deAssignDefaultNullValues ();
640
+ // destroyUnusedTclassesContents();
668
641
deReportEvents ();
669
642
}
670
643
0 commit comments