diff options
Diffstat (limited to 'src/c-writer.cc')
-rw-r--r-- | src/c-writer.cc | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/src/c-writer.cc b/src/c-writer.cc index 4039e6f9..0c969d52 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -39,7 +39,7 @@ namespace { struct Label { Label(LabelType label_type, const std::string& name, - const BlockSignature& sig, + const TypeVector& sig, size_t type_stack_size, bool used = false) : label_type(label_type), @@ -54,7 +54,7 @@ struct Label { LabelType label_type; const std::string& name; - const BlockSignature& sig; + const TypeVector& sig; size_t type_stack_size; bool used = false; }; @@ -152,7 +152,7 @@ class CWriter { void PushLabel(LabelType, const std::string& name, - const BlockSignature&, + const FuncSignature&, bool used = false); const Label* FindLabel(const Var& var); bool IsTopLabelUsed() const; @@ -424,9 +424,16 @@ void CWriter::DropTypes(size_t count) { void CWriter::PushLabel(LabelType label_type, const std::string& name, - const BlockSignature& sig, + const FuncSignature& sig, bool used) { - label_stack_.emplace_back(label_type, name, sig, type_stack_.size(), used); + // TODO(binji): Add multi-value support. + if ((label_type != LabelType::Func && sig.GetNumParams() != 0) || + sig.GetNumResults() > 1) { + UNIMPLEMENTED("multi value support"); + } + + label_stack_.emplace_back(label_type, name, sig.result_types, + type_stack_.size(), used); } const Label* CWriter::FindLabel(const Var& var) { @@ -1284,7 +1291,7 @@ void CWriter::Write(const Func& func) { std::string label = DefineLocalScopeName(kImplicitFuncLabel); ResetTypeStack(0); std::string empty; // Must not be temporary, since address is taken by Label. - PushLabel(LabelType::Func, empty, func.decl.sig.result_types); + PushLabel(LabelType::Func, empty, func.decl.sig); Write(func.exprs, LabelDecl(label)); PopLabel(); ResetTypeStack(0); @@ -1400,11 +1407,11 @@ void CWriter::Write(const ExprList& exprs) { const Block& block = cast<BlockExpr>(&expr)->block; std::string label = DefineLocalScopeName(block.label); size_t mark = MarkTypeStack(); - PushLabel(LabelType::Block, block.label, block.sig); + PushLabel(LabelType::Block, block.label, block.decl.sig); Write(block.exprs, LabelDecl(label)); ResetTypeStack(mark); PopLabel(); - PushTypes(block.sig); + PushTypes(block.decl.sig.result_types); break; } @@ -1525,7 +1532,7 @@ void CWriter::Write(const ExprList& exprs) { DropTypes(1); std::string label = DefineLocalScopeName(if_.true_.label); size_t mark = MarkTypeStack(); - PushLabel(LabelType::If, if_.true_.label, if_.true_.sig); + PushLabel(LabelType::If, if_.true_.label, if_.true_.decl.sig); Write(if_.true_.exprs, CloseBrace()); if (!if_.false_.empty()) { ResetTypeStack(mark); @@ -1534,7 +1541,7 @@ void CWriter::Write(const ExprList& exprs) { ResetTypeStack(mark); Write(Newline(), LabelDecl(label)); PopLabel(); - PushTypes(if_.true_.sig); + PushTypes(if_.true_.decl.sig.result_types); break; } @@ -1548,11 +1555,11 @@ void CWriter::Write(const ExprList& exprs) { Write(DefineLocalScopeName(block.label), ": "); Indent(); size_t mark = MarkTypeStack(); - PushLabel(LabelType::Loop, block.label, block.sig); + PushLabel(LabelType::Loop, block.label, block.decl.sig); Write(Newline(), block.exprs); ResetTypeStack(mark); PopLabel(); - PushTypes(block.sig); + PushTypes(block.decl.sig.result_types); Dedent(); } break; |