Changeset 97 in dev for BasicCompiler32
- Timestamp:
- Apr 16, 2007, 3:52:40 AM (18 years ago)
- Location:
- BasicCompiler32
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Calc_PushVar.cpp
r66 r97 65 65 } 66 66 } 67 void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg ){67 void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg, bool is64Head){ 68 68 int varSize; 69 69 … … 81 81 82 82 //上位32ビットをedxにロード 83 pRelativeVar->offset+=sizeof(long); 84 SetReg_WholeVariable(DEF_LONG,pRelativeVar,REG_EDX); 85 pRelativeVar->offset-=sizeof(long); 83 SetReg_WholeVariable(DEF_LONG,pRelativeVar,REG_EDX, true); 86 84 87 85 return; 88 86 } 89 87 88 int offsetOf64Head = 0; 89 if( is64Head ){ 90 offsetOf64Head = sizeof(long); 91 } 92 90 93 if(pRelativeVar->dwKind==VAR_GLOBAL){ 91 94 if(pRelativeVar->bOffsetOffset){ 92 95 //mov reg, ptr[ecx+offset] 93 op_mov_RM(varSize,reg,REG_ECX,(int)pRelativeVar->offset ,MOD_BASE_DISP32);96 op_mov_RM(varSize,reg,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32); 94 97 } 95 98 else{ 96 99 //mov reg, ptr[offset] 97 op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset ,MOD_DISP32);100 op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset + offsetOf64Head,MOD_DISP32); 98 101 } 99 102 obp-=sizeof(long); … … 119 122 if(pRelativeVar->bOffsetOffset){ 120 123 //mov reg, ptr[ebp+ecx+offset] 121 op_mov_RM_ex(varSize,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset ,USE_OFFSET);124 op_mov_RM_ex(varSize,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,USE_OFFSET); 122 125 } 123 126 else{ 124 127 //mov reg, ptr[ebp+offset] 125 op_mov_RM(varSize,reg,REG_EBP,(int)pRelativeVar->offset ,MOD_BASE_DISP32);128 op_mov_RM(varSize,reg,REG_EBP,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32); 126 129 } 127 130 obp-=sizeof(long); … … 146 149 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){ 147 150 directmem: 148 //mov reg, ptr[ecx] 149 op_mov_RM(varSize,reg,REG_ECX,0,MOD_BASE); 151 if( is64Head ){ 152 //mov reg, ptr[ecx] 153 op_mov_RM(varSize,reg,REG_ECX,offsetOf64Head,MOD_BASE_DISP8); 154 } 155 else{ 156 //mov reg, ptr[ecx] 157 op_mov_RM(varSize,reg,REG_ECX,0,MOD_BASE); 158 } 150 159 } 151 160 } -
BasicCompiler32/Compile_CallProc.cpp
r77 r97 116 116 if( pUserProc->GetParentClassPtr() ){ 117 117 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う 118 if(ObjectName[0] ){118 if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){ 119 119 if(lstrcmpi(ObjectName,"Super")==0){ 120 120 //クラスメンバ関数内から基底クラスの呼び出し … … 272 272 ////////////////////////////////////////////////////// 273 273 274 if(ObjectName[0] ){274 if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){ 275 275 if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember; 276 276 else{ -
BasicCompiler32/Compile_Func.cpp
r88 r97 205 205 } 206 206 207 if( type.IsString Object() ){207 if( type.IsStringClass() ){ 208 208 //Stringオブジェクトの場合 209 209 sprintf(temporary,"%s.Length",tempParm); -
BasicCompiler32/Compile_Var.cpp
r96 r97 336 336 337 337 return true; 338 }339 void GetWithName(char *buffer){340 extern WITHINFO WithInfo;341 int i;342 343 buffer[0]=0;344 for(i=0;i<WithInfo.num;i++)345 lstrcat(buffer,WithInfo.ppName[i]);346 338 } 347 339 … … 836 828 } 837 829 else if( type.IsLong() || type.IsDWord() || type.IsPointer() ){ 838 if(type.GetBasicType()==typeOfPtrChar &&calcType.GetIndex()==LITERAL_STRING){830 if(type.GetBasicType()==typeOfPtrChar){ 839 831 //文字列定数のとき 840 832 … … 1022 1014 } 1023 1015 else if( type.IsDWord() || type.IsLong() || type.IsPointer() ){ 1024 if(type.GetBasicType()==typeOfPtrChar &&calcType.GetIndex()==LITERAL_STRING){1016 if(type.GetBasicType()==typeOfPtrChar){ 1025 1017 //文字列定数のとき 1026 1018 … … 1307 1299 } 1308 1300 } 1301 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar){ 1302 if( reg != REG_EAX ){ 1303 SetError(); 1304 //TODO: 未完成 1305 } 1306 SetVarPtrToEax( pRelativeVar ); 1307 } 1309 1308 1310 1309 bool Compile_AddGlobalRootsForGc(){ -
BasicCompiler32/NumOpe.cpp
r94 r97 83 83 } 84 84 85 85 void ExtendRegToBigType( int reg, int bigBasicType, int baseBasicType ){ 86 if( reg != REG_EAX ){ 87 SetError(); 88 } 89 switch( Type::GetBasicSize( bigBasicType ) ){ 90 case sizeof(_int64): 91 ExtendTypeTo64(baseBasicType); 92 break; 93 case sizeof(long): 94 ExtendTypeTo32(baseBasicType,reg); 95 break; 96 case sizeof(short): 97 ExtendTypeTo16(baseBasicType,reg); 98 break; 99 } 100 } 101 102 103 104 bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){ 105 const int useReg = REG_EAX; 106 107 //大きな型への暗黙の変換 108 int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 109 110 if(resultType.GetBasicType()&FLAG_PTR){ 111 //配列ポインタ 112 resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) ); 113 114 SetVarPtrToReg(useReg, &relativeVar); 115 } 116 else if( resultType.IsStruct() ){ 117 //構造体ポインタをeaxへ格納(構造体は値型) 118 SetVarPtrToReg(useReg, &relativeVar); 119 } 120 else if( resultType.IsReal() ){ 121 // 実数 122 SetReg_RealVariable( resultType.GetBasicType(), &relativeVar ); 123 } 124 else if( resultType.IsWhole() || resultType.IsObject()){ 125 //整数型 126 SetReg_WholeVariable(resultType.GetBasicType(),&relativeVar,useReg); 127 } 128 else if( resultType.IsStruct() ){ 129 //構造体ポインタをUseRegへ格納(構造体は値型) 130 SetVarPtrToReg(useReg,&relativeVar); 131 } 132 else{ 133 return false; 134 } 135 136 if( resultType.GetBasicType() != bigType ){ 137 // 大きな型へ変換された場合 138 // ※レジスタの値をキャストする 139 ExtendRegToBigType( useReg, bigType, resultType.GetBasicType() ); 140 141 resultType.SetBasicType( bigType ); 142 } 143 144 return true; 145 } 146 bool TermMemberOpe( const CClass &objClass, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member ){ 147 const int useReg = REG_EAX; 148 149 if( GetMemberType( objClass, member, resultType, 0, false ) ){ 150 // メンバが見つかったとき 151 152 //オブジェクトポインタをecxにコピー 153 op_mov_RR( REG_ECX, useReg ); 154 155 RELATIVE_VAR relativeVar; 156 relativeVar.dwKind=VAR_DIRECTMEM; 157 158 if( !_member_offset( 159 true, //エラー表示あり 160 false, //読み込み専用 161 objClass, 162 member,&relativeVar,resultType,0)){ 163 return false; 164 } 165 166 if( !VarToReg( relativeVar, baseType, resultType ) ){ 167 SetError(11,termFull,cp); 168 } 169 170 return true; 171 } 172 173 174 /////////////////////////////////////////////////////////////////// 175 // 動的メソッドを検索 176 /////////////////////////////////////////////////////////////////// 177 vector<UserProc *> userProcs; 178 179 char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1]; 180 CClass::RefType refType; 181 lstrcpy( methodName, member ); 182 GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType); 183 184 objClass.EnumMethod( methodName, userProcs ); 185 UserProc *pUserProc; 186 if(userProcs.size()){ 187 //オーバーロードを解決 188 pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft); 189 190 if( pUserProc ){ 191 192 resultType = pUserProc->ReturnType(); 193 194 { 195 //オブジェクトポインタをスタックに入れておく 196 //push reg 197 op_push( useReg ); 198 199 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft,0 ) ){ 200 201 return false; 202 } 203 204 op_pop(); 205 206 ///////////////////// 207 // 戻り値の処理 208 ///////////////////// 209 210 //大きな型への暗黙の変換 211 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 212 213 if( resultType.GetBasicType() != bigType ){ 214 // 大きな型へ変換された場合 215 // ※レジスタの値をキャストする 216 ExtendRegToBigType( REG_EAX, bigType, resultType.GetBasicType() ); 217 218 resultType.SetBasicType( bigType ); 219 } 220 221 //SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 222 } 223 224 return true; 225 } 226 } 227 228 return false; 229 } 230 bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL ){ 231 char parameter[VN_SIZE]; 232 233 // Withを解決 234 char termFull[VN_SIZE]; 235 if(term[0]=='.'){ 236 GetWithName(termFull); 237 lstrcat(termFull,term); 238 } 239 else lstrcpy(termFull,term); 240 241 char termLeft[VN_SIZE]; 242 lstrcpy(termLeft,termFull); 243 244 // パース 245 char member[VN_SIZE]; 246 CClass::RefType refType; 247 if( SplitMemberName( termFull, termLeft, member, refType ) ){ 248 /////////////////////////////////////////////////////////////////// 249 // オブジェクトとメンバに分解できるとき 250 // termLeft.member 251 /////////////////////////////////////////////////////////////////// 252 253 isLiteral = false; 254 255 // オブジェクト側の型を取得 256 bool isClassName = false; 257 Type leftType; 258 if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){ 259 return false; 260 } 261 262 if( isClassName ){ 263 // 静的メンバ/メソッドの場合 264 goto globalArea; 265 } 266 267 if( !leftType.HasMember() ){ 268 // メンバを持たない型の場合 269 return false; 270 } 271 272 return TermMemberOpe( leftType.GetClass(), baseType, resultType, termFull, termLeft, member ); 273 } 274 275 276 ////////////////////////////////////////////// 277 // クラス名かどうかをチェック(静的メンバ用) 278 ////////////////////////////////////////////// 279 280 if( pIsClassName ){ 281 if( pobj_DBClass->check( termFull ) ){ 282 *pIsClassName = true; 283 return true; 284 } 285 } 286 287 288 ///////////////////////////////////////////////////////////////// 289 // グローバル属性エリア 290 ///////////////////////////////////////////////////////////////// 291 globalArea: 292 293 const int useReg = REG_EAX; 294 295 296 if(lstrcmpi(termFull,"This")==0){ 297 //Thisオブジェクト 298 resultType.SetType( DEF_OBJECT, pobj_CompilingClass ); 299 300 SetThisPtrToReg( useReg ); 301 302 isLiteral = false; 303 304 return true; 305 } 306 307 308 ////////////////////////////////////// 309 // 関数(DLL、ユーザー定義、組み込み) 310 ////////////////////////////////////// 311 char procName[VN_SIZE]; 312 char temporary[8192]; 313 314 int i2=GetCallProcName(termFull,procName); 315 if(termFull[i2]=='('){ 316 int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1); 317 318 void *pInfo; 319 int idProc=GetProc(procName,(void **)&pInfo); 320 321 if(idProc){ 322 //閉じカッコ")"に続く文字がNULLでないとき 323 if(termFull[i2+1+i4+1]!='\0'){ 324 SetError(42,NULL,cp); 325 } 326 327 328 { 329 //////////////// 330 // 呼び出し 331 //////////////// 332 333 CallProc(idProc,pInfo,procName,parameter,resultType); 334 335 336 ///////////////////// 337 // 戻り値の処理 338 ///////////////////// 339 340 //大きな型への暗黙の変換 341 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 342 343 /* 344 ※後でNumOpe内でプッシュする 345 //スタックへプッシュ 346 PushReturnValue( resultType.GetBasicType() ); 347 */ 348 349 if( resultType.GetBasicType() != bigType ){ 350 // 大きな型へ変換された場合 351 // ※レジスタの値をキャストする 352 ExtendRegToBigType( useReg, bigType, resultType.GetBasicType() ); 353 354 resultType.SetBasicType( bigType ); 355 } 356 357 //SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 358 } 359 360 361 if(resultType.IsStruct()){ 362 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 363 //※後にfreeする必要あり 364 // TODO: 解放はGCに任せる 365 *pbUseHeap = 1; 366 } 367 368 isLiteral = false; 369 370 return true; 371 } 372 else if(GetConstCalcBuffer(procName,parameter,temporary)){ 373 ///////////////////////// 374 // マクロ関数 375 ///////////////////////// 376 377 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 378 if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 379 380 //マクロ関数の場合 381 NumOpe(useReg, temporary,Type(),resultType); 382 383 if(!IS_LITERAL(resultType.GetIndex())){ 384 //リテラル値ではなかったとき 385 isLiteral = false; 386 } 387 388 return true; 389 } 390 } 391 392 393 //////////////////////////////// 394 // インデクサ(getアクセサ) 395 //////////////////////////////// 396 397 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 398 GetArrayElement(termFull,VarName,ArrayElements); 399 if(ArrayElements[0]){ 400 GetVarType(VarName,resultType,false); 401 if( resultType.IsObject() ){ 402 CallIndexerGetterProc(/*UseReg,*/&resultType.GetClass(),VarName,ArrayElements,resultType); 403 404 isLiteral = false; 405 406 return true; 407 } 408 } 409 410 411 //////////////////////////////// 412 // 変数 413 //////////////////////////////// 414 415 RELATIVE_VAR relativeVar; 416 if(GetVarOffset( 417 false, //エラー表示なし 418 false, //読み込み専用 419 termFull, 420 &relativeVar,resultType)){ 421 ////////// 422 // 変数 423 ////////// 424 425 if( !VarToReg( relativeVar, baseType, resultType ) ){ 426 SetError(11,termFull,cp); 427 } 428 429 isLiteral = false; 430 431 return true; 432 } 433 434 435 ///////////////////////////////// 436 // プロパティ用のメソッド 437 ///////////////////////////////// 438 439 //配列要素を排除 440 GetArrayElement(termFull,VarName,ArrayElements); 441 442 if(GetSubHash(VarName,0)){ 443 444 { 445 CallPropertyMethod(termFull,NULL,resultType); 446 447 //大きな型への暗黙の変換 448 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 449 450 if( resultType.GetBasicType() != bigType ){ 451 // 大きな型へ変換された場合 452 // ※レジスタの値をキャストする 453 ExtendRegToBigType( REG_EAX, bigType, resultType.GetBasicType() ); 454 455 resultType.SetBasicType( bigType ); 456 } 457 458 //SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 459 } 460 461 462 if(resultType.IsStruct()){ 463 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 464 //※後にfreeする必要あり 465 // TODO: 解放はGCに任せる 466 *pbUseHeap = 1; 467 } 468 469 isLiteral = false; 470 471 return true; 472 } 473 474 475 return false; 476 } 477 478 479 bool NumOpe( int reg, 480 const char *expression, 481 const Type &baseType, 482 Type &resultType, 483 BOOL *pbUseHeap ){ 484 485 if( !NumOpe( expression, baseType, resultType, pbUseHeap ) ){ 486 return false; 487 } 488 489 if( reg != REG_EAX ){ 490 // TODO: 未実装 491 SetError(); 492 } 493 494 if( resultType.IsReal() ){ 495 //fld ptr[esp] 496 op_fld_ptr_esp( resultType.GetBasicType() ); 497 498 //add esp,size 499 op_add_esp( resultType.GetBasicSize() ); 500 } 501 else{ 502 //pop eax 503 op_pop(REG_EAX); 504 505 if( resultType.Is64() ){ 506 //pop edx 507 op_pop(REG_EDX); 508 } 509 } 510 return true; 511 } 86 512 bool NumOpe( const char *expression, 87 513 const Type &baseType, … … 89 515 BOOL *pbUseHeap ){ 90 516 91 int i,i2,i3 ,i4;92 char temporary[1024],temp2[1024] ,temp3[1024];517 int i,i2,i3; 518 char temporary[1024],temp2[1024]; 93 519 94 520 if(expression[0]=='\0'){ … … 260 686 term=values[i]; 261 687 688 if( calc[i+1]%100 == CALC_AS ){ 689 // As演算子の右辺値 690 //型名 691 if( Type::StringToType( term, resultType ) ){ 692 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 693 } 694 else{ 695 SetError(3, term, cp ); 696 goto error; 697 } 698 699 type_stack[sp] = resultType.GetBasicType(); 700 index_stack[sp] = resultType.GetIndex(); 701 sp++; 702 703 break; 704 } 705 262 706 if(term[0]=='\"'){ 263 707 //リテラル文字列 … … 269 713 StrLiteral: 270 714 271 if( baseType.IsObject() ){ 272 if( baseType.IsStringObject() ){ 273 //要求タイプがStringのとき 274 275 //String型オブジェクトを生成 276 NewStringObject(term); 277 278 extern CClass *pobj_StringClass; 279 type_stack[sp]=DEF_OBJECT; 280 index_stack[sp]=(LONG_PTR)pobj_StringClass; 281 bLiteralCalculation=0; 282 283 sp++; 284 break; 285 } 715 if( baseType.IsObject() || baseType.IsNull() ){ 716 //要求タイプがオブジェクト、または未定のとき 717 718 //String型オブジェクトを生成 719 NewStringObject(term); 720 721 extern CClass *pobj_StringClass; 722 type_stack[sp]=DEF_OBJECT; 723 index_stack[sp]=(LONG_PTR)pobj_StringClass; 724 bLiteralCalculation=0; 725 726 sp++; 727 break; 286 728 } 287 729 … … 317 759 // 何らかの識別子 318 760 319 ////////////////////////////////////// 320 // 関数(DLL、ユーザー定義、組み込み) 321 ////////////////////////////////////// 322 323 i2=GetCallProcName(term,temporary); 324 if(term[i2]=='('){ 325 i4=GetStringInPare_RemovePare(temp2,term+i2+1); 326 327 void *pInfo; 328 int idProc=GetProc(temporary,(void **)&pInfo); 329 330 Type resultType; 331 if(idProc){ 332 //閉じカッコ")"に続く文字がNULLでないとき 333 if(term[i2+1+i4+1]!='\0'){ 334 if( term[i2+1+i4+1] == '.' 335 || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){ 336 goto NonProc; 761 bool isLiteral; 762 if( TermOpe( term, baseType, resultType, isLiteral, &bUseHeap[sp] ) ){ 763 if(resultType.IsNull()){ 764 //戻り値が存在しないとき 765 for(i2=0;;i2++){ 766 if(term[i2]=='('||term[i2]=='\0'){ 767 term[i2]=0; 768 break; 769 } 770 } 771 SetError(38,term,cp); 772 773 goto error; 774 } 775 776 type_stack[sp] = resultType.GetBasicType(); 777 index_stack[sp] = resultType.GetIndex(); 778 779 if( !isLiteral ){ 780 bLiteralCalculation=0; 781 } 782 783 if( resultType.GetBasicType() & FLAG_CAST ){ 784 // 型名のみ 785 SetError(); 786 } 787 else{ 788 if( resultType.IsReal() ){ 789 //sub esp,size 790 //fstp ptr[esp] 791 op_fstp_push( resultType ); 792 } 793 else{ 794 if( resultType.Is64() ){ 795 //push edx 796 op_push( REG_EDX ); 337 797 } 338 798 else{ 339 SetError(42,NULL,cp);799 ExtendTypeTo32( resultType.GetBasicType(), REG_EAX ); 340 800 } 801 802 //push eax 803 op_push( REG_EAX ); 341 804 } 342 343 ////////////////344 // 呼び出し345 ////////////////346 347 CallProc(idProc,pInfo,temporary,temp2,resultType);348 if(resultType.IsNull()){349 //戻り値が存在しないとき350 for(i2=2;;i2++){351 if(term[i2]=='('||term[i2]=='\0'){352 term[i2]=0;353 break;354 }355 }356 SetError(38,term,cp);357 358 goto error;359 }360 361 362 /////////////////////363 // 戻り値の処理364 /////////////////////365 366 //大きな型への暗黙の変換367 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());368 index_stack[sp] = resultType.GetIndex();369 bLiteralCalculation=0;370 371 //スタックへプッシュ372 PushReturnValue( resultType.GetBasicType() );373 374 if( Is64Type(type_stack[sp])375 && resultType.IsWhole()376 && resultType.GetBasicSize() <= sizeof(long) ){377 //必要に応じて64ビット拡張378 ExtendStackTo64( resultType.GetBasicType() );379 }380 381 if( resultType.IsStruct() ){382 //構造体が戻ったときはヒープ領域にインスタンスが格納されている383 //※後にfreeする必要あり384 bUseHeap[sp]=1;385 }386 387 sp++;388 break;389 805 } 390 else if(GetConstCalcBuffer(temporary,temp2,temp3)){ 391 ///////////////////////// 392 // マクロ関数 393 ///////////////////////// 394 395 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 396 if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 397 398 //マクロ関数の場合 399 NumOpe(temp3,Type(),resultType); 400 401 if(!IS_LITERAL(resultType.GetIndex())){ 402 //リテラル値ではなかったとき 403 bLiteralCalculation=0; 404 } 405 406 type_stack[sp] = resultType.GetBasicType(); 407 index_stack[sp] = resultType.GetIndex(); 408 409 sp++; 410 break; 411 } 412 } 413 NonProc: 414 415 416 //インデクサ(getアクセサ) 417 char variable[VN_SIZE],array_element[VN_SIZE]; 418 GetArrayElement(term,variable,array_element); 419 if(array_element[0]){ 420 Type resultType; 421 GetVarType(variable,resultType,0); 422 if( resultType.IsObject() ){ 423 CallIndexerGetterProc(&resultType.GetClass(),variable,array_element,resultType); 424 type_stack[sp]=resultType.GetBasicType(); 425 index_stack[sp]=resultType.GetIndex(); 426 bLiteralCalculation=0; 427 428 //push eax 429 op_push(REG_EAX); 430 431 sp++; 432 break; 433 } 806 807 sp++; 808 break; 434 809 } 435 810 … … 451 826 //push 0 452 827 op_push_V( 0 ); 453 454 sp++;455 break;456 }457 458 RELATIVE_VAR RelativeVar;459 Type varType;460 if(GetVarOffset(461 false, //エラー表示あり462 false, //読み込み専用463 term,464 &RelativeVar,varType)){465 //////////466 // 変数467 //////////468 469 //大きな型への暗黙の変換470 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());471 index_stack[sp] = varType.GetIndex();472 bLiteralCalculation=0;473 474 if(varType.GetBasicType()&FLAG_PTR){475 //配列ポインタ476 type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);477 478 SetVarPtrToEax(&RelativeVar);479 480 //push eax481 op_push(REG_EAX);482 }483 else if( varType.IsStruct() ){484 //構造体ポインタをeaxへ格納(構造体は値型)485 SetVarPtrToEax(&RelativeVar);486 487 //push eax488 op_push(REG_EAX);489 }490 else if( varType.GetBasicSize() == sizeof(_int64) ){491 //64ビット型492 PushDoubleVariable(&RelativeVar);493 }494 else if( varType.GetBasicSize() == sizeof(long) ){495 //32ビット型496 PushLongVariable(&RelativeVar);497 }498 else if( varType.IsInteger() ){499 PushIntegerVariable(&RelativeVar);500 }501 else if( varType.IsWord() ){502 PushWordVariable(&RelativeVar);503 }504 else if( varType.IsSByte() ){505 PushCharVariable(&RelativeVar);506 }507 else if( varType.IsByte() || varType.IsBoolean() ){508 PushByteVariable(&RelativeVar);509 }510 else SetError(11,term,cp);511 512 if( Is64Type(type_stack[sp])513 && varType.IsWhole()514 && varType.GetBasicSize()<=sizeof(long)){515 //必要に応じて64ビット拡張516 ExtendStackTo64( varType.GetBasicType() );517 }518 828 519 829 sp++; … … 556 866 557 867 558 //////////////559 // 型名の場合560 //////////////561 Type tempType;562 if( Type::StringToType( term, tempType ) ){563 type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;564 index_stack[sp] = tempType.GetIndex();565 sp++;566 break;567 }568 569 570 /////////////////////////////////571 // プロパティ用のメソッド572 /////////////////////////////////573 574 //配列要素を排除575 char VarName[VN_SIZE],ArrayElements[VN_SIZE];576 GetArrayElement(term,VarName,ArrayElements);577 578 if(GetSubHash(VarName,0)){579 Type resultType;580 CallPropertyMethod(term,NULL,resultType);581 582 //大きな型への暗黙の変換583 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());584 index_stack[sp]=resultType.GetIndex();585 bLiteralCalculation=0;586 587 //スタックへプッシュ588 PushReturnValue( resultType.GetBasicType() );589 590 if(type_stack[sp]==DEF_STRUCT){591 //構造体が戻ったときはヒープ領域にインスタンスが格納されている592 //※後にfreeする必要あり593 bUseHeap[sp]=1;594 }595 596 sp++;597 break;598 }599 600 601 602 868 //該当する識別子が見当たらないときはエラー扱いにする 603 869 bError=1; -
BasicCompiler32/NumOpe_Relation.cpp
r64 r97 1 1 #include "../BasicCompiler_Common/common.h" 2 2 #include "Opcode.h" 3 4 void AutoExtendToBigType( int *type_stack,int sp, int reg1, int reg2 ){ 5 /* 6 int bigSize = GetTypeSize( type_stack[sp-1], -1 ); 7 if( bigSize != GetTypeSize( type_stack[sp-2], -1 ) ){ 8 int extReg = reg2; 9 int oldType = type_stack[sp-2]; 10 if( bigSize < GetTypeSize( type_stack[sp-2], -1 ) ){ 11 bigSize = GetTypeSize( type_stack[sp-2], -1 ); 12 extReg = reg1; 13 oldType = type_stack[sp-1]; 14 } 15 if( bigSize == 2 ){ 16 ExtendTypeTo16( oldType, extReg ); 17 } 18 else if( bigSize == 4 ){ 19 ExtendTypeTo32( oldType, extReg ); 20 } 21 else{ 22 SetError(); 23 } 24 }*/ 25 } 26 3 27 4 28 BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){ … … 195 219 //pop eax 196 220 op_pop(REG_EAX); 221 222 // どちらかのサイズが足りない場合は自動拡張する 223 AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX ); 197 224 198 225 //sub esp,4 … … 434 461 op_pop(REG_EAX); 435 462 463 // どちらかのサイズが足りない場合は自動拡張する 464 AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX ); 465 436 466 //sub esp,4 437 467 op_sub_esp(4); … … 675 705 op_pop(REG_EAX); 676 706 707 // どちらかのサイズが足りない場合は自動拡張する 708 AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX ); 709 677 710 //sub esp,4 678 711 op_sub_esp(4); … … 911 944 //pop eax 912 945 op_pop(REG_EAX); 946 947 // どちらかのサイズが足りない場合は自動拡張する 948 AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX ); 913 949 914 950 //sub esp,4 … … 1115 1151 op_pop(REG_EBX); 1116 1152 1153 // どちらかのサイズが足りない場合は自動拡張する 1154 AutoExtendToBigType( type, sp, REG_EAX, REG_EBX ); 1155 1117 1156 //sub esp,4 1118 1157 op_sub_esp(4); … … 1306 1345 op_pop(REG_EBX); 1307 1346 1347 // どちらかのサイズが足りない場合は自動拡張する 1348 AutoExtendToBigType( type, sp, REG_EAX, REG_EBX ); 1349 1308 1350 //sub esp,4 1309 1351 op_sub_esp(4); -
BasicCompiler32/Opcode.h
r95 r97 102 102 //NumOpe.cpp 103 103 void PushReturnValue(int type); 104 bool NumOpe( int reg, 105 const char *expression, 106 const Type &baseType, 107 Type &resultType, 108 BOOL *pbUseHeap = NULL ); 104 109 bool NumOpe( const char *Command, 105 110 const Type &baseType, … … 151 156 void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset); 152 157 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative); 158 void ExtendTypeTo64(int type); 159 void ExtendTypeTo32(int type,int reg); 160 void ExtendTypeTo16(int type,int reg); 153 161 154 162 //increment.cpp … … 168 176 //Compile_Calc_PushVar.cpp 169 177 void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar); 170 void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg );178 void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg, bool is64Head = false); 171 179 void PushDoubleVariable(RELATIVE_VAR *pRelativeVar); 172 180 void PushLongVariable(RELATIVE_VAR *pRelativeVar); … … 182 190 //Compile_Var.cpp 183 191 void SetRelativeOffset( RELATIVE_VAR &relativeVar ); 184 void GetWithName(char *buffer);192 bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess); 185 193 void SetThisPtrToReg(int reg); 186 194 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = 0); … … 192 200 void dim( char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 193 201 void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar); 202 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar); 194 203 bool Compile_AddGlobalRootsForGc(); 195 204 … … 314 323 void op_push(int reg); 315 324 void op_push_V(long data); 316 void op_pop(int reg );325 void op_pop(int reg = REG_NON); 317 326 void op_add_esp(int num); 318 327 void op_sub_esp(int num); … … 328 337 void op_fstp_base_offset (int type,int base_reg,int offset); 329 338 void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,int offset,BOOL bUseOffset); 339 void op_fstp_push ( Type &type ); 330 340 void op_fistp_ptr_esp ( int typeSize ); 331 341 void op_zero_reg(int reg); -
BasicCompiler32/op32_main.cpp
r75 r97 864 864 SetError(); 865 865 } 866 } 867 void op_fstp_push( Type &type ){ 868 //sub esp,size 869 op_sub_esp( type.GetBasicSize() ); 870 871 op_fstp_basereg( type.GetBasicType(), REG_ESP ); 866 872 } 867 873
Note:
See TracChangeset
for help on using the changeset viewer.