Quoting Stéphane Mottelet <stephane.motte...@utc.fr>:

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 <sgoug...@free.fr>[1] 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[2]         else if (_pVar->isHandle())
   2242[3]         {
   2243[4]             if (_pArgs->size() == 1 && (*_pArgs)[0]->isString())
   2244[5]             {
   2245[6]                 //s(["x"])
2246[7]                 types::GraphicHandle* pH = _pVar->getAs<types::GraphicHandle>(); 2247[8]                 types::String *pS = (*_pArgs)[0]->getAs<types::String>();
   2248[9]                 types::typed_list in;
   2249[10]                 types::typed_list out;
   2250[11]                 types::optional_list opt;
   2251[12]
   2252[13]                 in.push_back(pH);
   2253[14]                 in.push_back(pS);
   2254[15]                 in.push_back(_pInsert);
   2255[16]
2256[17]                 types::Function* pCall = (types::Function*)symbol::Context::getInstance()->get(symbol::Symbol(L"set"));
   2257[18]                 if (pCall)
   2258[19]                 {
2259[20]                     types::Callable::ReturnValue ret = pCall->call(in, opt, 1, out);
   2260[21]                     if (ret == types::Callable::OK)
   2261[22]                     {
   2262[23]                         pRet = _pVar;
   2263[24]                     }
   2264[25]                     else
   2265[26]                     {
2266[27]                         throw ast::InternalError(ConfigVariable::getLastErrorMessage(), ConfigVariable::getLastErrorNumber(), e.getLocation());
   2267[28]                     }
   2268[29]                 }
   2269[30]             }
   2270[31]             else
   2271[32]             {
2272[33]                 pRet = _pVar->getAs<types::GraphicHandle>()->insert(_pArgs, _pInsert);
   2273[34]             }
   2274[35]         }

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...

To finish on this subject and maybe feed the conversation on this subject, here is the final set/get hijacking code and and a simple example of what if allows to do: e.g. here we add a 'xlim' property to the Axes entity. At the user level it is enough to write the two functions  %Axes_set_xlim_property and %Axes_get_xlim_property(varargin). Of course, this works only if the "set" hijacking does not crash scilab, which needs the hack into modules/ast/src/cpp/ast/visitor_common.cpp describe above.

S.

newfun('scilab_set',funptr('set'));
clearfun('set');
newfun('scilab_get',funptr('get'));
clearfun('get');
function set(varargin)
    try
        if length(varargin)==3           
            execstr('%'+sprintf('%s_set_%s_property(varargin(:))',...
            scilab_get(varargin(1),'type'),varargin(2)))
        end
    catch
        scilab_set(varargin(:))
    end
end

function out=get(varargin)
    try
        if length(varargin)==2    
            out=evstr('%'+sprintf('%s_get_%s_property(varargin(:))',...
            scilab_get(varargin(1),'type'),varargin(2));
        else
            out=scilab_get(varargin(:))
        end
    catch
        out=scilab_get(varargin(:))
    end
end

FUNCTION %AXES_SET_XLIM_PROPERTY(VARARGIN)
    VARARGIN(1).DATA_BOUNDS(1:2)=VARARGIN(3)(:);
END

FUNCTION OUT=%AXES_GET_XLIM_PROPERTY(VARARGIN)
    OUT=VARARGIN(1).DATA_BOUNDS(1:2);
END

CLF
PLOT
A=GCF().CHILDREN
A(2).XLIM=[2 4];
DISP(A(1).XLIM)



Links:
------
[1] mailto:sgoug...@free.fr
[2] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2241 [3] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2242 [4] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2243 [5] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2244 [6] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2245 [7] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2246 [8] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2247 [9] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2248 [10] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2249 [11] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2250 [12] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2251 [13] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2252 [14] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2253 [15] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2254 [16] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2255 [17] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2256 [18] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2257 [19] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2258 [20] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2259 [21] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2260 [22] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2261 [23] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2262 [24] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2263 [25] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2264 [26] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2265 [27] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2266 [28] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2267 [29] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2268 [30] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2269 [31] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2270 [32] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2271 [33] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2272 [34] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2273 [35] http://gitweb.scilab.org/?p=scilab.git;a=blob;f=scilab/modules/ast/src/cpp/ast/visitor_common.cpp;h=6379d14e630d747599fd48e0e9cfa907cab214cd;hb=b5bcf45d3328c87b56ed5d8f9dbec623504f7c9b#l2274
_______________________________________________
dev mailing list
dev@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/dev

Reply via email to