aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-01-17 17:40:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-01-17 17:40:17 +0200
commit9cb9d7498f5e598832b609d553ac300b206cdfab (patch)
treef3114fc8f62289aa541ae61dd7182e1b2a71bc43
parent8015f7e66508a15f8e48e05e9622c4c606aa17ec (diff)
Resolve issue with very long if-else chains
MSVC has a limit of 128.
-rw-r--r--xsde/cxx/hybrid/parser-source.cxx38
1 files changed, 32 insertions, 6 deletions
diff --git a/xsde/cxx/hybrid/parser-source.cxx b/xsde/cxx/hybrid/parser-source.cxx
index 2cc4dfa..2651094 100644
--- a/xsde/cxx/hybrid/parser-source.cxx
+++ b/xsde/cxx/hybrid/parser-source.cxx
@@ -61,8 +61,8 @@ namespace CXX
Enumeration& s (dynamic_cast<Enumeration&> (e.scope ()));
- os << "if (strcmp (s, " <<
- strlit (e.name ()) << ") == 0)" << endl
+ os << "if (strcmp (s, " << strlit (e.name ()) << ") == 0)"
+ << "{"
<< "v = " << fq_name (s) << "::" << ename (e) << ";";
}
};
@@ -456,9 +456,27 @@ namespace CXX
(stl ? "c_str" : "data") << " ();"
<< endl;
- names<Enumeration> (e, names_, 0, 0, 0, &Enumeration::comma);
+ // MSVC cannot handle an if-else chain longer than 128.
+ //
+ if (e.names_size () > 127)
+ {
+ os << "do"
+ << "{";
+
+ names<Enumeration> (
+ e, names_, 0, 0, 0, &Enumeration::comma_break);
+
+ os << "}"
+ << "} while (false);"
+ << endl;
+ }
+ else
+ {
+ names<Enumeration> (
+ e, names_, 0, 0, 0, &Enumeration::comma_else);
- os << endl;
+ os << "}";
+ }
if (fl)
os << type << " r (v);";
@@ -473,9 +491,17 @@ namespace CXX
}
virtual void
- comma (Type&)
+ comma_else (Type&)
{
- os << "else ";
+ os << "}"
+ << "else ";
+ }
+
+ virtual void
+ comma_break (Type&)
+ {
+ os << "break;"
+ << "}";
}
private: