Changeset 20 in dev
- Timestamp:
- Dec 28, 2006, 5:24:48 AM (18 years ago)
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r11 r20 331 331 } 332 332 333 void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 334 /////////////////////////////////////////////////////// 335 // 一時オブジェクトをあらかじめスタックに積んでおく 336 /////////////////////////////////////////////////////// 337 //TODO: 64ビットコードのままなので、32ビット用に書き換える 338 339 useTempObject = false; 340 341 //一時オブジェクトの数 342 nCountOfTempObjects = 0; 343 344 BOOL bEllipse; 345 if(pi_num){ 346 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1; 347 else bEllipse=0; 348 } 349 else bEllipse=0; 350 351 for(int i2=ParmsNum-1;i2>=0;i2--){ 352 useTempParameters[i2] = false; 353 354 if(bEllipse&&i2<=pi_num-2) bEllipse=0; 355 356 if(i2==0&&ppi[i2].name){ 357 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){ 358 //オブジェクトメンバの第一パラメータのThisポインタ 359 continue; 360 } 361 } 362 if((i2==0||i2==1)&&ppi[i2].name){ 363 if(lstrcmp(ppi[i2].name,FuncName)==0){ 364 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 365 continue; 366 } 367 } 368 369 TYPEINFO DummyTypeInfo; 370 BOOL bByVal; 371 if(bEllipse){ 372 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 373 bByVal=1; 374 } 375 else{ 376 DummyTypeInfo.type=ppi[i2].type; 377 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 378 bByVal=ppi[i2].bByVal; 379 } 380 381 382 if( !bByVal ){ 383 //ポインタ参照 384 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 385 //ポインタ指定 386 continue; 387 } 388 389 LONG_PTR lpVarIndex; 390 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 391 //変数ではないとき 392 int reg = REG_RAX; 393 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 394 //↑ここでスタックに積む 395 396 useTempParameters[i2] = true; 397 useTempObject = true; 398 399 types[i2].type = type; 400 types[i2].u.lpIndex = lpVarIndex; 401 402 nCountOfTempObjects++; 403 } 404 } 405 } 406 } 407 void CParameter::DeleteTempParameters(){ 408 /////////////////////////////////////////////////////// 409 // 一時オブジェクトを破棄 410 /////////////////////////////////////////////////////// 411 //TODO: 64ビットコードのままなので、32ビット用に書き換える 412 413 if( !useTempObject ) return; 414 415 for(int i2=ParmsNum-1;i2>=0;i2--){ 416 if( useTempParameters[i2] ){ 417 //スタックフレームから取得 418 // ※関数呼び出し時も値が普遍のebxを利用する 419 op_pop(REG_EBX); 420 421 422 /////////////////////////// 423 // デストラクタを呼び出す 424 /////////////////////////// 425 426 //push ebx 427 op_push(REG_EBX); 428 429 //call destructor 430 int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex; 431 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi ); 432 433 434 ///////////////////////// 435 // メモリを解放する 436 ///////////////////////// 437 438 //push ebx 439 op_push(REG_EBX); 440 441 //call free 442 extern SUBINFO *pSub_free; 443 op_call(pSub_free); 444 } 445 } 446 } 447 333 448 void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){ 334 449 int object_size; … … 441 556 int ParmSize=0; 442 557 RELATIVE_VAR RelativeVar; 558 int nCountOfNowTempObjects = 0; 443 559 for(i2=ParmsNum-1;i2>=0;i2--){ 444 560 if(bEllipse&&i2<=pi_num-2) bEllipse=0; … … 556 672 int VarType; 557 673 LONG_PTR lpVarIndex; 558 if(!GetVarOffsetReadOnly(Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue; 559 560 if(DummyTypeInfo.type!=DEF_ANY){ 561 //型チェックを行う 562 if(DummyTypeInfo.type==VarType){ 563 if(DummyTypeInfo.type==DEF_OBJECT){ 564 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 674 if(GetVarOffset( 675 false, 676 false, 677 Parms[i2], 678 &VarType, 679 &RelativeVar, 680 &lpVarIndex)){ 681 if(DummyTypeInfo.type!=DEF_ANY){ 682 //型チェックを行う 683 if(DummyTypeInfo.type==VarType){ 684 if(DummyTypeInfo.type==DEF_OBJECT){ 685 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 686 SetError(11,Parms[i2],cp); 687 } 688 } 689 } 690 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 691 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 692 } 693 else{ 565 694 SetError(11,Parms[i2],cp); 566 695 } 567 696 } 568 } 569 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){ 570 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 571 } 572 else{ 573 SetError(11,Parms[i2],cp); 574 } 697 698 //変数アドレスをレジスタにセット 699 SetVarPtrToEax(&RelativeVar); 700 701 //push eax 702 op_push(REG_EAX); 575 703 } 576 577 //変数アドレスをレジスタにセット 578 SetVarPtrToEax(&RelativeVar); 579 580 //push eax 581 op_push(REG_EAX); 704 else{ 705 //一時オブジェクトをコピー 706 707 //mov eax, dword ptr[esp+offset] 708 op_mov_RM( 709 sizeof(long), 710 REG_EAX, 711 REG_ESP, 712 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE, 713 MOD_BASE_DISP32 ); 714 715 nCountOfNowTempObjects++; 716 717 //push eax 718 op_push(REG_EAX); 719 720 //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 721 } 582 722 } 583 723 -
BasicCompiler32/Compile_CallProc.cpp
r18 r20 176 176 pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); 177 177 178 //一時オブジェクトを生成 179 pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum ); 180 178 181 //レジスタ、スタックフレームにセット 179 182 pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); 180 183 181 //パラメータオブジェクトを破棄 182 delete pobj_parameter; 183 184 184 185 186 //////////////////////// 187 // call 188 //////////////////////// 185 189 RELATIVE_VAR RelativeVar; 186 190 LONG_PTR lp; … … 195 199 OpBuffer[obp++]=(char)0xFF; 196 200 OpBuffer[obp++]=(char)0xD0; 201 202 203 204 //一時オブジェクトを破棄 205 pobj_parameter->DeleteTempParameters(); 206 207 //パラメータオブジェクトを破棄 208 delete pobj_parameter; 197 209 198 210 if(plpIndex) *plpIndex=pi->u.ReturnIndex; … … 343 355 } 344 356 357 //一時オブジェクトを生成 358 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 359 345 360 //レジスタ、スタックフレームにセット 346 361 int ParmSize; 347 362 ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); 348 349 //パラメータオブジェクトを破棄350 delete pobj_parameter;351 363 352 364 … … 469 481 } 470 482 483 //一時オブジェクトを破棄 484 pobj_parameter->DeleteTempParameters(); 485 486 //パラメータオブジェクトを破棄 487 delete pobj_parameter; 488 471 489 if(plpIndex) *plpIndex=psi->u.ReturnIndex; 472 490 -
BasicCompiler32/Compile_Var.cpp
r18 r20 760 760 } 761 761 762 763 /////////////////////////////////////// 764 // 単発式([]で囲まれていない) 765 /////////////////////////////////////// 766 767 if( type == DEF_OBJECT){ 768 //オブジェクトの場合はありえない 769 SetError(300,NULL,cp); 770 return 0; 771 } 772 762 773 if(SubScripts[0]!=-1){ 763 774 SetError(41,0,cp); … … 879 890 880 891 SetError(41,0,cp); 892 return 0; 893 } 894 895 896 /////////////////////////////////////// 897 // 単発式([]で囲まれていない) 898 /////////////////////////////////////// 899 900 if( type == DEF_OBJECT){ 901 //オブジェクトの場合はありえない 902 SetError(300,NULL,cp); 881 903 return 0; 882 904 } -
BasicCompiler32/Opcode.h
r17 r20 192 192 TYPEINFO ReturnTypeInfo; 193 193 194 //一時オブジェクト管理用 195 bool useTempObject; 196 bool useTempParameters[255]; 197 int nCountOfTempObjects; 198 194 199 public: 195 200 CParameter(char *buffer); … … 208 213 void SetObjectParameter(CClass *pobj_Class,LPSTR Parameter); 209 214 int SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 215 216 //一時オブジェクトパラメータの生成と破棄 217 void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 218 void DeleteTempParameters(); 210 219 }; 211 220 -
BasicCompiler64/CParameter.cpp
r11 r20 329 329 } 330 330 } 331 332 void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 333 /////////////////////////////////////////////////////// 334 // 一時オブジェクトをあらかじめスタックに積んでおく 335 /////////////////////////////////////////////////////// 336 337 useTempObject = false; 338 339 BOOL bEllipse; 340 if(pi_num){ 341 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1; 342 else bEllipse=0; 343 } 344 else bEllipse=0; 345 346 for(int i2=ParmsNum-1;i2>=0;i2--){ 347 useTempParameters[i2] = false; 348 349 if(bEllipse&&i2<=pi_num-2) bEllipse=0; 350 351 if(i2==0&&ppi[i2].name){ 352 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){ 353 //オブジェクトメンバの第一パラメータのThisポインタ 354 continue; 355 } 356 } 357 if((i2==0||i2==1)&&ppi[i2].name){ 358 if(lstrcmp(ppi[i2].name,FuncName)==0){ 359 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 360 continue; 361 } 362 } 363 364 TYPEINFO DummyTypeInfo; 365 BOOL bByVal; 366 if(bEllipse){ 367 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 368 bByVal=1; 369 } 370 else{ 371 DummyTypeInfo.type=ppi[i2].type; 372 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 373 bByVal=ppi[i2].bByVal; 374 } 375 376 377 if( !bByVal ){ 378 //ポインタ参照 379 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 380 //ポインタ指定 381 continue; 382 } 383 384 LONG_PTR lpVarIndex; 385 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 386 //変数ではないとき 387 int reg = REG_RAX; 388 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 389 390 //スタックフレームへコピー 391 StackOffsetOfTempObject[i2] = pobj_sf->push(reg); 392 393 useTempParameters[i2] = true; 394 useTempObject = true; 395 396 types[i2].type = type; 397 types[i2].u.lpIndex = lpVarIndex; 398 } 399 } 400 } 401 } 402 void CParameter::DeleteTempParameters(){ 403 /////////////////////////////////////////////////////// 404 // 一時オブジェクトを破棄 405 /////////////////////////////////////////////////////// 406 if( !useTempObject ) return; 407 408 for(int i2=ParmsNum-1;i2>=0;i2--){ 409 if( useTempParameters[i2] ){ 410 //スタックフレームから取得 411 pobj_sf->ref(REG_RCX); 412 413 //デストラクタを呼び出す 414 415 //call destructor 416 int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex; 417 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi ); 418 419 //メモリを解放する 420 421 pobj_sf->pop(REG_RCX); 422 423 //call free 424 extern SUBINFO *pSub_free; 425 op_call(pSub_free); 426 } 427 } 428 } 429 331 430 void CParameter::SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){ 332 431 ////////////////////////////////////////////////////// … … 427 526 op_mov_RR(reg,REG_R11); 428 527 } 528 429 529 void CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ 430 530 /////////////////////////////////////////////////////////// … … 616 716 int VarType; 617 717 LONG_PTR lpVarIndex; 618 if(!GetVarOffsetReadOnly( 718 if(GetVarOffset( 719 false, 720 false, 619 721 Parms[i2], 620 722 &VarType, 621 723 &RelativeVar, 622 &lpVarIndex)) continue; 623 624 if(DummyTypeInfo.type!=DEF_ANY){ 625 //型チェックを行う 626 if(DummyTypeInfo.type==VarType){ 627 if(DummyTypeInfo.type==DEF_OBJECT){ 628 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 724 &lpVarIndex)){ 725 726 if(DummyTypeInfo.type!=DEF_ANY){ 727 //型チェックを行う 728 if(DummyTypeInfo.type==VarType){ 729 if(DummyTypeInfo.type==DEF_OBJECT){ 730 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 731 SetError(11,Parms[i2],cp); 732 } 733 } 734 } 735 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ 736 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 737 } 738 else{ 629 739 SetError(11,Parms[i2],cp); 630 740 } 631 741 } 632 } 633 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ 634 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 635 } 636 else{ 637 SetError(11,Parms[i2],cp); 638 } 639 } 640 641 //変数アドレスをレジスタにセット 642 SetVarPtrToReg(reg,&RelativeVar); 742 743 //変数アドレスをレジスタにセット 744 SetVarPtrToReg(reg,&RelativeVar); 745 746 } 747 else{ 748 //一時オブジェクトをコピー 749 750 //mov reg, qword ptr[rsp+offset] 751 pobj_sf->ref_offset_data( reg, StackOffsetOfTempObject[i2] ); 752 753 //VarType = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 754 } 643 755 } 644 756 } -
BasicCompiler64/Compile_CallProc.cpp
r19 r20 180 180 pobj_parameter->BackupParameter(pi->ParmNum); 181 181 182 //一時オブジェクトを生成 183 pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum ); 184 182 185 //レジスタ、スタックフレームにセット 183 186 pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); … … 200 203 //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ 201 204 pobj_BlockReg->clear(); 205 206 //一時オブジェクトを破棄 207 pobj_parameter->DeleteTempParameters(); 202 208 203 209 //スタックフレームに存在する既存のパラメータを復元 … … 355 361 pobj_parameter->BackupParameter(psi->RealParmNum); 356 362 363 //一時オブジェクトを生成 364 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 365 357 366 //レジスタ、スタックフレームにセット 358 367 pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); … … 490 499 pobj_BlockReg->clear(); 491 500 501 //一時オブジェクトを破棄 502 pobj_parameter->DeleteTempParameters(); 503 492 504 //スタックフレームに存在する既存のパラメータを復元 493 505 pobj_parameter->RestoreParameter(psi->RealParmNum); -
BasicCompiler64/Compile_Var.cpp
r19 r20 781 781 } 782 782 783 784 /////////////////////////////////////// 785 // 単発式([]で囲まれていない) 786 /////////////////////////////////////// 787 788 if( type == DEF_OBJECT){ 789 //オブジェクトの場合はありえない 790 SetError(300,NULL,cp); 791 return 0; 792 } 793 783 794 if(SubScripts[0]!=-1){ 784 795 SetError(41,0,cp); -
BasicCompiler64/Opcode.h
r19 r20 120 120 void SetLocalParmSize(int size); 121 121 int GetFrameSize(); 122 voidpush(int reg);122 int push(int reg); 123 123 void push(int xmm_reg,int var_size); 124 void ref_offset_data( int reg, int sp_offset ); 124 125 void ref(int reg); 125 126 void ref(int xmm_reg,int var_size); … … 339 340 TYPEINFO ReturnTypeInfo; 340 341 342 //一時オブジェクト管理用 343 bool useTempObject; 344 bool useTempParameters[255]; 345 int StackOffsetOfTempObject[255]; 346 341 347 public: 342 348 CParameter(char *buffer); … … 354 360 void MacroParameterSupport(PARAMETER_INFO *ppi); 355 361 void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter); 362 363 //一時オブジェクトパラメータの生成と破棄 364 void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 365 void DeleteTempParameters(); 366 356 367 void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 368 357 369 void BackupParameter(int pi_num); 358 370 void RestoreParameter(int pi_num); -
BasicCompiler64/stack_frame.cpp
r3 r20 39 39 return -(answer_sp-0x08); 40 40 } 41 voidCStackFrame::push(int reg){41 int CStackFrame::push(int reg){ 42 42 now_sp-=sizeof(_int64); 43 43 if(lowest_sp>now_sp) lowest_sp=now_sp; 44 44 45 if(reg==REG_NON) return ;45 if(reg==REG_NON) return now_sp; 46 46 47 47 //mov qword ptr[rsp+offset],reg … … 52 52 add(); 53 53 obp+=sizeof(long); 54 55 return now_sp; 54 56 } 55 57 void CStackFrame::push(int xmm_reg,int var_size){ … … 77 79 obp+=sizeof(long); 78 80 } 79 void CStackFrame::ref (int reg){81 void CStackFrame::ref_offset_data( int reg, int sp_offset ){ 80 82 //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用 81 op_mov_RM(sizeof(_int64),reg,REG_RSP, now_sp,MOD_BASE_DISP32);83 op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32); 82 84 83 85 //スケジュールをセット … … 85 87 add(); 86 88 obp+=sizeof(long); 89 } 90 void CStackFrame::ref(int reg){ 91 ref_offset_data( reg, now_sp ); 87 92 } 88 93 void CStackFrame::ref(int xmm_reg,int var_size){ -
BasicCompiler_Common/Object.cpp
r5 r20 257 257 op_call(pSub_free); 258 258 } 259 if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){259 else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){ 260 260 //デストラクタの呼び出し 261 261 i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex; -
BasicCompiler_Common/Variable.cpp
r11 r20 281 281 } 282 282 return 1; 283 } 284 285 TYPEINFO GetStringTypeInfo(){ 286 extern CClass *pobj_StringClass; 287 TYPEINFO TypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass }; 288 return TypeInfo; 283 289 } 284 290 … … 765 771 } 766 772 773 //変数として見つからなかったとき 767 774 if(bError) SetError(3,variable,cp); 768 775 return -1; … … 957 964 } 958 965 else{ 959 //As指定なし 960 pTypeInfo->type=GetTypeFromSimpleName(variable); 961 962 i2=lstrlen(variable)-1; 963 if(i2>=0){ 964 if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$')) 965 SetError(-103,variable,cp); 966 } 966 ///////////////// 967 // As指定なし 968 ///////////////// 969 970 if( InitBuf[0] == '\0' ){ 971 //As指定も、初期値指定もない場合 972 pTypeInfo->type=GetTypeFromSimpleName(variable); 973 974 i2=lstrlen(variable)-1; 975 if(i2>=0){ 976 if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$')) 977 SetError(-103,variable,cp); 978 } 979 } 980 else{ 981 //初期値の型を判別して自動的に型情報を付加する 982 983 TYPEINFO BaseType = GetStringTypeInfo(); 984 int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex ); 985 986 //エラーの場合 987 if( result == -1 ) return 0; 988 989 pTypeInfo->type = result; 990 } 991 992 } 993 994 if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){ 995 //初期値とコンストラクタパラメータが同時に呼び出されているとき 996 SetError(132, NULL, cp); 997 } 998 999 if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' ){ 1000 lstrcpy( ConstractParameter, InitBuf ); 1001 InitBuf[0] = 0; 967 1002 } 968 1003 … … 1077 1112 AllInitGlobalVarSize); 1078 1113 if(InitBuf[0]){ 1079 //初期代入時のみ、書き込みアクセスを許可する 1080 bool bConstBack = pVar->bConst; 1081 pVar->bConst = false; 1082 1083 int result = SetInitGlobalData(pVar->offset, 1084 pVar->type, 1085 pVar->u.index, 1086 pVar->SubScripts, 1087 InitBuf); 1088 1089 if(!result){ 1090 //動的な式だった場合は代入演算を行う 1091 char temporary[8192]; 1092 sprintf(temporary,"%s=%s",name,InitBuf); 1093 OpcodeCalc(temporary); 1094 } 1095 1096 pVar->bConst = bConstBack; 1114 if( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){ 1115 //単発式が初期値のオブジェクトの場合 1116 //初期値をコピーコンストラクタに渡す 1117 } 1118 else{ 1119 int result = SetInitGlobalData(pVar->offset, 1120 pVar->type, 1121 pVar->u.index, 1122 pVar->SubScripts, 1123 InitBuf); 1124 1125 if(!result){ 1126 //動的な式だった場合は代入演算を行う 1127 1128 //初期代入時のみ、書き込みアクセスを許可する 1129 bool bConstBack = pVar->bConst; 1130 pVar->bConst = false; 1131 1132 //代入 1133 char temporary[8192]; 1134 sprintf(temporary,"%s=%s",name,InitBuf); 1135 OpcodeCalc(temporary); 1136 1137 //アクセス制限を元に戻す 1138 pVar->bConst = bConstBack; 1139 } 1140 } 1097 1141 } 1098 1142 -
BasicCompiler_Common/error.cpp
r18 r20 176 176 if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord); 177 177 if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。"); 178 if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。"); 178 179 179 180 //Enum関連
Note:
See TracChangeset
for help on using the changeset viewer.