實習的時候,自己的時間明顯沒有在學校的時候多啊。這次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) 閱讀(1989)
評論(6) 編輯 收藏 引用 所屬分類:
腳本技術