瀏覽代碼

HPCC-8556 Refactor const char * query functions from helpers

Optimize  getString() calls from codegen separately for varstring versus
string, to keep generated code size to a minimum.

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 12 年之前
父節點
當前提交
febcad25f3

+ 4 - 0
common/thorhelper/thorcommon.hpp

@@ -403,6 +403,10 @@ public:
     {
         return ctx->getString(str);
     }
+    virtual const char *getString(size32_t len, const char *str) const
+    {
+        return ctx->getString(len, str);
+    }
     virtual void getResultRowset(size32_t & tcount, byte * * & tgt, const char * name, unsigned sequence, IEngineRowAllocator * _rowAllocator, bool isGrouped, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
     {
         ctx->getResultRowset(tcount, tgt, name, sequence, _rowAllocator, isGrouped, xmlTransformer, csvTransformer);

+ 4 - 0
ecl/eclagent/eclagent.ipp

@@ -615,6 +615,10 @@ public:
     {
         return rowManager->strdup(str);
     }
+    virtual const char *getString(size32_t len, const char *str) const
+    {
+        return rowManager->strdup(len, str);
+    }
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);

+ 2 - 0
ecl/hqlcpp/hqlcatom.cpp

@@ -331,6 +331,7 @@ _ATOM getResultVarStringAtom;
 _ATOM getResultVarUnicodeAtom;
 _ATOM getRootResultAtom;
 _ATOM getStringAtom;
+_ATOM getStringXAtom;
 _ATOM getWorkflowIdAtom;
 _ATOM getWuidAtom;
 _ATOM goAtom;
@@ -1053,6 +1054,7 @@ MODULE_INIT(INIT_PRIORITY_HQLATOM-1)
     MAKEATOM(getResultVarUnicode);
     MAKEATOM(getRootResult);
     MAKEATOM(getString);
+    MAKEATOM(getStringX);
     MAKEATOM(getWorkflowId);
     MAKEATOM(getWuid);
     MAKEATOM(groupedDataset2RowsetX);

+ 1 - 0
ecl/hqlcpp/hqlcatom.hpp

@@ -331,6 +331,7 @@ extern _ATOM getResultVarStringAtom;
 extern _ATOM getResultVarUnicodeAtom;
 extern _ATOM getRootResultAtom;
 extern _ATOM getStringAtom;
+extern _ATOM getStringXAtom;
 extern _ATOM getWorkflowIdAtom;
 extern _ATOM getWuidAtom;
 extern _ATOM groupedDataset2RowsetXAtom;

+ 10 - 6
ecl/hqlcpp/hqlcpp.cpp

@@ -3384,13 +3384,17 @@ void HqlCppTranslator::buildReturn(BuildCtx & ctx, IHqlExpression * expr, ITypeI
         {
             if (hasConstModifier(retType))
             {
-                OwnedHqlExpr cast = ensureExprType(expr, retType);
-                CHqlBoundExpr ret;
-                buildCachedExpr(ctx, cast, ret);
+                _ATOM funcAtom;
+                if (expr->queryType()->getTypeCode()==type_varstring)
+                    funcAtom = getStringAtom;
+                else
+                    funcAtom = getStringXAtom;
                 HqlExprArray args;
-                args.append(*LINK(ret.expr));
-                OwnedHqlExpr call = bindFunctionCall(getStringAtom, args);
-                ctx.addReturn(call);
+                args.append(*LINK(expr));
+                OwnedHqlExpr call = bindFunctionCall(funcAtom, args);
+                CHqlBoundExpr ret;
+                buildExpr(ctx, call, ret);
+                ctx.addReturn(ret.expr);
                 return;
             }
 

+ 1 - 0
ecl/hqlcpp/hqlcppsys.ecl

@@ -656,6 +656,7 @@ const char * cppSystemText[]  = {
     "   linkcounted dictionary getResultDictionary(const varstring stepname, unsigned4 sequence, boolean xmltransformer, boolean csvtransformer, boolean hasher) : ctxmethod,pure,entrypoint='getResultDictionary';",
 
     "   const varstring  getString(const varstring str) : ctxmethod,pure,entrypoint='getString';",
+    "   const varstring  getStringX(const string str) : ctxmethod,pure,entrypoint='getString';",
 
     //Don't make these pure because they may change over time.
     "   boolean isResult(const varstring stepname, unsigned4 sequence) : gctxmethod,entrypoint='isResult';",

+ 4 - 0
roxie/ccd/ccdactivities.cpp

@@ -596,6 +596,10 @@ public:
     {
         return queryContext->queryCodeContext()->getString(str);
     }
+    virtual const char *getString(size32_t len, const char *str) const
+    {
+        return queryContext->queryCodeContext()->getString(len, str);
+    }
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);

+ 5 - 0
roxie/ccd/ccdcontext.cpp

@@ -1234,6 +1234,11 @@ public:
         return rowManager->strdup(str);
     }
 
+    virtual const char *getString(size32_t len, const char *str) const
+    {
+        return rowManager->strdup(len, str);
+    }
+
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
     {
         convertRowToXML(lenResult, result, info, row, flags);

+ 14 - 3
roxie/roxiemem/roxiemem.cpp

@@ -2370,16 +2370,27 @@ public:
         return normalHeap.doAllocate(activityId);
     }
 
-    virtual const char *strdup(const char *str)
+    virtual const char *strdup(size32_t len, const char *str)
     {
         if (str)
         {
-            memsize_t len = strlen(str)+1;
-            void *ret = allocate(len, 0);
+            char *ret = (char *) allocate(len+1, 0);
             memcpy(ret, str, len);
+            ret[len] = 0;
             return (const char *) ret;
         }
         else
+        {
+            assertex(len==0);
+            return NULL;
+        }
+    }
+
+    virtual const char *strdup(const char *str)
+    {
+        if (str)
+            return strdup(strlen(str), str);
+        else
             return NULL;
     }
 

+ 1 - 0
roxie/roxiemem/roxiemem.hpp

@@ -403,6 +403,7 @@ interface IRowManager : extends IInterface
 {
     virtual void *allocate(memsize_t size, unsigned activityId) = 0;
     virtual const char *strdup(const char *str) = 0;
+    virtual const char *strdup(size32_t len, const char *str) = 0;
     virtual void resizeRow(void * original, memsize_t copysize, memsize_t newsize, unsigned activityId, IRowResizeCallback & callback) = 0;
     virtual void resizeRow(memsize_t & capacity, void * & original, memsize_t copysize, memsize_t newsize, unsigned activityId) = 0;
     virtual void *finalizeRow(void *final, memsize_t originalSize, memsize_t finalSize, unsigned activityId) = 0;

+ 1 - 0
rtl/include/eclhelper.hpp

@@ -582,6 +582,7 @@ interface ICodeContext : public IResourceContext
 
     virtual IEngineRowAllocator * getRowAllocator(IOutputMetaData * meta, unsigned activityId) const = 0;
     virtual const char * getString(const char *str) const = 0;
+    virtual const char * getString(size32_t len, const char *str) const = 0;
 
     // Called from generated code for FROMXML/TOXML
 

+ 1 - 0
thorlcr/graph/thgraph.hpp

@@ -475,6 +475,7 @@ class graph_decl CGraphBase : public CInterface, implements ILocalGraph, impleme
         virtual UChar *getResultVarUnicode(const char * name, unsigned sequence) { return ctx->getResultVarUnicode(name, sequence); }
         virtual unsigned getResultHash(const char * name, unsigned sequence) { return ctx->getResultHash(name, sequence); }
         virtual const char *getString(const char *str) const { return ctx->getString(str); }
+        virtual const char *getString(size32_t len, const char *str) const { return ctx->getString(len, str); }
         virtual char *getWuid() { return ctx->getWuid(); }
         virtual void getExternalResultRaw(unsigned & tlen, void * & tgt, const char * wuid, const char * stepname, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer) { ctx->getExternalResultRaw(tlen, tgt, wuid, stepname, sequence, xmlTransformer, csvTransformer); }
         virtual void executeGraph(const char * graphName, bool realThor, size32_t parentExtractSize, const void * parentExtract) { ctx->executeGraph(graphName, realThor, parentExtractSize, parentExtract); }

+ 5 - 0
thorlcr/thorcodectx/thcodectx.cpp

@@ -102,6 +102,11 @@ const char * CThorCodeContextBase::getString(const char * str) const
     return job.queryRowManager()->strdup(str);
 }
 
+const char * CThorCodeContextBase::getString(size32_t len, const char * str) const
+{
+    return job.queryRowManager()->strdup(len, str);
+}
+
 ILocalGraph *CThorCodeContextBase::resolveLocalQuery(__int64 gid)
 {
     ILocalGraph *graph = job.getGraph((graph_id)gid);

+ 1 - 0
thorlcr/thorcodectx/thcodectx.hpp

@@ -109,6 +109,7 @@ public:
     virtual char *queryIndexMetaData(char const * lfn, char const * xpath) { UNIMPLEMENTED; }
     virtual IEngineRowAllocator * getRowAllocator(IOutputMetaData * meta, unsigned activityId) const;
     virtual const char *getString(const char *str) const;
+    virtual const char *getString(size32_t len, const char *str) const;
     virtual ILocalGraph *resolveLocalQuery(__int64 gid);
     virtual IThorChildGraph * resolveChildQuery(__int64 activityId, IHThorArg * colocal);
     virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags);