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

Stéphane Mottelet stephane.mottelet at utc.fr
Fri Mar 2 13:00:00 CET 2018


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.

-- 
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/05576662/attachment.htm>


More information about the dev mailing list