实习的时候,自己的时间明显没有在学校的时候多啊。这次Kernel FP拖了很久,一个多月都还没写完。幸好语法分析器用了之前开发的Syngram,要不得多花一个月。Kernel FP的类型推导的代码实在是很难看,趁着又发现了一个Bug,重构一下。
类型推导的时候需要频繁地修改符号的类型。譬如说现在有符号Type1 A和Type2 B。突然发现函数的分支里面,一条返回A,一条返回B,立刻就断定Type1与Type2相等了。现在事情就来了,需要将所有类型里面的Type1通通换成Type2。以前的做法是在推导之前将类型入栈,推导之后出栈,每次替换栈内的类型。这种做法导致了代码写起来非常难受而且很容易出错。因此今天针对这个问题,重写了这个用来实现类型推导的类。
现在需求如下。主类叫TypeSolver。TypeSolver::SolverAndReplace(OldType , NewType)的时候需要更新所有相关的类型。现在怎么办呢?我提供了一个TypeWrapper用来装Type的智能指针,实现operator->。使用TypeSolver创建Wrapper的时候,将Wrapper和类型记录在Solver里面。多个Wrapper可能共享一个Type,这个时候Solver中还维护了一个引用计数。
于是,我在Wrapper用其他Wrapper构造,或使用Wrapper或Type赋值,或者析构的时候都通知Solver。Solver析构的时候通知所有Wrapper。代码如下:
h文件:
1 class VL_KfpIdTypeWrapper : public VL_Base
2 {
3 friend class VL_KfpIdTypeSolver;
4 protected:
5 VL_KfpIdTypeSolver* FSolver;
6 VL_KfpIdType::Ptr FType;
7
8 VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver* Solver);
9
10 void Inc();
11 void Dec();
12 public:
13 VL_KfpIdTypeWrapper();
14 VL_KfpIdTypeWrapper(const VL_KfpIdTypeWrapper& Wrapper);
15 ~VL_KfpIdTypeWrapper();
16
17 VL_KfpIdTypeWrapper& operator=(const VL_KfpIdTypeWrapper& Wrapper);
18 VL_KfpIdTypeWrapper& operator=(VL_KfpIdType::Ptr Type);
19 VL_KfpIdType* operator->();
20 };
cpp文件:
1 void VL_KfpIdTypeWrapper::Inc()
2 {
3 if(FSolver)
4 {
5 if(FType)
6 {
7 VInt Index=FSolver->FAssociatedTypeCounter.IndexOfKey(FType.Object());
8 if(Index==-1)
9 {
10 FSolver->FAssociatedTypeCounter.Add(FType,1,FType.Object());
11 }
12 else
13 {
14 FSolver->FAssociatedTypeCounter.ValueOfIndex(Index)++;
15 }
16 }
17 }
18 }
19
20 void VL_KfpIdTypeWrapper::Dec()
21 {
22 if(FSolver)
23 {
24 if(FType)
25 {
26 VInt Index=FSolver->FAssociatedTypeCounter.IndexOfKey(FType.Object());
27 if(--FSolver->FAssociatedTypeCounter.ValueOfIndex(Index)==0)
28 {
29 FSolver->FAssociatedTypeCounter.DeleteByIndex(Index);
30 }
31 }
32 }
33 }
34
35 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper(VL_KfpIdTypeSolver* Solver)
36 {
37 FSolver=Solver;
38 FSolver->FAssociatedWrappers.Add(this);
39 }
40
41 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper()
42 {
43 FSolver=0;
44 }
45
46 VL_KfpIdTypeWrapper::~VL_KfpIdTypeWrapper()
47 {
48 Dec();
49 }
50
51 VL_KfpIdTypeWrapper::VL_KfpIdTypeWrapper(const VL_KfpIdTypeWrapper& Wrapper)
52 {
53 FSolver=Wrapper.FSolver;
54 FType=Wrapper.FType;
55 Inc();
56 }
57
58 VL_KfpIdTypeWrapper& VL_KfpIdTypeWrapper::operator=(const VL_KfpIdTypeWrapper& Wrapper)
59 {
60 Dec();
61 FSolver=Wrapper.FSolver;
62 FType=Wrapper.FType;
63 Inc();
64 return *this;
65 }
66
67 VL_KfpIdTypeWrapper& VL_KfpIdTypeWrapper::operator=(VL_KfpIdType::Ptr Type)
68 {
69 Dec();
70 FType=Type;
71 Inc();
72 return *this;
73 }
74
75 VL_KfpIdType* VL_KfpIdTypeWrapper::operator->()
76 {
77 return FType.Object();
78 }
posted on 2008-10-27 05:23
陈梓瀚(vczh) 阅读(1981)
评论(6) 编辑 收藏 引用 所属分类:
脚本技术