原作时间:2019~2021年
此次共享,腾讯内网 / 外网同步发布。
内部代码地址:https://git.code.oa.com/fatboyli/QBDF
外部代码地址:GitHub - ventureli/QBDF
两年前的一个混淆包(无源码):GitHub - ventureli/VLOCInterpreter
作者:腾讯fatboyli(李文强)
1.最终形态预览
上一篇文章我给大家介绍了QBDF这个框架的前世今生,整整四个版本的框架优化,大约耗时了3个月时间来搞定这件事。最终我们的QBDF的运行结构如下图。
代码结构运行图
下面以QQ浏览器HD短视频页面的代码来进行说明下。
QQ浏览器HD短视频QBDF代码
其中 最左侧的就是我们QBDF的脚本,是不是看起来和OC一样?对的,QBDF的目标下发OC 的.m 文件热更新,当然是完全一样的。
其中中间的部分就是我们生成的中间代码,我们通过自己设计的12条指令,把OC代码进行翻译为指令数组,然后就可以用虚拟机取运行了。大家看到的中间代码目前是JSON格式,没有被压缩的样式。最右侧的就是QBDF虚拟机对中间代码执行的效果。目前QQ浏览器HD iOS版本大家还可以看得到这个短视频页面。这个页面就是采用QBDF完成开发的。
2.QBDF架构
此章节主要简单介绍下QBDF整体架构。
2.1.QBDF主要组成
整个QBDF主要氛围两部分。一个是解释器,一个是虚拟机。两者的分工主要如下。
解释器
词法分析
语法分析与语法制导翻译
中间代码生成
中间代码混淆
虚拟机
虚拟机对接OC的四大驱动
运行上下文与过程调用解释器(就是PC指针,JMP,JZ等定位和符号表出栈入栈等操作)
符号表
参数接口与返回值接口处理
通过上面的描述,其实我们可以直到,QBDF解释器的部分并不一定要在客户端完成,我们完全可以在其他的地方编译好中间代码,然后直接由客户端的VM去解释中间代码就可以了。我在QBDF客户端SDK的基础上,我重写了解释器的部分,(客户端用OC实现,云解释器用C++实现)为什么不都用C++实现呢?确实都用C++实现比较好的。但是因为客户端的SDK是先写的,后来集成后不久我就离职了,所以一直没有进行统一。所以整个QBDF的组成就是这个样子。
QBDF 的整个组成。
2.2 QBDF和编译原理
整个QBDF是一个解释OC语言并运行的框架,它的设计就离不开编译原理层面的东西,这里简单介绍下。如果没有兴趣可以直接跳到下一章节从解释器最开始的词法解析去看。编译原理的知识是非常复杂和难以理解的。我在做这个项目的时候也是基本都忘光了。重新找了一个母校的编译原理课件重新学习了好几周才明白。就是这个,为母校点个赞,非常的通俗易懂的课件。
哈工大编译原理课件
我们直到对任何一个语言的编译过程主要氛围两个部分,一个是前端,一个是后端,通俗来讲,就是把前端的语言经过编译器编译成为可以在后端上运行的语言。
语言翻译T形图
我们实现QBDF是比较有意思,我们前端和后端都算是OC,同时实现语言也是OC,也就是说我们用OC语言实现了一个能把OC语言运行在OC上的程序。比较绕,但是确实是这个样子,这个过程非常像编译原理的自举这个概念。为了快速实现整个框架,我们采用了最小化的设计,剔除掉了部分不重要的部分,同时利用了高级语言的特性。比如表达式解析这块,加减乘除,三目表达式,自增,自减少,这种操作其实OC是有的,我们没有必要像汇编那样翻译成基本指令,后面我会说到,其实整个表达式都是利用树形结构进行处理的。下面是一个和一般编译程序的对比图对比图:
QBDF和一般编译程序的对比图
可以看到我把代码优化这个步骤去掉了,这个部分并不是必须的,因为我们的框架知识内部用于动态化开发,所以没有必要完全按照一般编译程序结构设计。代码优化这个部分完全可以由程序员自己去保证。也就说下面的代码QBDF是会真正执行1000次的,同时也会进行符号表的入栈和出栈操作。
for(int i=0;i<1000;i++){
//nothing
}
好了,以上就是QBDF的一个整体架构设计和实现思路,下面我们放一个QBDF的脚本和中间代码大家感受下。
QBDF整个解释器的总体技术设计是这个样子的。
QBDF解释器的技术组成
QBDF脚本如下。
@interface qbdfsubCell : UIView
@end
@implementation qbdfsubCell
- (id)initWithFrame:(CGRect)frame
{
self= [superinitWithFrame:frame];
if(self)
{
[selfsetBackgroundColor:[UIColor purpleColor]];
idlabel = [[UILabel alloc] initWithFrame:CGRectMake(0,self.bounds.size.height -35,self.bounds.size.width,20)];
label.font = [UIFont systemFontOfSize:20];
label.textColor =[UIColor blackColor];
label.text =@"短视频A";
[selfsetQBDFProp:label forKey:@"namelabel"];
[selfaddSubview:label];
idlabelB = [[UILabel alloc] initWithFrame:CGRectMake(0,self.bounds.size.height -15,self.bounds.size.width,15)];
labelB.font = [UIFont systemFontOfSize:15];
labelB.textColor =[UIColor blackColor];
labelB.text =@"详细信息,详细信息";
[selfsetQBDFProp:labelB forKey:@"contentlabel"];
[selfaddSubview:labelB];
idimageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,self.bounds.size.width,self.bounds.size.height -35)];
imageView.backgroundColor = [UIColor whiteColor];
[selfaddSubview:imageView];
[selfsetQBDFProp:imageView forKey:@"imageView"];
void(^blockA)()
{
iddata = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.nipic.com/2009-02-09/200929180899_2.jpg"]];
idimage = [UIImage imageWithData:data];
void(^blockB)()
{
imageView.image = image;
}
dispatch_async_main(blockB);
}
dispatch_async_global_queue(blockA);
}
return self;
}
@end
idsubcell = [[qbdfsubCell alloc] initWithFrame:baseView.bounds];
[baseView addSubview:subcell];
对应中间代码(已解压缩)
[
{
"5001" : "qbdfsubCell",
"1002" : "9010",
"5004" : [
],
"5002" : "UIView",
"1001" : 0,
"5003" : [
]
},
{
"1002" : "9011",
"5009" : "qbdfsubCell",
"5010" : [
{
"5013" : [
{
"3006" : "",
"3005" : "4019",
"3007" : "frame"
}
],
"5011" : "initWithFrame:",
"5014" : false,
"5012" : {
"3009" : "",
"3008" : "4023"
},
"5015" : [
{
"1001" : 0,
"2001" : {
"2014" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "frame",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "super",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "initWithFrame:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1002" : "9002",
"2001" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2011" : 1,
"1001" : 1
},
{
"1001" : 2,
"1002" : "9003",
"1009" : 27,
"1008" : -1,
"1011" : "IF-OUT"
},
{
"1001" : 3,
"1011" : "IF-ENT",
"1002" : "9007"
},
{
"1001" : 4,
"2001" : {
"2015" : [
{
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIColor",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "purpleColor"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "setBackgroundColor:"
},
"1002" : "9002"
},
{
"1002" : "9001",
"1007" : "label",
"1005" : "4023",
"1001" : 5,
"1006" : ""
},
{
"1001" : 6,
"2001" : {
"2014" : {
"2015" : [
{
"2002" : "2005",
"2013" : "CGRectMake",
"2014" : [
{
"2010" : "",
"2008" : "2017",
"2013" : 0,
"2002" : "2004",
"2009" : "4009"
},
{
"2014" : {
"2010" : "",
"2008" : "2017",
"2013" : 35,
"2002" : "2004",
"2009" : "4009"
},
"2013" : {
"2014" : "height",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 130
},
{
"2014" : "width",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
{
"2010" : "",
"2008" : "2017",
"2013" : 20,
"2002" : "2004",
"2009" : "4009"
}
]
}
],
"2013" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UILabel",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "alloc"
},
"2002" : "2006",
"2014" : "initWithFrame:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 7,
"2001" : {
"2014" : {
"2015" : [
{
"2010" : "",
"2008" : "2017",
"2013" : 20,
"2002" : "2004",
"2009" : "4009"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIFont",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "systemFontOfSize:"
},
"2013" : {
"2014" : "font",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 8,
"2001" : {
"2014" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIColor",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "blackColor"
},
"2013" : {
"2014" : "textColor",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 9,
"2001" : {
"2014" : {
"2010" : "",
"2008" : "2017",
"2013" : "短视频A",
"2002" : "2004",
"2009" : "4023"
},
"2013" : {
"2014" : "text",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 10,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
},
{
"2010" : "",
"2008" : "2017",
"2013" : "namelabel",
"2002" : "2004",
"2009" : "4023"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "setQBDFProp:forKey:"
},
"1002" : "9002"
},
{
"1001" : 11,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "label",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "addSubview:"
},
"1002" : "9002"
},
{
"1002" : "9001",
"1007" : "labelB",
"1005" : "4023",
"1001" : 12,
"1006" : ""
},
{
"1001" : 13,
"2001" : {
"2014" : {
"2015" : [
{
"2002" : "2005",
"2013" : "CGRectMake",
"2014" : [
{
"2010" : "",
"2008" : "2017",
"2013" : 0,
"2002" : "2004",
"2009" : "4009"
},
{
"2014" : {
"2010" : "",
"2008" : "2017",
"2013" : 15,
"2002" : "2004",
"2009" : "4009"
},
"2013" : {
"2014" : "height",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 130
},
{
"2014" : "width",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
{
"2010" : "",
"2008" : "2017",
"2013" : 15,
"2002" : "2004",
"2009" : "4009"
}
]
}
],
"2013" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UILabel",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "alloc"
},
"2002" : "2006",
"2014" : "initWithFrame:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 14,
"2001" : {
"2014" : {
"2015" : [
{
"2010" : "",
"2008" : "2017",
"2013" : 15,
"2002" : "2004",
"2009" : "4009"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIFont",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "systemFontOfSize:"
},
"2013" : {
"2014" : "font",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 15,
"2001" : {
"2014" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIColor",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "blackColor"
},
"2013" : {
"2014" : "textColor",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 16,
"2001" : {
"2014" : {
"2010" : "",
"2008" : "2017",
"2013" : "详细信息,详细信息",
"2002" : "2004",
"2009" : "4023"
},
"2013" : {
"2014" : "text",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 17,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
},
{
"2010" : "",
"2008" : "2017",
"2013" : "contentlabel",
"2002" : "2004",
"2009" : "4023"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "setQBDFProp:forKey:"
},
"1002" : "9002"
},
{
"1001" : 18,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "labelB",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "addSubview:"
},
"1002" : "9002"
},
{
"1002" : "9001",
"1007" : "imageView",
"1005" : "4023",
"1001" : 19,
"1006" : ""
},
{
"1001" : 20,
"2001" : {
"2014" : {
"2015" : [
{
"2002" : "2005",
"2013" : "CGRectMake",
"2014" : [
{
"2010" : "",
"2008" : "2017",
"2013" : 0,
"2002" : "2004",
"2009" : "4009"
},
{
"2010" : "",
"2008" : "2017",
"2013" : 0,
"2002" : "2004",
"2009" : "4009"
},
{
"2014" : "width",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
{
"2014" : {
"2010" : "",
"2008" : "2017",
"2013" : 35,
"2002" : "2004",
"2009" : "4009"
},
"2013" : {
"2014" : "height",
"2013" : {
"2014" : "size",
"2013" : {
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 130
}
]
}
],
"2013" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIImageView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "alloc"
},
"2002" : "2006",
"2014" : "initWithFrame:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "imageView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 21,
"2001" : {
"2014" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIColor",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "whiteColor"
},
"2013" : {
"2014" : "backgroundColor",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "imageView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 22,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "imageView",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "addSubview:"
},
"1002" : "9002"
},
{
"1001" : 23,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "imageView",
"2002" : "2004",
"2009" : ""
},
{
"2010" : "",
"2008" : "2017",
"2013" : "imageView",
"2002" : "2004",
"2009" : "4023"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "setQBDFProp:forKey:"
},
"1002" : "9002"
},
{
"1001" : 24,
"3004" : "blockA",
"1002" : "9009",
"3002" : {
"3009" : "",
"3008" : "4017"
},
"3003" : [
{
"1002" : "9001",
"1007" : "data",
"1005" : "4023",
"1001" : 0,
"1006" : ""
},
{
"1001" : 1,
"2001" : {
"2014" : {
"2015" : [
{
"2015" : [
{
"2010" : "",
"2008" : "2017",
"2013" : "http:\/\/pic1.nipic.com\/2009-02-09\/200929180899_2.jpg",
"2002" : "2004",
"2009" : "4023"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "NSURL",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "URLWithString:"
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "NSData",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "dataWithContentsOfURL:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "data",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1002" : "9001",
"1007" : "image",
"1005" : "4023",
"1001" : 2,
"1006" : ""
},
{
"1001" : 3,
"2001" : {
"2014" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "data",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "UIImage",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "imageWithData:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "image",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 4,
"3004" : "blockB",
"1002" : "9009",
"3002" : {
"3009" : "",
"3008" : "4017"
},
"3003" : [
{
"1001" : 0,
"2001" : {
"2014" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "image",
"2002" : "2004",
"2009" : ""
},
"2013" : {
"2014" : "image",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "imageView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
}
],
"3001" : [
]
},
{
"1001" : 5,
"2001" : {
"2002" : "2005",
"2013" : "dispatch_async_main",
"2014" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "blockB",
"2002" : "2004",
"2009" : ""
}
]
},
"1002" : "9002"
}
],
"3001" : [
]
},
{
"1001" : 25,
"2001" : {
"2002" : "2005",
"2013" : "dispatch_async_global_queue",
"2014" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "blockA",
"2002" : "2004",
"2009" : ""
}
]
},
"1002" : "9002"
},
{
"1001" : 26,
"1011" : "IF-LEV",
"1002" : "9008"
},
{
"1002" : "9002",
"2001" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "self",
"2002" : "2004",
"2009" : ""
},
"2011" : 1,
"1001" : 27
},
{
"1001" : 28,
"2018" : -1,
"1002" : "9006"
}
]
}
],
"1001" : 1
},
{
"1002" : "9001",
"1007" : "subcell",
"1005" : "4023",
"1001" : 2,
"1006" : ""
},
{
"1001" : 3,
"2001" : {
"2014" : {
"2015" : [
{
"2014" : "bounds",
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "baseView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 46
}
],
"2013" : {
"2015" : [
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "qbdfsubCell",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "alloc"
},
"2002" : "2006",
"2014" : "initWithFrame:"
},
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "subcell",
"2002" : "2004",
"2009" : ""
},
"2002" : "2003",
"2007" : 148
},
"1002" : "9002"
},
{
"1001" : 4,
"2001" : {
"2015" : [
{
"2010" : "4027",
"2008" : "2016",
"2013" : "subcell",
"2002" : "2004",
"2009" : ""
}
],
"2013" : {
"2010" : "4027",
"2008" : "2016",
"2013" : "baseView",
"2002" : "2004",
"2009" : ""
},
"2002" : "2006",
"2014" : "addSubview:"
},
"1002" : "9002"
},
{
"1001" : 5,
"1002" : "9005"
}
]