summaryrefslogtreecommitdiff
path: root/modules/functions/macros/bytecodewalk.sci
diff options
context:
space:
mode:
authorShashank2017-05-29 12:40:26 +0530
committerShashank2017-05-29 12:40:26 +0530
commit0345245e860375a32c9a437c4a9d9cae807134e9 (patch)
treead51ecbfa7bcd3cc5f09834f1bb8c08feaa526a4 /modules/functions/macros/bytecodewalk.sci
downloadscilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.tar.gz
scilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.tar.bz2
scilab_for_xcos_on_cloud-0345245e860375a32c9a437c4a9d9cae807134e9.zip
CMSCOPE changed
Diffstat (limited to 'modules/functions/macros/bytecodewalk.sci')
-rwxr-xr-xmodules/functions/macros/bytecodewalk.sci197
1 files changed, 197 insertions, 0 deletions
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 <serge.steer@inria.fr>
+//
+// 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-ll<long_tot then ctemp=[ctemp code(lc:ll+long_tot-1)];lc=ll+long_tot;end
+
+ lc0=lc
+ //if size(ctemp,'*')<>long_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<long_tot then ctemp=[ctemp code(lc:ll+long_tot-1)];lc=ll+long_tot;end
+ lc0=lc
+ long_tot=size(ctemp,"*")
+ ctemp(2)=-int32(long_tot)
+ c1=[c1 ctemp]
+endfunction