JIMS: add jvoid
[scilab.git] / scilab / modules / external_objects / src / cpp / invoker.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "ScilabGateway.hxx"
14
15 namespace org_modules_external_objects
16 {
17
18 int ScilabGateway::invoke(char * fname, const int envId, ScilabAbstractInvoker & invoker, void * pvApiCtx)
19 {
20     SciErr err;
21     int * tmpvar = 0;
22     int * addr = 0;
23     int * args = 0;
24     int ret = 0;
25     int nbArgs = Rhs;
26
27     CheckOutputArgument(pvApiCtx, 1, 1);
28
29     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
30     ScilabGatewayOptions & options = env.getGatewayOptions();
31     OptionsHelper & helper = env.getOptionsHelper();
32     OptionsHelper::setCopyOccurred(false);
33     ScilabObjects::initialization(env, pvApiCtx);
34     options.setIsNew(false);
35
36     tmpvar = new int[Rhs + 1];
37     *tmpvar = 0;
38     args = new int[Rhs];
39
40     for (int i = 0; i < Rhs; i++)
41     {
42         err = getVarAddressFromPosition(pvApiCtx, i + 1, &addr);
43         if (err.iErr)
44         {
45             delete[] args;
46             ScilabObjects::removeTemporaryVars(envId, tmpvar);
47             delete[] tmpvar;
48             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
49         }
50         try
51         {
52             args[i] = ScilabObjects::getArgumentId(addr, tmpvar, false, false, envId, pvApiCtx);
53         }
54         catch (ScilabAbstractEnvironmentException & e)
55         {
56             delete[] args;
57             delete[] tmpvar;
58             throw;
59         }
60
61         if (args[i] == VOID_OBJECT)
62         {
63             nbArgs = 0;
64         }
65     }
66
67     try
68     {
69         ret = invoker.invoke(args, nbArgs);
70     }
71     catch (std::exception & e)
72     {
73         delete[] args;
74         ScilabObjects::removeTemporaryVars(envId, tmpvar);
75         delete[] tmpvar;
76         throw;
77     }
78
79     delete[] args;
80     ScilabObjects::removeTemporaryVars(envId, tmpvar);
81     delete[] tmpvar;
82
83     if (ret == VOID_OBJECT)
84     {
85         PutLhsVar();
86
87         return 0;
88     }
89
90     if (helper.getAutoUnwrap())
91     {
92         if (!ScilabObjects::unwrap(ret, Rhs + 1, envId, pvApiCtx))
93         {
94             try
95             {
96                 ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, envId, pvApiCtx);
97             }
98             catch (ScilabAbstractEnvironmentException & e)
99             {
100                 env.removeobject(ret);
101                 throw;
102             }
103         }
104         else
105         {
106             env.removeobject(ret);
107         }
108     }
109     else
110     {
111         try
112         {
113             ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, envId, pvApiCtx);
114         }
115         catch (ScilabAbstractEnvironmentException & e)
116         {
117             env.removeobject(ret);
118             throw;
119         }
120     }
121
122     LhsVar(1) = Rhs + 1;
123     PutLhsVar();
124
125     return 0;
126 }
127 }