summaryrefslogtreecommitdiff
path: root/node/ExprNode.cc
diff options
context:
space:
mode:
Diffstat (limited to 'node/ExprNode.cc')
-rw-r--r--node/ExprNode.cc28
1 files changed, 19 insertions, 9 deletions
diff --git a/node/ExprNode.cc b/node/ExprNode.cc
index 13a85e9..e75eda5 100644
--- a/node/ExprNode.cc
+++ b/node/ExprNode.cc
@@ -124,7 +124,7 @@ Value ArrayAccessNode::CodeGen() {
if (array != nullptr) {
std::shared_ptr<Type> IndexType = array->GetIndexType();
Value indices[2] = {llvm::ConstantInt::get(
- manager->GetPointerIndexType_()->GetLLVMType(), 0)};
+ manager->GetPointerIndexType()->GetLLVMType(), 0)};
if (array->GetIsZeroStarted() == false) {
Value ConvertedRight =
manager->CreateCast(IndexType, RightType, right, context_);
@@ -167,7 +167,7 @@ Value DereferenceNode::CodeGen() {
return nullptr;
}
Value zero = llvm::ConstantInt::get(
- context_->GetTypeManager()->GetPointerIndexType_()->GetLLVMType(), 0);
+ context_->GetTypeManager()->GetPointerIndexType()->GetLLVMType(), 0);
type_ = pointer;
return context_->GetBuilder()->CreateInBoundsGEP(value, zero);
}
@@ -201,7 +201,7 @@ Value MemberAccessNode::CodeGen() {
int MemberIndex;
std::shared_ptr<Type> MemberType;
std::tie(MemberIndex, MemberType) = LeftInner->GetMember(rhs_);
- llvm::Type* IndexLLLVMType = manager->GetPointerIndexType_()->GetLLVMType();
+ llvm::Type* IndexLLLVMType = manager->GetPointerIndexType()->GetLLVMType();
Value indices[2] = {llvm::ConstantInt::get(IndexLLLVMType, 0),
llvm::ConstantInt::get(IndexLLLVMType, MemberIndex)};
type_ = manager->GetPointerType(MemberType);
@@ -234,21 +234,31 @@ Value FunctionCallNode::CodeGen() {
return nullptr;
}
const std::vector<std::shared_ptr<Type>>& ArgTypes = type->GetArgTypes();
+ if (type->IsVariadic() == false && ArgTypes.size() != args_.size()) {
+ Log(LogLevel ::PCC_ERROR,
+ "argument number mismatch, %d wanted, %d given", ArgTypes.size(),
+ args_.size());
+ return nullptr;
+ }
std::vector<Value> ArgValues(args_.size());
- auto ArgTypeIt = ArgTypes.begin();
+ auto ArgIt = args_.begin();
auto ArgValueIt = ArgValues.begin();
- for (auto&& arg : args_) {
- Value argv = arg->CodeGen();
+ for (auto&& ArgType : ArgTypes) {
+ Value argv = (*ArgIt)->CodeGen();
Value ConvertedArgv =
- manager->CreateCast(*ArgTypeIt, arg->GetType(), argv, context_);
+ manager->CreateCast(ArgType, (*ArgIt)->GetType(), argv, context_);
if (ConvertedArgv == nullptr) {
Log(LogLevel ::PCC_ERROR,
"argument type mismatch, the function type is %s, an argument "
"of type %s needed",
- type->GetCommonName(), (*ArgTypeIt)->GetCommonName());
+ type->GetCommonName(), ArgType->GetCommonName());
}
*ArgValueIt = ConvertedArgv;
- ++ArgTypeIt, ++ArgValueIt;
+ ++ArgIt, ++ArgValueIt;
+ }
+ while (ArgIt != args_.end()) {
+ *ArgValueIt = (*ArgIt)->CodeGen();
+ ++ArgIt, ++ArgValueIt;
}
type_ = type->GetReturnType();
return context_->GetBuilder()->CreateCall(std::get<1>(function), ArgValues);