diff options
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 132 |
1 files changed, 40 insertions, 92 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 8e106fe55..522e5ef12 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -31,45 +31,6 @@ namespace Slang { -// represents a declarator for use in emitting types -struct CLikeSourceEmitter::EDeclarator -{ - enum class Flavor - { - Name, - Array, - UnsizedArray, - }; - Flavor flavor; - EDeclarator* next = nullptr; - - // Used for `Flavor::name` - const StringSliceLoc* nameAndLoc; - - // Used for `Flavor::Array` - IRInst* elementCount; -}; - -struct CLikeSourceEmitter::IRDeclaratorInfo -{ - enum class Flavor - { - Simple, - Ptr, - Array, - }; - - Flavor flavor; - IRDeclaratorInfo* next; - union - { - String const* name; - IRInst* elementCount; - }; -}; - - - struct CLikeSourceEmitter::ComputeEmitActionsContext { IRInst* moduleInst; @@ -148,7 +109,7 @@ SlangResult CLikeSourceEmitter::init() // Types // -void CLikeSourceEmitter::emitDeclarator(EDeclarator* declarator) +void CLikeSourceEmitter::emitDeclarator(DeclaratorInfo* declarator) { if (!declarator) return; @@ -156,23 +117,45 @@ void CLikeSourceEmitter::emitDeclarator(EDeclarator* declarator) switch (declarator->flavor) { - case EDeclarator::Flavor::Name: - m_writer->emitName(*declarator->nameAndLoc); + case DeclaratorInfo::Flavor::Name: + { + auto nameDeclarator = (NameDeclaratorInfo*)declarator; + m_writer->emitName(*nameDeclarator->nameAndLoc); + } break; - case EDeclarator::Flavor::Array: - emitDeclarator(declarator->next); - m_writer->emit("["); - if(auto elementCount = declarator->elementCount) + case DeclaratorInfo::Flavor::SizedArray: { - emitVal(elementCount, getInfo(EmitOp::General)); + auto arrayDeclarator = (SizedArrayDeclaratorInfo*)declarator; + emitDeclarator(arrayDeclarator->next); + m_writer->emit("["); + if(auto elementCount = arrayDeclarator->elementCount) + { + emitVal(elementCount, getInfo(EmitOp::General)); + } + m_writer->emit("]"); + } + break; + + case DeclaratorInfo::Flavor::UnsizedArray: + { + auto arrayDeclarator = (UnsizedArrayDeclaratorInfo*)declarator; + emitDeclarator(arrayDeclarator->next); + m_writer->emit("[]"); } - m_writer->emit("]"); break; - case EDeclarator::Flavor::UnsizedArray: - emitDeclarator(declarator->next); - m_writer->emit("[]"); + case DeclaratorInfo::Flavor::Ptr: + { + // TODO: When there are both pointer and array declarators + // as part of a type, paranetheses may be needed in order + // to disambiguate between a pointer-to-array and an + // array-of-poiners. + // + auto ptrDeclarator = (PtrDeclaratorInfo*)declarator; + m_writer->emit("*"); + emitDeclarator(ptrDeclarator->next); + } break; default: @@ -253,26 +236,19 @@ List<IRWitnessTableEntry*> CLikeSourceEmitter::getSortedWitnessTableEntries(IRWi return sortedWitnessTableEntries; } -void CLikeSourceEmitter::_emitArrayType(IRArrayType* arrayType, EDeclarator* declarator) +void CLikeSourceEmitter::_emitArrayType(IRArrayType* arrayType, DeclaratorInfo* declarator) { - EDeclarator arrayDeclarator; - arrayDeclarator.flavor = EDeclarator::Flavor::Array; - arrayDeclarator.next = declarator; - arrayDeclarator.elementCount = arrayType->getElementCount(); - + SizedArrayDeclaratorInfo arrayDeclarator(declarator, arrayType->getElementCount()); _emitType(arrayType->getElementType(), &arrayDeclarator); } -void CLikeSourceEmitter::_emitUnsizedArrayType(IRUnsizedArrayType* arrayType, EDeclarator* declarator) +void CLikeSourceEmitter::_emitUnsizedArrayType(IRUnsizedArrayType* arrayType, DeclaratorInfo* declarator) { - EDeclarator arrayDeclarator; - arrayDeclarator.flavor = EDeclarator::Flavor::UnsizedArray; - arrayDeclarator.next = declarator; - + UnsizedArrayDeclaratorInfo arrayDeclarator(declarator); _emitType(arrayType->getElementType(), &arrayDeclarator); } -void CLikeSourceEmitter::_emitType(IRType* type, EDeclarator* declarator) +void CLikeSourceEmitter::_emitType(IRType* type, DeclaratorInfo* declarator) { switch (type->getOp()) { @@ -327,9 +303,7 @@ void CLikeSourceEmitter::emitTypeImpl(IRType* type, const StringSliceLoc* nameAn // be done so before the type name appears. m_writer->advanceToSourceLocationIfValid(nameAndLoc->loc); - EDeclarator nameDeclarator; - nameDeclarator.flavor = EDeclarator::Flavor::Name; - nameDeclarator.nameAndLoc = nameAndLoc; + NameDeclaratorInfo nameDeclarator(nameAndLoc); _emitType(type, &nameDeclarator); } else @@ -777,32 +751,6 @@ String CLikeSourceEmitter::getName(IRInst* inst) return name; } -void CLikeSourceEmitter::emitDeclarator(IRDeclaratorInfo* declarator) -{ - if(!declarator) - return; - - switch( declarator->flavor ) - { - case IRDeclaratorInfo::Flavor::Simple: - m_writer->emit(" "); - m_writer->emit(*declarator->name); - break; - - case IRDeclaratorInfo::Flavor::Ptr: - m_writer->emit("*"); - emitDeclarator(declarator->next); - break; - - case IRDeclaratorInfo::Flavor::Array: - emitDeclarator(declarator->next); - m_writer->emit("["); - emitOperand(declarator->elementCount, getInfo(EmitOp::General)); - m_writer->emit("]"); - break; - } -} - void CLikeSourceEmitter::emitSimpleValueImpl(IRInst* inst) { switch(inst->getOp()) |
