source: dev/BasicCompiler64/Compile_Calc.cpp@ 64

Last change on this file since 64 was 64, checked in by dai_9181, 17 years ago

すべてのオブジェクトを参照型に切り替えた。

File size: 7.4 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
5 /////////////////////////////////////////////////
6 // raxの内容を変数にコピーするコードを抽出
7 /////////////////////////////////////////////////
8
9 if(VarType==DEF_BOOLEAN){
10 //bool
11 SetBooleanVariable(CalcType,pRelativeVar);
12 }
13 else if( IsRealNumberType( VarType ) ){
14 // Double/Single型変数へレジスタの値を代入
15 SetRealVariable(VarType, CalcType, pRelativeVar);
16 }
17 else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){
18 int typeSize = GetTypeSize( VarType, -1 );
19
20 //整数変数へraxの値を格納する
21 SetWholeVariable( typeSize, CalcType, pRelativeVar );
22 }
23 else{
24 SetError(300,NULL,cp);
25 }
26}
27void OpcodeCalc(char *Command){
28 int i,i2,i3;
29 char variable[VN_SIZE];
30
31
32
33 //////////////////////////////////////
34 // インクリメント・デクリメント
35 //////////////////////////////////////
36
37 for(i=0;;i++){
38 if(Command[i]=='\"'){
39 //ダブルクォートは不正なのでエラー扱い
40 variable[i]=0;
41 SetError(3,variable,cp);
42 return;
43 }
44
45 if(Command[i]=='('){
46 i2=GetStringInPare(variable+i,Command+i);
47 i+=i2-1;
48 continue;
49 }
50 if(Command[i]=='['){
51 i2=GetStringInBracket(variable+i,Command+i);
52 i+=i2-1;
53 continue;
54 }
55 if(Command[i]=='\0'){
56
57 ///////////////////////////////////
58 // インクリメント・デクリメント
59 ///////////////////////////////////
60
61 if(i>2){
62 if(Command[i-2]=='+'&&Command[i-1]=='+'){
63 //インクリメント
64 variable[i-2]=0;
65 IncDec(CALC_ADDITION,variable,"1");
66 return;
67 }
68 else if(Command[i-2]=='-'&&Command[i-1]=='-'){
69 //デクリメント
70 variable[i-2]=0;
71 IncDec(CALC_SUBTRACTION,variable,"1");
72 return;
73 }
74 }
75
76
77 //先端部分の識別子をエラーキーワードにする
78 for(i=0;;i++){
79 if(!IsVariableChar(Command[i])){
80 variable[i]=0;
81 break;
82 }
83 variable[i]=Command[i];
84 }
85
86 LONG_PTR lp;
87 if(GetVarType(variable,&lp,0)!=-1){
88 //変数リストに該当したとき
89 SetError(1,NULL,cp);
90 }
91 else{
92 if(GetConstHash(variable)){
93 //定数リストに該当したとき
94 SetError(1,NULL,cp);
95 }
96 else{
97 //変数リスト、定数リストに該当しないとき
98 SetError(3,variable,cp);
99 }
100 }
101 return;
102 }
103
104 i2=GetCalcId(Command+i,&i3);
105 if(i2){
106 variable[i]=0;
107
108 if(Command[i]=='=') break;
109
110 if(Command[i+1+i3]=='='){
111 IncDec(i2,variable,Command+i+1+i3+1);
112 return;
113 }
114 }
115
116 variable[i]=Command[i];
117 }
118
119 if(Command[i+1]=='\0'){
120 SetError(1,NULL,cp);
121 return;
122 }
123
124
125
126 ///////////////////////////////////////////////////////////////
127 // インデクサのsetアクセサ([]=演算子のオーバーロードに対応)
128 ///////////////////////////////////////////////////////////////
129
130 char ObjName[VN_SIZE],array_element[VN_SIZE];
131 CClass *pobj_c;
132 GetArrayElement(variable,ObjName,array_element);
133 if(array_element[0]){
134 i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
135 if(i2==DEF_OBJECT){
136 char temporary[VN_SIZE];
137 sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
138
139 char temp2[VN_SIZE];
140 sprintf(temp2,"%s,%s",array_element,Command+i+1);
141
142 int idProc;
143 void *pInfo;
144 idProc=GetProc(temporary,&pInfo);
145 if(idProc){
146 CallProc(idProc,pInfo,temporary,temp2,NULL);
147 return;
148 }
149 }
150 }
151
152
153 if( lstrcmpi( variable, "This" ) == 0 ){
154 SetError(133,NULL,cp);
155 return;
156 }
157
158
159 ////////////////////////////////////////
160 // 変数のタイプ型を識別して、演算を行う
161 ////////////////////////////////////////
162
163 int VarType,CalcType;
164 LONG_PTR lpVarIndex,lpCalcIndex;
165 BOOL bCalcUseHeap;
166
167 //型を識別
168 VarType=GetVarType(variable,&lpVarIndex,0);
169 if(VarType==-1){
170
171 // プロパティ用のメソッドを呼び出す
172 if(!CallPropertyMethod(variable,Command+i+1,NULL)){
173 //エラーを表示
174 GetVarType(variable,&lpVarIndex,1);
175 }
176
177 return;
178 }
179
180 extern LONG_PTR ProcPtr_BaseIndex;
181 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
182 else ProcPtr_BaseIndex=-1;
183
184 //NumOpe...(rax、またはxmm0に答えが格納される)
185 int reg=REG_RAX;
186 CalcType=NumOpe(&reg,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
187
188 if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){
189 SetError(300,NULL,cp);
190 }
191
192 if(VarType==-1||CalcType==-1) return;
193
194 //結果を格納しているレジスタをブロッキング
195 pobj_BlockReg->lock(reg);
196
197 //変数アドレスを取得
198 RELATIVE_VAR VarRelativeVar;
199 if(!GetVarOffsetReadWrite(
200 variable,
201 &VarType,
202 &VarRelativeVar,
203 &lpVarIndex,
204 NULL)) return;
205
206 //レジスタのブロッキングを解除
207 pobj_BlockReg->clear();
208
209 if(VarType&FLAG_PTR){
210 SetError(14,variable,cp);
211 return;
212 }
213
214 if(VarType==DEF_STRUCT ){
215 //構造体インスタンスへの代入
216 SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
217 return;
218 }
219
220 if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
221 //キャスト演算子のオーバーロードに対応する
222 CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
223 }
224
225
226 /////////////////////////////////
227 // 右辺、左辺の型チェックを行う
228 /////////////////////////////////
229
230 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
231
232
233 /////////////////////////////////////////////////
234 // rax(実数はxmm0)の内容を変数にコピー
235 /////////////////////////////////////////////////
236 SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
237}
238
239// TODO: 消す
240/*
241void SetRefVariable( const char *varname, const char *expression ){
242 ////////////////////////////////////////
243 // 変数のタイプ型を識別して、演算を行う
244 ////////////////////////////////////////
245
246 int VarType,CalcType;
247 LONG_PTR lpVarIndex,lpCalcIndex;
248 BOOL bCalcUseHeap;
249
250 //型を識別
251 VarType=GetVarType(varname,&lpVarIndex,0);
252 if(VarType==-1){
253 SetError(300,NULL,cp);
254 return;
255 }
256
257 extern LONG_PTR ProcPtr_BaseIndex;
258 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
259 else ProcPtr_BaseIndex=-1;
260
261 //NumOpe...(rax、またはxmm0に答えが格納される)
262 int reg=REG_RAX;
263 CalcType=NumOpe(&reg,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
264
265 //結果を格納しているレジスタをブロッキング
266 pobj_BlockReg->lock(reg);
267
268 if(VarType==-1||CalcType==-1) return;
269
270 //変数アドレスを取得
271 RELATIVE_VAR VarRelativeVar;
272 if(!GetVarOffsetReadWrite(
273 varname,
274 &VarType,
275 &VarRelativeVar,
276 &lpVarIndex)) return;
277
278 //レジスタのブロッキングを解除
279 pobj_BlockReg->clear();
280
281 if(VarType&FLAG_PTR){
282 SetError(14,varname,cp);
283 return;
284 }
285
286 if( VarType == DEF_OBJECT
287 && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){
288 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
289 PTR_LEVEL_UP( VarType );
290
291 if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){
292 VarRelativeVar.dwKind = VAR_GLOBAL;
293 }
294 else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){
295 VarRelativeVar.dwKind = VAR_LOCAL;
296 }
297
298 if( CalcType == DEF_OBJECT ){
299 //右辺値が実体オブジェクトのときは、参照をコピー
300 PTR_LEVEL_UP( CalcType );
301 }
302 }
303 else{
304 SetError(300,NULL,cp);
305 }
306
307
308 /////////////////////////////////
309 // 右辺、左辺の型チェックを行う
310 /////////////////////////////////
311
312 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
313
314
315 /////////////////////////////////////////////////
316 // rax(実数はxmm0)の内容を変数にコピー
317 /////////////////////////////////////////////////
318 SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
319}
320*/
Note: See TracBrowser for help on using the repository browser.