Просмотр исходного кода

HPCC-11263 Pack the HqlStmt class, and avoid cloning literals.

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 11 лет назад
Родитель
Сommit
0d3b5551a8

+ 2 - 0
ecl/eclcc/eclcc.cpp

@@ -44,6 +44,7 @@
 #include "hqlgram.hpp"
 #include "hqltrans.ipp"
 #include "hqlutil.hpp"
+#include "hqlstmt.hpp"
 
 #include "build-config.h"
 #include "rmtfile.hpp"
@@ -1788,6 +1789,7 @@ bool EclCC::parseCommandLineOptions(int argc, const char* argv[])
         }
         else if (strcmp(arg, "-internal")==0)
         {
+            outputSizeStmts();
             testHqlInternals();
         }
         else if (iter.matchFlag(tempBool, "-save-cpps"))

+ 8 - 8
ecl/hqlcpp/hqlckey.cpp

@@ -198,8 +198,8 @@ void HqlCppTranslator::buildJoinMatchFunction(BuildCtx & ctx, const char * name,
         BuildCtx matchctx(ctx);
         matchctx.addQuotedCompound(s.append("virtual bool ").append(name).append("(const void * _left, const void * _right)"));
 
-        matchctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-        matchctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        matchctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+        matchctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
 
         bindTableCursor(matchctx, left, "left", no_left, selSeq);
         bindTableCursor(matchctx, right, "right", no_right, selSeq);
@@ -526,8 +526,8 @@ void KeyedJoinInfo::buildIndexReadMatch(BuildCtx & ctx)
         BuildCtx matchctx(ctx);
         matchctx.addQuotedCompound("virtual bool indexReadMatch(const void * _left, const void * _right, unsigned __int64 _filepos, IBlobProvider * blobs)");
 
-        matchctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-        matchctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        matchctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+        matchctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
 
         OwnedHqlExpr fileposExpr = getFilepos(rawKey, false);
         OwnedHqlExpr fileposVar = createVariable("_filepos", fileposExpr->getType());
@@ -552,7 +552,7 @@ void KeyedJoinInfo::buildLeftOnly(BuildCtx & ctx)
     {
         BuildCtx funcctx(ctx);
         funcctx.addQuotedCompound("virtual bool leftCanMatch(const void * _left)");
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *)_left;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *)_left;");
         translator.bindTableCursor(funcctx, expr->queryChild(0), "left", no_left, joinSeq);
         translator.buildReturn(funcctx, leftOnlyMatch);
     }
@@ -566,7 +566,7 @@ void KeyedJoinInfo::buildMonitors(BuildCtx & ctx)
     //---- virtual void createSegmentMonitors(struct IIndexReadContext *) { ... } ----
     BuildCtx createSegmentCtx(ctx);
     createSegmentCtx.addQuotedCompound("virtual void createSegmentMonitors(IIndexReadContext *irc, const void * _left)");
-    createSegmentCtx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+    createSegmentCtx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
     translator.bindTableCursor(createSegmentCtx, keyAccessDataset, "left", no_left, joinSeq);
     monitors->buildSegments(createSegmentCtx, "irc", false);
 }
@@ -592,7 +592,7 @@ void KeyedJoinInfo::buildTransform(BuildCtx & ctx)
     case no_denormalizegroup:
         {
             funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, const void * _right, unsigned numRows, const void * * _rows)");
-            funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+            funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
             break;
         }
     }   
@@ -1255,7 +1255,7 @@ void HqlCppTranslator::buildKeyedJoinExtra(ActivityInstance & instance, IHqlExpr
         IHqlExpression * indexRecord = index->queryRecord();
         BuildCtx ctx4(instance.startctx);
         ctx4.addQuotedCompound("virtual unsigned __int64 extractPosition(const void * _right)");
-        ctx4.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        ctx4.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
         bindTableCursor(ctx4, index, "right");
         OwnedHqlExpr fileposExpr = createSelectExpr(LINK(index), LINK(indexRecord->queryChild(indexRecord->numChildren()-1)));
         buildReturn(ctx4, fileposExpr);

+ 2 - 2
ecl/hqlcpp/hqlcpp.cpp

@@ -7935,7 +7935,7 @@ void HqlCppTranslator::doBuildAssignCompareTable(BuildCtx & ctx, EvaluateCompare
         //     if (cmp != 0) break;
         BuildCtx donectx(loopctx);
         donectx.addFilter(info.target.expr);
-        donectx.addQuoted("break;");
+        donectx.addQuotedLiteral("break;");
     }
 
     //     i1.next();
@@ -11692,7 +11692,7 @@ void HqlCppTranslator::buildScriptFunctionDefinition(BuildCtx &funcctx, IHqlExpr
         args.append(*createActualFromFormal(param));
         buildFunctionCall(funcctx, bindFunc, args);
     }
-    funcctx.addQuoted("__ctx->callFunction();");
+    funcctx.addQuotedLiteral("__ctx->callFunction();");
     IIdAtom * returnFunc;
     HqlExprArray retargs;
     Owned<ITypeInfo> newReturnType;

+ 1 - 1
ecl/hqlcpp/hqlcset.cpp

@@ -1139,7 +1139,7 @@ void ListSetCursor::buildIterateClass(BuildCtx & ctx, CHqlBoundExpr & tgt)
     translator.buildSimpleExpr(ctx, expr, boundList);
 
     UNIMPLEMENTED;
-    ctx.addQuoted("create fixed iterate (bound.length, bound.getAddress()");
+    ctx.addQuotedLiteral("create fixed iterate (bound.length, bound.getAddress()");
 }
 
 void ListSetCursor::gatherSelect(BuildCtx & ctx, IHqlExpression * indexExpr, CHqlBoundExpr & value, HqlExprAttr & cond)

+ 1 - 1
ecl/hqlcpp/hqlecl.cpp

@@ -462,7 +462,7 @@ void HqlDllGenerator::insertStandAloneCode()
 {
     BuildCtx ctx(static_cast<HqlCppInstance &>(*code), goAtom);
     ctx.addQuotedCompound("int main(int argc, const char *argv[])");
-    ctx.addQuoted("return start_query(argc, argv);\n");
+    ctx.addQuotedLiteral("return start_query(argc, argv);\n");
 }
 
 

+ 106 - 106
ecl/hqlcpp/hqlhtcpp.cpp

@@ -2218,7 +2218,7 @@ void ActivityInstance::buildPrefix()
         }
 
         oncreatectx.associateExpr(insideOnCreateMarker, NULL);
-        oncreatectx.addQuoted("ctx = _ctx;");
+        oncreatectx.addQuotedLiteral("ctx = _ctx;");
 
         evalContext->onCreate.createFunctionStructure(translator, oncreatectx, true, executedRemotely ? "serializeCreateContext" : NULL);
         if (onCreateStmt)
@@ -2788,7 +2788,7 @@ void GlobalClassBuilder::buildClass(unsigned priority)
         classctx.setNextPriority(priority);
     classStmt = classctx.addQuotedCompound(s, ";");
     if (!baseName)
-        classctx.addQuoted("ICodeContext * ctx;");
+        classctx.addQuotedLiteral("ICodeContext * ctx;");
     classctx.associateExpr(codeContextMarkerExpr, codeContextMarkerExpr);
 
     //Generate functions in the order i) always callable ii) after create iii) after start
@@ -2806,7 +2806,7 @@ void GlobalClassBuilder::buildClass(unsigned priority)
     BuildCtx oncreatectx(createctx);
     onCreateStmt = oncreatectx.addQuotedCompound("void onCreate(ICodeContext * _ctx)");
     oncreatectx.associateExpr(insideOnCreateMarker, NULL);
-    oncreatectx.addQuoted("ctx = _ctx;");
+    oncreatectx.addQuotedLiteral("ctx = _ctx;");
 
     evalContext->onCreate.createFunctionStructure(translator, oncreatectx, true, NULL);
     onCreateStmt->finishedFramework();
@@ -2827,8 +2827,8 @@ void GlobalClassBuilder::completeClass(unsigned priority)
             accessctx.setNextPriority(priority);
         accessctx.addQuotedCompound(prototype);
         accessctx.addQuoted(s.clear().append(className).append("* p = new ").append(className).append("(activityId); "));
-        accessctx.addQuoted("p->onCreate(ctx);");
-        accessctx.addQuoted("return p;");
+        accessctx.addQuotedLiteral("p->onCreate(ctx);");
+        accessctx.addQuotedLiteral("return p;");
 
         if (translator.queryOptions().spanMultipleCpp)
         {
@@ -4112,7 +4112,7 @@ void HqlCppTranslator::buildMetaInfo(MetaInstance & instance)
                 getctx.addQuotedCompound(s);
                 s.clear().append("if (!data) return ").append(maxLength).append(";");
                 getctx.addQuoted(s.str());
-                getctx.addQuoted("const unsigned char * left = (const unsigned char *)data;");
+                getctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *)data;");
 
                 OwnedHqlExpr selfDs = createDataset(no_null, LINK(instance.queryRecord()));
                 BoundRow * selfRow = bindTableCursorOrRow(getctx, selfDs, "left");
@@ -5234,8 +5234,8 @@ void HqlCppTranslator::buildCompareClass(BuildCtx & ctx, const char * name, IHql
 
     BuildCtx funcctx(classctx);
     funcctx.addQuotedCompound("virtual int docompare(const void * _left, const void * _right) const");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     bindTableCursor(funcctx, datasetLeft, "left", no_left, selSeq);
@@ -5281,8 +5281,8 @@ void HqlCppTranslator::buildCompareEqClass(BuildCtx & ctx, const char * name, IH
 
     BuildCtx funcctx(classctx);
     funcctx.addQuotedCompound("virtual bool match(const void * _left, const void * _right) const");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     bindTableCursor(funcctx, datasetLeft, "left", no_left, selSeq);
@@ -5314,8 +5314,8 @@ void HqlCppTranslator::buildNaryCompareClass(BuildCtx & ctx, const char * name,
 
     BuildCtx funcctx(classctx);
     funcctx.addQuotedCompound("virtual bool match(unsigned numRows, const void * * _rows) const");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _rows[0];");
-    funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _rows[0];");
+    funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
@@ -5397,8 +5397,8 @@ void HqlCppTranslator::buildCompareClass(BuildCtx & ctx, const char * name, IHql
 
     BuildCtx funcctx(comparectx);
     funcctx.addQuotedCompound("virtual int docompare(const void * _left, const void * _right) const");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     buildReturnOrder(funcctx, sortList, dataset);
@@ -6753,13 +6753,13 @@ void HqlCppTranslator::buildRecordSerializeExtract(BuildCtx & ctx, IHqlExpressio
             ctx.addQuoted(s.append("size32_t size = ").append(meta.queryInstanceObject()).append(".getRecordSize(_left);"));
         }
 
-        ctx.addQuoted("byte * self = crSelf.ensureCapacity(size, NULL);");
-        ctx.addQuoted("memcpy(crSelf.row(), _left, size);");
-        ctx.addQuoted("return size;");
+        ctx.addQuotedLiteral("byte * self = crSelf.ensureCapacity(size, NULL);");
+        ctx.addQuotedLiteral("memcpy(crSelf.row(), _left, size);");
+        ctx.addQuotedLiteral("return size;");
     }
     else
     {
-        ctx.addQuoted("const byte * left = (const byte *)_left;");
+        ctx.addQuotedLiteral("const byte * left = (const byte *)_left;");
         BoundRow * self = bindSelf(ctx, serializedDataset, "crSelf");
         BoundRow * left = bindTableCursor(ctx, memoryDataset, "left");
         OwnedHqlExpr rhs = ensureActiveRow(left->querySelector());
@@ -8123,7 +8123,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityMerge(BuildCtx & ctx, IHqlExpr
     if (sorts.ordinality() != 0)
     {
         OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
-        instance->startctx.addQuoted("virtual ICompare * queryCompare() { return &compare; }");
+        instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
 
         DatasetReference dsRef(dataset, no_activetable, NULL);
         buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
@@ -8368,7 +8368,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityLoop(BuildCtx & ctx, IHqlExpre
     {
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual bool sendToLoop(unsigned counter, const void * _self)");
-        funcctx.addQuoted("unsigned char * self = (unsigned char *) _self;");
+        funcctx.addQuotedLiteral("unsigned char * self = (unsigned char *) _self;");
 
         associateCounter(funcctx, counter, "counter");
         bindTableCursor(funcctx, dataset, "self", no_left, selSeq);
@@ -8382,7 +8382,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityLoop(BuildCtx & ctx, IHqlExpre
     {
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual bool loopAgain(unsigned counter, unsigned numRows, const void * * _rows)");
-        funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+        funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
 
         associateCounter(funcctx, counter, "counter");
 
@@ -8425,7 +8425,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityLoop(BuildCtx & ctx, IHqlExpre
             Owned<ITypeInfo> setType = makeSetType(LINK(unsignedType));
             BuildCtx funcctx(instance->startctx);
             funcctx.addQuotedCompound("virtual void numParallelIterations(size32_t & __lenResult, void * & __result)");
-            funcctx.addQuoted("bool __isAllResult;");
+            funcctx.addQuotedLiteral("bool __isAllResult;");
             doBuildFunctionReturn(funcctx, setType, parallelList);
         }
     }
@@ -9368,13 +9368,13 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
         {
             if (header->queryType()->isInteger())
             {
-                classctx.addQuoted("virtual const char * getHeader() { return NULL; }");
+                classctx.addQuotedLiteral("virtual const char * getHeader() { return NULL; }");
                 doBuildUnsignedFunction(classctx, "queryHeaderLen", header);
             }
             else
             {
                 doBuildVarStringFunction(classctx, "getHeader", header);
-                classctx.addQuoted("virtual unsigned queryHeaderLen() { return 1; }");
+                classctx.addQuotedLiteral("virtual unsigned queryHeaderLen() { return 1; }");
             }
         }
         else
@@ -9389,7 +9389,7 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
             }
             OwnedHqlExpr namesExpr = createConstant(names.str());
             doBuildVarStringFunction(classctx, "getHeader", namesExpr);
-            classctx.addQuoted("virtual unsigned queryHeaderLen() { return 1; }");
+            classctx.addQuotedLiteral("virtual unsigned queryHeaderLen() { return 1; }");
         }
 
         if (isReading)
@@ -9409,8 +9409,8 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
     }
     else
     {
-        classctx.addQuoted("virtual const char * getHeader() { return NULL; }");
-        classctx.addQuoted("virtual unsigned queryHeaderLen() { return 0; }");
+        classctx.addQuotedLiteral("virtual const char * getHeader() { return NULL; }");
+        classctx.addQuotedLiteral("virtual unsigned queryHeaderLen() { return 0; }");
     }
 
 
@@ -9435,7 +9435,7 @@ void HqlCppTranslator::buildCsvParameters(BuildCtx & subctx, IHqlExpression * cs
 
     endNestedClass();
 
-    subctx.addQuoted("virtual ICsvParameters * queryCsvParameters() { return &csv; }");
+    subctx.addQuotedLiteral("virtual ICsvParameters * queryCsvParameters() { return &csv; }");
 }
 
 void HqlCppTranslator::buildCsvWriteScalar(BuildCtx & ctx, IHqlExpression * expr, IAtom * encoding)
@@ -9859,7 +9859,7 @@ void HqlCppTranslator::doBuildIndexOutputTransform(BuildCtx & ctx, IHqlExpressio
     BuildCtx subctx(ctx);
     subctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IBlobCreator * blobs, unsigned __int64 & filepos)");
     ensureRowAllocated(subctx, "crSelf");
-    subctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+    subctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
     associateBlobHelper(subctx, srcDataset, "blobs");
 
     BoundRow * selfCursor = bindSelf(subctx, tgtDataset, "crSelf");
@@ -10133,7 +10133,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutputIndex(BuildCtx & ctx, IH
             HqlExprArray sorts;
             gatherIndexBuildSortOrder(sorts, expr, options.sortIndexPayload);
             OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
-            instance->startctx.addQuoted("virtual ICompare * queryCompare() { return &compare; }");
+            instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
 
             DatasetReference dsRef(dataset);
             buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
@@ -10294,11 +10294,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
             if (expr->hasAttribute(repeatAtom))
             {
                 //virtual const char * getPipeProgram() { return "grep"; }
-                instance->startctx.addQuoted("virtual const char * getPipeProgram() { return NULL; }");
+                instance->startctx.addQuotedLiteral("virtual const char * getPipeProgram() { return NULL; }");
 
                 BuildCtx pipeCtx(instance->startctx);
                 pipeCtx.addQuotedCompound("virtual char * getNameFromRow(const void * _self)");
-                pipeCtx.addQuoted("const unsigned char * self = (const unsigned char *) _self;");
+                pipeCtx.addQuotedLiteral("const unsigned char * self = (const unsigned char *) _self;");
                 bindTableCursor(pipeCtx, dataset, "self");
                 buildReturn(pipeCtx, pipe, unknownVarStringType);
             }
@@ -10311,9 +10311,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivityOutput(BuildCtx & ctx, IHqlExp
             }
 
             if (csvAttr)
-                instance->classctx.addQuoted("virtual IHThorCsvWriteExtra * queryCsvOutput() { return this; }");
+                instance->classctx.addQuotedLiteral("virtual IHThorCsvWriteExtra * queryCsvOutput() { return this; }");
             if (xmlAttr)
-                instance->classctx.addQuoted("virtual IHThorXmlWriteExtra * queryXmlOutput() { return this; }");
+                instance->classctx.addQuotedLiteral("virtual IHThorXmlWriteExtra * queryXmlOutput() { return this; }");
 
             StringBuffer flags;
             if (expr->hasAttribute(repeatAtom))
@@ -11160,11 +11160,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPipeThrough(BuildCtx & ctx, IH
     if (expr->hasAttribute(repeatAtom))
     {
         //virtual const char * getPipeProgram() { return "grep"; }
-        instance->startctx.addQuoted("virtual const char * getPipeProgram() { return NULL; }");
+        instance->startctx.addQuotedLiteral("virtual const char * getPipeProgram() { return NULL; }");
 
         BuildCtx pipeCtx(instance->startctx);
         pipeCtx.addQuotedCompound("virtual char * getNameFromRow(const void * _self)");
-        pipeCtx.addQuoted("const unsigned char * self = (const unsigned char *) _self;");
+        pipeCtx.addQuotedLiteral("const unsigned char * self = (const unsigned char *) _self;");
         bindTableCursor(pipeCtx, dataset, "self");
         buildReturn(pipeCtx, pipe, unknownVarStringType);
     }
@@ -11179,13 +11179,13 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPipeThrough(BuildCtx & ctx, IH
     if (csvToPipe)
     {
         buildCsvWriteMembers(instance, dataset, csvToPipe);
-        instance->classctx.addQuoted("virtual IHThorCsvWriteExtra * queryCsvOutput() { return this; }");
+        instance->classctx.addQuotedLiteral("virtual IHThorCsvWriteExtra * queryCsvOutput() { return this; }");
     }
 
     if (xmlToPipe)
     {
         buildXmlWriteMembers(instance, dataset, xmlToPipe);
-        instance->classctx.addQuoted("virtual IHThorXmlWriteExtra * queryXmlOutput() { return this; }");
+        instance->classctx.addQuotedLiteral("virtual IHThorXmlWriteExtra * queryXmlOutput() { return this; }");
     }
 
     bool usesContents = false;
@@ -11297,7 +11297,7 @@ void HqlCppTranslator::generateSortCompare(BuildCtx & nestedctx, BuildCtx & ctx,
         if (!noNeedToSort)
         {
             DBGLOG("Lightweight true, but code generator didn't think sort was required");
-            ctx.addQuoted("//Forced by lightweight");
+            ctx.addQuotedLiteral("//Forced by lightweight");
         }
         s.clear().append("virtual bool is").append(sideText).append("AlreadySorted() { return true; }");
         ctx.addQuoted(s);
@@ -11318,8 +11318,8 @@ void HqlCppTranslator::generateSortCompare(BuildCtx & nestedctx, BuildCtx & ctx,
 
         BuildCtx funcctx(classctx);
         funcctx.addQuotedCompound("virtual int docompare(const void * _left, const void * _right) const");
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-        funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+        funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
         funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
         OwnedHqlExpr groupOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
@@ -11390,7 +11390,7 @@ void HqlCppTranslator::generateSerializeFunction(BuildCtx & ctx, const char * fu
     s.append("virtual unsigned ").append(funcName).append("(ARowBuilder & crSelf, const void * _src, unsigned & thisRecordSize)");
     r2kctx.addQuotedCompound(s);
     ensureRowAllocated(r2kctx, "crSelf");
-    r2kctx.addQuoted("const unsigned char * src = (const unsigned char *) _src;");
+    r2kctx.addQuotedLiteral("const unsigned char * src = (const unsigned char *) _src;");
 
     OwnedHqlExpr selSeq = createDummySelectorSequence();
     BoundRow * tgtCursor = bindSelf(ctx, tgtDataset.queryDataset(), "crSelf");
@@ -11969,7 +11969,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
         {
             transformctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, const void * _right, unsigned numRows, const void * * _rows)");
             ensureRowAllocated(transformctx, "crSelf");
-            transformctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+            transformctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
 
 
             BoundRow * selfCursor = buildTransformCursors(transformctx, transform, dataset1, dataset2, instance->dataset, selSeq);
@@ -12002,7 +12002,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
     {
         //if left and right match, then leftright compare function is also the same
         if (canReuseLeftCompare && !joinInfo.hasOptionalEqualities())
-            instance->nestedctx.addQuoted("virtual ICompare * queryCompareLeftRight() { return &compareLeft; }");
+            instance->nestedctx.addQuotedLiteral("virtual ICompare * queryCompareLeftRight() { return &compareLeft; }");
         else
             doCompareLeftRight(instance->nestedctx, "CompareLeftRight", lhsDsRef, rhsDsRef, joinInfo.queryLeftReq(), joinInfo.queryRightReq());
     }
@@ -12035,7 +12035,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
             buildHashOfExprsClass(instance->nestedctx, "HashRight", rightList, rhsDsRef, false);
         }
         else
-            instance->nestedctx.addQuoted("virtual IHash * queryHashRight() { return &HashLeft; }");
+            instance->nestedctx.addQuotedLiteral("virtual IHash * queryHashRight() { return &HashLeft; }");
     }
 
     if (joinInfo.hasOptionalEqualities())
@@ -12208,9 +12208,9 @@ BoundRow * HqlCppTranslator::buildTransformCursors(BuildCtx & ctx, IHqlExpressio
     assertRecordTypesMatch(self->queryRecord(), transform->queryRecord());
 
     if (left)
-        ctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+        ctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
     if (right)
-        ctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        ctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
 
     // Bind left to "left" and right to RIGHT
     BoundRow * leftRow = NULL;
@@ -12336,8 +12336,8 @@ void HqlCppTranslator::buildProcessTransformFunction(BuildCtx & ctx, IHqlExpress
 
     ensureRowAllocated(funcctx, "crSelf");
     ensureRowAllocated(funcctx, "crSelfRight");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
     bindTableCursor(funcctx, right, "right", no_right, selSeq);
 
@@ -12561,7 +12561,7 @@ void HqlCppTranslator::doBuildAggregateFirstFunc(BuildCtx & ctx, IHqlExpression
     BuildCtx funcctx(ctx);
     funcctx.addQuotedCompound("virtual size32_t processFirst(ARowBuilder & crSelf, const void * _src)");
     ensureRowAllocated(funcctx, "crSelf");
-    funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+    funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
 
     //NOTE: no_throughaggregate recordof(expr) != tgtRecord => we need to create a temporary dataset
     OwnedHqlExpr resultDataset = createDataset(no_anon, LINK(tgtRecord));
@@ -12580,7 +12580,7 @@ void HqlCppTranslator::doBuildAggregateNextFunc(BuildCtx & ctx, IHqlExpression *
     BuildCtx funcctx(ctx);
     funcctx.addQuotedCompound("virtual size32_t processNext(ARowBuilder & crSelf, const void * _src)");
     //no need ensureRowAllocated(funcctx, "crSelf");
-    funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+    funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
 
     OwnedHqlExpr resultDataset = createDataset(no_anon, LINK(tgtRecord));
     BoundRow * selfRow = bindSelf(funcctx, resultDataset, "crSelf");
@@ -12724,7 +12724,7 @@ void HqlCppTranslator::doBuildAggregateMergeFunc(BuildCtx & ctx, IHqlExpression
     BuildCtx funcctx(ctx);
     funcctx.addQuotedCompound("virtual size32_t mergeAggregate(ARowBuilder & crSelf, const void * _right)");
     //ensureRowAllocated(funcctx, "crSelf"); must be non null
-    funcctx.addQuoted("unsigned char * right = (unsigned char *) _right;");
+    funcctx.addQuotedLiteral("unsigned char * right = (unsigned char *) _right;");
 
     OwnedHqlExpr resultDataset = createDataset(no_anon, LINK(tgtRecord));
     BoundRow * selfRow = bindSelf(funcctx, resultDataset, "crSelf");
@@ -13174,7 +13174,7 @@ void HqlCppTranslator::doBuildUserMergeAggregateFunc(BuildCtx & ctx, IHqlExpress
     IHqlExpression * rowsid = expr->queryAttribute(_rowsid_Atom);
     BuildCtx funcctx(ctx);
     funcctx.addQuotedCompound("virtual size32_t mergeAggregate(ARowBuilder & upRight1, const void * _right2)");
-    funcctx.addQuoted("unsigned char * right2 = (unsigned char *) _right2;");
+    funcctx.addQuotedLiteral("unsigned char * right2 = (unsigned char *) _right2;");
     BoundRow * rightCursor = bindTableCursor(funcctx, expr, "upRight1.row()", no_right, selSeq);
     BoundRow * leftCursor = bindTableCursor(funcctx, expr, "right2", no_left, selSeq);
     BoundRow * selfCursor = bindSelf(funcctx, expr, "upRight1");
@@ -13220,7 +13220,7 @@ void HqlCppTranslator::doBuildUserAggregateFuncs(BuildCtx & ctx, IHqlExpression
         BuildCtx funcctx(ctx);
         funcctx.addQuotedCompound("virtual size32_t processFirst(ARowBuilder & crSelf, const void * _src)");
         ensureRowAllocated(funcctx, "crSelf");
-        funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+        funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
 
         BoundRow * selfRow = bindSelf(funcctx, expr, "crSelf");
         bindTableCursor(funcctx, dataset, "src", options.mainRowsAreLinkCounted, no_left, selSeq);
@@ -13233,7 +13233,7 @@ void HqlCppTranslator::doBuildUserAggregateFuncs(BuildCtx & ctx, IHqlExpression
         BuildCtx funcctx(ctx);
         funcctx.addQuotedCompound("virtual size32_t processNext(ARowBuilder & crSelf, const void * _src)");
         ensureRowAllocated(funcctx, "crSelf");
-        funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+        funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
 
         BoundRow * selfCursor = bindSelf(funcctx, expr, "crSelf");
         bindTableCursor(funcctx, dataset, "src", options.mainRowsAreLinkCounted, no_left, selSeq);
@@ -13409,7 +13409,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityAggregate(BuildCtx & ctx, IHql
     {
         BuildCtx sendctx(instance->startctx);
         sendctx.addQuotedCompound("virtual void sendResult(const void * _self)");
-        sendctx.addQuoted("const unsigned char * self = (const unsigned char *)_self;");
+        sendctx.addQuotedLiteral("const unsigned char * self = (const unsigned char *)_self;");
 
         OwnedHqlExpr resultDataset = createDataset(no_anon, LINK(expr->queryChild(1)), NULL);
         bindTableCursor(sendctx, resultDataset, "self");
@@ -13625,8 +13625,8 @@ void HqlCppTranslator::buildDedupFilterFunction(BuildCtx & ctx, HqlExprArray & e
     BuildCtx funcctx(ctx);
 
     IHqlStmt * functionStmt = funcctx.addQuotedCompound("virtual bool matches(const void * _left, const void * _right)");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
 
     BuildCtx filterctx(funcctx);
 
@@ -13697,7 +13697,7 @@ void HqlCppTranslator::buildDedupSerializeFunction(BuildCtx & ctx, const char *
     s.append("virtual unsigned ").append(funcName).append("(ARowBuilder & crSelf, const void * _src)");
     r2kctx.addQuotedCompound(s);
     ensureRowAllocated(r2kctx, "crSelf");
-    r2kctx.addQuoted("const unsigned char * src = (const unsigned char *) _src;");
+    r2kctx.addQuotedLiteral("const unsigned char * src = (const unsigned char *) _src;");
 
     BoundRow * tgtCursor = bindSelf(ctx, tgtDataset, "crSelf");
     BoundRow * srcCursor = bindTableCursor(ctx, srcDataset, "src", no_left, selSeq);
@@ -13833,7 +13833,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDedup(BuildCtx & ctx, IHqlExpr
         if (!reuseCompare)
             buildCompareMember(instance->nestedctx, "KeyCompare", keyOrder, DatasetReference(keyDataset, no_activetable, NULL));
         else
-            instance->nestedctx.addQuoted("virtual ICompare * queryKeyCompare() { return &Compare; }");
+            instance->nestedctx.addQuotedLiteral("virtual ICompare * queryKeyCompare() { return &Compare; }");
 
         //virtual unsigned getFlags() = 0;
         {
@@ -13845,7 +13845,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDedup(BuildCtx & ctx, IHqlExpr
 
         //virtual IHash    * queryKeyHash()=0;
         if (reuseCompare)
-            instance->nestedctx.addQuoted("virtual IHash * queryKeyHash() { return &Hash; }");
+            instance->nestedctx.addQuotedLiteral("virtual IHash * queryKeyHash() { return &Hash; }");
         else
             buildHashOfExprsClass(instance->nestedctx, "KeyHash", keyOrder, DatasetReference(keyDataset, no_activetable, NULL), true);
 
@@ -13855,7 +13855,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDedup(BuildCtx & ctx, IHqlExpr
             doCompareLeftRight(instance->nestedctx, "RowKeyCompare", DatasetReference(dataset), DatasetReference(keyDataset, no_activetable, NULL), info.equalities, selects);
         }
         else
-            instance->nestedctx.addQuoted("virtual ICompare * queryRowKeyCompare() { return &Compare; }");
+            instance->nestedctx.addQuotedLiteral("virtual ICompare * queryRowKeyCompare() { return &Compare; }");
 
     }
 
@@ -13901,7 +13901,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityDistribute(BuildCtx & ctx, IHq
         unwindChildren(sorts, cond);
 
         OwnedHqlExpr sortOrder = createValueSafe(no_sortlist, makeSortListType(NULL), sorts);
-        instance->startctx.addQuoted("virtual ICompare * queryCompare() { return &compare; }");
+        instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
 
         DatasetReference dsRef(dataset);
         buildCompareClass(instance->nestedctx, "compare", sortOrder, dsRef);
@@ -14096,7 +14096,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityChooseSetsEx(BuildCtx & ctx, I
     //virtual unsigned getRecordCategory(const void * _self) = 0;
     BuildCtx categoryctx(instance->startctx);
     categoryctx.addQuotedCompound("virtual unsigned getCategory(const void * _self)");
-    categoryctx.addQuoted("const unsigned char * self = (const unsigned char *)_self;");
+    categoryctx.addQuotedLiteral("const unsigned char * self = (const unsigned char *)_self;");
     bindTableCursor(categoryctx, dataset, "self");
     HqlExprArray args;
     for (unsigned idx3 = 1; idx3 <= numConditions; idx3++)
@@ -14180,16 +14180,16 @@ ABoundActivity * HqlCppTranslator::doBuildActivityChooseSets(BuildCtx & ctx, IHq
 
     StringBuffer s;
     BuildCtx limitctx(instance->classctx);
-    instance->startctx.addQuoted("unsigned * counts;");
-    instance->startctx.addQuoted("unsigned numFull;");
+    instance->startctx.addQuotedLiteral("unsigned * counts;");
+    instance->startctx.addQuotedLiteral("unsigned numFull;");
     limitctx.addQuotedCompound("virtual bool setCounts(unsigned * data)");
-    limitctx.addQuoted("counts = data;");
-    limitctx.addQuoted("numFull = 0;");
+    limitctx.addQuotedLiteral("counts = data;");
+    limitctx.addQuotedLiteral("numFull = 0;");
 
     OwnedHqlExpr tally = createVariable("counts", makeIntType(4, false));
     BuildCtx validctx(instance->startctx);
     validctx.addQuotedCompound("virtual unsigned getRecordAction(const void * _self)");
-    validctx.addQuoted("const unsigned char * self = (const unsigned char *)_self;");
+    validctx.addQuotedLiteral("const unsigned char * self = (const unsigned char *)_self;");
     bindTableCursor(validctx, dataset, "self");
 
     OwnedHqlExpr one = createConstant((int)1);
@@ -14238,7 +14238,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityChooseSets(BuildCtx & ctx, IHq
 
         BuildCtx limitCondCtx(limitctx);
         buildFilter(limitCondCtx, condDone);
-        limitCondCtx.addQuoted("numFull++;");
+        limitCondCtx.addQuotedLiteral("numFull++;");
     }
     buildReturn(validctx, queryZero());
     limitctx.addQuoted(s.clear().append("return numFull == ").append(numCategories).append(";"));
@@ -14291,7 +14291,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNormalize(BuildCtx & ctx, IHql
 
     BuildCtx funcctx(instance->startctx);
     funcctx.addQuotedCompound("virtual unsigned numExpandedRows(const void * _left)");
-    funcctx.addQuoted("unsigned char * left = (unsigned char *) _left;");
+    funcctx.addQuotedLiteral("unsigned char * left = (unsigned char *) _left;");
 
     bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
     bindTableCursor(funcctx, dataset, "left");
@@ -14381,7 +14381,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNormalizeChild(BuildCtx & ctx,
         BuildCtx activityinitctx(instance->startctx);
         BuildCtx funcctx(iterclassctx);
         funcctx.addQuotedCompound("virtual void init(const void * _left)");
-        funcctx.addQuoted("const byte * left = (const byte *)_left;");
+        funcctx.addQuotedLiteral("const byte * left = (const byte *)_left;");
 
 
         CHqlBoundExpr bound;
@@ -14390,7 +14390,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNormalizeChild(BuildCtx & ctx,
             //Ugly......
             //If this is a complex expression, then ensure the temporary variable is a member of the activity class, and 
             //evaluate it in the function defined inside the activity (so the member variables don't need mangling)
-            funcctx.addQuoted("activity->init(left);");
+            funcctx.addQuotedLiteral("activity->init(left);");
 
             BuildCtx * declarectx = NULL;
             instance->evalContext->getInvariantMemberContext(NULL, &declarectx, NULL, false, true);
@@ -14513,7 +14513,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNormalizeLinkedChild(BuildCtx
     {
         BuildCtx firstctx(instance->startctx);
         firstctx.addQuotedCompound("virtual byte * first(const void * parentRecord)");
-        firstctx.addQuoted("const byte * left = (const byte *)parentRecord;");
+        firstctx.addQuotedLiteral("const byte * left = (const byte *)parentRecord;");
         bindTableCursor(firstctx, dataset, "left", selectorOp, selSeq);
 
         ExpressionFormat format = !hasLinkCountedModifier(value) ? FormatLinkedDataset : FormatNatural;
@@ -14566,7 +14566,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySelectNew(BuildCtx & ctx, IHql
 
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left)");
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
         ensureRowAllocated(funcctx, "crSelf");
         BoundRow * selfCursor = bindSelf(funcctx, expr, "crSelf");
         bindTableCursor(funcctx, anon->queryNormalizedSelector(), "left");
@@ -14620,7 +14620,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPrefetchProject(BuildCtx & ctx
     BuildCtx postctx(instance->startctx);
     postctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IEclGraphResults * results, unsigned __int64 _counter)");
     ensureRowAllocated(postctx, "crSelf");
-    postctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+    postctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
     if (expr->getOperator() == no_hqlproject)
         bindTableCursor(postctx, dataset, "left", no_left, selSeq);
     else
@@ -14647,7 +14647,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityPrefetchProject(BuildCtx & ctx
             BuildCtx prectx(instance->startctx);
             prectx.addQuotedCompound("virtual bool preTransform(rtlRowBuilder & builder, const void * _left, unsigned __int64 _counter)");
             associateSkipReturnMarker(prectx, queryBoolExpr(false), NULL);
-            prectx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+            prectx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
             if (expr->getOperator() == no_hqlproject)
                 bindTableCursor(prectx, dataset, "left", no_left, selSeq);
             else
@@ -14792,7 +14792,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityProject(BuildCtx & ctx, IHqlEx
 
     if (op == no_newusertable)
     {
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
 
         BoundRow * selfCursor = bindSelf(funcctx, expr, "crSelf");
         associateSkipReturnMarker(funcctx, queryZero(), selfCursor);
@@ -14991,7 +14991,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityFilter(BuildCtx & ctx, IHqlExp
     {
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual bool isValid(const void * _self)");
-        funcctx.addQuoted("unsigned char * self = (unsigned char *) _self;");
+        funcctx.addQuotedLiteral("unsigned char * self = (unsigned char *) _self;");
 
         bindTableCursor(funcctx, dataset, "self");
         buildReturn(funcctx, cond);
@@ -15030,8 +15030,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivityFilterGroup(BuildCtx & ctx, IH
     {
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual bool isValid(unsigned numRows, const void * * _rows)");
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _rows[0];");
-        funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _rows[0];");
+        funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
 
         bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
         bindRows(funcctx, no_left, selSeq, rowsid, dataset, "numRows", "rows", options.mainRowsAreLinkCounted);
@@ -15075,8 +15075,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivityCombine(BuildCtx & ctx, IHqlEx
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, unsigned _num, const void * * _rows)");
     if (transform->getOperator() != no_skip)
     {
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _rows[0];");
-        funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _rows[1];");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _rows[0];");
+        funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _rows[1];");
         ensureRowAllocated(funcctx, "crSelf");
 
         bindTableCursor(funcctx, left, "left", no_left, selSeq);
@@ -15146,9 +15146,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivityCombineGroup(BuildCtx & ctx, I
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, unsigned numRows, const void * * _rows)");
     if (transform->getOperator() != no_skip)
     {
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *)_left;");
-        funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _rows[0];");
-        funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *)_left;");
+        funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _rows[0];");
+        funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
         ensureRowAllocated(funcctx, "crSelf");
 
         bindTableCursor(funcctx, left, "left", no_left, selSeq);
@@ -15195,8 +15195,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivityRollupGroup(BuildCtx & ctx, IH
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, unsigned numRows, const void * * _rows)");
     if (transform->getOperator() != no_skip)
     {
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _rows[0];");
-        funcctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _rows[0];");
+        funcctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
         ensureRowAllocated(funcctx, "crSelf");
 
         bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
@@ -15240,7 +15240,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityAssert(BuildCtx & ctx, IHqlExp
 
     BuildCtx funcctx(instance->startctx);
     funcctx.addQuotedCompound("virtual bool isValid(const void * _self)");
-    funcctx.addQuoted("unsigned char * self = (unsigned char *) _self;");
+    funcctx.addQuotedLiteral("unsigned char * self = (unsigned char *) _self;");
     bindTableCursor(funcctx, dataset, "self");
 
     for (unsigned i=1; i < num; i++)
@@ -15524,7 +15524,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityEnth(BuildCtx & ctx, IHqlExpre
     if (sample && !sample->isAttribute())
         buildReturn(funcctx3, sample);
     else
-        funcctx3.addQuoted("return 1;");
+        funcctx3.addQuotedLiteral("return 1;");
 
     buildInstanceSuffix(instance);
     buildConnectInputOutput(ctx, instance, boundDataset, 0, 0);
@@ -15631,8 +15631,8 @@ void HqlCppTranslator::doBuildFuncIsSameGroup(BuildCtx & ctx, IHqlExpression * d
         buildReturn(funcctx, queryBoolExpr(false));
     else
     {
-        funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
-        funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+        funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
+        funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
 
         OwnedHqlExpr selSeq = createSelectorSequence();
         OwnedHqlExpr leftSelect = createSelector(no_left, dataset, selSeq);
@@ -16102,7 +16102,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
     StringBuffer s;
     buildInstancePrefix(instance);
 
-    instance->classctx.addQuoted("virtual ICompare * queryCompare() { return &compare; }");
+    instance->classctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
 
 //  sortlist.setown(spotScalarCSE(sortlist));
     buildCompareClass(instance->nestedctx, "compare", sortlist, DatasetReference(dataset));
@@ -16114,7 +16114,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
     {
         if (record != serializedRecord)
         {
-            instance->classctx.addQuoted("virtual ICompare * queryCompareSerializedRow() { return &compareSR; }");
+            instance->classctx.addQuotedLiteral("virtual ICompare * queryCompareSerializedRow() { return &compareSR; }");
 
             OwnedHqlExpr selSeq = createSelectorSequence();
             OwnedHqlExpr leftSelector = createSelector(no_left, dataset, selSeq);
@@ -16173,7 +16173,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
 
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual int compareBest(const void * _self)");
-        funcctx.addQuoted("unsigned char * self = (unsigned char *) _self;");
+        funcctx.addQuotedLiteral("unsigned char * self = (unsigned char *) _self;");
         bindTableCursor(funcctx, dataset, "self");
         buildReturn(funcctx, order);
     }
@@ -16201,8 +16201,8 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
         }
         else
         {
-            instance->startctx.addQuoted("virtual const char * getSortedFilename() { return NULL; }");
-            instance->classctx.addQuoted("virtual IOutputMetaData * querySortedRecordSize() { return NULL; }");
+            instance->startctx.addQuotedLiteral("virtual const char * getSortedFilename() { return NULL; }");
+            instance->classctx.addQuotedLiteral("virtual IOutputMetaData * querySortedRecordSize() { return NULL; }");
 
             ABoundActivity * masterSort = queryAssociatedActivity(ctx, cosortDataset);
             if (!masterSort)
@@ -16220,7 +16220,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySort(BuildCtx & ctx, IHqlExpre
     }
 
     if (expr->hasAttribute(manyAtom))
-        instance->classctx.addQuoted("virtual bool hasManyRecords() { return true; }");
+        instance->classctx.addQuotedLiteral("virtual bool hasManyRecords() { return true; }");
 
     IHqlExpression * stable = expr->queryAttribute(stableAtom);
     IHqlExpression * unstable = expr->queryAttribute(unstableAtom);
@@ -16386,7 +16386,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityXmlParse(BuildCtx & ctx, IHqlE
     BuildCtx funcctx(instance->startctx);
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IColumnProvider * parsed)");
     ensureRowAllocated(funcctx, "crSelf");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
 
     // Both left and the dataset are bound to left because it might be a new transform or a transform
     IHqlExpression * transform = expr->queryChild(3);
@@ -16405,7 +16405,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityXmlParse(BuildCtx & ctx, IHqlE
     buildReturnRecordSize(funcctx, selfCursor);
 
     if (xmlUsesContents)
-        instance->classctx.addQuoted("virtual bool requiresContents() { return true; }");
+        instance->classctx.addQuotedLiteral("virtual bool requiresContents() { return true; }");
 
     buildInstanceSuffix(instance);
     buildConnectInputOutput(ctx, instance, boundDataset, 0, 0);
@@ -17005,7 +17005,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySOAP(BuildCtx & ctx, IHqlExpre
         funcctx.addQuotedCompound("virtual void getLogText(size32_t & __lenResult, char * & __result, const void * _left)");
         if (dataset)
         {
-            funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+            funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
             bindTableCursor(funcctx, dataset, "left");
             bindTableCursor(funcctx, dataset, "left", no_left, selSeq);
         }
@@ -17448,12 +17448,12 @@ void HqlCppTranslator::buildWorkflow(WorkflowArray & workflow)
     BuildCtx classctx(*code, goAtom);
     classctx.addQuotedCompound("struct MyEclProcess : public EclProcess", ";");
 
-    classctx.addQuoted("virtual unsigned getActivityVersion() const { return ACTIVITY_INTERFACE_VERSION; }");
+    classctx.addQuotedLiteral("virtual unsigned getActivityVersion() const { return ACTIVITY_INTERFACE_VERSION; }");
 
     BuildCtx performctx(classctx);
     performctx.addQuotedCompound("virtual int perform(IGlobalCodeContext * gctx, unsigned wfid)");
-    performctx.addQuoted("ICodeContext * ctx;");
-    performctx.addQuoted("ctx = gctx->queryCodeContext();");
+    performctx.addQuotedLiteral("ICodeContext * ctx;");
+    performctx.addQuotedLiteral("ctx = gctx->queryCodeContext();");
 
     performctx.associateExpr(globalContextMarkerExpr, globalContextMarkerExpr);
     performctx.associateExpr(codeContextMarkerExpr, codeContextMarkerExpr);
@@ -17600,7 +17600,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivitySetResult(BuildCtx & ctx, IHql
 
         BuildCtx sendctx(instance->startctx);
         sendctx.addQuotedCompound("virtual void sendResult(const void * _self)");
-        sendctx.addQuoted("const unsigned char * self = (const unsigned char *)_self;");
+        sendctx.addQuotedLiteral("const unsigned char * self = (const unsigned char *)_self;");
 
         if (dataset->isDatarow())
         {
@@ -17705,7 +17705,7 @@ void HqlCppTranslator::doBuildDistributionNextFunc(BuildCtx & ctx, IHqlExpressio
     StringBuffer s;
     BuildCtx funcctx(ctx);
     funcctx.addQuotedCompound("virtual void process(IDistributionTable * * tables, const void * _src)");
-    funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+    funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
 
     bindTableCursor(funcctx, dataset, "src");
 

+ 1 - 3
ecl/hqlcpp/hqlhtcpp.ipp

@@ -237,12 +237,10 @@ bool isKeyableType(ITypeInfo * type);
 IHqlExpression * getFilepos(IHqlExpression * dataset, bool isLocal);
 
 
-class ReferenceSelector : public CInterface, implements IReferenceSelector
+class ReferenceSelector : public CInterfaceOf<IReferenceSelector>
 {
 public:
     ReferenceSelector(HqlCppTranslator & _translator);
-    IMPLEMENT_IINTERFACE
-
 
 protected:
     HqlCppTranslator &      translator;

+ 2 - 2
ecl/hqlcpp/hqlinline.cpp

@@ -1898,9 +1898,9 @@ void NestedEvalContext::ensureHelpersExist()
         BuildCtx oncreatectx(onCreate.declarectx);
         IHqlStmt * onCreateStmt  = oncreatectx.addQuotedCompound(s.clear().append("inline void onCreate(ICodeContext * _ctx, ").append(rootActivity->className).append(" * _activity)"));
         oncreatectx.addQuoted(s.clear().append("activity = _activity;"));
-        oncreatectx.addQuoted("ctx = _ctx;");
+        oncreatectx.addQuotedLiteral("ctx = _ctx;");
 
-        onCreate.declarectx.addQuoted("ICodeContext * ctx;");
+        onCreate.declarectx.addQuotedLiteral("ICodeContext * ctx;");
         onCreate.declarectx.addQuoted(s.clear().append(rootActivity->className).append(" * activity;"));
         onCreate.declarectx.associateExpr(codeContextMarkerExpr, codeContextMarkerExpr);
 

+ 15 - 15
ecl/hqlcpp/hqliter.cpp

@@ -222,7 +222,7 @@ void CompoundIteratorBuilder::buildCompoundIterator(BuildCtx & initctx, HqlExprA
 {
     StringBuffer s;
 
-    declarectx.addQuoted("RtlCompoundIterator iter;");
+    declarectx.addQuotedLiteral("RtlCompoundIterator iter;");
     initctx.addQuoted(s.clear().append("iter.init(").append(iterators.ordinality()).append(");"));
 
     ForEachItemIn(i, iterators)
@@ -267,13 +267,13 @@ void CompoundIteratorBuilder::createSingleIterator(StringBuffer & iterName, IHql
 
     if (isArrayRowset(expr->queryType()))
     {
-        classctx.addQuoted("byte * * end;");
-        classctx.addQuoted("byte * * cur;");
+        classctx.addQuotedLiteral("byte * * end;");
+        classctx.addQuotedLiteral("byte * * cur;");
     }
     else
     {
-        classctx.addQuoted("byte * end;");
-        classctx.addQuoted("byte * cur;");
+        classctx.addQuotedLiteral("byte * end;");
+        classctx.addQuotedLiteral("byte * cur;");
     }
 
     IHqlExpression * root = queryRoot(expr);
@@ -314,16 +314,16 @@ void CompoundIteratorBuilder::createSingleIterator(StringBuffer & iterName, IHql
 
         BuildCtx firstctx(classctx);
         firstctx.addQuotedCompound("virtual const byte * first()");
-        firstctx.addQuoted("if (!rawFirst()) return NULL;");
+        firstctx.addQuotedLiteral("if (!rawFirst()) return NULL;");
         firstctx.addQuotedCompound("for (;;)");
-        firstctx.addQuoted("const byte * valid = checkValid(); if (valid) return valid;");
-        firstctx.addQuoted("if (!rawNext()) return NULL;");
+        firstctx.addQuotedLiteral("const byte * valid = checkValid(); if (valid) return valid;");
+        firstctx.addQuotedLiteral("if (!rawNext()) return NULL;");
 
         BuildCtx nextctx(classctx);
         nextctx.addQuotedCompound("virtual const byte * next()");
         nextctx.addQuotedCompound("for (;;)");
-        nextctx.addQuoted("if (!rawNext()) return NULL;");
-        nextctx.addQuoted("const byte * valid = checkValid(); if (valid) return valid;");
+        nextctx.addQuotedLiteral("if (!rawNext()) return NULL;");
+        nextctx.addQuotedLiteral("const byte * valid = checkValid(); if (valid) return valid;");
     }
 
     translator.endNestedClass();
@@ -348,7 +348,7 @@ void CompoundIteratorBuilder::createRawFirstFunc(BuildCtx & ctx, IHqlExpression
         s.clear().append("end = cur+");
         translator.generateExprCpp(s, count).append(";");
         ctx.addQuoted(s);
-        ctx.addQuoted("return (cur < end) ? *cur : NULL;");
+        ctx.addQuotedLiteral("return (cur < end) ? *cur : NULL;");
     }
     else
     {
@@ -362,7 +362,7 @@ void CompoundIteratorBuilder::createRawFirstFunc(BuildCtx & ctx, IHqlExpression
         s.clear().append("end = cur+");
         translator.generateExprCpp(s, length).append(";");
         ctx.addQuoted(s);
-        ctx.addQuoted("return (cur < end) ? cur : NULL;");
+        ctx.addQuotedLiteral("return (cur < end) ? cur : NULL;");
     }
 }
 
@@ -370,8 +370,8 @@ void CompoundIteratorBuilder::createRawNextFunc(BuildCtx & ctx, IHqlExpression *
 {
     if (isArrayRowset(expr->queryType()))
     {
-        ctx.addQuoted("cur++;");
-        ctx.addQuoted("return (cur < end) ? *cur : NULL;");
+        ctx.addQuotedLiteral("cur++;");
+        ctx.addQuotedLiteral("return (cur < end) ? *cur : NULL;");
     }
     else
     {
@@ -385,7 +385,7 @@ void CompoundIteratorBuilder::createRawNextFunc(BuildCtx & ctx, IHqlExpression *
         s.clear().append("cur+=");
         translator.generateExprCpp(s, bound.expr).append(";");
         ctx.addQuoted(s);
-        ctx.addQuoted("return (cur < end) ? cur : NULL;");
+        ctx.addQuotedLiteral("return (cur < end) ? cur : NULL;");
     }
 }
 

+ 8 - 8
ecl/hqlcpp/hqlnlp.cpp

@@ -270,7 +270,7 @@ void NlpParseContext::buildValidators(HqlCppTranslator & translator, BuildCtx &
         funcctx.addReturn(queryQuotedNullExpr());
 
         translator.endNestedClass();
-        classctx.addQuoted("virtual INlpHelper * queryHelper() { return &helper; }");
+        classctx.addQuotedLiteral("virtual INlpHelper * queryHelper() { return &helper; }");
     }
 }
 
@@ -298,7 +298,7 @@ void NlpParseContext::buildProductions(HqlCppTranslator & translator, BuildCtx &
             s.append(": return &").append(meta.queryInstanceObject()).append(";");
             metacasectx.addQuoted(s);
         }
-        metactx.addQuoted("return 0;");
+        metactx.addQuotedLiteral("return 0;");
     }
 
     {
@@ -337,7 +337,7 @@ void NlpParseContext::buildProductions(HqlCppTranslator & translator, BuildCtx &
                 translator.buildTransformBody(childctx, newTransform, NULL, NULL, dataset, NULL);
             }
         }
-        prodctx.addQuoted("return (size32_t)-1;");
+        prodctx.addQuotedLiteral("return (size32_t)-1;");
     }
 }
 
@@ -513,7 +513,7 @@ void HqlCppTranslator::doBuildParseTransform(BuildCtx & classctx, IHqlExpression
 
     funcctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IMatchedResults * matched, IMatchWalker * walker)");
     ensureRowAllocated(funcctx, "crSelf");
-    funcctx.addQuoted("const unsigned char * left = (const unsigned char *) _left;");
+    funcctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _left;");
     funcctx.associateExpr(activeNlpMarkerExpr, activeNlpMarkerExpr);
     bindTableCursor(funcctx, queryNlpParsePseudoTable(), queryNlpParsePseudoTable());
 
@@ -540,11 +540,11 @@ void HqlCppTranslator::doBuildParseSearchText(BuildCtx & classctx, IHqlExpressio
     if (searchTypeCode == type_unicode)
     {
         funcctx.addQuotedCompound("virtual void getSearchText(size32_t & retLen, char * & _retText, const void * _self)");
-        funcctx.addQuoted("UChar * & retText = *(UChar * *)&_retText;");        // don't ask.
+        funcctx.addQuotedLiteral("UChar * & retText = *(UChar * *)&_retText;");        // don't ask.
     }
     else
         funcctx.addQuotedCompound("virtual void getSearchText(size32_t & retLen, char * & retText, const void * _self)");
-    funcctx.addQuoted("const unsigned char * self = (const unsigned char *) _self;");
+    funcctx.addQuotedLiteral("const unsigned char * self = (const unsigned char *) _self;");
     bindTableCursor(funcctx, dataset, "self");
 
     bool needToFree = true;
@@ -739,11 +739,11 @@ ABoundActivity * HqlCppTranslator::doBuildActivityParse(BuildCtx & ctx, IHqlExpr
     if (options.debugNlp != 0)
     {
         BuildCtx subctx(instance->classctx);
-        subctx.addQuoted("#if 0\nHuman readable form of the grammar");
+        subctx.addQuotedLiteral("#if 0\nHuman readable form of the grammar");
         StringBuffer s;
         nlpParse->getDebugText(s, options.debugNlp);
         subctx.addQuoted(s);
-        subctx.addQuoted("#endif");
+        subctx.addQuotedLiteral("#endif");
 
         if (options.debugNlpAsHint)
         {

+ 44 - 44
ecl/hqlcpp/hqlsource.cpp

@@ -637,7 +637,7 @@ public:
                 BuildCtx transformctx(ctx);
                 transformctx.addQuotedCompound("virtual void mapOutputToInput(ARowBuilder & crSelf, const void * _projected, unsigned numFields)");
                 translator.ensureRowAllocated(transformctx, "crSelf");
-                transformctx.addQuoted("const byte * pr = (const byte *)_projected;");
+                transformctx.addQuotedLiteral("const byte * pr = (const byte *)_projected;");
 
                 translator.bindTableCursor(transformctx, rawStepping.ds, "crSelf.row()");
                 translator.bindTableCursor(transformctx, outputStepping.ds, "pr");
@@ -1653,14 +1653,14 @@ void SourceBuilder::doBuildNormalizeIterators(BuildCtx & ctx, IHqlExpression * e
         bool isProjected = (root->queryNormalizedSelector() != tableExpr->queryNormalizedSelector());
         if (!isProjected)
         {
-            iterctx.addQuoted("byte * src;");
+            iterctx.addQuotedLiteral("byte * src;");
             associateFilePositions(iterctx, "activity->fpp", "activity->src");      // in case no projection in first()
             translator.associateBlobHelper(iterctx, tableExpr, "fpp");
-            firstctx.addQuoted("src = (byte *)_src;");
+            firstctx.addQuotedLiteral("src = (byte *)_src;");
         }
         else
         {
-            firstctx.addQuoted("byte * src = (byte *)_src;");
+            firstctx.addQuotedLiteral("byte * src = (byte *)_src;");
         }
 
         translator.associateBlobHelper(firstctx, tableExpr, "fpp");
@@ -1695,11 +1695,11 @@ void SourceBuilder::doBuildNormalizeIterators(BuildCtx & ctx, IHqlExpression * e
     {
         iterBuilder.buildCompoundIterator(instance->onlyEvalOnceContext(), iterators, cursors);
 
-        firstctx.addQuoted("return iter.first();");
+        firstctx.addQuotedLiteral("return iter.first();");
 
         BuildCtx nextctx(instance->startctx);
         nextctx.addQuotedCompound("virtual bool next()");
-        nextctx.addQuoted("return iter.next();");
+        nextctx.addQuotedLiteral("return iter.next();");
     }
 
     ForEachItemIn(i, cursors)
@@ -2087,7 +2087,7 @@ void SourceBuilder::assignLocalExtract(BuildCtx & ctx, ParentExtract * extractBu
 
 void SourceBuilder::buildGroupAggregateHashHelper(ParentExtract * extractBuilder, IHqlExpression * dataset, IHqlExpression * fields)
 {
-    instance->classctx.addQuoted("virtual IHash * queryHash() { return &hash; }");
+    instance->classctx.addQuotedLiteral("virtual IHash * queryHash() { return &hash; }");
 
     BuildCtx classctx(instance->nestedctx);
     translator.beginNestedClass(classctx, "hash", "IHash", NULL, extractBuilder);
@@ -2150,7 +2150,7 @@ void SourceBuilder::buildGroupAggregateCompareHelper(ParentExtract * extractBuil
     OwnedHqlExpr order = createValue(no_order, makeIntType(sizeof(signed), true), LINK(leftList), LINK(rightResolved));
 
     //Now generate the nested class
-    instance->classctx.addQuoted("virtual ICompare * queryCompareRowElement() { return &compareRowElement; }");
+    instance->classctx.addQuotedLiteral("virtual ICompare * queryCompareRowElement() { return &compareRowElement; }");
 
     BuildCtx classctx(instance->nestedctx);
     translator.beginNestedClass(classctx, "compareRowElement", "ICompare", NULL, extractBuilder);
@@ -2158,7 +2158,7 @@ void SourceBuilder::buildGroupAggregateCompareHelper(ParentExtract * extractBuil
     BuildCtx funcctx(classctx);
     funcctx.addQuotedCompound("virtual int docompare(const void * _left, const void * _right) const");
     assignLocalExtract(funcctx, extractBuilder, aggregate->queryChild(0), "_left");
-    funcctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    funcctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     funcctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
 
     translator.bindTableCursor(funcctx, aggregate, "right", no_right, selSeq);
@@ -2285,12 +2285,12 @@ void SourceBuilder::buildGlobalGroupAggregateHelpers(IHqlExpression * expr)
     //virtual void processRow(void * self, const void * src) = 0;
     BuildCtx rowctx(instance->startctx);
     rowctx.addQuotedCompound("virtual void processRow(const void * src, IHThorGroupAggregateCallback * callback)");
-    rowctx.addQuoted("doProcessRow((byte *)src, callback);");
+    rowctx.addQuotedLiteral("doProcessRow((byte *)src, callback);");
 
     //virtual void processRows(void * self, size32_t srcLen, const void * src) = 0;
     BuildCtx rowsctx(instance->startctx);
     rowsctx.addQuotedCompound("virtual void processRows(size32_t srcLen, const void * _left, IHThorGroupAggregateCallback * callback)");
-    rowsctx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+    rowsctx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
     OwnedHqlExpr ds = createVariable("left", makeReferenceModifier(tableExpr->getType()));
     OwnedHqlExpr len = createVariable("srcLen", LINK(sizetType));
     OwnedHqlExpr fullDs = createTranslated(ds, len);
@@ -2383,12 +2383,12 @@ void SourceBuilder::buildCountHelpers(IHqlExpression * expr, bool allowMultiple)
             //virtual size32_t numValid(const void * src) = 0;
             BuildCtx rowctx(instance->startctx);
             rowctx.addQuotedCompound("virtual size32_t numValid(const void * src)");
-            rowctx.addQuoted("return valid((byte *)src);");
+            rowctx.addQuotedLiteral("return valid((byte *)src);");
 
             //virtual size32_t numValid(size32_t srcLen, const void * src);
             BuildCtx rowsctx(instance->startctx);
             rowsctx.addQuotedCompound("virtual size32_t numValid(size32_t srcLen, const void * _src)");
-            rowsctx.addQuoted("unsigned char * src = (unsigned char *)_src;");
+            rowsctx.addQuotedLiteral("unsigned char * src = (unsigned char *)_src;");
             OwnedHqlExpr ds = createVariable("src", makeReferenceModifier(tableExpr->getType()));
             OwnedHqlExpr len = createVariable("srcLen", LINK(sizetType));
             OwnedHqlExpr fullDs = createTranslated(ds, len);
@@ -2402,18 +2402,18 @@ void SourceBuilder::buildCountHelpers(IHqlExpression * expr, bool allowMultiple)
                 s.append("))");
                 iterctx.addQuotedCompound(s);
                 iterctx.addReturn(one);
-                rowsctx.addQuoted("return 0;");
+                rowsctx.addQuotedLiteral("return 0;");
             }
             else
             {
-                rowsctx.addQuoted("size32_t cnt = 0;");
+                rowsctx.addQuotedLiteral("size32_t cnt = 0;");
                 BuildCtx iterctx(rowsctx);
                 BoundRow * curRow = translator.buildDatasetIterate(iterctx, fullDs, false);
                 s.clear().append("cnt += valid(");
                 translator.generateExprCpp(s, curRow->queryBound());
                 s.append(");");
                 iterctx.addQuoted(s);
-                rowsctx.addQuoted("return cnt;");
+                rowsctx.addQuotedLiteral("return cnt;");
             }
         }
         else
@@ -2425,7 +2425,7 @@ void SourceBuilder::buildCountHelpers(IHqlExpression * expr, bool allowMultiple)
                 rowsctx.addReturn(one);
             else
             {
-                rowsctx.addQuoted("unsigned char * src = (unsigned char *)_src;");
+                rowsctx.addQuotedLiteral("unsigned char * src = (unsigned char *)_src;");
                 CHqlBoundExpr bound;
                 bound.length.setown(createVariable("srcLen", LINK(sizetType)));
                 bound.expr.setown(createVariable("src", makeReferenceModifier(tableExpr->getType())));
@@ -2862,7 +2862,7 @@ void DiskReadBuilder::buildTransform(IHqlExpression * expr)
     else
         transformCtx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, IFilePositionProvider * fpp)");
     translator.ensureRowAllocated(transformCtx, "crSelf");
-    transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+    transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
     buildTransformBody(transformCtx, expr, true, false);
 }
 
@@ -3023,12 +3023,12 @@ void DiskAggregateBuilder::buildMembers(IHqlExpression * expr)
     //virtual void processRow(void * self, const void * src) = 0;
     BuildCtx rowctx(instance->startctx);
     rowctx.addQuotedCompound("virtual void processRow(ARowBuilder & crSelf, const void * src)");
-    rowctx.addQuoted("doProcessRow(crSelf, (byte *)src);");
+    rowctx.addQuotedLiteral("doProcessRow(crSelf, (byte *)src);");
 
     //virtual void processRows(void * self, size32_t srcLen, const void * src) = 0;
     BuildCtx rowsctx(instance->startctx);
     rowsctx.addQuotedCompound("virtual void processRows(ARowBuilder & crSelf, size32_t srcLen, const void * _left)");
-    rowsctx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+    rowsctx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
     OwnedHqlExpr ds = createVariable("left", makeReferenceModifier(tableExpr->getType()));
     OwnedHqlExpr len = createVariable("srcLen", LINK(sizetType));
     OwnedHqlExpr fullDs = createTranslated(ds, len);
@@ -3101,7 +3101,7 @@ void DiskCountBuilder::buildTransform(IHqlExpression * expr)
     {
         BuildCtx transformCtx(instance->startctx);
         transformCtx.addQuotedCompound("size32_t valid(byte * _left)");
-        transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+        transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
         OwnedHqlExpr cnt;
         if (isNormalize)
         {
@@ -3388,7 +3388,7 @@ void ChildGroupAggregateBuilder::buildMembers(IHqlExpression * expr)
     translator.doBuildAggregateClearFunc(instance->startctx, aggregate);
 
     //virtual size32_t mergeAggregate(ARowBuilder & crSelf, const void * src) - never actually called.
-    instance->startctx.addQuoted("virtual size32_t mergeAggregate(ARowBuilder & crSelf, const void * src) { return 0; }");
+    instance->startctx.addQuotedLiteral("virtual size32_t mergeAggregate(ARowBuilder & crSelf, const void * src) { return 0; }");
 }
 
 void ChildGroupAggregateBuilder::buildTransform(IHqlExpression * expr)
@@ -4442,12 +4442,12 @@ void MonitorExtractor::generateOffsetWrapping(StringBuffer & createMonitorText,
     s.clear().append("struct ").append(className).append(" : public RtlCInterface, public IKeySegmentOffsetTranslator");
     suffix.append(instanceName).append(";");
     classctx.addQuotedCompound(s, suffix);
-    classctx.addQuoted("virtual void Link() const { RtlCInterface::Link(); }");
-    classctx.addQuoted("virtual bool Release() const { return RtlCInterface::Release(); }");
+    classctx.addQuotedLiteral("virtual void Link() const { RtlCInterface::Link(); }");
+    classctx.addQuotedLiteral("virtual bool Release() const { return RtlCInterface::Release(); }");
     classctx.addQuoted(s.clear().append("virtual const char * queryFactoryName() const { return \"").append(factoryName).append("\"; }"));
 
     classctx.addQuotedCompound("virtual const void * getSegmentBase(const void * _row) const");
-    classctx.addQuoted("const byte * row = (const byte *)_row;");
+    classctx.addQuotedLiteral("const byte * row = (const byte *)_row;");
     classctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
     translator.bindTableCursor(classctx, tableExpr, "row");
     CHqlBoundExpr bound;
@@ -4487,14 +4487,14 @@ void MonitorExtractor::generateFormatWrapping(StringBuffer & createMonitorText,
     s.clear().append("struct ").append(className).append(" : public RtlCInterface, public IKeySegmentFormatTranslator");
     suffix.append(instanceName).append(";");
     classctx.addQuotedCompound(s, suffix);
-    classctx.addQuoted("virtual void Link() const { RtlCInterface::Link(); }");
-    classctx.addQuoted("virtual bool Release() const { return RtlCInterface::Release(); }");
+    classctx.addQuotedLiteral("virtual void Link() const { RtlCInterface::Link(); }");
+    classctx.addQuotedLiteral("virtual bool Release() const { return RtlCInterface::Release(); }");
     classctx.addQuoted(s.clear().append("virtual const char * queryFactoryName() const { return \"").append(factoryName).append("\"; }"));
     classctx.addQuoted(s.clear().append("virtual unsigned queryHashCode() const { return ").append(getExpressionCRC(selector)).append("; }"));
     classctx.addQuotedCompound("virtual void extractField(void * _target, const void * _row) const");
     classctx.associateExpr(constantMemberMarkerExpr, constantMemberMarkerExpr);
-    classctx.addQuoted("const byte * row = (const byte *)_row;");
-    classctx.addQuoted("byte * target = (byte *)_target;");
+    classctx.addQuotedLiteral("const byte * row = (const byte *)_row;");
+    classctx.addQuotedLiteral("byte * target = (byte *)_target;");
 
     OwnedHqlExpr castValue = ensureExprType(selector, expandedSelector->queryType());
     LinkedHqlExpr targetField = expandedSelector->queryChild(1);
@@ -6375,7 +6375,7 @@ void NewIndexReadBuilder::buildTransform(IHqlExpression * expr)
         BuildCtx transformCtx(instance->startctx);
         transformCtx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left)");
         translator.ensureRowAllocated(transformCtx, "crSelf");
-        transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+        transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
         translator.associateBlobHelper(transformCtx, tableExpr, "fpp");
         buildTransformBody(transformCtx, expr, true, false);
     }
@@ -6385,7 +6385,7 @@ void NewIndexReadBuilder::buildTransform(IHqlExpression * expr)
         BuildCtx transformCtx(instance->startctx);
         transformCtx.addQuotedCompound("virtual size32_t unfilteredTransform(ARowBuilder & crSelf, const void * _left)");
         translator.ensureRowAllocated(transformCtx, "crSelf");
-        transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+        transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
         translator.associateBlobHelper(transformCtx, tableExpr, "fpp");
         buildTransformBody(transformCtx, expr, true, true);
     }
@@ -6524,12 +6524,12 @@ void IndexAggregateBuilder::buildMembers(IHqlExpression * expr)
     //virtual void processRow(void * self, const void * src) = 0;
     BuildCtx rowctx(instance->startctx);
     rowctx.addQuotedCompound("virtual void processRow(ARowBuilder & crSelf, const void * src)");
-    rowctx.addQuoted("doProcessRow(crSelf, (byte *)src);");
+    rowctx.addQuotedLiteral("doProcessRow(crSelf, (byte *)src);");
 
     //virtual void processRows(void * self, size32_t srcLen, const void * src) = 0;
     BuildCtx rowsctx(instance->startctx);
     rowsctx.addQuotedCompound("virtual void processRows(ARowBuilder & crSelf, size32_t srcLen, const void * _left)");
-    rowsctx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+    rowsctx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
     OwnedHqlExpr ds = createVariable("left", makeReferenceModifier(tableExpr->getType()));
     OwnedHqlExpr len = createVariable("srcLen", LINK(sizetType));
     OwnedHqlExpr fullDs = createTranslated(ds, len);
@@ -6618,7 +6618,7 @@ void IndexCountBuilder::buildTransform(IHqlExpression * expr)
     {
         BuildCtx transformCtx(instance->startctx);
         transformCtx.addQuotedCompound("virtual size32_t numValid(const void * _left)");
-        transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
+        transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
         translator.associateBlobHelper(transformCtx, tableExpr, "fpp");
         OwnedHqlExpr cnt;
         if (isNormalize)
@@ -6736,7 +6736,7 @@ void IndexGroupAggregateBuilder::doBuildProcessCountMembers(BuildCtx & ctx, IHql
         BuildCtx funcctx(ctx);
         funcctx.addQuotedCompound("virtual size32_t initialiseCountGrouping(ARowBuilder & crSelf, const void * _src)");
         translator.ensureRowAllocated(funcctx, "crSelf");
-        funcctx.addQuoted("unsigned char * src = (unsigned char *) _src;");
+        funcctx.addQuotedLiteral("unsigned char * src = (unsigned char *) _src;");
         translator.associateBlobHelper(funcctx, tableExpr, "fpp");
         BoundRow * selfCursor = translator.bindSelf(funcctx, resultDataset, "crSelf");
         translator.bindTableCursor(funcctx, dataset, "src");
@@ -6956,8 +6956,8 @@ void HqlCppTranslator::buildCsvReadTransformer(IHqlExpression * dataset, StringB
     transformClass->setIncomplete(true);
     transformClass->setIncluded(false);         // if can't generate csv for this record, then don't generate an invalid class.
 
-    classctx.addQuoted("virtual void Link() const { RtlCInterface::Link(); }");
-    classctx.addQuoted("virtual bool Release() const { return RtlCInterface::Release(); }");
+    classctx.addQuotedLiteral("virtual void Link() const { RtlCInterface::Link(); }");
+    classctx.addQuotedLiteral("virtual bool Release() const { return RtlCInterface::Release(); }");
 
     unsigned maxColumns = buildCsvReadTransform(classctx, dataset, false, optCsvAttr);
     doBuildUnsignedFunction(classctx, "getMaxColumns", maxColumns);
@@ -7091,7 +7091,7 @@ void FetchBuilder::buildMembers(IHqlExpression * expr)
     IHqlExpression * fetch = queryFetch(expr);
     BuildCtx getposctx(instance->startctx);
     getposctx.addQuotedCompound("virtual unsigned __int64 extractPosition(const void * _right)");
-    getposctx.addQuoted("const unsigned char * right = (const unsigned char *) _right;");
+    getposctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _right;");
     translator.bindTableCursor(getposctx, fetch->queryChild(1), "right", no_right, selSeq);
     translator.buildReturn(getposctx, fetch->queryChild(2));
     
@@ -7139,7 +7139,7 @@ void FetchBuilder::buildMembers(IHqlExpression * expr)
     if (!containsOnlyLeft(fetch->queryChild(3), true))
     {
         //MORE: Need to change following if we optimize it to only extract the relevant fields.
-        instance->classctx.addQuoted("virtual bool extractAllJoinFields() { return true; }");
+        instance->classctx.addQuotedLiteral("virtual bool extractAllJoinFields() { return true; }");
 
         BuildCtx funcctx(instance->startctx);
         funcctx.addQuotedCompound("virtual size32_t extractJoinFields(ARowBuilder & crSelf, const void * _left)");
@@ -7163,16 +7163,16 @@ void FetchBuilder::buildTransform(IHqlExpression * expr)
     {
     case no_csv:
         transformCtx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, unsigned * lenLeft, const char * * dataLeft, const void * _right, unsigned __int64 _fpos)");
-        transformCtx.addQuoted("unsigned char * right = (unsigned char *)_right;");
+        transformCtx.addQuotedLiteral("unsigned char * right = (unsigned char *)_right;");
         break;
     case no_xml:
         transformCtx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, IColumnProvider * xmlLeft, const void * _right, unsigned __int64 _fpos)");
-        transformCtx.addQuoted("unsigned char * right = (unsigned char *)_right;");
+        transformCtx.addQuotedLiteral("unsigned char * right = (unsigned char *)_right;");
         break;
     default:
         transformCtx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, const void * _left, const void * _right, unsigned __int64 _fpos)");
-        transformCtx.addQuoted("unsigned char * left = (unsigned char *)_left;");
-        transformCtx.addQuoted("unsigned char * right = (unsigned char *)_right;");
+        transformCtx.addQuotedLiteral("unsigned char * left = (unsigned char *)_left;");
+        transformCtx.addQuotedLiteral("unsigned char * right = (unsigned char *)_right;");
         break;
     }
 
@@ -7180,7 +7180,7 @@ void FetchBuilder::buildTransform(IHqlExpression * expr)
     buildTransformBody(transformCtx, expr, true, false);
 
     if (translator.xmlUsesContents)
-        instance->classctx.addQuoted("virtual bool requiresContents() { return true; }");
+        instance->classctx.addQuotedLiteral("virtual bool requiresContents() { return true; }");
 }
 
 

+ 15 - 15
ecl/hqlcpp/hqlstep.cpp

@@ -556,9 +556,9 @@ IHqlExpression * SteppingFieldSelection::generateSteppingMeta(HqlCppTranslator &
         translator.doBuildUnsignedFunction(comparectx, "maxFields", lenOffsets/2);
 
         comparectx.addQuotedCompound("virtual int docompare(const void * _left,const void * _right, unsigned numFields) const");
-        comparectx.addQuoted("const byte * left = (const byte *)_left;");
-        comparectx.addQuoted("const byte * right = (const byte *)_right;");
-        comparectx.addQuoted("int ret;");
+        comparectx.addQuotedLiteral("const byte * left = (const byte *)_left;");
+        comparectx.addQuotedLiteral("const byte * right = (const byte *)_right;");
+        comparectx.addQuotedLiteral("int ret;");
 
         comparectx.addQuoted(s.clear().append("if (numFields < 1) return 0;"));
         OwnedHqlExpr selSeq = createDummySelectorSequence();
@@ -589,8 +589,8 @@ IHqlExpression * SteppingFieldSelection::generateSteppingMeta(HqlCppTranslator &
         BuildCtx distancectx(classctx);
         distancectx.addQuotedCompound("class Distance : public IDistanceCalculator", s2.clear().append(" ").append(distanceName).append(";"));
         distancectx.addQuotedCompound("virtual unsigned getDistance(unsigned __int64 & distance, const void * _before, const void * _after, unsigned numFields) const");
-        distancectx.addQuoted("const byte * before = (const byte *)_before;");
-        distancectx.addQuoted("const byte * after = (const byte *)_after;");
+        distancectx.addQuotedLiteral("const byte * before = (const byte *)_before;");
+        distancectx.addQuotedLiteral("const byte * after = (const byte *)_after;");
 
         OwnedHqlExpr selSeq = createDummySelectorSequence();
         OwnedITypeInfo distanceType = makeIntType(8, false);
@@ -616,7 +616,7 @@ IHqlExpression * SteppingFieldSelection::generateSteppingMeta(HqlCppTranslator &
             subctx.addQuotedF("return %u;", i+1);
         }
             
-        distancectx.addQuoted("return DISTANCE_EXACT_MATCH;");
+        distancectx.addQuotedLiteral("return DISTANCE_EXACT_MATCH;");
     
         classctx.addQuoted(s.clear().append("virtual IDistanceCalculator * queryDistance() { return &").append(distanceName).append("; }"));
     }
@@ -822,7 +822,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMerge(BuildCtx & ctx, IHql
     buildInstancePrefix(instance);
 
     IHqlExpression * sortOrder = expr->queryChild(1);
-    instance->startctx.addQuoted("virtual ICompare * queryCompare() { return &compare; }");
+    instance->startctx.addQuotedLiteral("virtual ICompare * queryCompare() { return &compare; }");
 
     //NOTE: left is used instead of dataset in sort list
     DatasetReference dsRef(dataset, no_left, querySelSeq(expr));        
@@ -918,7 +918,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
     //virtual ICompare * queryEqualCompare()
     {
         buildCompareClass(instance->nestedctx, "equalCompare", equalityList, leftRef);
-        instance->classctx.addQuoted("virtual ICompare * queryEqualCompare() { return &equalCompare; }");
+        instance->classctx.addQuotedLiteral("virtual ICompare * queryEqualCompare() { return &equalCompare; }");
     }
 
     //virtual ICompareEq * queryExactCompare()
@@ -957,7 +957,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
     //virtual ICompare * queryMergeCompare()
     {
         buildCompareClass(instance->nestedctx, "mergeCompare", sortOrder, leftRef);
-        instance->classctx.addQuoted("virtual ICompare * queryMergeCompare() { return &mergeCompare; }");
+        instance->classctx.addQuotedLiteral("virtual ICompare * queryMergeCompare() { return &mergeCompare; }");
     }
 
     if (createClearRow)
@@ -988,7 +988,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
         {
             BuildCtx extractCtx(instance->startctx);
             extractCtx.addQuotedCompound("unsigned __int64 extractRangeValue(const void * _left)");
-            extractCtx.addQuoted("const byte * left = (const byte *)_left;");
+            extractCtx.addQuotedLiteral("const byte * left = (const byte *)_left;");
             bindTableCursor(extractCtx, dataset, "left", no_left, selSeq);
             buildReturn(extractCtx, rangeValue);
         }
@@ -998,7 +998,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
             BuildCtx adjustCtx(instance->startctx);
             adjustCtx.addQuotedCompound("void adjustRangeValue(ARowBuilder & crSelf, const void * _left, __int64 delta)");
             ensureRowAllocated(adjustCtx, "crSelf");
-            adjustCtx.addQuoted("const byte * left = (const byte *)_left;");
+            adjustCtx.addQuotedLiteral("const byte * left = (const byte *)_left;");
 
             BoundRow * self = bindSelf(adjustCtx, dataset, "crSelf");
             bindTableCursor(adjustCtx, dataset, "left", no_left, selSeq);
@@ -1056,9 +1056,9 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
         BuildCtx transformctx(instance->startctx);
         transformctx.addQuotedCompound("virtual size32_t transform(ARowBuilder & crSelf, unsigned numRows, const void * * _rows)");
         ensureRowAllocated(transformctx, "crSelf");
-        transformctx.addQuoted("const unsigned char * left = (const unsigned char *) _rows[0];");
-        transformctx.addQuoted("const unsigned char * right = (const unsigned char *) _rows[1];");
-        transformctx.addQuoted("unsigned char * * rows = (unsigned char * *) _rows;");
+        transformctx.addQuotedLiteral("const unsigned char * left = (const unsigned char *) _rows[0];");
+        transformctx.addQuotedLiteral("const unsigned char * right = (const unsigned char *) _rows[1];");
+        transformctx.addQuotedLiteral("unsigned char * * rows = (unsigned char * *) _rows;");
 
         bindTableCursor(transformctx, dataset, "left", no_left, selSeq);
         bindTableCursor(transformctx, dataset, "right", no_right, selSeq);
@@ -1086,7 +1086,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityNWayMergeJoin(BuildCtx & ctx,
             BuildCtx transformctx(instance->startctx);
             transformctx.addQuotedCompound("virtual bool createNextJoinValue(ARowBuilder & crSelf, const void * _value)");
             ensureRowAllocated(transformctx, "crSelf");
-            transformctx.addQuoted("const byte * value = (const byte *)_value;");
+            transformctx.addQuotedLiteral("const byte * value = (const byte *)_value;");
 
             BoundRow * self = bindSelf(transformctx, dataset, "crSelf");
             bindTableCursor(transformctx, dataset, "value", no_left, selSeq);

+ 30 - 0
ecl/hqlcpp/hqlstmt.cpp

@@ -400,6 +400,15 @@ IHqlStmt * BuildCtx::addQuoted(const char * text)
 }
 
 
+IHqlStmt * BuildCtx::addQuotedLiteral(const char * text)
+{
+    if (ignoreInput)
+        return NULL;
+    HqlStmt * next = new HqlQuoteLiteralStmt(quote_stmt, curStmts, text);
+    return appendSimple(next);
+}
+
+
 IHqlStmt * BuildCtx::addQuotedF(const char * format, ...)
 {
     if (ignoreInput)
@@ -1189,6 +1198,12 @@ StringBuffer & HqlQuoteStmt::getTextExtra(StringBuffer & out) const
 }
 
 
+StringBuffer & HqlQuoteLiteralStmt::getTextExtra(StringBuffer & out) const
+{
+    return out.append(text);
+}
+
+
 //---------------------------------------------------------------------------
 int queryMemsetChar(IHqlExpression * expr)
 {
@@ -1962,3 +1977,18 @@ unsigned calcTotalChildren(const IHqlStmt * stmt)
         return 0;
     return doCalcTotalChildren(stmt);
 }
+
+
+#include "hqltcppc.hpp"
+
+void outputSizeStmts()
+{
+    printf("Sizes: stmt(%u) stmts(%u) compound(%u) cache(%u) defined(%u) boundrow(%u)\n",
+            (unsigned)sizeof(HqlStmt),
+            (unsigned)sizeof(HqlStmts),
+            (unsigned)sizeof(HqlCompoundStmt),
+            (unsigned)sizeof(AssociationCache),
+            (unsigned)sizeof(HqlSimpleDefinedValue),
+            (unsigned)sizeof(BoundRow)
+            );
+}

+ 2 - 0
ecl/hqlcpp/hqlstmt.hpp

@@ -116,6 +116,7 @@ public:
     IHqlStmt *                  addLine(const char * filename = NULL, unsigned lineNum = 0);
     IHqlStmt *                  addLoop(IHqlExpression * cond, IHqlExpression * next, bool atEnd);
     IHqlStmt *                  addQuoted(const char * text);
+    IHqlStmt *                  addQuotedLiteral(const char * text); // must only be used for constant C++ strings - avoids a memory clone
     IHqlStmt *                  addQuotedF(const char * text, ...) __attribute__((format(printf, 2, 3)));
     IHqlStmt *                  addQuotedCompound(const char * text, const char * extra = NULL);
     IHqlStmt *                  addQuotedCompoundOpt(const char * text, const char * extra = NULL);
@@ -275,5 +276,6 @@ unsigned calcTotalChildren(const IHqlStmt * stmt);
 IHqlExpression * stripTranslatedCasts(IHqlExpression * e);
 IHqlExpression * peepholeAddExpr(IHqlExpression * left, IHqlExpression * right);
 bool rightFollowsLeft(IHqlExpression * left, IHqlExpression * leftLen, IHqlExpression * right);
+extern HQLCPP_API void outputSizeStmts();
 
 #endif

+ 17 - 5
ecl/hqlcpp/hqlstmt.ipp

@@ -51,16 +51,16 @@ protected:
     bool hasChildren() const;
 
 protected:
-    unsigned                            priority;       //64bit: pack with link count in CInterface
-    HqlStmts *                          container;
-    HqlExprArray                        exprs;
+    unsigned short                      priority;       //64bit: pack with link count in CInterface
 #ifdef _DEBUG
     StmtKind                            kind;
 #else
     unsigned char                       kind;
 #endif
-    bool                                incomplete;
-    bool                                included;
+    bool                                incomplete:1;
+    bool                                included:1;
+    HqlStmts *                          container;
+    HqlExprArray                        exprs;
 };
 
 #ifdef _WIN32
@@ -176,6 +176,18 @@ protected:
 };
 
 
+class HqlQuoteLiteralStmt : public HqlCompoundStmt
+{
+public:
+    HqlQuoteLiteralStmt(StmtKind _kind, HqlStmts * _container, const char * _text) : HqlCompoundStmt(_kind, _container), text(_text) {}
+
+    virtual StringBuffer &          getTextExtra(StringBuffer & out) const;
+
+protected:
+    const char * text;
+};
+
+
 enum {
     PHOconvertReal = 0x0001,
 };

+ 1 - 1
ecl/hqlcpp/hqltcppc.hpp

@@ -20,7 +20,7 @@
 #include "hqlattr.hpp"
 
 class ColumnToOffsetMap;
-class HQLCPP_API BoundRow : public HqlExprAssociation, public IInterface
+class HQLCPP_API BoundRow : public HqlExprAssociation
 {
 public:
     BoundRow(const BoundRow & other, IHqlExpression * _newBound);                                                       // other row

+ 1 - 1
ecl/hqlcpp/hqltcppc2.cpp

@@ -550,7 +550,7 @@ void CChildLimitedDatasetColumnInfo::buildDeserialize(HqlCppTranslator & transla
     assertex(!column->isDictionary());
     if (sizeField || !countField)
     {
-        ctx.addQuoted("rtlFailUnexpected();");
+        ctx.addQuotedLiteral("rtlFailUnexpected();");
         return;
     }