ast_tools 源码解读
# IfWithExpressFix
主要是给不包含 block 的 if 表达式添加上,让其统一化。
if(a=1) var b=3; | |
----------------- | |
if(a=1){var b=3} |
# ForWithExpressFix & ForWithForFix
都是给 For 循环规范化。
# ReturnSeqFix
将 return 中包含逗号表达式的还原
第一部分用于将所有的逗号表达式添加到数组中,第二步主要是将逗号表达式前 n-1 项加到 return 前面,然后将 return 节点只包含逗号表达式的最后一项。
function add(a,b){return c=a+1,b} | |
-------------------------- | |
function add(a,b){c=a+1;return ab} |
# VariableDeclaratorFix
声明表达式及赋值表达式还原。
var a,b,c; | |
m=2,d=3,n=4; | |
----------- | |
var a; | |
var b; | |
var c; | |
m=2; | |
d=3; | |
n=4; |
# ConditionalFix
三目表达式转化为 if-else 的形式。
# SequenceExpressionFix
本质上还是逗号表达式的还原。
# AssignmentWithConditionalFix
还是对三目表达的还原,这里限制了其 consequent 和 alternate 部分都为数字。
# LogicalExpressionFix
将逻辑表达式转化为条件表达式。
# UnaryFunctionFix
把自执行函数的壳去掉。
# ControlFlowFix
控制流平坦化。
进入大 FOR 循环,获取第一个初始化 Ci 的表达式,然后根据一个三目获取变量的名称 (其余的条件貌似不是针对大控制流的)。
定义了两个数组,分别用于存取大控制流的变量
生成了一个函数,给定一个初始的 li 然后会返回一个字典包含这五个参数。
进入控制流,然后生产了一个用于判断是否结束的函数。
获取主流程 switch 节点
初始化了 get_control_struct 函数,steps_hash_list,bodys,get_next_control_param 函数,
定义了一个 get_node 函数 (控制流的另一种形式,初始 li 参数)
控制流的另一种形式:将上述控制流转化为一个类似字典的东西,键指代控制流指向,值包含其内容为 node 类型。
# get_code 函数
控制流的整体流程
这里获取所有初始参数的值
这一步应该是不断计算,获取最下层节点即 Ai 节点的值。
在这里,由于包含 IF 的模块,所以还要对其进行一个判断,get_next_control_param 用于获取其类型是否包含这种 IF。
向栈中添加这两个节点值。
然后根据这个 11490 在进行一个这个流程,在进入 while 流程中,基本上就将控制流还原了。
ba = window; | |
Nt = r; | |
ur = void 0; | |
Jo = void 0; | |
ei = O; | |
if (Nt) { | |
。。。。 | |
} else { | |
。。。 | |
} |
整体思想,获取初始参数的值,计算出中间参数的值,找到最底层的节点,获取当前节点的表达式,然后获取下一步初始参数的值 (要对 for 循环中的条件进行一个判断),反复调用并合并节点,最后将整个大 FOR 循环脱掉。
# ConstantFix
字符串的还原。
# DecryptVariableFix
将 w.pop () 的形式,还原为字符串。
# ReserveStrFix
这玩意的还原。