Changeset 75 in dev for BasicCompiler64/Compile_Calc.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_Calc.cpp
r64 r75 84 84 } 85 85 86 LONG_PTR lp; 87 if(GetVarType(variable,&lp,0)!=-1){ 86 if(GetVarType(variable,Type(),0)){ 88 87 //変数リストに該当したとき 89 88 SetError(1,NULL,cp); … … 129 128 130 129 char ObjName[VN_SIZE],array_element[VN_SIZE]; 131 CClass *pobj_c;132 130 GetArrayElement(variable,ObjName,array_element); 133 131 if(array_element[0]){ 134 i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);135 if( i2==DEF_OBJECT){132 Type varType; 133 if( GetVarType(ObjName,varType,0) && varType.IsObject() ){ 136 134 char temporary[VN_SIZE]; 137 135 sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET); … … 141 139 142 140 int idProc; 143 void *p Info;144 idProc=GetProc(temporary, &pInfo);141 void *pProc; 142 idProc=GetProc(temporary,(void **)&pProc); 145 143 if(idProc){ 146 CallProc(idProc,p Info,temporary,temp2,NULL);144 CallProc(idProc,pProc,temporary,temp2,Type()); 147 145 return; 148 146 } … … 161 159 //////////////////////////////////////// 162 160 163 int VarType,CalcType; 164 LONG_PTR lpVarIndex,lpCalcIndex; 165 BOOL bCalcUseHeap; 161 Type varType; 166 162 167 163 //型を識別 168 VarType=GetVarType(variable,&lpVarIndex,0); 169 if(VarType==-1){ 164 if( !GetVarType(variable,varType,false) ){ 170 165 171 166 // プロパティ用のメソッドを呼び出す 172 if(!CallPropertyMethod( variable,Command+i+1,NULL)){167 if(!CallPropertyMethod( variable, Command+i+1, Type() )){ 173 168 //エラーを表示 174 GetVarType(variable, &lpVarIndex,1);169 GetVarType(variable,varType,true); 175 170 } 176 171 … … 179 174 180 175 extern LONG_PTR ProcPtr_BaseIndex; 181 if( VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;176 if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex(); 182 177 else ProcPtr_BaseIndex=-1; 183 178 184 179 //NumOpe...(rax、またはxmm0に答えが格納される) 185 180 int reg=REG_RAX; 186 CalcType=NumOpe(®,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 187 188 if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){ 181 BOOL bCalcUseHeap; 182 Type calcType; 183 if( !NumOpe(®,Command+i+1,varType,calcType,&bCalcUseHeap) ){ 184 return; 185 } 186 187 if(reg!=REG_RAX&&calcType.IsWhole()|| 188 varType.IsNull()||calcType.IsNull()){ 189 189 SetError(300,NULL,cp); 190 190 } 191 192 if(VarType==-1||CalcType==-1) return;193 191 194 192 //結果を格納しているレジスタをブロッキング … … 199 197 if(!GetVarOffsetReadWrite( 200 198 variable, 201 &VarType,202 199 &VarRelativeVar, 203 &lpVarIndex, 204 NULL)) return; 200 varType)) return; 205 201 206 202 //レジスタのブロッキングを解除 207 203 pobj_BlockReg->clear(); 208 204 209 if( VarType&FLAG_PTR){205 if(varType.GetBasicType()&FLAG_PTR){ 210 206 SetError(14,variable,cp); 211 207 return; 212 208 } 213 209 214 if( VarType==DEF_STRUCT){210 if( varType.IsStruct() ){ 215 211 //構造体インスタンスへの代入 216 SetStructVariableFromRax( lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);217 return; 218 } 219 220 if( CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){212 SetStructVariableFromRax(varType,calcType,&VarRelativeVar,bCalcUseHeap); 213 return; 214 } 215 216 if( calcType.IsObject() && !calcType.Equals( varType ) ){ 221 217 //キャスト演算子のオーバーロードに対応する 222 CallCastOperatorProc(REG_RAX, CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);218 CallCastOperatorProc(REG_RAX,calcType,bCalcUseHeap,varType); 223 219 } 224 220 … … 228 224 ///////////////////////////////// 229 225 230 CheckDifferentType( VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);226 CheckDifferentType(varType,calcType,0,0); 231 227 232 228 … … 234 230 // rax(実数はxmm0)の内容を変数にコピー 235 231 ///////////////////////////////////////////////// 236 SetVariableFromRax( VarType,CalcType,&VarRelativeVar);232 SetVariableFromRax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar); 237 233 } 238 239 // TODO: 消す240 /*241 void 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(®,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_OBJECT287 && (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 TracChangeset
for help on using the changeset viewer.