//思路:每个函数块的追踪在一个数组里,将每个函数追踪转化成序列。
//如果追踪中有ASYNC标记,则创建一个包含两个序列的新序列。
function TswitchS(arr){
if(typeof arr === "Array"){
Sequence = new Array();
var FUNC="root";
var j=0,k=0;//序列下标参数
var SKIP=false;//FAILURE标记
var asyncID = new Array();
for(var i=0;i<arr.length;i ){
var arg0_length = arr[i][0].IndexOf(':');//返回某个指定的字符串值在字符串中首次出现的位置。
var func = arr[i][0].substring(0,arg0_length);//用于提取字符串中介于两个指定下标之间的字符
var arg1_length = arr[i][0].lastIndexOf(':');
var funAsync = arr[i][0].substr(arg_length);
if(testA(funAsync)){//处理异步调用
var num = funAsync.substr(funAsync.length-1);//用于提取字符串中介于两个指定下标之间的字符
if(typeof asyncID[num]==="Array"){
asyncID[num].push();
}else{
asyncID[num] = new Array();
asyncID[num].push();
}
}
if(func==FAILURE){//有FAILURE标记,此序列终止
SKIP=true;
Sequence[j][k ]="FAILURE";
}else if(func==FUNC&&!SKIP){//同一序列
Sequence[j][k ]="该行序列格式";
}else{//开启新序列
j ;k=0;
FUN=fun;
SKIP=false;
Sequence[j] = new Array();
Sequence[j][k]="该行序列格式";
}
}
}
}
//增则表达式匹配异步调用
function testA(text){
var result=text.indexOf("ASYNC");
if(result!=-1){
alert("ok");
}else{
alert("err");
}
}
//获取异步调用ID号
function getID(str){
if(typeof str ==="String"){
var numColon = str.lastIndexOf(":");
var strID = str.substr(numColon);
return strID;
}
}
查找包含直接DOM访问的序列
代码语言:javascript复制
//根据ρ←(l1,l2,...,ln)⇐⇒∃li∈{l1,l2,...,ln},li .f ailure = true(1)找到目标序列。
function test(text){
// var re =/?(w{1,}=w{1,}&){1,}w{1,}=w{1,}/;
var re =new RegExp("FAILURE$");
var result= re.test(text);
if(result){
alert("ok");
}else{
alert("err");
}
}
function Screen(arr){
var last = arr[arr.length-1];//获取最后一个元素
if(test(last)){//选中序列
var seq_num = last.IndexOf(':');//返回某个指定的字符串值在字符串中首次出现的位置。
var seq = last.substring(0,seq_num);//用于提取字符串中介于两个指定下标之间的字符
return seq;
}
}
var Seq=new Array();
Seq=Sequence.filter(Screen(this));
定位直接DOM访问
代码语言:javascript复制
//在找到的序列中根据dynamic backword slicing寻找direct DOM access.
function findDOM(iid){
if("是direct DOM access"){
//该行(iid)标识为直接DOM访问
return iid;
}else{//不是direct DOM access,追踪变量保持null值
if(iid.ASSIGN){//如果是赋值
var stringIid=iid.code;
text=text.replace(/s/ig,'');//去除字符串中的空格
if(iid.name==null_var){//是关于null_var的赋值
var a = stringIid.IndexOf('=');//返回某个指定的字符串值在字符串中首次出现的位置。
var b = stringIid.IndexOf(';');//返回某个指定的字符串值在字符串中首次出现的位置。
var new_var = stringIid.substring(a,b);//用于提取字符串中介于两个指定下标之间的字符
null_var=new_var;
return findDOM(iid-1);
}else{
return findDOM(iid-1);
}
}else if(iid.RETURN){//如果是return
if(){//是关于null_var的赋值
return findDOM(iid-1);
}else{
return findDOM(iid-1);
}
}else if(iid.FUNCTION){//如果是函数调用
if(){//是关于null_var的赋值
return findDOM(iid-1);
}else{
return findDOM(iid-1);
}
}else{//非以上情况,忽略
return findDOM(iid-1);
}
}
}