From 9cb9d7498f5e598832b609d553ac300b206cdfab Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 17 Jan 2016 17:40:17 +0200 Subject: Resolve issue with very long if-else chains MSVC has a limit of 128. --- xsde/cxx/hybrid/parser-source.cxx | 38 ++++++++++++++++++++++++++++++++------ 1 file 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 (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 (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 ( + e, names_, 0, 0, 0, &Enumeration::comma_break); + + os << "}" + << "} while (false);" + << endl; + } + else + { + names ( + 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: -- cgit v1.1