Remove some warnings in the C code (mostly unused variables)
[scilab.git] / scilab / modules / external_objects / src / cpp / doubleExclam_invoke.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 /**
16  * The function !!_invoke_l is called by !_invoke_ which is called on object.method
17  */
18
19 namespace org_modules_external_objects
20 {
21
22 int ScilabGateway::doubleExclam_invoke(char * fname, const int envId, void * pvApiCtx)
23 {
24     SciErr err;
25     int * addr = 0;
26     int * tmpvar = 0;
27     int * args = 0;
28     int eId = OptionsHelper::getEnvId();
29     int ret = 0;
30     int * sret = 0;
31     int len = Rhs;
32
33     CheckOutputArgument(pvApiCtx, 1, 1);
34
35     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(eId);
36     ScilabGatewayOptions & options = env.getGatewayOptions();
37     OptionsHelper & helper = env.getOptionsHelper();
38     ScilabObjects::initialization(env, pvApiCtx);
39
40     if (!OptionsHelper::getCopyOccured()) // if the function is called outside a method context, then return null
41     {
42         //TODO: get null for environment
43         ScilabObjects::unwrap(0, Rhs + 1, eId, pvApiCtx);
44
45         LhsVar(1) = Rhs + 1;
46         PutLhsVar();
47
48         return 0;
49     }
50
51     OptionsHelper::setCopyOccured(false);
52
53     if (!options.getMethodName())
54     {
55         LhsVar(1) = Rhs + 1;
56         PutLhsVar();
57
58         return 0;
59     }
60
61     if (Rhs == 1)
62     {
63         err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
64         if (err.iErr)
65         {
66             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
67         }
68
69         if (ScilabObjects::isExternalVoid(addr, pvApiCtx))
70         {
71             len = 0;
72         }
73     }
74
75     tmpvar = new int[len + 1];
76     *tmpvar = 0;
77     args = new int[len];
78
79     for (int i = 0; i < len; i++)
80     {
81         err = getVarAddressFromPosition(pvApiCtx, i + 1, &addr);
82         if (err.iErr)
83         {
84             ScilabObjects::removeTemporaryVars(eId, tmpvar);
85             delete[] tmpvar;
86             delete[] args;
87             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
88         }
89
90         try
91         {
92             args[i] = ScilabObjects::getArgumentId(addr, tmpvar, false, false, eId, pvApiCtx);
93         }
94         catch (ScilabAbstractEnvironmentException & e)
95         {
96             delete[] tmpvar;
97             delete[] args;
98             throw;
99         }
100     }
101
102     if (options.getIsNew())
103     {
104         try
105         {
106             ret = env.newinstance(options.getObjId(), args, len);
107         }
108         catch (std::exception & e)
109         {
110             options.setIsNew(false);
111             ScilabObjects::removeTemporaryVars(eId, tmpvar);
112             delete[] tmpvar;
113             delete[] args;
114             throw;
115         }
116
117         options.setIsNew(false);
118         ScilabObjects::removeTemporaryVars(eId, tmpvar);
119         delete[] tmpvar;
120         delete[] args;
121         options.setMethodName(0);
122
123         if (ret == VOID_OBJECT)
124         {
125             PutLhsVar();
126
127             return 0;
128         }
129
130         try
131         {
132             ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, eId, pvApiCtx);
133         }
134         catch (ScilabAbstractEnvironmentException & e)
135         {
136             env.removeobject(ret);
137             throw;
138         }
139
140         LhsVar(1) = Rhs + 1;
141         PutLhsVar();
142
143         return 0;
144     }
145     else
146     {
147         try
148         {
149             sret = env.invoke(options.getObjId(), options.getMethodName(), args, len);
150         }
151         catch (std::exception & e)
152         {
153             ScilabObjects::removeTemporaryVars(eId, tmpvar);
154             delete[] tmpvar;
155             delete[] args;
156             options.setMethodName(0);
157             throw;
158         }
159     }
160
161     ScilabObjects::removeTemporaryVars(eId, tmpvar);
162     delete[] tmpvar;
163     delete[] args;
164     options.setMethodName(0);
165
166     if (!sret || *sret <= 0 || (*sret == 1 && sret[1] == VOID_OBJECT))
167     {
168         if (sret)
169         {
170             delete[] sret;
171         }
172
173         PutLhsVar();
174
175         return 0;
176     }
177
178     if (helper.getAutoUnwrap())
179     {
180         for (int i = 1; i <= *sret; i++)
181         {
182             if (!ScilabObjects::unwrap(sret[i], Rhs + i, eId, pvApiCtx))
183             {
184                 try
185                 {
186                     ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, sret[i], eId, pvApiCtx);
187                 }
188                 catch (ScilabAbstractEnvironmentException & e)
189                 {
190                     for (int j = 1; j <= *sret; j++)
191                     {
192                         env.removeobject(sret[j]);
193                     }
194                     delete[] sret;
195                     throw;
196                 }
197             }
198             else
199             {
200                 env.removeobject(sret[i]);
201             }
202
203             LhsVar(i) = Rhs + i;
204         }
205     }
206     else
207     {
208         for (int i = 1; i <= *sret; i++)
209         {
210             try
211             {
212                 ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, sret[i], eId, pvApiCtx);
213             }
214             catch (ScilabAbstractEnvironmentException & e)
215             {
216                 for (int j = 1; j <= *sret; j++)
217                 {
218                     env.removeobject(sret[j]);
219                 }
220                 delete[] sret;
221                 throw;
222             }
223
224             LhsVar(i) = Rhs + i;
225         }
226     }
227
228     delete[] sret;
229
230     PutLhsVar();
231
232     return 0;
233 }
234 }