From 0345245e860375a32c9a437c4a9d9cae807134e9 Mon Sep 17 00:00:00 2001 From: Shashank Date: Mon, 29 May 2017 12:40:26 +0530 Subject: CMSCOPE changed --- modules/functions/macros/bytecodewalk.sci | 197 ++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100755 modules/functions/macros/bytecodewalk.sci (limited to 'modules/functions/macros/bytecodewalk.sci') diff --git a/modules/functions/macros/bytecodewalk.sci b/modules/functions/macros/bytecodewalk.sci new file mode 100755 index 000000000..2a4da8b74 --- /dev/null +++ b/modules/functions/macros/bytecodewalk.sci @@ -0,0 +1,197 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2003-2010 - INRIA - Serge STEER +// +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + +function c1=bytecodewalk(code,query,job) + //walk along bytecode looking for a particular opcode (query) and + //applying a function (job) at this point + if argn(2) < 3 then + error(sprintf(_("%s: Wrong number of input argument(s): %d expected.\n"), "bytecodewalk", 3)); + end + c1=[]; + lc0=1; + lc=lc0; + long_walk=size(code,"*") + while lc<=long_walk + if code(lc)==query then + c1=[c1 code(lc0:lc-1)] + [ctemp,lc]=job(lc) + c1=[c1 ctemp] + lc0=lc + else + select code(lc) + case 0 then //deleted ops + lc=lc+double(code(lc+1)) + case 1 then //stackp (obsolete) + lc=lc+1+nsiz + case 2 then //stackg + lc=lc+nsiz+3 + case 3 then //string + ni=double(code(lc+1)) + lc=lc+2+ni + case 4 then//[] + lc=lc+1 + case 5 then //allops + lc=lc+4 + case 6 then //num + lc=lc+3 + case 7 then//for + c1=[c1 code(lc0:lc-1)] + ll=lc + lc=lc+1 + long=double(code(lc)) + lc=lc+1 + cv=bytecodewalk(code(lc:lc+long-1),query,job) + lc=lc+long + long=double(code(lc)) + lc=lc+1 + id=code(lc:lc-1+nsiz) + lc=lc+nsiz + cc=bytecodewalk(code(lc:lc+long-1),query,job) + c1=[c1 int32(7) int32(size(cv,"*")) cv int32(size(cc,"*")) id cc] + lc=lc+long + lc0=lc + case 8 then //if + exec(walkclause,-1) + case 9 then //while + exec(walkclause,-1) + case 10 then//select case + c1=[c1 code(lc0:lc-1)] + ll=lc + long_tot=abs(double(code(lc+1))) + ncase=double(code(lc+2)) + ctemp=code(lc:lc+2) + lc=lc+3 + + long_case_expr=double(code(lc)) + lc=lc+1 + c_case_expr=bytecodewalk(code(lc:lc+long_case_expr-1),query,job) + lc=lc+long_case_expr + long_case_expr=size(c_case_expr,"*") + ctemp=[ctemp int32(long_case_expr) c_case_expr] + for k=1:ncase+1 + long_case_expr=double(code(lc)); + lc=lc+1; + c_case_expr=bytecodewalk(code(lc:lc+long_case_expr-1),query,job) + lc=lc+long_case_expr; + long_case_expr=size(c_case_expr,"*"); + long_case_then=double(code(lc)) + lc=lc+1 + c_case_then=bytecodewalk(code(lc:lc+long_case_then-1),query,job) + lc=lc+long_case_then + long_case_then=size(c_case_then,"*") + ctemp=[ctemp int32(long_case_expr) c_case_expr int32(long_case_then) ... + c_case_then] + end + //padding ??? + if lc-lllong_tot then pause,end + long_tot=size(ctemp,"*") + ctemp(2)=int32(long_tot) + c1=[c1 ctemp] + case 11 then //try catch + long_try=double(code(lc+1)) + long_catch=double(code(lc+2)) + lc=lc+3 + c_try=bytecodewalk(code(lc:lc+long_try-1),query,job) + lc=lc+long_try + long_try=size(c_try,"*") + + c_catch=bytecodewalk(code(lc:lc+long_catch-1),query,job) + lc=lc+long_catch + long_catch=size(c_catch,"*") + c1=[c1 int32([11 long_try long_catch]) c_try c_catch] + lc0=lc + case 12 then //pause + lc=lc+1 + case 13 then //break + lc=lc+1 + case 14 then //abort + lc=lc+1 + case 15 then //eol + lc=lc+1 + case 16 then //line num + lc=lc+2 + case 17 then //return + lc=lc+1 + case 18 then //nmark named variable + lc=lc+1+nsiz + case 19 then //Mkindx + lc=lc+3 + case 20 then + lc=lc+1 + case 21 then //begrhs + lc=lc+1 + case 22 then //printmode + lc=lc+2 + case 23 then //name2var + lc=lc+1+nsiz + case 24 then // + lc=lc+1 + case 25 then //profile + lc=lc+3 + case 26 then //vector of string + n=double(code(lc+1)*code(lc+2)) + nc=double(code(lc+4+n))-1 + lc=lc+5+n+nc + case 27 then //varfunptr + lc=lc+3+nsiz + case 28 then // + lc=lc+1 + case 29 then //assignment + nlhs=double(code(lc+1)) + lc=lc+3+nlhs*(nsiz+1) + case 30 then // skip logical evaluation + lc=lc+3 + case 31 then //comment + lc=lc+2+double(code(lc+1)) + case 99 then + lc=lc+1 + else//Matfns + lc=lc+4 + end + end + end + c1=[c1 code(lc0:$)] +endfunction +function walkclause + + if code(lc+1)==0 then //very old code + error(msprintf(gettext("%s: obsolete op-code %d.\n"),"bytecodewalk",code(lc))) + end + c1=[c1 code(lc0:lc-1)] + ll=lc + long_tot=abs(double(code(lc+1))) + ncase=double(code(lc+2)) + + ctemp=code(lc:lc+3) + lc=lc+4 + + for k=1:ncase+1 + long_if_expr=double(code(lc)) + lc=lc+1 + c_if_expr=bytecodewalk(code(lc:lc+long_if_expr-1),query,job) + lc=lc+long_if_expr + long_if_expr=size(c_if_expr,"*") + long_if_then=double(code(lc)) + lc=lc+1 + c_if_then=bytecodewalk(code(lc:lc+long_if_then-1),query,job) + lc=lc+long_if_then + long_if_then=size(c_if_then,"*") + ctemp=[ctemp int32(long_if_expr) c_if_expr int32(long_if_then) ... + c_if_then] + end + //padding ??? + if lc-ll