Make empty arrays into just pointers
This commit is contained in:
parent
d70f6fffa0
commit
0400aa1d99
@ -293,9 +293,6 @@ namespace types {
|
|||||||
}
|
}
|
||||||
|
|
||||||
llvm::Type* ArrayType::codegen(codegen::Builder& builder) {
|
llvm::Type* ArrayType::codegen(codegen::Builder& builder) {
|
||||||
if (this->m_size) {
|
return llvm::ArrayType::get(this->m_inner->codegen(builder), this->m_size);
|
||||||
return llvm::ArrayType::get(this->m_inner->codegen(builder), *this->m_size);
|
|
||||||
}
|
|
||||||
return llvm::PointerType::get(*builder.context, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,9 +266,16 @@ namespace parsing {
|
|||||||
auto array_postfix = parse_array_postfix(inner);
|
auto array_postfix = parse_array_postfix(inner);
|
||||||
while (array_postfix.ok()) {
|
while (array_postfix.ok()) {
|
||||||
auto postfix = array_postfix.unwrap();
|
auto postfix = array_postfix.unwrap();
|
||||||
ty = std::shared_ptr<types::Type>{
|
if (postfix) {
|
||||||
new types::ArrayType(ty, postfix)
|
ty = std::shared_ptr<types::Type>{
|
||||||
};
|
new types::ArrayType(ty, *postfix)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ty = std::shared_ptr<types::Type>{
|
||||||
|
new types::PointerType(ty)
|
||||||
|
};
|
||||||
|
}
|
||||||
array_postfix = parse_array_postfix(inner);
|
array_postfix = parse_array_postfix(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -146,10 +146,7 @@ namespace types {
|
|||||||
std::string ArrayType::formatted() {
|
std::string ArrayType::formatted() {
|
||||||
std::stringstream out{ "" };
|
std::stringstream out{ "" };
|
||||||
out << this->m_inner->formatted();
|
out << this->m_inner->formatted();
|
||||||
if (this->m_size)
|
out << "[" << this->m_size << "]";
|
||||||
out << "[" << *this->m_size << "]";
|
|
||||||
else
|
|
||||||
out << "[]";
|
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,13 +156,7 @@ namespace types {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ArrayType::size() {
|
uint32_t ArrayType::size() {
|
||||||
if (this->m_size) {
|
return this->m_size * this->m_inner->size();
|
||||||
return (*this->m_size) * this->m_inner->size();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Acts as a pointer type otherwise
|
|
||||||
return 64;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool types_equal(std::shared_ptr<types::Type> type1, std::shared_ptr<types::Type> type2) {
|
bool types_equal(std::shared_ptr<types::Type> type1, std::shared_ptr<types::Type> type2) {
|
||||||
|
|||||||
@ -85,9 +85,9 @@ namespace types {
|
|||||||
class ArrayType : public Type {
|
class ArrayType : public Type {
|
||||||
public:
|
public:
|
||||||
std::shared_ptr<Type> m_inner;
|
std::shared_ptr<Type> m_inner;
|
||||||
std::optional<uint32_t> m_size;
|
uint32_t m_size;
|
||||||
|
|
||||||
ArrayType(std::shared_ptr<Type> inner, std::optional<uint32_t> size)
|
ArrayType(std::shared_ptr<Type> inner, uint32_t size)
|
||||||
: Type(TypeKind::Array), m_inner{ std::move(inner) }, m_size{ size } {
|
: Type(TypeKind::Array), m_inner{ std::move(inner) }, m_size{ size } {
|
||||||
}
|
}
|
||||||
virtual ~ArrayType() override = default;
|
virtual ~ArrayType() override = default;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user