[Scilab-Dev] Hijacking built-in "set" almost works...

Stéphane Mottelet stephane.mottelet at utc.fr
Fri Mar 2 15:44:05 CET 2018


Le 02/03/2018 à 13:00, Stéphane Mottelet a écrit :
> Le 01/03/2018 à 23:44, Samuel Gougeon a écrit :
>> Le 01/03/2018 à 23:26, Stéphane Mottelet a écrit :
>>> Le 01/03/2018 à 21:57, Stéphane Mottelet a écrit :
>>>> Hello,
>>>>
>>>>> Le 1 mars 2018 à 20:18, Samuel Gougeon <sgougeon at free.fr> a écrit :
>>>>>
>>>>>> Le 01/03/2018 à 20:09, Stéphane Mottelet a écrit :
>>>>>> Hello,
>>>>>>
>>>>>> I have tried to implement a (naïve) hijacking mechanism that 
>>>>>> works *like a charm* under scilab 5.5.2:
>>>>>>
>>>>>> newfun('scilab_set',funptr('set'));
>>>>>> clearfun('set');
>>>>>> function set(varargin)
>>>>>>     scilab_set(varargin(:))
>>>>>>     printf("...\n")
>>>>>> endfunction
>>>>>> // test the hijacked "set"
>>>>>> f=gcf()
>>>>>> set(f,"tag","1")
>>>>>> f.tag="2"
>>>>>>
>>>>>> When I test this under  6.0.0 or 6.0.1, the last line always 
>>>>>> crashes Scilab. Is there an evident reason why ? When trying this 
>>>>>> on the command line (scilab -nw)
>>>>>>
>>>>>>> --> set(f,"tag","1")
>>>>>>> ...
>>>>>>>
>>>>>>> --> f.tag="2"
>>>>>>> ...
>>>>>>> /Applications/scilab-6.0.1.app/Contents/MacOS/bin/scilab: line 
>>>>>>> 972: 27117 Illegal instruction: 4  "$SCILABBIN" "$@"
>>>>>> I can see that the problem occurs *after* the insertion code 
>>>>>> f.tag="2" has delegated the operation to the hijacked "set", 
>>>>>> hence the crash occurs in the built-in function which does the 
>>>>>> insertion. In order to understand why this crash occurs (under 
>>>>>> Linux or OSX), I would like to know which module is in charge of 
>>>>>> the insertion for handles (a kind of %h_i but built-in) ?
>>>>> You may have a look at
>>>>> SCI\modules\graphic_objects\src\cpp\setGraphicObjectProperty.cpp
>>>>> and
>>>>> SCI\modules\graphic_objects\src\java\org\scilab\modules\graphic_objects\* 
>>>>>
>>>> Hmm, the crash occurs *after* the property has been set. So my 
>>>> question was rather about the generic code that handles field 
>>>> insertion, which is delegated to “set” for handles.
>>>>
>>>> S.
>>>>
>>>
>>> I have localized many methods for handle type in 
>>> modules/ast/src/cpp/types/graphichandle.cpp. Although I don't know 
>>> much of C++, I can see that GraphicHandle::invoke is delegated to 
>>> the overloaded %h_e macro, hence is an extraction method, but I am 
>>> not able to find any *insertion* method in this file. Maybe someone 
>>> knows ?
>>
>> Maybe
>> edit generic_i_h
> I found it in modules/ast/src/cpp/ast/visitor_common.cpp
>
> When you don't have any idea of where to look, sometimes a "grep 
> theStringToFind -r ." is useful :
>
> 2241 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2241> 
>         else if (_pVar->isHandle())
> 2242 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2242> 
>         {
> 2243 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2243> 
>             if (_pArgs->size() == 1 && (*_pArgs)[0]->isString())
> 2244 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2244> 
>             {
> 2245 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2245> 
>                 //s(["x"])
> 2246 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2246> 
>                 types::GraphicHandle* pH = _pVar->getAs<types::GraphicHandle>();
> 2247 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2247> 
>                 types::String *pS = (*_pArgs)[0]->getAs<types::String>();
> 2248 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2248> 
>                 types::typed_list in;
> 2249 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2249> 
>                 types::typed_list out;
> 2250 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2250> 
>                 types::optional_list opt;
> 2251 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2251> 
>
> 2252 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2252> 
>                 in.push_back(pH);
> 2253 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2253> 
>                 in.push_back(pS);
> 2254 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2254> 
>                 in.push_back(_pInsert);
> 2255 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2255> 
>
> 2256 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2256> 
>                 types::Function* pCall = (types::Function*)symbol::Context::getInstance()->get(symbol::Symbol(L"set"));
> 2257 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2257> 
>                 if (pCall)
> 2258 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2258> 
>                 {
> 2259 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2259> 
>                     types::Callable::ReturnValue ret = pCall->call(in, opt, 1, out);
> 2260 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2260> 
>                     if (ret == types::Callable::OK)
> 2261 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2261> 
>                     {
> 2262 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2262> 
>                         pRet = _pVar;
> 2263 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2263> 
>                     }
> 2264 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2264> 
>                     else
> 2265 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2265> 
>                     {
> 2266 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2266> 
>                         throw ast::InternalError(ConfigVariable::getLastErrorMessage(), ConfigVariable::getLastErrorNumber(), e.getLocation());
> 2267 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2267> 
>                     }
> 2268 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2268> 
>                 }
> 2269 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2269> 
>             }
> 2270 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2270> 
>             else
> 2271 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2271> 
>             {
> 2272 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2272> 
>                 pRet = _pVar->getAs<types::GraphicHandle>()->insert(_pArgs, _pInsert);
> 2273 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2273> 
>             }
> 2274 
> <http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2274> 
>         }
>
> here one can see the delegation to "set" at line 2256...2259. However, 
> the internal overload mechanism is still very obscure to me. Now that 
> I can build scilab_master on my Linux machine, I have played a little 
> bit and replaced lines 2246..2268 by the sole lines
>
> pRet = callOverload(e, L"i", _pArgs, _pInsert, _pVar); sciprint("after 
> callOverload\n")
>
> then recompiled the ast module. The result is a scilab with a fully 
> working graphics, e.g. typing "plot" without arguments works as usual 
> and triggers a lot of handle insertions (a bunch of "after 
> callOverload" are printed). However, there is no %h_i macro, so I 
> don't understand by which miracle it could work.
>
> Antoine it think that you are the author of this file 
> (/ast/src/cpp/ast/visitor_common.cpp) can you explain how it works ?
>
> Thanks in advance,
>
> S.
>
Ok, no miracle... in fact, if the callOverload is forced as explained 
above, then generic_i_h is called (thanks Samuel for your hint), and 
generic_i_h itself calls "set". So this is almost equivalent, besides 
the fact that "set" is called from a Scilab macro and not from 
visitor_common.cpp above. With this solution the hijacking I had 
proposed does not crash anymore.

But after all these complications, I guess that there may be a more 
straightforward way of implementing new handle properties at the user 
level...

S.

-- 
Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/dev/attachments/20180302/bb46be17/attachment.htm>


More information about the dev mailing list