Browse Source

HPCC-8030 R/Java/JavaScript/Python language support in ECL

Changes in response to code review

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 12 years ago
parent
commit
5776d9ff48
4 changed files with 31 additions and 22 deletions
  1. 9 6
      ecl/hql/hqlgram2.cpp
  2. 2 2
      ecl/hqlcpp/hqlcpp.cpp
  3. 2 2
      plugins/Rembed/Rembed.cpp
  4. 18 12
      plugins/javaembed/javaembed.cpp

+ 9 - 6
ecl/hql/hqlgram2.cpp

@@ -838,19 +838,22 @@ IHqlExpression * HqlGram::processEmbedBody(const attribute & errpos, IHqlExpress
     if (language)
     {
         IHqlScope *pluginScope = language->queryScope();
-        OwnedHqlExpr getEmbedContextFunc = pluginScope->lookupSymbol(getEmbedContextAtom, LSFsharedOK, lookupCtx);
+        OwnedHqlExpr getEmbedContextFunc = pluginScope->lookupSymbol(getEmbedContextAtom, LSFpublic, lookupCtx);
+        _ATOM moduleName = language->queryName();
+        if (!moduleName)
+            moduleName = unnamedAtom;
         if (!getEmbedContextFunc)
-            reportError(ERR_PluginNoScripting, errpos, "Module %s does not export getEmbedContext() function", language->queryName()->getAtomNamePtr());
+            reportError(ERR_PluginNoScripting, errpos, "Module %s does not export getEmbedContext() function", moduleName->getAtomNamePtr());
         bool isImport = queryPropertyInList(importAtom, attribs) != NULL;
-        OwnedHqlExpr checkSupport = pluginScope->lookupSymbol(isImport ? supportsImportAtom : supportsScriptAtom, LSFsharedOK, lookupCtx);
+        OwnedHqlExpr checkSupport = pluginScope->lookupSymbol(isImport ? supportsImportAtom : supportsScriptAtom, LSFpublic, lookupCtx);
         if (!matchesBoolean(checkSupport, true))
-            reportError(ERR_PluginNoScripting, errpos, "Module %s does not support %s", language->queryName()->getAtomNamePtr(), isImport ? "import" : "script");
-        OwnedHqlExpr syntaxCheckFunc = pluginScope->lookupSymbol(syntaxCheckAtom, LSFsharedOK, lookupCtx);
+            reportError(ERR_PluginNoScripting, errpos, "Module %s does not support %s", moduleName->getAtomNamePtr(), isImport ? "import" : "script");
+        OwnedHqlExpr syntaxCheckFunc = pluginScope->lookupSymbol(syntaxCheckAtom, LSFpublic, lookupCtx);
         if (syntaxCheckFunc && !importAtom)
         {
             // MORE - create an expression that calls it, and const fold it, I guess....
         }
-        args.append(*createAttribute(languageAtom, getEmbedContextFunc.getClear()));
+        args.append(*createExprAttribute(languageAtom, getEmbedContextFunc.getClear()));
     }
     if (attribs)
         attribs->unwindList(args, no_comma);

+ 2 - 2
ecl/hqlcpp/hqlcpp.cpp

@@ -7242,7 +7242,7 @@ void HqlCppTranslator::doBuildExprEmbedBody(BuildCtx & ctx, IHqlExpression * exp
 
     processCppBodyDirectives(expr);
     IHqlExpression *languageAttr = expr->queryProperty(languageAtom);
-    if (languageAtom)
+    if (languageAttr)
     {
         UNIMPLEMENTED;  // It's not clear if this can ever happen - perhaps a parameterless function that used EMBED ?
     }
@@ -11425,7 +11425,7 @@ void HqlCppTranslator::buildScriptFunctionDefinition(BuildCtx &funcctx, IHqlExpr
 
     HqlExprArray noargs;
     OwnedHqlExpr getPlugin = bindFunctionCall(language, noargs);
-    OwnedHqlExpr pluginPtr = createQuoted("Owned<IEmbedContext> __plugin", makeBoolType());
+    OwnedHqlExpr pluginPtr = createQuoted("Owned<IEmbedContext> __plugin", makeBoolType());  // Not really bool - at some point ECL may support without this aliasing...
     buildAssignToTemp(funcctx, pluginPtr, getPlugin);
     StringBuffer createParam;
     createParam.append("Owned<IEmbedFunctionContext> __ctx = __plugin->createFunctionContext(");

+ 2 - 2
plugins/Rembed/Rembed.cpp

@@ -41,7 +41,7 @@ static const char * EclDefinition =
     "END;"
     "EXPORT getEmbedContext := Language.getEmbedContext;"
     "EXPORT syntaxCheck := Language.syntaxCheck;"
-    "EXPORT boolean supportsImport := true;"
+    "EXPORT boolean supportsImport := false;"
     "EXPORT boolean supportsScript := true;";
 
 extern "C" EXPORT bool getECLPluginDefinition(ECLPluginDefinitionBlock *pb)
@@ -177,7 +177,7 @@ public:
 
     virtual void importFunction(const char *text)
     {
-        UNIMPLEMENTED;
+        throwUnexpected();
     }
     virtual void compileEmbeddedScript(const char *text)
     {

+ 18 - 12
plugins/javaembed/javaembed.cpp

@@ -82,7 +82,7 @@ public:
         options[2].optionString = (char *) "-verbose:jni";
         vm_args.version = JNI_VERSION_1_6;
 #ifdef _DEBUG
-        vm_args.nOptions = 2;  // set to 3 if you want the verbose...
+        vm_args.nOptions = 1;  // set to 3 if you want the verbose...
 #else
         vm_args.nOptions = 1;
 #endif
@@ -137,9 +137,11 @@ public:
         {
             prevtext.clear();
             // Name should be in the form class.method:signature
-            const char *signature = strchr(text, ':');
             const char *funcname = strchr(text, '.');
-            if (!signature || !funcname)
+            if (!funcname)
+                throw MakeStringException(MSGAUD_user, 0, "javaembed: Invalid import name %s - Expected classname.methodname:signature", text);
+            const char *signature = strchr(funcname, ':');
+            if (!signature)
                 throw MakeStringException(MSGAUD_user, 0, "javaembed: Invalid import name %s - Expected classname.methodname:signature", text);
             StringBuffer classname(funcname-text, text);
             funcname++;  // skip the '.'
@@ -174,7 +176,7 @@ public:
         default: result.i = JNIenv->CallStaticIntMethodA(javaClass, javaMethodID, args); break;
         }
     }
-    __int64 getSignedResult(jvalue & result)
+    inline __int64 getSignedResult(jvalue & result)
     {
         switch (returnType.get()[0])
         {
@@ -194,7 +196,7 @@ public:
             throw MakeStringException(MSGAUD_user, 0, "javaembed: Type mismatch on result");
         }
     }
-    double getDoubleResult(jvalue &result)
+    inline double getDoubleResult(jvalue &result)
     {
         switch (returnType.get()[0])
         {
@@ -212,7 +214,7 @@ public:
             throw MakeStringException(MSGAUD_user, 0, "javaembed: Type mismatch on result");
         }
     }
-    bool getBooleanResult(jvalue &result)
+    inline bool getBooleanResult(jvalue &result)
     {
         switch (returnType.get()[0])
         {
@@ -229,6 +231,15 @@ public:
             throw MakeStringException(MSGAUD_user, 0, "javaembed: Type mismatch on result");
         }
     }
+    inline void getStringResult(jvalue &result, size32_t &__len, char * &__result)
+    {
+        jstring sresult = (jstring) result.l;
+        __len = JNIenv->GetStringUTFLength(sresult);
+        const char * chars =  JNIenv->GetStringUTFChars(sresult, NULL);
+        __result = (char *)rtlMalloc(__len);
+        memcpy(__result, chars, __len);
+        JNIenv->ReleaseStringUTFChars(sresult, chars);
+    }
 private:
     StringAttr returnType;
     StringAttr prevtext;
@@ -269,12 +280,7 @@ public:
     }
     virtual void getStringResult(size32_t &__len, char * &__result)
     {
-        jstring sresult = (jstring) result.l;
-        __len = sharedCtx->JNIenv->GetStringUTFLength(sresult);
-        const char * chars =  sharedCtx->JNIenv->GetStringUTFChars(sresult, NULL);
-        __result = (char *)rtlMalloc(__len);
-        memcpy(__result, chars, __len);
-        sharedCtx->JNIenv->ReleaseStringUTFChars(sresult, chars);
+        sharedCtx->getStringResult(result, __len, __result);
     }
 
     virtual void bindBooleanParam(const char *name, bool val)