JIMS: plug java.nio.ByteBuffers 36/12036/4
Calixte DENIZET [Tue, 16 Jul 2013 09:32:07 +0000 (11:32 +0200)]
Change-Id: I0ff4f81f3933a92891e5403a97f22514278f34fc

17 files changed:
scilab/modules/external_objects/Makefile.am
scilab/modules/external_objects/Makefile.in
scilab/modules/external_objects/includes/ScilabGateway.hxx
scilab/modules/external_objects/src/cpp/invoke.cpp
scilab/modules/external_objects/src/cpp/invoke_asref.cpp [new file with mode: 0644]
scilab/modules/external_objects_java/Makefile.am
scilab/modules/external_objects_java/Makefile.in
scilab/modules/external_objects_java/includes/gw_external_objects_java.h
scilab/modules/external_objects_java/sci_gateway/c/gw_external_objects_java.c
scilab/modules/external_objects_java/sci_gateway/cpp/sci_jinvoke_db.cpp [new file with mode: 0644]
scilab/modules/external_objects_java/sci_gateway/external_objects_java_gateway.xml
scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.cpp
scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironmentWrapper.cpp
scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironmentWrapper.hxx
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabJavaObject.java
scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.dia.ref [new file with mode: 0644]
scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.tst [new file with mode: 0644]

index 753e6ec..aa4d1d0 100644 (file)
@@ -57,6 +57,7 @@ EXTERNAL_OBJECTS_CPP_SOURCES = src/cpp/ScilabEnvironments.cpp \
                               src/cpp/getRepresentation.cpp \
                               src/cpp/import.cpp \
                               src/cpp/invoke.cpp \
+                              src/cpp/invoke_asref.cpp \
                               src/cpp/invoke_lu.cpp \
                               src/cpp/trace.cpp \
                               src/cpp/newInstance.cpp \
index 0b11d40..61419ef 100644 (file)
@@ -172,6 +172,7 @@ am__objects_2 = libsciexternal_objects_algo_la-ScilabEnvironments.lo \
        libsciexternal_objects_algo_la-getRepresentation.lo \
        libsciexternal_objects_algo_la-import.lo \
        libsciexternal_objects_algo_la-invoke.lo \
+       libsciexternal_objects_algo_la-invoke_asref.lo \
        libsciexternal_objects_algo_la-invoke_lu.lo \
        libsciexternal_objects_algo_la-trace.lo \
        libsciexternal_objects_algo_la-newInstance.lo \
@@ -648,6 +649,7 @@ EXTERNAL_OBJECTS_CPP_SOURCES = src/cpp/ScilabEnvironments.cpp \
                               src/cpp/getRepresentation.cpp \
                               src/cpp/import.cpp \
                               src/cpp/invoke.cpp \
+                              src/cpp/invoke_asref.cpp \
                               src/cpp/invoke_lu.cpp \
                               src/cpp/trace.cpp \
                               src/cpp/newInstance.cpp \
@@ -872,6 +874,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-getsetOptions.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-import.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-invoke.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-invoke_asref.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-invoke_lu.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-invoker.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_algo_la-newInstance.Plo@am__quote@
@@ -1165,6 +1168,13 @@ libsciexternal_objects_algo_la-invoke.lo: src/cpp/invoke.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsciexternal_objects_algo_la-invoke.lo `test -f 'src/cpp/invoke.cpp' || echo '$(srcdir)/'`src/cpp/invoke.cpp
 
+libsciexternal_objects_algo_la-invoke_asref.lo: src/cpp/invoke_asref.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsciexternal_objects_algo_la-invoke_asref.lo -MD -MP -MF $(DEPDIR)/libsciexternal_objects_algo_la-invoke_asref.Tpo -c -o libsciexternal_objects_algo_la-invoke_asref.lo `test -f 'src/cpp/invoke_asref.cpp' || echo '$(srcdir)/'`src/cpp/invoke_asref.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libsciexternal_objects_algo_la-invoke_asref.Tpo $(DEPDIR)/libsciexternal_objects_algo_la-invoke_asref.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='src/cpp/invoke_asref.cpp' object='libsciexternal_objects_algo_la-invoke_asref.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsciexternal_objects_algo_la-invoke_asref.lo `test -f 'src/cpp/invoke_asref.cpp' || echo '$(srcdir)/'`src/cpp/invoke_asref.cpp
+
 libsciexternal_objects_algo_la-invoke_lu.lo: src/cpp/invoke_lu.cpp
 @am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsciexternal_objects_algo_la-invoke_lu.lo -MD -MP -MF $(DEPDIR)/libsciexternal_objects_algo_la-invoke_lu.Tpo -c -o libsciexternal_objects_algo_la-invoke_lu.lo `test -f 'src/cpp/invoke_lu.cpp' || echo '$(srcdir)/'`src/cpp/invoke_lu.cpp
 @am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libsciexternal_objects_algo_la-invoke_lu.Tpo $(DEPDIR)/libsciexternal_objects_algo_la-invoke_lu.Plo
index 3743c58..41e6e38 100644 (file)
@@ -92,6 +92,8 @@ public:
 
     static int invoke(char * fname, const int envId, void * pvApiCtx);
 
+    static int invoke_asref(char * fname, const int envId, void * pvApiCtx);
+
     static int invoke(char * fname, const int envId, ScilabAbstractInvoker & invoker, void * pvApiCtx);
 
     static int invoke_lu(char * fname, const int envId, void * pvApiCtx);
index 73a30a0..eb57c76 100644 (file)
@@ -116,7 +116,6 @@ int ScilabGateway::invoke(char * fname, const int envId, void * pvApiCtx)
         delete[] args;
         ScilabObjects::removeTemporaryVars(envId, tmpvar);
         delete[] tmpvar;
-        env.removeobject(idObj);
         freeAllocatedSingleString(methName);
         throw;
     }
diff --git a/scilab/modules/external_objects/src/cpp/invoke_asref.cpp b/scilab/modules/external_objects/src/cpp/invoke_asref.cpp
new file mode 100644 (file)
index 0000000..e95fcf2
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "ScilabGateway.hxx"
+
+namespace org_modules_external_objects
+{
+
+int ScilabGateway::invoke_asref(char * fname, const int envId, void * pvApiCtx)
+{
+    SciErr err;
+    int * tmpvar = 0;
+    int * addr = 0;
+    int * args = 0;
+    int idObj = 0;
+    int * ret = 0;
+    char * methName = 0;
+    int nbArgs = Rhs - 2;
+
+    if (Rhs < 2)
+    {
+        throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong number of arguments : more than 2 arguments expected"));
+    }
+
+    ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
+    ScilabGatewayOptions & options = env.getGatewayOptions();
+    OptionsHelper & helper = env.getOptionsHelper();
+    OptionsHelper::setCopyOccurred(false);
+    ScilabObjects::initialization(env, pvApiCtx);
+    options.setIsNew(false);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
+    }
+
+    tmpvar = new int[Rhs - 1];
+    *tmpvar = 0;
+
+    try
+    {
+        idObj = ScilabObjects::getArgumentId(addr, tmpvar, false, false, envId, pvApiCtx);
+    }
+    catch (ScilabAbstractEnvironmentException & e)
+    {
+        delete[] tmpvar;
+        throw;
+    }
+
+    if (idObj == 0)
+    {
+        delete[] tmpvar;
+        throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot invoke on null object"));
+    }
+
+    args = new int[Rhs - 2];
+
+    for (int i = 0; i < Rhs - 2; i++)
+    {
+        char * varName = 0;
+
+        try
+        {
+            char * varName =  ScilabObjects::getSingleString(i + 3, pvApiCtx);
+            err = getVarAddressFromName(pvApiCtx, varName, &addr);
+            if (err.iErr)
+            {
+                throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
+            }
+
+            args[i] = ScilabObjects::getArgumentId(addr, tmpvar, true, false, envId, pvApiCtx);
+        }
+        catch (ScilabAbstractEnvironmentException & e)
+        {
+            if (varName)
+            {
+                freeAllocatedSingleString(varName);
+            }
+
+            delete[] args;
+            ScilabObjects::removeTemporaryVars(envId, tmpvar);
+            delete[] tmpvar;
+            throw;
+        }
+
+        if (args[i] == VOID_OBJECT)
+        {
+            nbArgs = 0;
+        }
+
+        if (varName)
+        {
+            freeAllocatedSingleString(varName);
+        }
+    }
+
+    try
+    {
+        methName = ScilabObjects::getSingleString(2, pvApiCtx);
+    }
+    catch (ScilabAbstractEnvironmentException & e)
+    {
+        delete[] args;
+        ScilabObjects::removeTemporaryVars(envId, tmpvar);
+        delete[] tmpvar;
+        throw;
+    }
+
+    try
+    {
+        ret = env.invoke(idObj, methName, args, nbArgs);
+    }
+    catch (std::exception & e)
+    {
+        delete[] args;
+        ScilabObjects::removeTemporaryVars(envId, tmpvar);
+        delete[] tmpvar;
+        freeAllocatedSingleString(methName);
+        throw;
+    }
+
+    delete[] args;
+    ScilabObjects::removeTemporaryVars(envId, tmpvar);
+    delete[] tmpvar;
+    freeAllocatedSingleString(methName);
+
+    if (!ret || *ret <= 0 || (*ret == 1 && ret[1] == VOID_OBJECT))
+    {
+        if (ret)
+        {
+            delete[] ret;
+        }
+
+        PutLhsVar();
+
+        return 0;
+    }
+
+    if (helper.getAutoUnwrap())
+    {
+        for (int i = 1; i <= *ret; i++)
+        {
+            if (!ScilabObjects::unwrap(ret[i], Rhs + i, envId, pvApiCtx))
+            {
+                try
+                {
+                    ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, ret[i], envId, pvApiCtx);
+                }
+                catch (ScilabAbstractEnvironmentException & e)
+                {
+                    for (int j = 1; j <= *ret; j++)
+                    {
+                        env.removeobject(ret[j]);
+                    }
+                    delete[] ret;
+                    throw;
+                }
+            }
+            else
+            {
+                env.removeobject(ret[i]);
+            }
+
+            LhsVar(i) = Rhs + i;
+        }
+    }
+    else
+    {
+        for (int i = 1; i <= *ret; i++)
+        {
+            try
+            {
+                ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, ret[i], envId, pvApiCtx);
+            }
+            catch (ScilabAbstractEnvironmentException & e)
+            {
+                for (int j = 1; j <= *ret; j++)
+                {
+                    env.removeobject(ret[j]);
+                }
+                delete[] ret;
+                throw;
+            }
+
+            LhsVar(i) = Rhs + i;
+        }
+    }
+
+    delete[] ret;
+
+    PutLhsVar();
+
+    return 0;
+}
+}
index 0b1f9d1..82440f7 100644 (file)
@@ -67,7 +67,8 @@ sci_gateway/cpp/sci_jwrapinfloat.cpp \
 sci_gateway/cpp/sci_jsetfield.cpp \
 sci_gateway/cpp/sci_jautoTranspose.cpp \
 sci_gateway/cpp/sci_jconvMatrixMethod.cpp \
-sci_gateway/cpp/sci_jgetinfo.cpp
+sci_gateway/cpp/sci_jgetinfo.cpp \
+sci_gateway/cpp/sci_jinvoke_db.cpp
 
 GIWS_WRAPPERS = src/jni/ScilabObjects.giws.xml
 
index 14c542a..01e35d6 100644 (file)
@@ -189,7 +189,8 @@ am__objects_3 =  \
        libsciexternal_objects_java_la-sci_jsetfield.lo \
        libsciexternal_objects_java_la-sci_jautoTranspose.lo \
        libsciexternal_objects_java_la-sci_jconvMatrixMethod.lo \
-       libsciexternal_objects_java_la-sci_jgetinfo.lo
+       libsciexternal_objects_java_la-sci_jgetinfo.lo \
+       libsciexternal_objects_java_la-sci_jinvoke_db.lo
 am_libsciexternal_objects_java_la_OBJECTS = $(am__objects_3) \
        $(am__objects_1)
 libsciexternal_objects_java_la_OBJECTS =  \
@@ -621,7 +622,8 @@ sci_gateway/cpp/sci_jwrapinfloat.cpp \
 sci_gateway/cpp/sci_jsetfield.cpp \
 sci_gateway/cpp/sci_jautoTranspose.cpp \
 sci_gateway/cpp/sci_jconvMatrixMethod.cpp \
-sci_gateway/cpp/sci_jgetinfo.cpp
+sci_gateway/cpp/sci_jgetinfo.cpp \
+sci_gateway/cpp/sci_jinvoke_db.cpp
 
 GIWS_WRAPPERS = src/jni/ScilabObjects.giws.xml
 @GIWS_TRUE@BUILT_SOURCES = giws
@@ -788,6 +790,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jgetmethods.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jimport.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jinvoke.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jinvoke_db.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jnewInstance.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jremove.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsciexternal_objects_java_la-sci_jsetfield.Plo@am__quote@
@@ -1090,6 +1093,13 @@ libsciexternal_objects_java_la-sci_jgetinfo.lo: sci_gateway/cpp/sci_jgetinfo.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_java_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsciexternal_objects_java_la-sci_jgetinfo.lo `test -f 'sci_gateway/cpp/sci_jgetinfo.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_jgetinfo.cpp
 
+libsciexternal_objects_java_la-sci_jinvoke_db.lo: sci_gateway/cpp/sci_jinvoke_db.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_java_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libsciexternal_objects_java_la-sci_jinvoke_db.lo -MD -MP -MF $(DEPDIR)/libsciexternal_objects_java_la-sci_jinvoke_db.Tpo -c -o libsciexternal_objects_java_la-sci_jinvoke_db.lo `test -f 'sci_gateway/cpp/sci_jinvoke_db.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_jinvoke_db.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libsciexternal_objects_java_la-sci_jinvoke_db.Tpo $(DEPDIR)/libsciexternal_objects_java_la-sci_jinvoke_db.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_jinvoke_db.cpp' object='libsciexternal_objects_java_la-sci_jinvoke_db.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciexternal_objects_java_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libsciexternal_objects_java_la-sci_jinvoke_db.lo `test -f 'sci_gateway/cpp/sci_jinvoke_db.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_jinvoke_db.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index da8da41..0d8ec03 100644 (file)
@@ -42,6 +42,7 @@ EXTERNAL_OBJECTS_JAVA_SCILAB_IMPEXP int sci_jautoTranspose(char *fname, unsigned
 EXTERNAL_OBJECTS_JAVA_SCILAB_IMPEXP int sci_jinvoke(char *fname, unsigned long fname_len);
 EXTERNAL_OBJECTS_JAVA_SCILAB_IMPEXP int sci_jconvMatrixMethod(char *fname, unsigned long fname_len);
 EXTERNAL_OBJECTS_JAVA_SCILAB_IMPEXP int sci_jgetinfo(char *fname, unsigned long fname_len);
+EXTERNAL_OBJECTS_JAVA_SCILAB_IMPEXP int sci_jinvoke_db(char *fname, unsigned long fname_len);
 /*--------------------------------------------------------------------------*/
 #endif /* __GW_EXTERNAL_OBJECTS_H__ */
 /*--------------------------------------------------------------------------*/
index 586e0dd..fbbf9f2 100644 (file)
@@ -45,7 +45,8 @@ static gw_generic_table Tab[] =
     {sci_jautoTranspose, "jautoTranspose"},
     {sci_jinvoke, "jinvoke"},
     {sci_jconvMatrixMethod, "jconvMatrixMethod"},
-    {sci_jgetinfo, "jgetinfo"}
+    {sci_jgetinfo, "jgetinfo"},
+    {sci_jinvoke_db, "jinvoke_db"}
 };
 
 static BOOL loadedDep = FALSE;
diff --git a/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jinvoke_db.cpp b/scilab/modules/external_objects_java/sci_gateway/cpp/sci_jinvoke_db.cpp
new file mode 100644 (file)
index 0000000..39303b6
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "ScilabJavaEnvironment.hxx"
+#include "ScilabGateway.hxx"
+
+extern "C" {
+#include "Scierror.h"
+#include "gw_external_objects_java.h"
+}
+
+using namespace org_scilab_modules_external_objects_java;
+using namespace org_modules_external_objects;
+
+int sci_jinvoke_db(char * fname, unsigned long fname_len)
+{
+    try
+    {
+        const int envId = ScilabJavaEnvironment::start();
+        return ScilabGateway::invoke_asref(fname, envId, pvApiCtx);
+    }
+    catch (std::exception & e)
+    {
+        Scierror(999, "%s: An error occured: %s", fname, e.what());
+        return 0;
+    }
+}
index e61264a..c89746b 100644 (file)
@@ -54,4 +54,5 @@
     <PRIMITIVE gatewayId="72" primitiveId="23" primitiveName="jinvoke" />
     <PRIMITIVE gatewayId="72" primitiveId="24" primitiveName="jconvMatrixMethod" />
     <PRIMITIVE gatewayId="72" primitiveId="25" primitiveName="jgetinfo" />
+    <PRIMITIVE gatewayId="72" primitiveId="26" primitiveName="jinvoke_db" />
 </GATEWAY>
index 2ec4063..fb43393 100644 (file)
@@ -66,8 +66,6 @@ int ScilabJavaEnvironment::start()
         instance->Initialize();
         instance->helper.setUseLastName(true);
         instance->helper.setNewAllowed(true);
-        //instance->enabletrace((std::string(getTMPDIR()) + std::string("/eo_java.log")).c_str());
-        //instance->enabletrace(std::string("/tmp/eo_java.log").c_str());
     }
 
     return envId;
@@ -265,7 +263,10 @@ int * ScilabJavaEnvironment::invoke(int id, const char * methodName, int * args,
     invokedId[0] = 1 ; //1 object returned
     invokedId[1] = ScilabJavaObject::invoke(vm, id, methodName, args, argsSize);
 
-    ScilabAutoCleaner::registerVariable(envId, invokedId[1]);
+    if (invokedId[1] != 0 && invokedId[1] != -1)
+    {
+        ScilabAutoCleaner::registerVariable(envId, invokedId[1]);
+    }
 
     return invokedId;
 }
index d708db3..abbfea3 100644 (file)
@@ -35,18 +35,33 @@ VariableType ScilabJavaEnvironmentWrapper::isunwrappable(int id) const
 int ScilabJavaEnvironmentWrapper::wrap(double * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap(vm, x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(double * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap(vm, x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(double * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap(vm, x, xSize, xSizeCol);
 }
 
@@ -78,108 +93,198 @@ int ScilabJavaEnvironmentWrapper::wrap(double * re, double * im, int xSize, int
 int ScilabJavaEnvironmentWrapper::wrap(char * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap(vm, (byte *)x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(char * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap(vm, (byte *)x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(char * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap(vm, (byte *)x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned char * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (char *)x, 1);
+    }
+
     return wrap(vm, (byte *)x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned char * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (char *)x, xSize);
+    }
+
     return wrap(vm, (byte *)x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned char * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (char *)x, xSize * xSizeCol);
+    }
+
     return wrap(vm, (byte *)x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(short * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap(vm, x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(short * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap(vm, x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(short * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap(vm, x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned short * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (short *)x, 1);
+    }
+
     return wrap(vm, (short *)x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned short * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (short *)x, xSize);
+    }
+
     return wrap(vm, (short *)x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned short * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (short *)x, xSize * xSizeCol);
+    }
+
     return wrap(vm, (short *)x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(int * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap(vm, x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(int * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap(vm, x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(int * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap(vm, x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned int * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (int *)x, 1);
+    }
+
     return wrap(vm, (int *)x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned int * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (int *)x, xSize);
+    }
+
     return wrap(vm, (int *)x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned int * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (int *)x, xSize * xSizeCol);
+    }
+
     return wrap(vm, (int *)x, xSize, xSizeCol);
 }
 
@@ -188,36 +293,66 @@ int ScilabJavaEnvironmentWrapper::wrap(unsigned int * x, int xSize, int xSizeCol
 int ScilabJavaEnvironmentWrapper::wrap(long long * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap(vm, x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(long long * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap(vm, x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(long long * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap(vm, x, xSize, xSizeCol);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned long long * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (long long *)x, 1);
+    }
+
     return wrap(vm, (long long *)x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned long long * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (long long *)x, xSize);
+    }
+
     return wrap(vm, (long long *)x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrap(unsigned long long * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, (long long *)x, xSize * xSizeCol);
+    }
+
     return wrap(vm, (long long *)x, xSize, xSizeCol);
 }
 
@@ -244,18 +379,33 @@ int ScilabJavaEnvironmentWrapper::wrap(char ** x, int xSize, int xSizeCol, const
 int ScilabJavaEnvironmentWrapper::wrapBool(int * x, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, 1);
+    }
+
     return wrap<int, bool>(vm, x);
 }
 
 int ScilabJavaEnvironmentWrapper::wrapBool(int * x, int xSize, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize);
+    }
+
     return wrap<int, bool>(vm, x, xSize);
 }
 
 int ScilabJavaEnvironmentWrapper::wrapBool(int * x, int xSize, int xSizeCol, const bool isRef) const
 {
     JavaVM * vm = getScilabJavaVM();
+    if (isRef)
+    {
+        return wrapAsDirectBuffer(vm, x, xSize * xSizeCol);
+    }
+
     return wrap<int, bool>(vm, x, xSize, xSizeCol);
 }
 
@@ -397,13 +547,13 @@ void ScilabJavaEnvironmentWrapper::unwrapmatuint(int id, const ScilabUIntStackAl
 void ScilabJavaEnvironmentWrapper::unwraplong(int id, const ScilabLongStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapSingle<jlong, long long, long long>(vm, id, allocator, false);
+    unwrapSingle<jlong, int, long long>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwraprowlong(int id, const ScilabLongStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapRow<jlong, long long, long long>(vm, id, allocator, false);
+    unwrapRow<jlong, int, long long>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwrapmatlong(int id, const ScilabLongStackAllocator & allocator) const
@@ -430,13 +580,13 @@ void ScilabJavaEnvironmentWrapper::unwrapmatulong(int id, const ScilabULongStack
 void ScilabJavaEnvironmentWrapper::unwrapboolean(int id, const ScilabBooleanStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapSingle<jboolean, int, bool>(vm, id, allocator);
+    unwrapSingle<jboolean, int, bool>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwraprowboolean(int id, const ScilabBooleanStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapRow<jboolean, int, bool>(vm, id, allocator);
+    unwrapRow<jboolean, int, bool>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwrapmatboolean(int id, const ScilabBooleanStackAllocator & allocator) const
@@ -587,13 +737,13 @@ void ScilabJavaEnvironmentWrapper::unwrapmatcomplex(int id, const ScilabComplexS
 void ScilabJavaEnvironmentWrapper::unwrapfloat(int id, const ScilabFloatStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapSingle<jfloat, float, float>(vm, id, allocator, false);
+    unwrapSingle<jfloat, double, float>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwraprowfloat(int id, const ScilabFloatStackAllocator & allocator) const
 {
     JavaVM * vm = getScilabJavaVM();
-    unwrapRow<jfloat, float, float>(vm, id, allocator, false);
+    unwrapRow<jfloat, double, float>(vm, id, allocator, true);
 }
 
 void ScilabJavaEnvironmentWrapper::unwrapmatfloat(int id, const ScilabFloatStackAllocator & allocator) const
index 8a84634..e674c4b 100644 (file)
@@ -79,6 +79,14 @@ class ScilabJavaEnvironmentWrapper : public ScilabAbstractEnvironmentWrapper
     jmethodID unwrapRowFloatID_;
     jmethodID unwrapMatFloatID_;
 
+    jmethodID wrapAsDirectByteBufferID_;
+    jmethodID wrapAsDirectDoubleBufferID_;
+    jmethodID wrapAsDirectIntBufferID_;
+    jmethodID wrapAsDirectCharBufferID_;
+    jmethodID wrapAsDirectFloatBufferID_;
+    jmethodID wrapAsDirectLongBufferID_;
+    jmethodID wrapAsDirectShortBufferID_;
+
 public:
 
     ScilabJavaEnvironmentWrapper(JavaOptionsHelper & _helper) : helper(_helper)
@@ -98,28 +106,36 @@ public:
         unwrapMatBooleanID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatBoolean", "(I)[[Z");
 
         unwrapByteID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapByte", "(I)B");
-        unwrapRowByteID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowByte", "(I)[B");
+        unwrapRowByteID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowByte", "(I)Ljava/lang/Object;");
         unwrapMatByteID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatByte", "(I)[[B");
 
         unwrapShortID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapShort", "(I)S");
-        unwrapRowShortID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowShort", "(I)[S");
+        unwrapRowShortID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowShort", "(I)Ljava/lang/Object;");
         unwrapMatShortID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatShort", "(I)[[S");
 
         unwrapIntID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapInt", "(I)I");
-        unwrapRowIntID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowInt", "(I)[I");
+        unwrapRowIntID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowInt", "(I)Ljava/lang/Object;");
         unwrapMatIntID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatInt", "(I)[[I");
 
         unwrapLongID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapLong", "(I)J");
-        unwrapRowLongID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowLong", "(I)[J");
+        unwrapRowLongID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowLong", "(I)Ljava/lang/Object;");
         unwrapMatLongID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatLong", "(I)[[J");
 
         unwrapDoubleID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapDouble", "(I)D");
-        unwrapRowDoubleID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowDouble", "(I)[D");
+        unwrapRowDoubleID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowDouble", "(I)Ljava/lang/Object;");
         unwrapMatDoubleID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatDouble", "(I)[[D");
 
         unwrapFloatID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapFloat", "(I)F");
-        unwrapRowFloatID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowFloat", "(I)[F");
+        unwrapRowFloatID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapRowFloat", "(I)Ljava/lang/Object;");
         unwrapMatFloatID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "unwrapMatFloat", "(I)[[F");
+
+        wrapAsDirectByteBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectByteBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectDoubleBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectDoubleBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectIntBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectIntBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectCharBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectCharBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectFloatBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectFloatBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectLongBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectLongBuffer", "(Ljava/nio/ByteBuffer;)I");
+        wrapAsDirectShortBufferID_ = curEnv->GetStaticMethodID(ScilabJavaObjectClass_, "wrapAsDirectShortBuffer", "(Ljava/nio/ByteBuffer;)I");
     }
 
     ~ScilabJavaEnvironmentWrapper() { }
@@ -505,6 +521,31 @@ private:
         return unwrapMatFloatID_;
     }
 
+    inline const jmethodID getDBMethod(const char * x) const
+    {
+        return wrapAsDirectByteBufferID_;
+    }
+    inline const jmethodID getDBMethod(const double * x) const
+    {
+        return wrapAsDirectDoubleBufferID_;
+    }
+    inline const jmethodID getDBMethod(const int * x) const
+    {
+        return wrapAsDirectIntBufferID_;
+    }
+    inline const jmethodID getDBMethod(const float * x) const
+    {
+        return wrapAsDirectFloatBufferID_;
+    }
+    inline const jmethodID getDBMethod(const long long * x) const
+    {
+        return wrapAsDirectLongBufferID_;
+    }
+    inline const jmethodID getDBMethod(const short * x) const
+    {
+        return wrapAsDirectShortBufferID_;
+    }
+
     template <typename T>
     inline T CallStatic(JNIEnv * env_, const char * x, int javaID) const
     {
@@ -560,7 +601,7 @@ private:
     }
 
     template <typename T, typename U, typename V, class W>
-    inline void unwrapSingle(JavaVM * jvm_, const int javaID, const W & allocator, const bool mustAlloc = true) const
+    inline void unwrapSingle(JavaVM * jvm_, const int javaID, const W & allocator, const bool mustAlloc = false) const
     {
         JNIEnv * curEnv = NULL;
         U* addr = 0;
@@ -576,12 +617,12 @@ private:
 
         if (mustAlloc)
         {
-            addr = allocator.allocate(1, 1, 0);
+            addr = reinterpret_cast<U *>(allocator.allocate(1, 1, 0));
             *addr = static_cast<U>(res);
         }
         else
         {
-            allocator.allocate(1, 1, reinterpret_cast<U *>(&res));
+            allocator.allocate(1, 1, reinterpret_cast<V *>(&res));
         }
     }
 
@@ -592,62 +633,103 @@ private:
     }
 
     template <typename T, typename U, typename V, class W>
-    inline void unwrapRow(JavaVM * jvm_, const int javaID, const W & allocator, const bool mustAlloc = true) const
+    inline void unwrapRow(JavaVM * jvm_, const int javaID, const W & allocator, const bool mustAlloc = false) const
     {
         jint lenRow;
         jboolean isCopy = JNI_FALSE;
         JNIEnv * curEnv = NULL;
         U* addr = 0;
+        jobject res = 0;
+        jobjectArray array = 0;
+        void * buffer = 0;
 
         jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
 
-        jobjectArray res = static_cast<jobjectArray>(curEnv->CallStaticObjectMethod(ScilabJavaObjectClass_, getRowMethod((V *)addr), javaID));
+        res = curEnv->CallStaticObjectMethod(ScilabJavaObjectClass_, getRowMethod((V *)addr), javaID);
         if (curEnv->ExceptionCheck())
         {
             curEnv->DeleteLocalRef(res);
             throw GiwsException::JniCallMethodException(curEnv);
         }
 
-        lenRow = curEnv->GetArrayLength(res);
-
-        if (mustAlloc)
+        buffer = curEnv->GetDirectBufferAddress(res);
+        if (buffer)
         {
-            try
+            const jlong len = curEnv->GetDirectBufferCapacity(res);
+            V * resultsArray = (V *)buffer;
+            if (mustAlloc)
             {
-                addr = allocator.allocate(1, lenRow, 0);
+                try
+                {
+                    addr = reinterpret_cast<U* >(allocator.allocate(1, len, 0));
+                    for (jlong i = 0; i < len; i++)
+                    {
+                        addr[i] = static_cast<U>(resultsArray[i]);
+                    }
+                }
+                catch (const ScilabAbstractEnvironmentException & e)
+                {
+                    curEnv->DeleteLocalRef(res);
+                    throw;
+                }
             }
-            catch (const ScilabAbstractEnvironmentException & e)
+            else
             {
-                curEnv->DeleteLocalRef(res);
-                throw;
+                try
+                {
+                    allocator.allocate(1, len, reinterpret_cast<V *>(resultsArray));
+                }
+                catch (const ScilabAbstractEnvironmentException & e)
+                {
+                    curEnv->DeleteLocalRef(res);
+                    throw;
+                }
             }
         }
-
-        T * resultsArray = static_cast<T *>(curEnv->GetPrimitiveArrayCritical(res, &isCopy));
-
-        if (mustAlloc)
+        else
         {
-            for (int i = 0; i < lenRow; i++)
+            array = static_cast<jobjectArray>(res);
+            lenRow = curEnv->GetArrayLength(array);
+
+            if (mustAlloc)
             {
-                addr[i] = static_cast<U>(resultsArray[i]);
+                try
+                {
+                    addr = reinterpret_cast<U *>(allocator.allocate(1, lenRow, 0));
+                }
+                catch (const ScilabAbstractEnvironmentException & e)
+                {
+                    curEnv->DeleteLocalRef(array);
+                    throw;
+                }
             }
-        }
-        else
-        {
-            try
+
+            T * resultsArray = static_cast<T *>(curEnv->GetPrimitiveArrayCritical(array, &isCopy));
+
+            if (mustAlloc)
             {
-                allocator.allocate(1, lenRow, reinterpret_cast<U *>(resultsArray));
+                for (int i = 0; i < lenRow; i++)
+                {
+                    addr[i] = static_cast<U>(resultsArray[i]);
+                }
             }
-            catch (const ScilabAbstractEnvironmentException & e)
+            else
             {
-                curEnv->ReleasePrimitiveArrayCritical(res, resultsArray, JNI_ABORT);
-                curEnv->DeleteLocalRef(res);
-                throw;
+                try
+                {
+                    allocator.allocate(1, lenRow, reinterpret_cast<V *>(resultsArray));
+                }
+                catch (const ScilabAbstractEnvironmentException & e)
+                {
+                    curEnv->ReleasePrimitiveArrayCritical(array, resultsArray, JNI_ABORT);
+                    curEnv->DeleteLocalRef(array);
+                    throw;
+                }
             }
-        }
 
-        curEnv->ReleasePrimitiveArrayCritical(res, resultsArray, JNI_ABORT);
-        curEnv->DeleteLocalRef(res);
+            curEnv->ReleasePrimitiveArrayCritical(array, resultsArray, JNI_ABORT);
+            curEnv->DeleteLocalRef(array);
+        }
         if (curEnv->ExceptionCheck())
         {
             throw GiwsException::JniCallMethodException(curEnv);
@@ -728,6 +810,24 @@ private:
             throw GiwsException::JniCallMethodException(curEnv);
         }
     }
+
+    template<typename T>
+    inline int wrapAsDirectBuffer(JavaVM * jvm_, T * data, const int size) const
+    {
+        JNIEnv * curEnv = NULL;
+        jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
+
+        jobject dbuffer = curEnv->NewDirectByteBuffer((void*)data, (jlong)(size * sizeof(T)));
+        int id = static_cast<jint>(curEnv->CallStaticIntMethod(ScilabJavaObjectClass_, getDBMethod(data), dbuffer));
+
+        curEnv->DeleteLocalRef(dbuffer);
+        if (curEnv->ExceptionCheck())
+        {
+            throw GiwsException::JniCallMethodException(curEnv);
+        }
+
+        return id;
+    }
 };
 }
 
index 60a18a2..b08fdc5 100644 (file)
 
 package org.scilab.modules.external_objects_java;
 
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.MethodDescriptor;
+import java.beans.PropertyDescriptor;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.PrintStream;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
@@ -21,25 +27,19 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.nio.CharBuffer;
 import java.nio.DoubleBuffer;
 import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.nio.LongBuffer;
 import java.nio.ShortBuffer;
-import java.nio.ByteOrder;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.MethodDescriptor;
-import java.beans.PropertyDescriptor;
-import java.io.IOException;
-import java.util.Arrays;
 import java.util.logging.FileHandler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -825,14 +825,15 @@ public class ScilabJavaObject {
             }
 
             if (arraySJO[id] != null) {
-                Object ret = ScilabJavaMethod.invoke(methName, arraySJO[id].clazz, arraySJO[id].object, returnType, args);
-                if (ret == null && returnType[0] == Void.TYPE) {
-                    return -1;
-                } else {
-                    return new ScilabJavaObject(ret, returnType[0]).id;
-                }
-            }
-            throw new ScilabJavaException("Invalid Java object");
+               Object ret = ScilabJavaMethod.invoke(methName, arraySJO[id].clazz, arraySJO[id].object, returnType, args);
+               if (ret == null && returnType[0] == Void.TYPE) {
+                   return -1;
+               } else {
+                   return new ScilabJavaObject(ret, returnType[0]).id;
+               }
+            } else {
+               throw new ScilabJavaException("Invalid Java object");
+           }
         } else {
             throw new ScilabJavaException("null is not an object");
         }
@@ -1411,14 +1412,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final double[] unwrapRowDouble(final int id) {
+    public static final Object unwrapRowDouble(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toDoubleArray((List<Double>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Double[]) {
             return ScilabJavaArray.toPrimitive((Double[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof DoubleBuffer && !((DoubleBuffer) arraySJO[id].object).isDirect()) {
+            return ((DoubleBuffer) arraySJO[id].object).array();
         }
 
-        return (double[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1446,14 +1449,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final int[] unwrapRowInt(final int id) {
+    public static final Object unwrapRowInt(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toIntArray((List<Integer>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Integer[]) {
             return ScilabJavaArray.toPrimitive((Integer[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof IntBuffer && !((IntBuffer) arraySJO[id].object).isDirect()) {
+            return ((IntBuffer) arraySJO[id].object).array();
         }
 
-        return (int[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1480,14 +1485,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final short[] unwrapRowShort(final int id) {
+    public static final Object unwrapRowShort(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toShortArray((List<Short>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Short[]) {
             return ScilabJavaArray.toPrimitive((Short[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof ShortBuffer && !((ShortBuffer) arraySJO[id].object).isDirect()) {
+            return ((ShortBuffer) arraySJO[id].object).array();
         }
 
-        return (short[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1514,14 +1521,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final byte[] unwrapRowByte(final int id) {
+    public static final Object unwrapRowByte(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toByteArray((List<Byte>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Byte[]) {
             return ScilabJavaArray.toPrimitive((Byte[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof ByteBuffer && !((ByteBuffer) arraySJO[id].object).isDirect()) {
+            return ((ByteBuffer) arraySJO[id].object).array();
         }
 
-        return (byte[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1610,14 +1619,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final char[] unwrapRowChar(final int id) {
+    public static final Object unwrapRowChar(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toCharArray((List<Character>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Character[]) {
             return ScilabJavaArray.toPrimitive((Character[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof CharBuffer && !((CharBuffer) arraySJO[id].object).isDirect()) {
+            return ((CharBuffer) arraySJO[id].object).array();
         }
 
-        return (char[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1644,14 +1655,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final float[] unwrapRowFloat(final int id) {
+    public static final Object unwrapRowFloat(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toFloatArray((List<Float>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Double[]) {
             return ScilabJavaArray.toPrimitive((Float[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof FloatBuffer && !((FloatBuffer) arraySJO[id].object).isDirect()) {
+            return ((FloatBuffer) arraySJO[id].object).array();
         }
 
-        return (float[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1678,14 +1691,16 @@ public class ScilabJavaObject {
      * @param id the Java Object id
      * @return the resulting unwrapping
      */
-    public static final long[] unwrapRowLong(final int id) {
+    public static final Object unwrapRowLong(final int id) {
         if (arraySJO[id].object instanceof List) {
             return ScilabJavaArray.toLongArray((List<Long>) arraySJO[id].object);
         } else if (arraySJO[id].object instanceof Long[]) {
             return ScilabJavaArray.toPrimitive((Long[]) arraySJO[id].object);
+        } else if (arraySJO[id].object instanceof LongBuffer && !((LongBuffer) arraySJO[id].object).isDirect()) {
+            return ((LongBuffer) arraySJO[id].object).array();
         }
 
-        return (long[]) (arraySJO[id].object);
+        return arraySJO[id].object;
     }
 
     /**
@@ -1735,6 +1750,31 @@ public class ScilabJavaObject {
 
                 return i;
             }
+        } else if (arraySJO[id].object instanceof Buffer) {
+            if (arraySJO[id].object instanceof DoubleBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 3);
+                return 3;
+            } else if (arraySJO[id].object instanceof ByteBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 12);
+                return 12;
+            } else if (arraySJO[id].object instanceof IntBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 24);
+                return 24;
+            } else if (arraySJO[id].object instanceof CharBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 21);
+                return 21;
+            } else if (arraySJO[id].object instanceof FloatBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 36);
+                return 36;
+            } else if (arraySJO[id].object instanceof LongBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 30);
+                return 30;
+            } else if (arraySJO[id].object instanceof ShortBuffer) {
+                unwrappableType.put(arraySJO[id].clazz, 18);
+                return 18;
+            }
+
+            return -1;
         } else {
             return -1;
         }
diff --git a/scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.dia.ref b/scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.dia.ref
new file mode 100644 (file)
index 0000000..69acb68
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Sylvestre Ledru
+// Copyright (C) 2013 - Scilab Enterprises - Calixte Denizet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+c = jcompile("TestDirectBuffer",["import java.nio.DoubleBuffer;";
+                                 "public class TestDirectBuffer {";
+                                 "public static void increment(DoubleBuffer x) {";
+                                 "for (int i = 0; i < x.capacity(); i++) x.put(i, x.get(i) + 1);";
+                                 "}";
+                                 "}"])
+ c  =
+class TestDirectBuffer
+a = 1:10000;
+b = a + 1; // only used to compare with the following...
+jinvoke_db(c, "increment", "a");
+assert_checktrue(and(a==b));
+jremove c;
diff --git a/scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.tst b/scilab/modules/external_objects_java/tests/unit_tests/jinvoke_db.tst
new file mode 100644 (file)
index 0000000..c5cd9b0
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Sylvestre Ledru
+// Copyright (C) 2013 - Scilab Enterprises - Calixte Denizet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+c = jcompile("TestDirectBuffer",["import java.nio.DoubleBuffer;";
+                                 "public class TestDirectBuffer {";
+                                 "public static void increment(DoubleBuffer x) {";
+                                 "for (int i = 0; i < x.capacity(); i++) x.put(i, x.get(i) + 1);";
+                                 "}";
+                                 "}"])
+a = 1:10000;
+b = a + 1; // only used to compare with the following...
+jinvoke_db(c, "increment", "a");
+assert_checktrue(and(a==b));
+
+jremove c;