Skip to content

Commit

Permalink
Fix coverage leaks (#546)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcauberer authored May 12, 2024
1 parent 60c6b93 commit 94c3181
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 69 deletions.
46 changes: 12 additions & 34 deletions media/test-project/test.spice
Original file line number Diff line number Diff line change
@@ -1,39 +1,17 @@
import "std/data/doubly-linked-list";
import "std/os/env";
import "bootstrap/lexer/lexer";

f<int> main() {
DoublyLinkedList<String> list;
assert list.getSize() == 0;
assert list.isEmpty();
list.pushBack(String("Hello"));
assert list.getSize() == 1;
assert !list.isEmpty();
String var = String("World");
list.pushBack(var);
assert list.getSize() == 2;
list.pushFront(String("Hi"));
assert list.getSize() == 3;
assert list.getFront() == String("Hi");
assert list.getBack() == String("World");
list.removeFront();
assert list.getSize() == 2;
assert list.getFront() == String("Hello");
list.removeBack();
assert list.getSize() == 1;
assert list.getBack() == String("Hello");
list.pushBack(String("World"));
list.pushFront(String("Hi"));
list.pushBack(String("Programmers"));
assert list.getSize() == 4;
list.remove(String("World"));
assert list.getSize() == 3;
assert list.get(0) == String("Hi");
assert list.get(1) == String("Hello");
assert list.get(2) == String("Programmers");
list.removeAt(1);
assert list.getSize() == 2;
assert list.get(0) == String("Hi");
assert list.get(1) == String("Programmers");
printf("All assertions passed!\n");
String filePath = getEnv("SPICE_STD_DIR") + "/../test/test-files/bootstrap-compiler/standalone-lexer-test/test-file.spice";
Lexer lexer = Lexer(filePath.getRaw());
unsigned long tokenCount = 0l;
while (!lexer.isEOF()) {
Token token = lexer.getToken();
token.print();
lexer.advance();
tokenCount++;
}
printf("\nLexed tokens: %d\n", tokenCount);
}

/*import "std/iterator/number-iterator";
Expand Down
16 changes: 8 additions & 8 deletions src/irgenerator/GenExpressions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ std::any IRGenerator::visitAssignExpr(const AssignExprNode *node) {
case AssignExprNode::OP_XOR_EQUAL:
result = conversionManager.getXorEqualInst(node, lhs, lhsSTy, rhs, rhsSTy, currentScope);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "Assign op fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -320,7 +320,7 @@ std::any IRGenerator::visitEqualityExpr(const EqualityExprNode *node) {
case EqualityExprNode::OP_NOT_EQUAL:
result = conversionManager.getNotEqualInst(node, result, lhsSTy, rhs, rhsSTy, currentScope, 0);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "EqualityExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -360,7 +360,7 @@ std::any IRGenerator::visitRelationalExpr(const RelationalExprNode *node) {
case RelationalExprNode::OP_GREATER_EQUAL:
result = conversionManager.getGreaterEqualInst(node, result, lhsSTy, rhs, rhsSTy, currentScope);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "EqualityExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -394,7 +394,7 @@ std::any IRGenerator::visitShiftExpr(const ShiftExprNode *node) {
case ShiftExprNode::OP_SHIFT_RIGHT:
result = conversionManager.getShiftRightInst(node, result, lhsSTy, rhs, rhsSTy, currentScope, 0);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "ShiftExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -433,7 +433,7 @@ std::any IRGenerator::visitAdditiveExpr(const AdditiveExprNode *node) {
case AdditiveExprNode::OP_MINUS:
lhs = conversionManager.getMinusInst(node, lhs, lhsSTy, rhs, rhsSTy, currentScope, operatorIndex);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "AdditiveExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -481,7 +481,7 @@ std::any IRGenerator::visitMultiplicativeExpr(const MultiplicativeExprNode *node
case MultiplicativeExprNode::OP_REM:
result = conversionManager.getRemInst(node, result, lhsSTy, rhs, rhsSTy, currentScope);
break;
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "MultiplicativeExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -636,7 +636,7 @@ std::any IRGenerator::visitPrefixUnaryExpr(const PrefixUnaryExprNode *node) {

break;
}
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "PrefixUnaryExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down Expand Up @@ -776,7 +776,7 @@ std::any IRGenerator::visitPostfixUnaryExpr(const PostfixUnaryExprNode *node) {
}
break;
}
default:
default: // GCOV_EXCL_LINE
throw CompilerError(UNHANDLED_BRANCH, "PostfixUnaryExpr fall-through"); // GCOV_EXCL_LINE
}

Expand Down
41 changes: 17 additions & 24 deletions src/irgenerator/NameMangling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ std::string NameMangling::mangleFunction(const Function &spiceFunc) {
// This type
if (spiceFunc.isMethod()) {
mangledName << "N";
mangleType(mangledName, spiceFunc.thisType, spiceFunc.typeMapping);
mangleType(mangledName, spiceFunc.thisType);
}

// Function name
Expand All @@ -51,7 +51,7 @@ std::string NameMangling::mangleFunction(const Function &spiceFunc) {
for (const GenericType &genericTemplateType : spiceFunc.templateTypes) {
assert(spiceFunc.typeMapping.contains(genericTemplateType.getSubType()));
const QualType &actualType = spiceFunc.typeMapping.at(genericTemplateType.getSubType());
mangleType(mangledName, actualType, spiceFunc.typeMapping);
mangleType(mangledName, actualType);
}
mangledName << "E";

Expand All @@ -61,7 +61,7 @@ std::string NameMangling::mangleFunction(const Function &spiceFunc) {

// Return type
if (spiceFunc.isFunction())
mangleType(mangledName, spiceFunc.returnType, spiceFunc.typeMapping);
mangleType(mangledName, spiceFunc.returnType);
else
mangledName << "v";

Expand All @@ -72,7 +72,7 @@ std::string NameMangling::mangleFunction(const Function &spiceFunc) {
// Parameter types
for (const Param &param : spiceFunc.paramList) {
assert(!param.isOptional);
mangleType(mangledName, param.type, spiceFunc.typeMapping);
mangleType(mangledName, param.type);
}
if (spiceFunc.paramList.empty())
mangledName << "v";
Expand Down Expand Up @@ -153,17 +153,14 @@ void NameMangling::mangleName(std::stringstream &out, const std::string &name, b
* @param qualType Input symbol qualType
* @return Mangled name
*/
void NameMangling::mangleType(std::stringstream &out, QualType qualType, const TypeMapping &typeMapping) { // NOLINT(*-no-recursion)
void NameMangling::mangleType(std::stringstream &out, QualType qualType) { // NOLINT(*-no-recursion)
const Type *type = qualType.getType();

// Replace generic qualType with concrete qualType
if (qualType.hasAnyGenericParts() && !typeMapping.empty())
TypeMatcher::substantiateTypeWithTypeMapping(qualType, typeMapping);
assert(!qualType.hasAnyGenericParts());

// Unwrap qualType chain
assert(!type->typeChain.empty());
for (size_t i = type->typeChain.size() - 1; i >= 1; i--)
mangleTypeChainElement(out, type->typeChain.at(i), typeMapping, false);
mangleTypeChainElement(out, type->typeChain.at(i), false);

// Specifiers
assert(qualType.getSpecifiers().isSigned == !qualType.getSpecifiers().isUnsigned);
Expand All @@ -172,7 +169,7 @@ void NameMangling::mangleType(std::stringstream &out, QualType qualType, const T
out << "K";

// Base chain element
mangleTypeChainElement(out, type->typeChain.front(), typeMapping, signedness);
mangleTypeChainElement(out, type->typeChain.front(), signedness);
}

/**
Expand All @@ -183,8 +180,7 @@ void NameMangling::mangleType(std::stringstream &out, QualType qualType, const T
* @param signedness Signedness of the type
* @return Mangled name
*/
void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement,
const TypeMapping &typeMapping, bool signedness) {
void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, bool signedness) {
switch (chainElement.superType) {
case TY_PTR: // fall-through
case TY_ARRAY:
Expand Down Expand Up @@ -226,7 +222,7 @@ void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChai
if (!chainElement.templateTypes.empty()) {
out << "I";
for (const QualType &templateType : chainElement.templateTypes)
mangleType(out, templateType, typeMapping);
mangleType(out, templateType);
out << "E";
}
if (nestedType)
Expand All @@ -243,29 +239,26 @@ void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChai
case TY_FUNCTION: {
out << (chainElement.data.hasCaptures ? "PFC" : "PF");
for (const QualType &paramType : chainElement.paramTypes)
mangleType(out, paramType, typeMapping);
mangleType(out, paramType);
out << "E";
break;
}
case TY_PROCEDURE: {
out << (chainElement.data.hasCaptures ? "PFCv" : "PFv");
for (size_t i = 1; i < chainElement.paramTypes.size(); i++)
mangleType(out, chainElement.paramTypes.at(i), typeMapping);
mangleType(out, chainElement.paramTypes.at(i));
out << "E";
break;
}
case TY_GENERIC:
out << chainElement.subType.size() << chainElement.subType; // <length><name>
break;
default:
throw CompilerError(INTERNAL_ERROR, "Type " + chainElement.getName(false) + " cannot be mangled");
default: // GCOV_EXCL_LINE
throw CompilerError(INTERNAL_ERROR, "Type " + chainElement.getName(false) + " cannot be mangled"); // GCOV_EXCL_LINE
}
}

std::string NameMangling::mangleTypeInfoName(const StructBase *structBase) {
std::stringstream out;
out << "_ZTS";
mangleType(out, structBase->entry->getQualType(), {});
mangleType(out, structBase->entry->getQualType());
return out.str();
}

Expand All @@ -274,14 +267,14 @@ std::string NameMangling::mangleTypeInfoValue(const std::string &value) { return
std::string NameMangling::mangleTypeInfo(const StructBase *structBase) {
std::stringstream out;
out << "_ZTI";
mangleType(out, structBase->entry->getQualType(), {});
mangleType(out, structBase->entry->getQualType());
return out.str();
}

std::string NameMangling::mangleVTable(const StructBase *structBase) {
std::stringstream out;
out << "_ZTV";
mangleType(out, structBase->entry->getQualType(), {});
mangleType(out, structBase->entry->getQualType());
return out.str();
}

Expand Down
5 changes: 2 additions & 3 deletions src/irgenerator/NameMangling.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ class NameMangling {
private:
// Private methods
static void mangleName(std::stringstream &out, const std::string &name, bool &nestedType);
static void mangleType(std::stringstream &out, QualType qualType, const TypeMapping &typeMapping);
static void mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, const TypeMapping &typeMapping,
bool signedness);
static void mangleType(std::stringstream &out, QualType qualType);
static void mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, bool signedness);
};

} // namespace spice::compiler

0 comments on commit 94c3181

Please sign in to comment.