Changeset 76 in dev for BasicCompiler32/CParameter.cpp
- Timestamp:
- Mar 21, 2007, 9:26:56 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r75 r76 39 39 } 40 40 41 Type DummyTypeInfo;41 Type dummyType; 42 42 BOOL bByVal; 43 43 if(bEllipse){ 44 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);44 NumOpe_GetType( Parms[i2], Type(), dummyType ); 45 45 bByVal=1; 46 46 } 47 47 else{ 48 DummyTypeInfo.type=params[i2]->GetBasicType(); 49 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 48 dummyType = *params[i2]; 50 49 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 51 50 } … … 59 58 } 60 59 61 LONG_PTR lpVarIndex; 62 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 60 if( !GetVarType( Parms[i2], Type(), FALSE ) ){ 63 61 //変数ではないとき 64 int reg = REG_RAX;65 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex);62 Type calcType; 63 NumOpe( Parms[i2], dummyType, calcType ); 66 64 //↑ここでスタックに積む 67 65 68 66 nCountOfTempObjects++; 69 67 70 if( type != DEF_STRUCT){68 if( !calcType.IsStruct() ){ 71 69 //一時参照を作成 72 70 … … 78 76 79 77 bool result = CheckDifferentType( 80 DummyTypeInfo.type, 81 DummyTypeInfo.u.lpIndex, 82 type, 83 lpVarIndex, 78 dummyType, 79 calcType, 84 80 procName.c_str(), 85 81 i2); … … 89 85 useTempObject = true; 90 86 91 types[i2].type = type; 92 types[i2].u.lpIndex = lpVarIndex; 87 types[i2] = calcType; 93 88 } 94 89 } … … 107 102 for(int i2=ParmsNum-1;i2>=0;i2--){ 108 103 if( useTempParameters[i2] ){ 109 if( types[i2]. type == DEF_STRUCT){104 if( types[i2].IsStruct() ){ 110 105 // 構造体の一時メモリ 111 106 … … 117 112 } 118 113 else{ 119 if( Is64Type( types[i2].type) ){114 if( types[i2].Is64() ){ 120 115 //pop ... 参照を消す 121 116 //pop ... 上位32ビット … … 133 128 } 134 129 135 void ParamImpl::SetStructParameter( CClass *pobj_Class,LPSTR Parameter){136 int object_size = pobj_Class->GetSize();130 void ParamImpl::SetStructParameter( const Type &baseType, const char *expression ){ 131 int object_size = baseType.GetClass().GetSize(); 137 132 138 133 //push object_size … … 143 138 op_call(pSub_calloc); 144 139 140 //push eax(ここでプッシュされた値が実際にパラメータとして引き渡される) 141 op_push(REG_EAX); 142 145 143 //push eax 146 144 op_push(REG_EAX); 147 145 148 149 Type BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 150 Type CalcType; 151 CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex); 152 153 /* 154 TODO: 消す 155 if( pobj_Class->GetCopyConstructorMethod() 156 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ 157 //////////////////////////////////// 158 // コピーコンストラクタを呼び出す 159 //////////////////////////////////// 160 161 //push eax 162 op_push(REG_EAX); 163 164 BOOL bUseHeap; 165 CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 166 167 //pop ecx 168 op_pop(REG_ECX); 169 170 //pop eax 171 op_pop(REG_EAX); 172 173 if(bUseHeap){ 174 //※解放用に退避 175 //mov esi,ecx 176 op_mov_RR(REG_ESI,REG_ECX); 177 } 178 179 //push ecx 180 op_push(REG_ECX); 181 182 //push eax 183 op_push(REG_EAX); 184 185 //call constructor 186 op_call(pobj_Class->GetCopyConstructorMethod()->pUserProc); 187 188 189 if(bUseHeap){ 190 FreeTempObject(REG_ESI,pobj_Class); 191 } 192 } 193 else{*/ 194 195 196 //push eax 197 op_push(REG_EAX); 198 199 /* 200 TODO: 消す 201 if( pobj_Class->GetConstructorMethod() ){ 202 //////////////////////////////// 203 // コンストラクタを呼び出す 204 //////////////////////////////// 205 206 //push this 207 op_push(REG_EAX); 208 209 //call constructor 210 op_call(pobj_Class->GetConstructorMethod()->pUserProc); 211 } 212 */ 213 214 BOOL bUseHeap; 215 CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 216 217 218 219 SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap); 220 //} 146 Type calcType; 147 BOOL bUseHeap; 148 NumOpe( expression, 149 baseType, 150 calcType, 151 &bUseHeap ); 152 153 // ※スタックにある二つのデータ(コピー先、コピー元)の値を必要とする 154 SetStructVariable( baseType, calcType, bUseHeap ); 221 155 } 222 156 … … 247 181 248 182 //パラメータをレジスタとスタックに格納 249 int CalcType;250 LONG_PTR lpCalcIndex;251 BOOL bCalcUseHeap;252 183 int ParmSize=0; 253 184 RELATIVE_VAR RelativeVar; … … 269 200 } 270 201 271 Type DummyTypeInfo;202 Type dummyType; 272 203 BOOL bByVal; 273 204 if(bEllipse){ 274 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);205 NumOpe_GetType( Parms[i2], Type(), dummyType ); 275 206 bByVal=1; 276 207 } 277 208 else{ 278 DummyTypeInfo.type=params[i2]->GetBasicType(); 279 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 280 bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE; 209 dummyType = *params[i2]; 210 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 281 211 } 282 212 … … 291 221 } 292 222 293 if( DummyTypeInfo.type==DEF_STRUCT){294 SetStructParameter( DummyTypeInfo.u.pobj_Class,Parms[i2]);223 if( dummyType.IsStruct() ){ 224 SetStructParameter( dummyType, Parms[i2] ); 295 225 goto next; 296 226 } 297 227 298 299 228 extern LONG_PTR ProcPtr_BaseIndex; 300 LONG_PTR back_ProcPtr_BaseIndex; 301 back_ProcPtr_BaseIndex=ProcPtr_BaseIndex; 302 if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex; 303 else ProcPtr_BaseIndex=-1; 304 305 CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap); 229 LONG_PTR back_ProcPtr_BaseIndex = ProcPtr_BaseIndex; 230 if( dummyType.IsProcPtr() ){ 231 ProcPtr_BaseIndex = dummyType.GetIndex(); 232 } 233 else{ 234 ProcPtr_BaseIndex=-1; 235 } 236 237 BOOL bCalcUseHeap; 238 Type calcType; 239 if( !NumOpe( Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){ 240 break; 241 } 306 242 307 243 ProcPtr_BaseIndex=back_ProcPtr_BaseIndex; 308 244 309 if(CalcType==-1) break; 310 311 if(CalcType==DEF_OBJECT){ 312 if( DummyTypeInfo.type != DEF_OBJECT 245 if( calcType.IsObject() ){ 246 if( !dummyType.IsObject() 313 247 || 314 DummyTypeInfo.type == DEF_OBJECT&&315 ! DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex) ){248 dummyType.IsObject() && 249 !dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){ 316 250 //キャスト演算子のオーバーロードに対応する 317 CallCastOperatorProc( CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);251 CallCastOperatorProc( calcType, bCalcUseHeap,dummyType ); 318 252 } 319 253 } 320 254 321 255 if(!bEllipse){ 256 //型チェック 257 // TODO: _System_ReturnValueが考慮されていない? 258 if(bHas_System_LocalThis) i3=i2-1; 259 else i3=i2; 260 CheckDifferentType( 261 dummyType, 262 calcType, 263 procName.c_str(), 264 i3); 265 } 266 267 if( dummyType.IsDouble() ){ 268 ChangeTypeToDouble( calcType.GetBasicType() ); 269 ParmSize+=sizeof(long)*2; 270 } 271 else if( dummyType.IsSingle() ){ 272 ChangeTypeToSingle( calcType.GetBasicType() ); 273 ParmSize+=sizeof(long); 274 } 275 else if( dummyType.Is64() ){ 276 ChangeTypeToInt64( calcType.GetBasicType() ); 277 ParmSize+=sizeof(long)*2; 278 } 279 else if( dummyType.IsLong() || dummyType.IsDWord() 280 || dummyType.IsPointer() 281 || dummyType.IsObject() || dummyType.IsStruct() ){ 282 ChangeTypeToLong( calcType.GetBasicType() ); 283 ParmSize+=sizeof(long); 284 } 285 else if( dummyType.IsInteger() || dummyType.IsWord() ){ 286 ChangeTypeToInteger( calcType.GetBasicType() ); 287 ParmSize+=sizeof(long); 288 } 289 else if( dummyType.IsSByte() || dummyType.IsByte() || dummyType.IsBoolean() ){ 290 ChangeTypeToByte( calcType.GetBasicType() ); 291 ParmSize+=sizeof(long); 292 } 293 else{ 294 SetError(300,NULL,cp); 295 } 296 } 297 else{ 298 //ポインタ参照 299 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 300 //ポインタ指定 301 302 Type calcType; 303 if( !NumOpe( Parms[i2]+2, dummyType, calcType) ){ 304 break; 305 } 306 307 ChangeTypeToLong( calcType.GetBasicType() ); 308 309 dummyType.PtrLevelUp(); 310 322 311 //型チェック 323 312 if(bHas_System_LocalThis) i3=i2-1; 324 313 else i3=i2; 325 314 CheckDifferentType( 326 DummyTypeInfo.type, 327 DummyTypeInfo.u.lpIndex, 328 CalcType, 329 lpCalcIndex, 315 dummyType, 316 calcType, 330 317 procName.c_str(), 331 318 i3); 332 }333 334 if(DummyTypeInfo.type==DEF_DOUBLE){335 ChangeTypeToDouble(CalcType);336 ParmSize+=sizeof(long)*2;337 }338 else if(DummyTypeInfo.type==DEF_SINGLE){339 ChangeTypeToSingle(CalcType);340 ParmSize+=sizeof(long);341 }342 else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){343 ChangeTypeToInt64(CalcType);344 ParmSize+=sizeof(long)*2;345 }346 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||347 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){348 ChangeTypeToLong(CalcType);349 ParmSize+=sizeof(long);350 }351 else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD || (isUnicode&&DummyTypeInfo.type==DEF_CHAR)){352 ChangeTypeToInteger(CalcType);353 ParmSize+=sizeof(long);354 }355 else if(DummyTypeInfo.type==DEF_SBYTE||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN || (isUnicode==false&&DummyTypeInfo.type==DEF_CHAR)){356 ChangeTypeToByte(CalcType);357 ParmSize+=sizeof(long);358 }359 else{360 SetError(300,NULL,cp);361 }362 }363 else{364 //ポインタ参照365 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){366 //ポインタ指定367 i3=NumOpe(Parms[i2]+2,0,0,0);368 369 ChangeTypeToLong(i3);370 319 } 371 320 else{ … … 373 322 //一時オブジェクトをコピー 374 323 375 if( types[i2].type != DEF_STRUCT){324 if( !types[i2].IsStruct() ){ 376 325 // 一時参照のための領域を考慮する 377 326 nCountOfNowTempObjects++; … … 393 342 else{ 394 343 //変数のアドレスを取得 395 int VarType; 396 LONG_PTR lpVarIndex; 344 Type varType; 397 345 if(GetVarOffset( 398 346 false, 399 347 false, 400 348 Parms[i2], 401 &VarType,402 349 &RelativeVar, 403 &lpVarIndex)){404 if( DummyTypeInfo.type!=DEF_ANY){350 varType)){ 351 if( !dummyType.IsAny() ){ 405 352 //型チェックを行う 406 if( DummyTypeInfo.type==VarType){407 if( DummyTypeInfo.type==DEF_OBJECT){408 if( ! DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex) ){353 if( dummyType.GetBasicType() == varType.GetBasicType() ){ 354 if( dummyType.IsObject() ){ 355 if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){ 409 356 SetError(11,Parms[i2],cp); 410 357 } 411 358 } 412 else if( DummyTypeInfo.type==DEF_STRUCT){413 if( ! DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex) ){359 else if( dummyType.IsStruct() ){ 360 if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){ 414 361 SetError(11,Parms[i2],cp); 415 362 } 416 363 } 417 364 } 418 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 365 else if( (varType.GetBasicType()&FLAG_PTR) 366 &&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){ 419 367 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 420 368 }
Note:
See TracChangeset
for help on using the changeset viewer.