summaryrefslogtreecommitdiffstats
path: root/source/slang/emit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/emit.cpp')
-rw-r--r--source/slang/emit.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index eae9cd052..699294d84 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -765,6 +765,34 @@ static void emitCallExpr(
emitSimpleCallExpr(context, callExpr, outerPrec);
}
+static void emitStringLiteral(
+ EmitContext* context,
+ String const& value)
+{
+ emit(context, "\"");
+ for (auto c : value)
+ {
+ // TODO: This needs a more complete implementation,
+ // especially if we want to support Unicode.
+
+ char buffer[] = { c, 0 };
+ switch (c)
+ {
+ default:
+ emit(context, buffer);
+ break;
+
+ case '\"': emit(context, "\\\"");
+ case '\'': emit(context, "\\\'");
+ case '\\': emit(context, "\\\\");
+ case '\n': emit(context, "\\n");
+ case '\r': emit(context, "\\r");
+ case '\t': emit(context, "\\t");
+ }
+ }
+ emit(context, "\"");
+}
+
static void EmitExprWithPrecedence(EmitContext* context, RefPtr<ExpressionSyntaxNode> expr, int outerPrec)
{
bool needClose = false;
@@ -874,6 +902,9 @@ static void EmitExprWithPrecedence(EmitContext* context, RefPtr<ExpressionSyntax
case ConstantExpressionSyntaxNode::ConstantType::Bool:
Emit(context, litExpr->IntValue ? "true" : "false");
break;
+ case ConstantExpressionSyntaxNode::ConstantType::String:
+ emitStringLiteral(context, litExpr->stringValue);
+ break;
default:
assert(!"unreachable");
break;