summaryrefslogtreecommitdiff
path: root/src/c-writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/c-writer.cc')
-rw-r--r--src/c-writer.cc31
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;