diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-17 06:52:23 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-17 06:52:23 +0000 |
| commit | 39661855c0816ac248be437704c76f58359cb5f0 (patch) | |
| tree | 202b014805e40208e3adb861f4a97d31770f13e6 /lib/CodeGen/ArrayHandler.cc | |
| parent | c89477d615fb0ce4d89786ef848ffe6aca1da088 (diff) | |
feat(classes): construct declared objects and nested fields and arrays
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/ArrayHandler.cc')
| -rw-r--r-- | lib/CodeGen/ArrayHandler.cc | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/CodeGen/ArrayHandler.cc b/lib/CodeGen/ArrayHandler.cc index 5eb8a52..337e5f4 100644 --- a/lib/CodeGen/ArrayHandler.cc +++ b/lib/CodeGen/ArrayHandler.cc @@ -139,6 +139,24 @@ void ArrayHandler::emitArrayDeclare(ArrayDeclareStmtAST *Stmt, CodeGen &CG) { Builder->CreateStore(Ptr, Alloca); CG.registerSymbol(Name, Alloca, ElemInfo->Name, true); + if (CG.typeNeedsConstruction(ElemInfo->Name)) { + BasicBlock *Preheader = Builder->GetInsertBlock(); + BasicBlock *Loop = BasicBlock::Create(*TheContext, "construct_elements", TheFunction); + BasicBlock *Body = BasicBlock::Create(*TheContext, "construct_element", TheFunction); + BasicBlock *Done = BasicBlock::Create(*TheContext, "constructed_array", TheFunction); + Builder->CreateBr(Loop); + Builder->SetInsertPoint(Loop); + auto *Index = Builder->CreatePHI(Type::getInt64Ty(*TheContext), 2, "construct_index"); + Index->addIncoming(ConstantInt::get(Type::getInt64Ty(*TheContext), 0), Preheader); + Builder->CreateCondBr(Builder->CreateICmpULT(Index, TotalElements), Body, Done); + Builder->SetInsertPoint(Body); + Value *Element = Builder->CreateGEP(ElemInfo->LLVMType, Ptr, Index); + CG.emitDefaultConstruct(ElemInfo->Name, Element, Stmt->getLine()); + Value *Next = Builder->CreateAdd(Index, ConstantInt::get(Type::getInt64Ty(*TheContext), 1)); + Index->addIncoming(Next, Builder->GetInsertBlock()); + Builder->CreateBr(Loop); + Builder->SetInsertPoint(Done); + } } void ArrayHandler::computeDimsAndMultipliers(const std::string &Name, |
