Changeset 75 in dev for BasicCompiler32
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- Location:
- BasicCompiler32
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/CParameter.cpp
r73 r75 2 2 #include "opcode.h" 3 3 4 int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 4 int ParamImpl::NewTempParameters( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 5 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 6 5 7 /////////////////////////////////////////////////////// 6 8 // 一時オブジェクトをあらかじめスタックに積んでおく … … 13 15 14 16 BOOL bEllipse; 15 if(p i_num){16 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;17 if(params.size()){ 18 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 17 19 else bEllipse=0; 18 20 } … … 22 24 useTempParameters[i2] = false; 23 25 24 if(bEllipse&&i2<= pi_num-2) bEllipse=0;25 26 if(i2==0 &&ppi[i2].name){27 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){26 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 27 28 if(i2==0){ 29 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 28 30 //オブジェクトメンバの第一パラメータのThisポインタ 29 31 continue; 30 32 } 31 33 } 32 if( (i2==0||i2==1)&&ppi[i2].name){33 if( lstrcmp(ppi[i2].name,FuncName)==0){34 if( i2==0||i2==1 ){ 35 if( params[i2]->GetVarName() == procName ){ 34 36 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 35 37 continue; … … 37 39 } 38 40 39 T YPEINFODummyTypeInfo;41 Type DummyTypeInfo; 40 42 BOOL bByVal; 41 43 if(bEllipse){ … … 44 46 } 45 47 else{ 46 DummyTypeInfo.type=p pi[i2].type;47 DummyTypeInfo.u.lpIndex=p pi[i2].u.index;48 bByVal =ppi[i2].bByVal;48 DummyTypeInfo.type=params[i2]->GetBasicType(); 49 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 50 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 49 51 } 50 52 … … 80 82 type, 81 83 lpVarIndex, 82 FuncName, 83 i2); 84 85 if( result ){ 86 useTempParameters[i2] = true; 87 useTempObject = true; 88 89 types[i2].type = type; 90 types[i2].u.lpIndex = lpVarIndex; 91 } 92 } 93 } 94 } 95 96 return nCountOfTempObjects * PTR_SIZE; 97 } 98 int ParamImpl::NewTempParameters( const char *procName, const Parameters ¶ms, int SecondParmNum ){ 99 /////////////////////////////////////////////////////// 100 // 一時オブジェクトをあらかじめスタックに積んでおく 101 /////////////////////////////////////////////////////// 102 103 useTempObject = false; 104 105 //一時参照の数 106 nCountOfTempObjects = 0; 107 108 BOOL bEllipse; 109 if(params.size()){ 110 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 111 else bEllipse=0; 112 } 113 else bEllipse=0; 114 115 for(int i2=ParmsNum-1;i2>=0;i2--){ 116 useTempParameters[i2] = false; 117 118 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 119 120 if(i2==0){ 121 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 122 //オブジェクトメンバの第一パラメータのThisポインタ 123 continue; 124 } 125 } 126 if( i2==0||i2==1 ){ 127 if( params[i2]->GetVarName() == procName ){ 128 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 129 continue; 130 } 131 } 132 133 TYPEINFO DummyTypeInfo; 134 BOOL bByVal; 135 if(bEllipse){ 136 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 137 bByVal=1; 138 } 139 else{ 140 DummyTypeInfo.type=params[i2]->GetBasicType(); 141 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 142 bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE; 143 } 144 145 146 if( !bByVal ){ 147 //ポインタ参照 148 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 149 //ポインタ指定 150 continue; 151 } 152 153 LONG_PTR lpVarIndex; 154 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 155 //変数ではないとき 156 int reg = REG_RAX; 157 int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 158 //↑ここでスタックに積む 159 160 nCountOfTempObjects++; 161 162 if( type != DEF_STRUCT ){ 163 //一時参照を作成 164 165 //push esp 166 op_push( REG_ESP ); 167 168 nCountOfTempObjects++; 169 } 170 171 bool result = CheckDifferentType( 172 DummyTypeInfo.type, 173 DummyTypeInfo.u.lpIndex, 174 type, 175 lpVarIndex, 176 procName, 84 procName.c_str(), 177 85 i2); 178 86 … … 205 113 206 114 //call free 207 extern SubInfo*pSub_free;115 extern UserProc *pSub_free; 208 116 op_call(pSub_free); 209 117 } … … 232 140 233 141 //call calloc 234 extern SubInfo*pSub_calloc;142 extern UserProc *pSub_calloc; 235 143 op_call(pSub_calloc); 236 144 … … 239 147 240 148 241 T YPEINFOBaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};242 T YPEINFOCalcType;149 Type BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 150 Type CalcType; 243 151 CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex); 244 152 … … 276 184 277 185 //call constructor 278 op_call(pobj_Class->GetCopyConstructorMethod()->p si);186 op_call(pobj_Class->GetCopyConstructorMethod()->pUserProc); 279 187 280 188 … … 300 208 301 209 //call constructor 302 op_call(pobj_Class->GetConstructorMethod()->p si);210 op_call(pobj_Class->GetConstructorMethod()->pUserProc); 303 211 } 304 212 */ … … 313 221 } 314 222 315 int ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ 223 int ParamImpl::SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum ){ 224 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size(); 225 316 226 /////////////////////////////////////////////////////////// 317 227 // パラメータをレジスタ及びスタックフレームにセット … … 320 230 321 231 BOOL bEllipse; 322 if( pi_num){323 if(p pi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;232 if( params.size() ){ 233 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1; 324 234 else bEllipse=0; 325 235 } … … 328 238 BOOL bHas_System_LocalThis=0; 329 239 if(ParmsNum>=1){ 330 if( lstrcmp(ppi[0].name,"_System_LocalThis")==0)240 if( params[0]->GetVarName() == "_System_LocalThis" ){ 331 241 bHas_System_LocalThis=1; 242 } 332 243 } 333 244 334 245 //戻り値用の変数名を取得 335 const char *lpszVarNameToReturn = ( FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;246 const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str(); 336 247 337 248 //パラメータをレジスタとスタックに格納 … … 343 254 int nCountOfNowTempObjects = 0; 344 255 for(i2=ParmsNum-1;i2>=0;i2--){ 345 if(bEllipse&&i2<= pi_num-2) bEllipse=0;346 347 if(i2==0 &&ppi[i2].name){348 if( lstrcmp(ppi[i2].name,"_System_LocalThis")==0){256 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0; 257 258 if(i2==0){ 259 if( params[i2]->GetVarName() == "_System_LocalThis" ){ 349 260 //オブジェクトメンバの第一パラメータのThisポインタ 350 261 continue; 351 262 } 352 263 } 353 if( (i2==0||i2==1)&&ppi[i2].name){354 if( lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){264 if(i2==0||i2==1){ 265 if( params[i2]->GetVarName() == lpszVarNameToReturn ){ 355 266 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 356 267 continue; … … 358 269 } 359 270 360 T YPEINFODummyTypeInfo;271 Type DummyTypeInfo; 361 272 BOOL bByVal; 362 273 if(bEllipse){ … … 365 276 } 366 277 else{ 367 DummyTypeInfo.type=p pi[i2].type;368 DummyTypeInfo.u.lpIndex=p pi[i2].u.index;369 bByVal =ppi[i2].bByVal;278 DummyTypeInfo.type=params[i2]->GetBasicType(); 279 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex(); 280 bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE; 370 281 } 371 282 … … 375 286 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 376 287 char temp2[255]; 377 sprintf(temp2,"%s関数の第%dパラメータ", FuncName,i2+1);288 sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1); 378 289 SetError(19,temp2,cp); 379 290 continue; … … 417 328 CalcType, 418 329 lpCalcIndex, 419 FuncName,330 procName.c_str(), 420 331 i3); 421 332 } … … 530 441 return ParmSize; 531 442 } 532 int ParamImpl::SetParameter( const char *procName, const Parameters ¶ms, int SecondParmNum ){533 ///////////////////////////////////////////////////////////534 // パラメータをレジスタ及びスタックフレームにセット535 ///////////////////////////////////////////////////////////536 int i2,i3;537 538 BOOL bEllipse;539 if( params.size() ){540 if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;541 else bEllipse=0;542 }543 else bEllipse=0;544 545 BOOL bHas_System_LocalThis=0;546 if(ParmsNum>=1){547 if( params[0]->GetVarName() == "_System_LocalThis" ){548 bHas_System_LocalThis=1;549 }550 }551 552 //戻り値用の変数名を取得553 const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName;554 555 //パラメータをレジスタとスタックに格納556 int CalcType;557 LONG_PTR lpCalcIndex;558 BOOL bCalcUseHeap;559 int ParmSize=0;560 RELATIVE_VAR RelativeVar;561 int nCountOfNowTempObjects = 0;562 for(i2=ParmsNum-1;i2>=0;i2--){563 if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;564 565 if(i2==0){566 if( params[i2]->GetVarName() == "_System_LocalThis" ){567 //オブジェクトメンバの第一パラメータのThisポインタ568 continue;569 }570 }571 if(i2==0||i2==1){572 if( params[i2]->GetVarName() == lpszVarNameToReturn ){573 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト574 continue;575 }576 }577 578 TYPEINFO DummyTypeInfo;579 BOOL bByVal;580 if(bEllipse){581 DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);582 bByVal=1;583 }584 else{585 DummyTypeInfo.type=params[i2]->GetBasicType();586 DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();587 bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE;588 }589 590 if(bByVal==1){591 //値参照592 593 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){594 char temp2[255];595 sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);596 SetError(19,temp2,cp);597 continue;598 }599 600 if(DummyTypeInfo.type==DEF_STRUCT){601 SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);602 goto next;603 }604 605 606 extern LONG_PTR ProcPtr_BaseIndex;607 LONG_PTR back_ProcPtr_BaseIndex;608 back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;609 if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;610 else ProcPtr_BaseIndex=-1;611 612 CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);613 614 ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;615 616 if(CalcType==-1) break;617 618 if(CalcType==DEF_OBJECT){619 if( DummyTypeInfo.type != DEF_OBJECT620 ||621 DummyTypeInfo.type == DEF_OBJECT &&622 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){623 //キャスト演算子のオーバーロードに対応する624 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);625 }626 }627 628 if(!bEllipse){629 //型チェック630 if(bHas_System_LocalThis) i3=i2-1;631 else i3=i2;632 CheckDifferentType(633 DummyTypeInfo.type,634 DummyTypeInfo.u.lpIndex,635 CalcType,636 lpCalcIndex,637 procName,638 i3);639 }640 641 if(DummyTypeInfo.type==DEF_DOUBLE){642 ChangeTypeToDouble(CalcType);643 ParmSize+=sizeof(long)*2;644 }645 else if(DummyTypeInfo.type==DEF_SINGLE){646 ChangeTypeToSingle(CalcType);647 ParmSize+=sizeof(long);648 }649 else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){650 ChangeTypeToInt64(CalcType);651 ParmSize+=sizeof(long)*2;652 }653 else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||654 (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){655 ChangeTypeToLong(CalcType);656 ParmSize+=sizeof(long);657 }658 else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD || (isUnicode&&DummyTypeInfo.type==DEF_CHAR)){659 ChangeTypeToInteger(CalcType);660 ParmSize+=sizeof(long);661 }662 else if(DummyTypeInfo.type==DEF_SBYTE||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN || (isUnicode==false&&DummyTypeInfo.type==DEF_CHAR)){663 ChangeTypeToByte(CalcType);664 ParmSize+=sizeof(long);665 }666 else{667 SetError(300,NULL,cp);668 }669 }670 else{671 //ポインタ参照672 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){673 //ポインタ指定674 i3=NumOpe(Parms[i2]+2,0,0,0);675 676 ChangeTypeToLong(i3);677 }678 else{679 if( useTempParameters[i2] ){680 //一時オブジェクトをコピー681 682 if( types[i2].type != DEF_STRUCT ){683 // 一時参照のための領域を考慮する684 nCountOfNowTempObjects++;685 }686 687 nCountOfNowTempObjects++;688 689 //mov eax, dword ptr[esp+offset]690 op_mov_RM(691 sizeof(long),692 REG_EAX,693 REG_ESP,694 ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,695 MOD_BASE_DISP32 );696 697 //push eax698 op_push(REG_EAX);699 }700 else{701 //変数のアドレスを取得702 int VarType;703 LONG_PTR lpVarIndex;704 if(GetVarOffset(705 false,706 false,707 Parms[i2],708 &VarType,709 &RelativeVar,710 &lpVarIndex)){711 if(DummyTypeInfo.type!=DEF_ANY){712 //型チェックを行う713 if(DummyTypeInfo.type==VarType){714 if(DummyTypeInfo.type==DEF_OBJECT){715 if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){716 SetError(11,Parms[i2],cp);717 }718 }719 else if(DummyTypeInfo.type==DEF_STRUCT){720 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){721 SetError(11,Parms[i2],cp);722 }723 }724 }725 else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){726 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき727 }728 else{729 SetError(11,Parms[i2],cp);730 }731 }732 733 //変数アドレスをレジスタにセット734 SetVarPtrToEax(&RelativeVar);735 736 //push eax737 op_push(REG_EAX);738 }739 }740 }741 742 ParmSize+=PTR_SIZE;743 }744 745 next:;746 }747 748 return ParmSize;749 } -
BasicCompiler32/Compile_Calc.cpp
r67 r75 415 415 int i,i2,i3; 416 416 char variable[VN_SIZE]; 417 418 419 420 ////////////////////////////////////// 421 // インクリメント・デクリメント 422 ////////////////////////////////////// 417 423 418 424 for(i=0;;i++){ … … 465 471 } 466 472 467 LONG_PTR lp; 468 if(GetVarType(variable,&lp,0)!=-1){ 473 if(GetVarType(variable,Type(),0)){ 469 474 //変数リストに該当したとき 470 475 SetError(1,NULL,cp); … … 510 515 511 516 char ObjName[VN_SIZE],array_element[VN_SIZE]; 512 CClass *pobj_c;513 517 GetArrayElement(variable,ObjName,array_element); 514 518 if(array_element[0]){ 515 i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);516 if( i2==DEF_OBJECT){519 Type varType; 520 if( GetVarType(ObjName,varType,0) && varType.IsObject() ){ 517 521 char temporary[VN_SIZE]; 518 522 sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET); … … 522 526 523 527 int idProc; 524 void *p Info;525 idProc=GetProc(temporary, &pInfo);528 void *pProc; 529 idProc=GetProc(temporary,(void **)&pProc); 526 530 if(idProc){ 527 CallProc(idProc,p Info,temporary,temp2,NULL);531 CallProc(idProc,pProc,temporary,temp2,Type()); 528 532 return; 529 533 } … … 542 546 //////////////////////////////////////// 543 547 544 int VarType,CalcType; 545 LONG_PTR lpVarIndex,lpCalcIndex; 548 Type varType; 549 550 //型を識別 551 if( !GetVarType(variable,varType,false) ){ 552 553 // プロパティ用のメソッドを呼び出す 554 if(!CallPropertyMethod( variable, Command+i+1, Type() )){ 555 //エラーを表示 556 GetVarType(variable,varType,true); 557 } 558 559 return; 560 } 561 562 extern LONG_PTR ProcPtr_BaseIndex; 563 if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex(); 564 else ProcPtr_BaseIndex=-1; 565 546 566 RELATIVE_VAR VarRelativeVar; 547 BOOL bCalcUseHeap; 548 549 //型を識別 550 VarType=GetVarType(variable,&lpVarIndex,0); 551 if(VarType==-1){ 552 553 // プロパティ用のメソッドを呼び出す 554 if(!CallPropertyMethod(variable,Command+i+1,NULL)){ 555 //エラーを表示 556 GetVarType(variable,&lpVarIndex,1); 557 } 558 559 return; 560 } 561 562 extern LONG_PTR ProcPtr_BaseIndex; 563 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 564 else ProcPtr_BaseIndex=-1; 565 566 if(VarType==DEF_STRUCT){ 567 if( varType.IsStruct() ){ 567 568 //代入コピーに備える 568 569 … … 570 571 if(!GetVarOffsetReadWrite( 571 572 variable, 572 &VarType,573 573 &VarRelativeVar, 574 &lpVarIndex)) return;574 varType)) return; 575 575 576 576 SetVarPtrToEax(&VarRelativeVar); … … 582 582 583 583 //NumOpe...(スタックに答えが格納される) 584 CalcType=NumOpe(Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 585 if(VarType==-1||CalcType==-1) return; 584 BOOL bCalcUseHeap; 585 Type calcType; 586 if( !NumOpe(Command+i+1,varType,calcType,&bCalcUseHeap) ){ 587 return; 588 } 586 589 587 590 //変数アドレスを取得 588 591 if(!GetVarOffsetReadWrite( 589 592 variable, 590 &VarType,591 593 &VarRelativeVar, 592 &lpVarIndex)) return;593 594 if( VarType&FLAG_PTR){594 varType)) return; 595 596 if(varType.GetBasicType()&FLAG_PTR){ 595 597 SetError(14,variable,cp); 596 598 return; 597 599 } 598 600 599 if( VarType==DEF_STRUCT){600 // オブジェクトインスタンスへの代入601 SetStructVariable( lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);601 if( varType.IsStruct() ){ 602 //構造体インスタンスへの代入 603 SetStructVariable(varType,calcType,bCalcUseHeap); 602 604 return; 603 605 } 604 606 605 if( CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){607 if( calcType.IsObject() && !calcType.Equals( varType ) ){ 606 608 //キャスト演算子のオーバーロードに対応する 607 CallCastOperatorProc( CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);609 CallCastOperatorProc(calcType,bCalcUseHeap,varType); 608 610 } 609 611 … … 614 616 ///////////////////////////////// 615 617 616 CheckDifferentType( VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);618 CheckDifferentType(varType,calcType,0,0); 617 619 618 620 … … 622 624 623 625 //eax、edx:eax、またはst(0)にスタック上のデータを取り出す 624 RestoreDefaultRegisterFromStackMemory( CalcType ); 625 626 SetVariableFromEax( VarType, CalcType, &VarRelativeVar ); 627 /* 628 TODO: 消す 629 if(VarType==DEF_BOOLEAN){ 630 //bool 631 SetBooleanVariable(CalcType,&VarRelativeVar); 632 } 633 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 634 //8ビット整数型変数へスタックの内容を格納する 635 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 636 } 637 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 638 //16ビット整数型変数へスタックの内容を格納する 639 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 640 } 641 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 642 //32ビット整数型変数へスタックの内容を格納する 643 if(VarType==DEF_LONG) 644 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 645 else 646 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 647 } 648 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 649 //64ビット整数型変数へスタックの内容を格納する 650 SetInt64Variable(CalcType,&VarRelativeVar); 651 } 652 else if(VarType==DEF_DOUBLE){ 653 //Double型変数へスタックの内容を格納する 654 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 655 } 656 else if(VarType==DEF_SINGLE){ 657 //Single型変数へスタックの内容を格納する 658 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 659 }*/ 660 } 661 662 663 // TODO: 消す 664 /* 665 void SetRefVariable( const char *varname, const char *expression ){ 666 //////////////////////////////////////// 667 // 変数のタイプ型を識別して、演算を行う 668 //////////////////////////////////////// 669 670 int VarType,CalcType; 671 LONG_PTR lpVarIndex,lpCalcIndex; 672 RELATIVE_VAR VarRelativeVar; 673 BOOL bCalcUseHeap; 674 675 //型を識別 676 VarType=GetVarType(varname,&lpVarIndex,0); 677 if(VarType==-1){ 678 SetError(300,NULL,cp); 679 return; 680 } 681 682 extern LONG_PTR ProcPtr_BaseIndex; 683 if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex; 684 else ProcPtr_BaseIndex=-1; 685 686 if(VarType==DEF_OBJECT){ 687 //代入演算のオーバーロード オペレータに備える 688 689 //変数アドレスを取得 690 if(!GetVarOffsetReadWrite( 691 varname, 692 &VarType, 693 &VarRelativeVar, 694 &lpVarIndex)) return; 695 696 SetVarPtrToEax(&VarRelativeVar); 697 698 //push eax 699 op_push(REG_EAX); 700 } 701 702 703 //NumOpe...(スタックに答えが格納される) 704 CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap); 705 if(VarType==-1||CalcType==-1) return; 706 707 //変数アドレスを取得 708 if(!GetVarOffsetReadWrite( 709 varname, 710 &VarType, 711 &VarRelativeVar, 712 &lpVarIndex)) return; 713 714 if(VarType&FLAG_PTR){ 715 SetError(14,varname,cp); 716 return; 717 } 718 719 720 if( VarType == DEF_OBJECT 721 && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){ 722 // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する 723 PTR_LEVEL_UP( VarType ); 724 725 if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){ 726 VarRelativeVar.dwKind = VAR_GLOBAL; 727 } 728 else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){ 729 VarRelativeVar.dwKind = VAR_LOCAL; 730 } 731 732 if( CalcType == DEF_OBJECT ){ 733 //右辺値が実体オブジェクトのときは、参照をコピー 734 PTR_LEVEL_UP( CalcType ); 735 } 736 } 737 else{ 738 SetError(300,NULL,cp); 739 } 740 741 742 ///////////////////////////////// 743 // 右辺、左辺の型チェックを行う 744 ///////////////////////////////// 745 746 CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0); 747 748 749 ///////////////////////////////////////////////// 750 // スタックの内容を変数にコピーするコードを抽出 751 ///////////////////////////////////////////////// 752 753 if(VarType==DEF_BOOLEAN){ 754 //bool 755 SetBooleanVariable(CalcType,&VarRelativeVar); 756 } 757 else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){ 758 //8ビット整数型変数へスタックの内容を格納する 759 Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 760 } 761 else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){ 762 //16ビット整数型変数へスタックの内容を格納する 763 Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 764 } 765 else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){ 766 //32ビット整数型変数へスタックの内容を格納する 767 if(VarType==DEF_LONG) 768 SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 769 else 770 SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 771 } 772 else if(VarType==DEF_INT64||VarType==DEF_QWORD){ 773 //64ビット整数型変数へスタックの内容を格納する 774 SetInt64Variable(CalcType,&VarRelativeVar); 775 } 776 else if(VarType==DEF_DOUBLE){ 777 //Double型変数へスタックの内容を格納する 778 SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 779 } 780 else if(VarType==DEF_SINGLE){ 781 //Single型変数へスタックの内容を格納する 782 SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset); 783 } 784 } 785 */ 626 RestoreDefaultRegisterFromStackMemory( calcType.GetBasicType() ); 627 628 SetVariableFromEax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar); 629 } -
BasicCompiler32/Compile_CallProc.cpp
r73 r75 8 8 void Call_DebugSys_SaveContext(){ 9 9 //call _System_GetEip 10 extern SubInfo*pSub_System_GetEip;10 extern UserProc *pSub_System_GetEip; 11 11 op_call(pSub_System_GetEip); 12 12 … … 18 18 19 19 //call _DebugSys_SaveContext 20 extern SubInfo*pSub_DebugSys_SaveContext;20 extern UserProc *pSub_DebugSys_SaveContext; 21 21 op_call(pSub_DebugSys_SaveContext); 22 22 } … … 32 32 33 33 34 int Opcode_CallProcPtr(char *variable,char *Parameter,P ROCPTRINFO *pi,LONG_PTR *plpIndex){34 int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex){ 35 35 extern HANDLE hHeap; 36 36 int i; … … 52 52 53 53 //エラーチェック 54 if( !pobj_parameter->ErrorCheck(variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum) ){54 if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){ 55 55 //パラメータにエラーがあるときは処理を終える 56 return p i->ReturnType;56 return pProcPointer->ReturnType().GetBasicType(); 57 57 } 58 58 59 59 //一時オブジェクトを生成 60 pobj_parameter->NewTempParameters( variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum);60 pobj_parameter->NewTempParameters( variable,pProcPointer->Params() ); 61 61 62 62 //レジスタ、スタックフレームにセット 63 pobj_parameter->SetParameter(variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum);63 pobj_parameter->SetParameter(variable,pProcPointer->Params() ); 64 64 65 65 … … 89 89 delete pobj_parameter; 90 90 91 if(plpIndex) *plpIndex=p i->u.ReturnIndex;92 93 return p i->ReturnType;91 if(plpIndex) *plpIndex=pProcPointer->ReturnType().GetIndex(); 92 93 return pProcPointer->ReturnType().GetBasicType(); 94 94 } 95 95 96 void Opcode_CallProc(const char *Parameter, SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){96 void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType){ 97 97 int i2; 98 98 99 if( psi->dwType==SUBTYPE_MACRO){100 if( lstrcmpi(psi->name,"Print")==0){99 if( pUserProc->IsMacro() ){ 100 if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){ 101 101 Opcode_Print(Parameter,0); 102 102 return; 103 103 } 104 if( lstrcmpi(psi->name,"Input")==0){104 if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){ 105 105 Opcode_Input(Parameter); 106 106 return; 107 107 } 108 if( lstrcmpi(psi->name,"Write")==0){108 if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){ 109 109 Opcode_Print(Parameter,1); 110 110 return; … … 112 112 } 113 113 114 p si->bUse=1;114 pUserProc->Using(); 115 115 116 116 bool isStatic = false; 117 117 CClass *pobj_c = NULL; 118 118 CMethod *pMethod = NULL; 119 if( psi->pobj_ParentClass){119 if( pUserProc->GetParentClassPtr() ){ 120 120 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う 121 121 if(ObjectName[0]){ … … 141 141 if(dwFlags&PROCFLAG_NEW){ 142 142 //New演算子によるコンストラクタ呼び出し 143 pobj_c=p si->pobj_ParentClass;143 pobj_c=pUserProc->GetParentClassPtr(); 144 144 } 145 145 else{ … … 154 154 ///////////////////////////////// 155 155 pMethod = NULL; 156 if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( p si);156 if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc ); 157 157 if( ! pMethod ){ 158 158 //動的メソッドが取得できなかったときは静的メソッドを当たる 159 pMethod = pobj_c->GetStaticMethodInfo( p si);159 pMethod = pobj_c->GetStaticMethodInfo( pUserProc ); 160 160 if( !pMethod ){ 161 161 SetError(300,NULL,cp); … … 178 178 //同一クラスオブジェクトの場合はプライベートアクセスを容認する 179 179 if(dwAccess==ACCESS_NON){ 180 SetError(109,p si->name,cp);180 SetError(109,pUserProc->GetName(),cp); 181 181 return; 182 182 } … … 185 185 if(dwAccess==ACCESS_PRIVATE|| 186 186 dwAccess==ACCESS_NON){ 187 SetError(109,p si->name,cp);187 SetError(109,pUserProc->GetName(),cp); 188 188 return; 189 189 } 190 190 if(dwAccess==ACCESS_PROTECTED){ 191 SetError(110,p si->name,cp);191 SetError(110,pUserProc->GetName(),cp); 192 192 return; 193 193 } … … 197 197 //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする) 198 198 if(dwAccess==ACCESS_NON){ 199 SetError(109,p si->name,cp);199 SetError(109,pUserProc->GetName(),cp); 200 200 return; 201 201 } … … 210 210 211 211 char temporary[VN_SIZE]={0}; 212 if( p si->pobj_ParentClass&& isStatic == false ){212 if( pUserProc->GetParentClassPtr() && isStatic == false ){ 213 213 //_System_LocalThis(第一パラメータ)のダミーを作成 214 214 lstrcpy(temporary,"0,"); … … 230 230 231 231 //エラーチェック 232 if( !pobj_parameter->ErrorCheck(p si->name,psi->realParams,psi->SecondParmNum) ){232 if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){ 233 233 //パラメータにエラーがあるときは処理を終える 234 234 return; 235 235 } 236 236 237 if(p si->dwType==SUBTYPE_MACRO){237 if(pUserProc->IsMacro()){ 238 238 //マクロ関数の場合は、パラメータ省略を考慮する 239 pobj_parameter->MacroParameterSupport( p si->realParams);239 pobj_parameter->MacroParameterSupport( pUserProc->RealParams() ); 240 240 } 241 241 242 242 //一時オブジェクトを生成 243 int tempSize = pobj_parameter->NewTempParameters( p si->name,psi->realParams,psi->RealSecondParmNum);243 int tempSize = pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() ); 244 244 245 245 //レジスタ、スタックフレームにセット 246 int ParmSize; 247 ParmSize=pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum); 248 249 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 246 int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() ); 247 248 if(pUserProc->ReturnType().IsStruct() ){ 250 249 ////////////////////////////////////////////////////// 251 250 // 戻り値に構造体インスタンスを持つ場合 … … 253 252 ////////////////////////////////////////////////////// 254 253 255 int object_size = p si->u.Return_pobj_c->GetSize();254 int object_size = pUserProc->ReturnType().GetClass().GetSize(); 256 255 257 256 //push object_size … … 259 258 260 259 //call calloc 261 extern SubInfo*pSub_calloc;260 extern UserProc *pSub_calloc; 262 261 op_call(pSub_calloc); 263 262 … … 267 266 268 267 269 if( p si->pobj_ParentClass&& isStatic == false ){268 if( pUserProc->GetParentClassPtr() && isStatic == false ){ 270 269 ////////////////////////////////////////////////////// 271 270 // メンバ関数の場合 … … 310 309 } 311 310 312 if( psi->bVirtual){311 if( pUserProc->IsVirtual() ){ 313 312 //仮想関数(オブジェクトメソッド)呼び出し 314 313 //pObj->func_table->func1 … … 320 319 OpBuffer[obp++]=(char)0x11; 321 320 322 i2 = pobj_c->GetFuncNumInVtbl( p si);321 i2 = pobj_c->GetFuncNumInVtbl( pUserProc ); 323 322 324 323 //call dword ptr[edx+func_index] … … 339 338 340 339 //call ProcAddr 341 op_call(p si);342 } 343 344 if(p si->bCdecl){340 op_call(pUserProc); 341 } 342 343 if(pUserProc->IsCdecl()){ 345 344 //add esp,ParmSize 346 345 op_add_esp(ParmSize); … … 354 353 } 355 354 356 int Opcode_CallDllProc(char *Parameter,D ECLAREINFO *pdi,LONG_PTR *plpIndex){355 int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex){ 357 356 char *temporary; 358 357 … … 361 360 extern BOOL bDebugCompile; 362 361 extern BOOL bDebugSupportProc; 363 if(bDebugCompile&&bDebugSupportProc==0&& lstrcmp(pdi->name,"DebugBreak")!=0)362 if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){ 364 363 Call_DebugSys_SaveContext(); 365 366 pdi->bUse=1; 364 } 367 365 368 366 … … 376 374 377 375 //エラーチェック 378 if( !pobj_parameter->ErrorCheck( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){376 if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){ 379 377 //パラメータにエラーがあるときは処理を終える 380 return p di->ReturnType;378 return pDllProc->ReturnType().GetBasicType(); 381 379 } 382 380 383 381 //一時オブジェクトを生成 384 pobj_parameter->NewTempParameters( p di->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);382 pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() ); 385 383 386 384 //レジスタ、スタックフレームにセット 387 int ParmSize; 388 ParmSize=pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum); 385 int ParmSize = pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() ); 389 386 390 387 … … 392 389 393 390 //call dword ptr[LookupTable] 391 pDllProc->Using(); 394 392 OpBuffer[obp++]=(char)0xFF; 395 393 OpBuffer[obp++]=(char)0x15; 396 pobj_ImportAddrSchedule->add(p di);394 pobj_ImportAddrSchedule->add(pDllProc); 397 395 obp+=sizeof(long); 398 396 399 if(p di->bCdecl){397 if(pDllProc->IsCdecl()){ 400 398 //add esp,ParmSize 401 399 op_add_esp(ParmSize); … … 408 406 delete pobj_parameter; 409 407 410 if(plpIndex) *plpIndex=p di->u.ReturnIndex;408 if(plpIndex) *plpIndex=pDllProc->ReturnType().GetIndex(); 411 409 412 410 HeapDefaultFree(temporary); 413 411 414 return p di->ReturnType;412 return pDllProc->ReturnType().GetBasicType(); 415 413 } -
BasicCompiler32/Compile_Func.cpp
r73 r75 207 207 } 208 208 209 T YPEINFOTypeInfo={type,lpIndex};209 Type TypeInfo={type,lpIndex}; 210 210 if(IsStringObjectType(TypeInfo)){ 211 211 //Stringオブジェクトの場合 … … 243 243 void Opcode_Func_AddressOf(const char *name){ 244 244 extern int cp; 245 SubInfo *psi;245 UserProc *pUserProc; 246 246 247 247 extern LONG_PTR ProcPtr_BaseIndex; … … 249 249 //左辺の型にのっとり、オーバーロードを解決 250 250 251 std::vector< SubInfo*> subs;251 std::vector<UserProc *> subs; 252 252 GetOverloadSubHash( name, subs ); 253 253 if( subs.size() == 0 ){ … … 257 257 258 258 //オーバーロードを解決 259 extern P ROCPTRINFO *pProcPtrInfo;260 p si=OverloadSolution(name,subs,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);261 262 if(!p si){259 extern ProcPointer **ppProcPtrInfo; 260 pUserProc=OverloadSolution(name,subs,ppProcPtrInfo[ProcPtr_BaseIndex]->Params(), Type() ); 261 262 if(!pUserProc){ 263 263 SetError(27,name,cp); 264 264 return; … … 266 266 } 267 267 else{ 268 p si=GetSubHash(name);269 if(!p si){268 pUserProc=GetSubHash(name); 269 if(!pUserProc){ 270 270 SetError(27,name,cp); 271 271 return; … … 273 273 } 274 274 275 276 if(psi->bVirtual){ 275 if( pUserProc->IsVirtual() ){ 277 276 /////////////////////////////// 278 277 // 仮想関数の場合 … … 324 323 OpBuffer[obp++]=(char)0x11; 325 324 326 int i2 = pobj_c->GetFuncNumInVtbl( p si);325 int i2 = pobj_c->GetFuncNumInVtbl( pUserProc ); 327 326 328 327 //mov eax,dword ptr[edx+func_index] … … 339 338 //mov eax,ProcAddr 340 339 OpBuffer[obp++]=(char)0xB8; 341 pobj_SubAddrSchedule->add(p si,0);340 pobj_SubAddrSchedule->add(pUserProc,0); 342 341 obp+=sizeof(long); 343 342 } 344 343 345 p si->bUse=1;344 pUserProc->Using(); 346 345 } 347 346 void Opcode_Func_SizeOf(const char *Parameter){ … … 361 360 op_mov_RV( REG_EAX, size ); 362 361 } 363 void Opcode_Func_VarPtr( const char *Parameter, T YPEINFO&ReturnTypeInfo ){362 void Opcode_Func_VarPtr( const char *Parameter, Type &ReturnTypeInfo ){ 364 363 RELATIVE_VAR RelativeVar; 365 364 … … 439 438 } 440 439 441 void Opcode_CallFunc( const char *Parameter, const int FuncNum, T YPEINFO&ReturnTypeInfo ){440 void Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo ){ 442 441 switch(FuncNum){ 443 442 case FUNC_FIX: -
BasicCompiler32/Compile_Object.cpp
r73 r75 2 2 #include "opcode.h" 3 3 4 void _call_constructor( CClass *pobj_c, const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){4 void _call_constructor( const CClass *pobj_c, const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){ 5 5 //////////////////////////// 6 6 // コンストラクタの呼び出し … … 31 31 //////////////////////// 32 32 33 std::vector< SubInfo*> subs;33 std::vector<UserProc *> subs; 34 34 pobj_c->EnumMethod( pobj_c->name, subs ); 35 35 36 SubInfo *psi;36 UserProc *pUserProc; 37 37 if( subs.size() > 0 ){ 38 38 //オーバーロードを解決 39 p si=OverloadSolutionWithStrParam(pobj_c->name,40 subs,CreateParameter,"" ,NULL);41 42 if(!p si) return;39 pUserProc=OverloadSolutionWithStrParam(pobj_c->name, 40 subs,CreateParameter,""); 41 42 if(!pUserProc) return; 43 43 } 44 44 45 45 //コンストラクタを呼び出す 46 46 Opcode_CallProc(CreateParameter, 47 p si,47 pUserProc, 48 48 PROCFLAG_NEW,"",0); 49 49 … … 74 74 } 75 75 } 76 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo){76 void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){ 77 77 int typeSize = classObj.GetSize(); 78 78 … … 82 82 } 83 83 84 BOOL bSomeObjects=0; 84 85 if(objectSizeStr[0]){ 85 int type = NumOpe(objectSizeStr,0,0,0); 86 ChangeTypeToLong(type); 86 bSomeObjects=1; 87 88 Type tempType; 89 NumOpe(objectSizeStr,Type(),tempType); 90 if( !tempType.IsWhole() ) SetError(49,NULL,cp); 91 ChangeTypeToLong(tempType.GetBasicType()); 87 92 88 93 //pop eax … … 129 134 } 130 135 131 if( baseTypeInfo.type == DEF_OBJECT ){ 132 //DeleteはGCで処理 136 if( baseType.IsObject() ){ 137 // オブジェクト インスタンス 138 // ※DeleteはGCで処理 133 139 134 140 //call _System_GC_malloc_ForObject 135 extern SubInfo*pSub_System_GC_malloc_ForObject;141 extern UserProc *pSub_System_GC_malloc_ForObject; 136 142 op_call(pSub_System_GC_malloc_ForObject); 137 143 } 138 144 else{ 139 //明示的なDeleteが必要 145 // オブジェクトポインタ 146 // ※明示的なDeleteが必要 140 147 141 148 //call _System_GC_malloc_ForObjectPtr 142 extern SubInfo*pSub_System_GC_malloc_ForObjectPtr;149 extern UserProc *pSub_System_GC_malloc_ForObjectPtr; 143 150 op_call(pSub_System_GC_malloc_ForObjectPtr); 144 151 } … … 184 191 //mov ecx,DestructorProcAddr 185 192 OpBuffer[obp++]=(char)0xB9; 186 pobj_SubAddrSchedule->add(method->p si,0);187 method->p si->bUse=1;193 pobj_SubAddrSchedule->add(method->pUserProc,0); 194 method->pUserProc->Using(); 188 195 obp+=sizeof(long); 189 196 … … 209 216 //////////////////////////// 210 217 211 BOOL bSomeObjects;212 if(objectSizeStr[0]) bSomeObjects=1;213 else bSomeObjects=0;214 218 _call_constructor(&classObj,parameter,typeSize,bSomeObjects); 215 219 } 216 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){217 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];218 int i,i2;219 220 i=0;221 222 if(Parameter[0]=='['){223 i=GetStringInBracket(objectSizeStr,Parameter);224 225 SlideString(objectSizeStr+1,-1);226 objectSizeStr[i-2]=0;227 }228 else objectSizeStr[0]=0;229 230 for(i2=0;;i++,i2++){231 if(Parameter[i]=='('){232 TypeName[i2]=0;233 234 //コンストラクタに渡すパラメータを取得235 i2=GetStringInPare(CreateParameter,Parameter+i);236 RemoveStringPare(CreateParameter);237 i+=i2;238 if(Parameter[i]!='\0'){239 SetError(42,NULL,cp);240 return -1;241 }242 break;243 }244 TypeName[i2]=Parameter[i];245 if(Parameter[i]=='\0'){246 CreateParameter[0]=0;247 break;248 }249 }250 251 int type,TypeSize;252 type=GetTypeFixed(TypeName,plpIndex);253 if(type==-1){254 SetError(3,TypeName,cp);255 return -1;256 }257 TypeSize=GetTypeSize(type,*plpIndex);258 259 if(type!=DEF_OBJECT){260 ////////////////////////261 // 通常のデータ型の場合262 ////////////////////////263 264 SetError(121,NULL,cp);265 return -1;266 }267 268 CClass *pobj_c;269 pobj_c=(CClass *)*plpIndex;270 271 Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );272 273 if( baseTypeInfo.type == DEF_OBJECT ){274 return DEF_OBJECT;275 }276 return DEF_PTR_OBJECT;277 }278 279 220 void OpcodeDelete(const char *Parameter, bool isSweeping){ 280 int type;281 282 type=NumOpe(Parameter,0,0,0);283 if(type==-1) return;284 if(!( type==DEF_PTR_OBJECT||type==DEF_PTR_VOID)) SetError(122,NULL,cp);221 Type tempType; 222 if( !NumOpe(Parameter,Type(),tempType) ){ 223 return; 224 } 225 if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) SetError(122,NULL,cp); 285 226 286 227 //pop eax … … 376 317 if( isSweeping ){ 377 318 //call _System_GC_free_for_SweepingDelete 378 extern SubInfo*pSub_System_GC_free_for_SweepingDelete;319 extern UserProc *pSub_System_GC_free_for_SweepingDelete; 379 320 op_call(pSub_System_GC_free_for_SweepingDelete); 380 321 } 381 322 else{ 382 323 //call free 383 extern SubInfo*pSub_free;324 extern UserProc *pSub_free; 384 325 op_call(pSub_free); 385 326 } -
BasicCompiler32/Compile_ProcOp.cpp
r73 r75 3 3 4 4 5 void SystemProc( char *name){5 void SystemProc( const char *name ){ 6 6 if(lstrcmp(name,"_System_GetEip")==0){ 7 7 //mov eax,dword ptr[esp] … … 69 69 cp=GlobalVar[i].source_code_address; 70 70 71 T YPEINFOTypeInfo;71 Type TypeInfo; 72 72 TypeInfo.type=GlobalVar[i].type; 73 73 TypeInfo.u.lpIndex=GlobalVar[i].u.index; … … 214 214 } 215 215 216 void CompileBufferInProcedure( SubInfo *psi){216 void CompileBufferInProcedure(UserProc *pUserProc){ 217 217 extern char *basbuf; 218 218 extern HANDLE hHeap; 219 extern SubInfo**ppSubHash;219 extern UserProc **ppSubHash; 220 220 extern BOOL bDebugCompile; 221 221 int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset; … … 224 224 BufferSize=128; 225 225 226 if( psi->bUse==0||psi->bCompile) return;227 228 p si->bCompile=1;226 if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return; 227 228 pUserProc->CompleteCompile(); 229 229 230 230 extern BOOL bSystemProc; 231 if(memcmp(p si->name,"_System_",8)==0) bSystemProc=1;231 if(memcmp(pUserProc->GetName().c_str(),"_System_",8)==0) bSystemProc=1; 232 232 else bSystemProc=0; 233 233 234 234 extern BOOL bDebugSupportProc; 235 if(memcmp(p si->name,"_DebugSys_",10)==0){235 if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){ 236 236 if(!bDebugCompile){ 237 p si->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);238 p si->VarNum=0;237 pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 238 pUserProc->VarNum=0; 239 239 return; 240 240 } … … 243 243 else bDebugSupportProc=0; 244 244 245 p si->CompileAddress=obp;246 247 if(p si->bSystem){245 pUserProc->beginOpAddress=obp; 246 247 if(pUserProc->IsSystem()){ 248 248 extern int MaxLocalVarNum; 249 249 extern int AllLocalVarSize; … … 251 251 AllLocalVarSize=0; 252 252 253 SystemProc(p si->name);254 255 p si->EndOpAddr=obp;256 p si->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);257 p si->VarNum=0;253 SystemProc(pUserProc->GetName().c_str()); 254 255 pUserProc->endOpAddress=obp; 256 pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 257 pUserProc->VarNum=0; 258 258 return; 259 259 } 260 260 261 cp=p si->address;261 cp=pUserProc->GetCodePos(); 262 262 for(;;cp++){ 263 263 if(IsCommandDelimitation(basbuf[cp])) break; … … 280 280 281 281 //パラメータ用の変数データを考慮 282 for(i3= psi->realParams.size()-1;i3>=0;i3--){283 Parameter ¶m = *p si->realParams[i3];282 for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){ 283 Parameter ¶m = *pUserProc->RealParams()[i3]; 284 284 285 285 //変数データを追加 … … 297 297 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 298 298 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 299 if(p si->bExport)299 if(pUserProc->IsExport()) 300 300 SetError(24,NULL,cp); 301 301 } … … 340 340 341 341 //コンパイル中の関数が属するクラス 342 pobj_CompilingClass=p si->pobj_ParentClass;342 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 343 343 344 344 //コンパイルスタートをクラス管理クラスに追加 345 pobj_DBClass->StartCompile( p si);345 pobj_DBClass->StartCompile( pUserProc ); 346 346 347 347 //コンパイル中の関数 348 extern SubInfo *pCompilingSubInfo;349 pCompiling SubInfo=psi;348 extern UserProc *pCompilingUserProc; 349 pCompilingUserProc=pUserProc; 350 350 351 351 … … 373 373 OpBuffer[obp++]=(char)0x57; 374 374 375 if( psi->ReturnType!=DEF_NON){375 if( !pUserProc->ReturnType().IsNull() ){ 376 376 //戻り値が存在するとき 377 377 378 char *temp; 379 if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue"; 380 else temp=psi->name; 381 382 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 378 const char *temp = pUserProc->GetName().c_str(); 379 if( temp[0]==1&&temp[1]==ESC_OPERATOR ){ 380 temp = "_System_ReturnValue"; 381 } 382 383 if( pUserProc->ReturnType().IsStruct() ){ 383 384 //戻り値用の構造体(値型)はパラメータで引き渡される 384 385 } 385 386 else{ 386 387 //戻り値用の変数の定義 387 if( psi->isReturnRef ){ 388 sprintf(temporary,"%c%c",1,ESC_BYREF); 389 } 390 else temporary[0]=0; 391 392 sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS); 393 GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary)); 388 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 394 389 395 390 OpcodeDim(temporary,0); … … 444 439 445 440 //call _DebugSys_StartProc 446 extern SubInfo*pSub_DebugSys_StartProc;441 extern UserProc *pSub_DebugSys_StartProc; 447 442 op_call(pSub_DebugSys_StartProc); 448 443 } 449 444 450 445 if(pobj_CompilingClass){ 451 if( lstrcmp(psi->name,pobj_CompilingClass->name)==0){446 if( pUserProc->GetName() == pobj_CompilingClass->name ){ 452 447 //////////////////////////////////// 453 448 // コンストラクタをコンパイルするとき … … 497 492 498 493 Opcode_CallProc(temporary, 499 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,494 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 500 495 0, 501 496 "", … … 505 500 //基底クラスのコンストラクタを暗黙的に呼び出す 506 501 Opcode_CallProc("", 507 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,502 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 508 503 0, 509 504 "", … … 548 543 } 549 544 } 550 else if( psi->name[0]=='~'){545 else if( pUserProc->IsDestructor() ){ 551 546 //デストラクタをコンパイルしたとき 552 547 … … 559 554 ////////////////////////////////////////// 560 555 ////// プロシージャ内をコンパイル //////// 561 if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0); 562 else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0); 563 else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0); 556 if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0); 557 else{ 558 if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0); 559 else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0); 560 } 564 561 ////////////////////////////////////////// 565 562 ////////////////////////////////////////// … … 573 570 pobj_CompilingClass->NotifyFinishConstructorCompile(); 574 571 } 575 else if( psi->name[0]=='~'){572 else if( pUserProc->IsDestructor() ){ 576 573 //////////////////////////////////// 577 574 //デストラクタをコンパイルしたとき … … 588 585 if( method ){ 589 586 Opcode_CallProc("", 590 method->p si,587 method->pUserProc, 591 588 0, 592 589 "", … … 631 628 632 629 //call destructor 633 op_call( method->p si);630 op_call( method->pUserProc ); 634 631 } 635 632 } … … 666 663 HeapDefaultFree(WithInfo.pWithCp); 667 664 668 //重複エラー情報管理のメモリを解放669 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);670 HeapDefaultFree(SynonymErrorWords);671 672 665 //push ebp 673 666 AllLocalVarSize+=sizeof(long); … … 686 679 687 680 //call _DebugSys_EndProc 688 extern SubInfo*pSub_DebugSys_EndProc;681 extern UserProc *pSub_DebugSys_EndProc; 689 682 op_call(pSub_DebugSys_EndProc); 690 683 } 691 684 692 if( psi->ReturnType!=DEF_NON){685 if( !pUserProc->ReturnType().IsNull() ){ 693 686 //戻り値をeax、edxに設定 694 687 RELATIVE_VAR RelativeVar; 695 688 LONG_PTR lpIndex; 696 689 697 c har *temp;698 if( psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)690 const char *temp = pUserProc->GetName().c_str(); 691 if( temp[0]==1 && temp[1]==ESC_OPERATOR ){ 699 692 temp="_System_ReturnValue"; 700 else temp=psi->name;693 } 701 694 GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex); 702 695 703 i3=p si->ReturnType;696 i3=pUserProc->ReturnType().GetBasicType(); 704 697 705 698 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ … … 808 801 809 802 //call _esp_error 810 extern SubInfo*pSub_esp_error;803 extern UserProc *pSub_esp_error; 811 804 op_call( pSub_esp_error ); 812 805 … … 824 817 op_add_esp(AllLocalVarSize-BaseOffset); 825 818 826 if( BaseOffset==0||psi->bCdecl){819 if( BaseOffset==0 || pUserProc->IsCdecl() ){ 827 820 //ret 0 828 821 OpBuffer[obp++]=(char)0xC3; … … 835 828 } 836 829 837 psi->EndOpAddr=obp; 838 psi->pVar=LocalVar; 839 psi->VarNum=MaxLocalVarNum; 830 pUserProc->endOpAddress=obp; 831 pUserProc->pVar=LocalVar; 832 pUserProc->VarNum=MaxLocalVarNum; 833 834 835 //重複エラー情報管理のメモリを解放 836 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]); 837 HeapDefaultFree(SynonymErrorWords); 838 SynonymErrorWords=0; 839 840 840 841 841 //ローカル変数のネーム情報は後に解放する 842 842 } 843 843 void CompileLocal(){ 844 extern SubInfo**ppSubHash;844 extern UserProc **ppSubHash; 845 845 int i2; 846 SubInfo *psi;846 UserProc *pUserProc; 847 847 848 848 extern BOOL bDll; 849 849 if(bDll){ 850 850 //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする 851 p si=GetSubHash("_System_InitDllGlobalVariables");852 if(p si){853 CompileBufferInProcedure(p si);851 pUserProc=GetSubHash("_System_InitDllGlobalVariables"); 852 if(pUserProc){ 853 CompileBufferInProcedure(pUserProc); 854 854 } 855 855 else SetError(300,NULL,cp); … … 858 858 //_System_InitStaticLocalVariablesは一番最後にコンパイル 859 859 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない 860 extern SubInfo*pSub_System_InitStaticLocalVariables;861 pSub_System_InitStaticLocalVariables-> bCompile=1;860 extern UserProc *pSub_System_InitStaticLocalVariables; 861 pSub_System_InitStaticLocalVariables->CompleteCompile(); 862 862 863 863 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 864 extern SubInfo*pSub_System_Call_Destructor_of_GlobalObject;865 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=1;864 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject; 865 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 866 866 867 867 Repeat: 868 868 for(i2=0;i2<MAX_HASH;i2++){ 869 p si=ppSubHash[i2];870 while(p si){871 CompileBufferInProcedure(p si);872 p si=psi->pNextData;869 pUserProc=ppSubHash[i2]; 870 while(pUserProc){ 871 CompileBufferInProcedure(pUserProc); 872 pUserProc=pUserProc->pNextData; 873 873 } 874 874 } … … 876 876 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 877 877 for(i2=0;i2<MAX_HASH;i2++){ 878 p si=ppSubHash[i2];879 while(p si){880 if( psi->bUse&&psi->bCompile==0){878 pUserProc=ppSubHash[i2]; 879 while(pUserProc){ 880 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 881 881 goto Repeat; 882 882 } 883 883 884 p si=psi->pNextData;884 pUserProc=pUserProc->pNextData; 885 885 } 886 886 } 887 887 888 888 //_System_InitStaticLocalVariablesは一番最後にコンパイル 889 pSub_System_InitStaticLocalVariables-> bCompile=0;889 pSub_System_InitStaticLocalVariables->KillCompileStatus(); 890 890 CompileBufferInProcedure(pSub_System_InitStaticLocalVariables); 891 891 892 892 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 893 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=0;893 pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus(); 894 894 CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject); 895 895 } -
BasicCompiler32/Compile_Set_Var.cpp
r73 r75 7 7 } 8 8 9 void SetStructVariable( LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){9 void SetStructVariable( const Type &varType, const Type &calcType, BOOL bUseHeap){ 10 10 /* 11 11 TODO: 消す … … 37 37 38 38 39 if( CalcType == DEF_STRUCT ){ 40 CClass *pVarClass = (CClass *)lpVarIndex; 41 CClass *pCalcClass = (CClass *)lpCalcIndex; 42 43 44 if( pVarClass->IsEquals( pCalcClass ) ){ //等しい 39 if( calcType.IsStruct() ){ 40 if( varType.GetClass().IsEquals( &calcType.GetClass() ) ){ //等しい 45 41 46 42 //双方のオブジェクト型が一致、または派生・継承関係にあるとき 47 43 //※コピーを行う 48 44 49 int object_size = pVarClass->GetSize();45 int object_size = varType.GetClass().GetSize(); 50 46 51 47 //mov ecx,object_size … … 71 67 72 68 //call free 73 extern SubInfo*pSub_free;69 extern UserProc *pSub_free; 74 70 op_call(pSub_free); 75 71 } -
BasicCompiler32/Compile_Statement.cpp
r73 r75 5 5 int i,i2; 6 6 char buffer[8192]; 7 SubInfo *psi;7 UserProc *pUserProc; 8 8 9 9 for(i=0;;i++){ … … 41 41 ////////////////////////////// 42 42 43 p si=GetSubHash(Command);43 pUserProc=GetSubHash(Command); 44 44 45 45 //GetSubHash内でエラー提示が行われた場合 46 if(p si==(SubInfo*)-1) return;47 48 if(p si==0){46 if(pUserProc==(UserProc *)-1) return; 47 48 if(pUserProc==0){ 49 49 char temporary[VN_SIZE]; 50 50 lstrcpy(temporary,Command); 51 51 52 52 CharUpper(temporary); 53 p si=GetSubHash(temporary);53 pUserProc=GetSubHash(temporary); 54 54 55 55 //GetSubHash内でエラー提示が行われた場合 56 if(p si==(SubInfo*)-1) return;57 } 58 59 if(p si){60 if( psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);61 62 Opcode_CallProc("",p si,0,"",0);56 if(pUserProc==(UserProc *)-1) return; 57 } 58 59 if(pUserProc){ 60 if( !pUserProc->IsMacro() ) SetError(10,Command,cp); 61 62 Opcode_CallProc("",pUserProc,0,"",0); 63 63 64 64 return; … … 963 963 964 964 int CaseTypeSize; 965 void OpcodeSelect(c har *Parameter){965 void OpcodeSelect(const char *lpszParams){ 966 966 extern DWORD *pCaseSchedule; 967 967 extern int CaseScheduleNum; … … 987 987 988 988 LONG_PTR lpIndex; 989 type1=NumOpe( Parameter,0,0,&lpIndex);989 type1=NumOpe(lpszParams,0,0,&lpIndex); 990 990 if(type1==DEF_INTEGER|| 991 991 type1==DEF_WORD|| … … 1076 1076 pobj_c=(CClass *)lpIndex; 1077 1077 1078 std::vector< SubInfo*> subs;1078 std::vector<UserProc *> subs; 1079 1079 pobj_c->EnumMethod( CALC_EQUAL, subs ); 1080 1080 if( subs.size() == 0 ){ … … 1082 1082 } 1083 1083 1084 PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3); 1085 int iParmNum=0; 1086 ppi[iParmNum].bArray=0; 1087 ppi[iParmNum].bByVal=0; 1088 ppi[iParmNum].name=0; 1089 ppi[iParmNum].type=type2; 1090 ppi[iParmNum].u.index=lpIndex2; 1091 ppi[iParmNum].SubScripts[0]=-1; 1092 iParmNum++; 1084 Parameters params; 1085 params.push_back( new Parameter( "", Type( type2, lpIndex2 ) ) ); 1093 1086 1094 1087 //オーバーロードを解決 1095 SubInfo *psi; 1096 psi=OverloadSolution("==",subs,ppi,iParmNum,NULL); 1097 HeapDefaultFree(ppi); 1098 1099 if(!psi){ 1088 UserProc *pUserProc; 1089 pUserProc=OverloadSolution("==",subs, params, NULL); 1090 1091 delete params[0]; 1092 1093 if(!pUserProc){ 1100 1094 //エラー 1101 1095 return; … … 1116 1110 1117 1111 //call operator_proc ※ ==演算子 1118 op_call(p si);1112 op_call(pUserProc); 1119 1113 1120 1114 //test eax,eax … … 1330 1324 //戻り値をセット 1331 1325 if(Parameter[0]){ 1332 extern SubInfo *pCompilingSubInfo; 1333 char *temp; 1334 if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR) 1335 temp="_System_ReturnValue"; 1336 else temp=pCompilingSubInfo->name; 1337 1338 /* 1339 TODO: 消す 1340 if( pCompilingSubInfo->isReturnRef ){ 1341 //参照型 1342 SetRefVariable( temp, Parameter ); 1343 } 1344 else{ 1345 //値型*/ 1346 char temporary[VN_SIZE]; 1347 sprintf(temporary,"%s=%s",temp,Parameter); 1348 OpcodeCalc(temporary); 1349 //} 1326 extern UserProc *pCompilingUserProc; 1327 const char *temp = "_System_ReturnValue"; 1328 if(pCompilingUserProc->GetName()[0]==1&&pCompilingUserProc->GetName()[1]==ESC_OPERATOR) 1329 { 1330 } 1331 else temp=pCompilingUserProc->GetName().c_str(); 1332 1333 char temporary[VN_SIZE]; 1334 sprintf(temporary,"%s=%s",temp,Parameter); 1335 OpcodeCalc(temporary); 1350 1336 } 1351 1337 … … 1460 1446 OpcodeCalc(temp2); 1461 1447 1462 SubInfo *psi;1463 if(bFile) p si=GetSubHash("INPUT_FromFile");1464 else p si=GetSubHash("INPUT_FromPrompt");1465 if(!p si){1448 UserProc *pUserProc; 1449 if(bFile) pUserProc=GetSubHash("INPUT_FromFile"); 1450 else pUserProc=GetSubHash("INPUT_FromPrompt"); 1451 if(!pUserProc){ 1466 1452 SetError(3,"Input",cp); 1467 1453 return; 1468 1454 } 1469 Opcode_CallProc(buffer,p si,0,"",0);1455 Opcode_CallProc(buffer,pUserProc,0,"",0); 1470 1456 } 1471 1457 void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){ … … 1562 1548 OpcodeCalc(temp2); 1563 1549 1564 SubInfo *psi;1565 if(bFile) p si=GetSubHash("PRINTUSING_ToFile");1566 else p si=GetSubHash("PRINTUSING_ToPrompt");1567 if(!p si){1550 UserProc *pUserProc; 1551 if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile"); 1552 else pUserProc=GetSubHash("PRINTUSING_ToPrompt"); 1553 if(!pUserProc){ 1568 1554 SetError(3,"Print",cp); 1569 1555 return; 1570 1556 } 1571 Opcode_CallProc(buffer,p si,0,"",0);1557 Opcode_CallProc(buffer,pUserProc,0,"",0); 1572 1558 } 1573 1559 void Opcode_Print(const char *Parameter,BOOL bWrite){ … … 1666 1652 if(sw) lstrcat(buffer,"+Ex\"\\r\\n\""); 1667 1653 1668 SubInfo *psi;1669 if(bFile) p si=GetSubHash("PRINT_ToFile");1670 else p si=GetSubHash("PRINT_ToPrompt");1671 if(!p si){1654 UserProc *pUserProc; 1655 if(bFile) pUserProc=GetSubHash("PRINT_ToFile"); 1656 else pUserProc=GetSubHash("PRINT_ToPrompt"); 1657 if(!pUserProc){ 1672 1658 SetError(3,"Print",cp); 1673 1659 return; 1674 1660 } 1675 Opcode_CallProc(buffer,p si,0,"",0);1661 Opcode_CallProc(buffer,pUserProc,0,"",0); 1676 1662 } 1677 1663 -
BasicCompiler32/Compile_Var.cpp
r73 r75 11 11 int AllLocalVarSize; 12 12 13 void SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){ 14 int i2; 15 13 void SetRelativeOffset( Type &resultType, RELATIVE_VAR *pRelativeVar,const char *lpPtrOffset){ 16 14 PushLongVariable(pRelativeVar); 17 15 18 i2=NumOpe(lpPtrOffset,0,0,0); 19 ChangeTypeToLong(i2); 16 Type type; 17 NumOpe( lpPtrOffset, Type(), type ); 18 ChangeTypeToLong( type.GetBasicType() ); 20 19 21 20 //pop ebx 22 21 op_pop(REG_EBX); 23 22 24 if( PTR_LEVEL(*pType)){25 *pType = PTR_LEVEL_DOWN( *pType);26 27 i 2=GetTypeSize(*pType,lpIndex);28 if( i2>=2){23 if( resultType.PtrLevel() ){ 24 resultType.PtrLevelDown(); 25 26 int typeSize = resultType.GetSize(); 27 if(typeSize>=2){ 29 28 //imul ebx,i2 30 op_imul_RV( REG_EBX, i2);29 op_imul_RV( REG_EBX, typeSize ); 31 30 } 32 31 } … … 58 57 } 59 58 } 60 BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){59 bool GetArrayOffset(const int *SubScripts,char *array, const Type &type){ 61 60 extern HANDLE hHeap; 62 int i,i2,i3,i4 ,TypeSize;61 int i,i2,i3,i4; 63 62 char temporary[VN_SIZE],*pParm[MAX_PARMS]; 64 63 … … 110 109 111 110 for(i=i3-1;i>=0;i--){ 112 T YPEINFO TypeInfo;111 Type tempType; 113 112 BOOL bUseHeap; 114 TypeInfo.type=NumOpe(pParm[i],DEF_LONG,-1,&TypeInfo.u.lpIndex,&bUseHeap);115 if( TypeInfo.type==DEF_OBJECT){113 NumOpe( pParm[i], Type( DEF_LONG ), tempType, &bUseHeap ); 114 if( tempType.IsObject() ){ 116 115 //キャスト演算子のオーバーロードに対応する 117 116 CallCastOperatorProc( 118 TypeInfo.type,TypeInfo.u.lpIndex,119 bUseHeap, DEF_LONG,-1);120 TypeInfo.type=DEF_LONG;121 } 122 ChangeTypeToLong( TypeInfo.type);117 tempType, 118 bUseHeap, Type(DEF_LONG) ); 119 tempType.SetBasicType( DEF_LONG ); 120 } 121 ChangeTypeToLong( tempType.GetBasicType() ); 123 122 124 123 //pop eax … … 144 143 op_pop(REG_EAX); 145 144 146 TypeSize=GetTypeSize(type,lpIndex);147 148 145 //imul eax,TypeSize 149 146 OpBuffer[obp++]=(char)0x69; 150 147 OpBuffer[obp++]=(char)0xC0; 151 *((long *)(OpBuffer+obp)) =TypeSize;148 *((long *)(OpBuffer+obp)) = type.GetSize(); 152 149 obp+=sizeof(long); 153 150 … … 161 158 return 1; 162 159 } 163 BOOL GetMemberOffset(bool isErrorEnabled, bool isWriteAccess, CClass *pobj_c, char *member, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpNestIndex, BOOL bPrivateAccess){160 bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){ 164 161 int i; 165 162 166 //クラス、配列の構成要素を解析する 163 164 ////////////////////////////////////// 165 // クラス、配列の構成要素を解析する 166 ////////////////////////////////////// 167 167 168 char VarName[VN_SIZE]; //変数名 168 169 char array[VN_SIZE]; //第1次配列 … … 171 172 CClass::RefType refType; 172 173 lstrcpy(VarName,member); 173 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0; 174 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false; 175 174 176 175 177 //////////////////////////// … … 177 179 //////////////////////////// 178 180 179 int offset =pobj_c->GetMemberOffset( VarName, &i );180 if(i== pobj_c->iMemberNum){181 int offset = objClass.GetMemberOffset( VarName, &i ); 182 if(i==objClass.iMemberNum){ 181 183 if(isErrorEnabled) SetError(103,VarName,cp); 182 return 0; 183 } 184 185 CMember *pMember=pobj_c->ppobj_Member[i]; 184 return false; 185 } 186 187 CMember *pMember=objClass.ppobj_Member[i]; 188 186 189 187 190 //アクセシビリティをチェック 188 if( pobj_c==pobj_CompilingClass){191 if(&objClass==pobj_CompilingClass){ 189 192 //同一クラスオブジェクトの場合はプライベートアクセスを容認する 190 193 if(pMember->dwAccess==ACCESS_NON){ 191 194 if(isErrorEnabled) SetError(107,VarName,cp); 192 return 0;195 return false; 193 196 } 194 197 } … … 197 200 pMember->dwAccess==ACCESS_NON){ 198 201 if(isErrorEnabled) SetError(107,VarName,cp); 199 return 0;202 return false; 200 203 } 201 204 else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){ 202 205 if(isErrorEnabled) SetError(108,VarName,cp); 203 return 0;206 return false; 204 207 } 205 208 } … … 209 212 if( pMember->IsConst() && //定数メンバである 210 213 isWriteAccess && //書き込みアクセスを要求されている 211 pobj_c->IsCompilingConstructor() == false //コンストラクタ コンパイル中を除く214 objClass.IsCompilingConstructor() == false //コンストラクタ コンパイル中を除く 212 215 ){ 213 216 //Const定義の変数に書き込みアクセスをしようとした場合 … … 215 218 } 216 219 217 *pType=pMember->TypeInfo.type; 218 *plpNestIndex=pMember->TypeInfo.u.lpIndex; 220 resultType = *pMember; 219 221 220 222 //ポインタ変数の場合 221 if( IsPtrType(*pType)){223 if( resultType.IsPointer() ){ 222 224 if(pMember->SubScripts[0]==-1){ 223 225 lstrcpy(lpPtrOffset,array); … … 228 230 if(lpPtrOffset[0]){ 229 231 if(isErrorEnabled) SetError(16,member,cp); 230 return 0;232 return false; 231 233 } 232 234 } … … 242 244 if(array[0]){ 243 245 //配列オフセット 244 if(!GetArrayOffset(pMember->SubScripts,array,*p Type,pMember->TypeInfo.u.lpIndex))246 if(!GetArrayOffset(pMember->SubScripts,array,*pMember)){ 245 247 if(isErrorEnabled) SetError(14,member,cp); 248 } 246 249 } 247 250 else if(pMember->SubScripts[0]!=-1){ 248 *pType|=FLAG_PTR;251 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR ); 249 252 } 250 253 … … 252 255 //入れ子構造の場合 253 256 254 if( *pType==DEF_OBJECT || *pType==DEF_STRUCT){257 if( resultType.IsObject() || resultType.IsStruct() ){ 255 258 if( refType != CClass::Dot ){ 256 259 if(isErrorEnabled) SetError(104,member,cp); 257 return 0;258 } 259 260 if( *pType==DEF_OBJECT){260 return false; 261 } 262 263 if( resultType.IsObject() ){ 261 264 // 参照内容へのポインタを抽出 262 265 SetRelativeOffset( *pRelativeVar ); 263 266 } 264 267 } 265 else if( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){268 else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){ 266 269 //構造体ポインタ型メンバ変数 267 270 268 271 if(lpPtrOffset[0]){ 269 272 //pObj[n].member 270 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){ 271 if(isErrorEnabled) SetError(104,member,cp); 272 return 0; 273 if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() ) 274 && refType != CClass::Dot ){ 275 if(isErrorEnabled) SetError(104,member,cp); 276 return false; 273 277 } 274 278 275 279 //直接参照に切り替え 276 SetRelativeOffset( pType,*plpNestIndex,pRelativeVar,lpPtrOffset);280 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 277 281 pRelativeVar->dwKind=VAR_DIRECTMEM; 278 282 … … 281 285 else{ 282 286 //pObj->member 283 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){ 284 if(isErrorEnabled) SetError(104,member,cp); 285 return 0; 287 if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() ) 288 && refType != CClass::Pointer ){ 289 if(isErrorEnabled) SetError(104,member,cp); 290 return false; 286 291 } 287 292 … … 289 294 } 290 295 } 291 else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 296 else if( resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_OBJECT,2) 297 || resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_STRUCT,2)){ 292 298 //構造体ポインタのポインタ型メンバ変数 293 299 … … 296 302 if( refType != CClass::Pointer ){ 297 303 if(isErrorEnabled) SetError(104,member,cp); 298 return 0;304 return false; 299 305 } 300 306 301 307 //直接参照に切り替え 302 SetRelativeOffset( pType,*plpNestIndex,pRelativeVar,lpPtrOffset);308 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 303 309 pRelativeVar->dwKind=VAR_DIRECTMEM; 304 310 … … 311 317 else{ 312 318 if(isErrorEnabled) SetError(104,member,cp); 313 return 0;314 } 315 } 316 317 if(! GetMemberOffset(319 return false; 320 } 321 } 322 323 if(!_member_offset( 318 324 isErrorEnabled, 319 325 isWriteAccess, 320 pMember-> TypeInfo.u.pobj_Class,326 pMember->GetClass(), 321 327 NestMember, 322 pType,323 328 pRelativeVar, 324 plpNestIndex,325 0)) return 0;329 resultType, 330 0)) return false; 326 331 } 327 332 328 333 if(lpPtrOffset[0]){ 329 SetRelativeOffset( pType,*plpNestIndex,pRelativeVar,lpPtrOffset);334 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 330 335 pRelativeVar->dwKind=VAR_DIRECTMEM; 331 336 } 332 337 333 return 1;338 return true; 334 339 } 335 340 void GetWithName(char *buffer){ … … 355 360 } 356 361 357 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){ 358 extern BOOL bCompilingGlobal; 362 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){ 359 363 int i; 360 LONG_PTR lpIndex;361 364 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE]; 362 365 … … 373 376 374 377 void *pInfo; 375 int idProc=GetProc(VarName, &pInfo);378 int idProc=GetProc(VarName,(void **)&pInfo); 376 379 377 380 if(idProc){ 378 381 pRelativeVar->dwKind=VAR_DIRECTMEM; 382 383 Type type; 379 384 380 385 … … 383 388 //////////////// 384 389 385 *pType=CallProc(idProc,pInfo,VarName,array,&lpIndex);390 CallProc(idProc,pInfo,VarName,array,type); 386 391 387 392 //戻り値をecxにコピー … … 389 394 390 395 391 LONG_PTR lp2; 392 if(!GetMemberOffset( 396 if(!_member_offset( 393 397 isErrorEnabled, 394 398 isWriteAccess, 395 (CClass *)lpIndex, 396 member,pType,pRelativeVar,&lp2,0)) return 0; 397 if(plpIndex) *plpIndex=lp2; 398 399 return 1; 399 type.GetClass(), 400 member,pRelativeVar,resultType,0)) return false; 401 402 return true; 400 403 } 401 404 } … … 405 408 GetVarFormatString(VarName,array,lpPtrOffset,member,refType); 406 409 407 int *pSubScripts; 408 bool bConst; 409 410 if(bCompilingGlobal==0){ 411 //////////////////// 410 const int *pSubScripts; 411 bool bConst = false; 412 413 414 if( UserProc::IsLocalAreaCompiling() ){ 415 ////////////////// 412 416 // ローカル変数 413 //////////////////// 414 415 for(i=MaxLocalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 416 if( LocalVar[i].bLiving //現在のスコープで有効なもの 417 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 418 ){ 419 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 420 } 421 } 422 if(i>=0){ 417 ////////////////// 418 419 const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName ); 420 if( pVar ){ 423 421 //ポインタ変数の場合 424 if( IsPtrType(LocalVar[i].type)){425 if( LocalVar[i].SubScripts[0]==-1){422 if( pVar->IsPointer() ){ 423 if( !pVar->IsArray() ){ 426 424 lstrcpy(lpPtrOffset,array); 427 425 array[0]=0; … … 432 430 SetError(16,variable,cp); 433 431 pRelativeVar->dwKind=NON_VAR; 434 return 0;432 return false; 435 433 } 436 434 } 437 435 438 pRelativeVar->offset=- LocalVar[i].offset;436 pRelativeVar->offset=-pVar->offset; 439 437 pRelativeVar->bOffsetOffset=0; 440 if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL; 438 if( pVar->IsRef() ){ 439 // 参照型 440 pRelativeVar->dwKind = VAR_REFLOCAL; 441 } 441 442 else pRelativeVar->dwKind=VAR_LOCAL; 442 *pType=LocalVar[i].type; 443 lpIndex=LocalVar[i].u.index; 444 if(plpIndex) *plpIndex=lpIndex; 445 pSubScripts=LocalVar[i].SubScripts; 446 bConst = LocalVar[i].bConst; 443 resultType = *pVar; 444 pSubScripts=pVar->GetSubScriptsPtr(); 445 bConst = pVar->IsConst(); 447 446 448 447 goto ok; … … 461 460 SetThisPtrToReg(REG_ECX); 462 461 463 *pType=DEF_OBJECT;464 462 pRelativeVar->dwKind=VAR_DIRECTMEM; 465 463 466 if(plpIndex) *plpIndex=(LONG_PTR)pobj_CompilingClass;467 return 1;464 resultType.SetType( DEF_OBJECT, pobj_CompilingClass ); 465 return true; 468 466 } 469 467 … … 500 498 501 499 pRelativeVar->dwKind=VAR_DIRECTMEM; 502 if(! GetMemberOffset(500 if(!_member_offset( 503 501 isErrorEnabled, 504 502 isWriteAccess, 505 pobj_CompilingClass,503 *pobj_CompilingClass, 506 504 variable, 507 pType,508 505 pRelativeVar, 509 &lpIndex,1)) return 0; 510 if(plpIndex) *plpIndex=lpIndex; 511 return 1; 506 resultType,1)) return false; 507 return true; 512 508 } 513 509 514 510 NonClassMember: 515 511 516 ////////////////////////// 517 // 静的ローカル変数 518 // ※"Static.Object.Method.Variable" 519 ////////////////////////// 520 521 char temporary[VN_SIZE]; 522 extern SubInfo *pCompilingSubInfo; 523 if(pCompilingSubInfo){ 524 GetNowStaticVarFullName(VarName,temporary); 525 526 for(i=0;i<MaxGlobalVarNum;i++){ 527 if(lstrcmp(temporary,GlobalVar[i].name)==0) break; 528 } 529 if(i!=MaxGlobalVarNum){ 512 { 513 const Variable *pVar; 514 515 ////////////////////////// 516 // 静的ローカル変数 517 // ※"Static.Object.Method.Variable" 518 ////////////////////////// 519 520 char temporary[VN_SIZE]; 521 if( UserProc::IsLocalAreaCompiling() ){ 522 GetNowStaticVarFullName(VarName,temporary); 523 524 pVar = globalVars.Find( temporary ); 525 if( pVar ){ 526 goto GlobalOk; 527 } 528 } 529 530 531 ////////////////////////// 532 // クラスの静的メンバ 533 ////////////////////////// 534 535 if(member[0]){ 536 lstrcpy(temporary,member); 537 538 char tempMember[VN_SIZE]; 539 char tempArray[VN_SIZE]; 540 { 541 CClass::RefType refType; 542 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType ); 543 } 544 545 char temp2[VN_SIZE]; 546 sprintf(temp2,"%s.%s",VarName,temporary); 547 pVar = globalVars.Find( temp2 ); 548 if( pVar ){ 549 lstrcpy(member,tempMember); 550 lstrcpy(array,tempArray); 551 goto GlobalOk; 552 } 553 } 554 555 if(pobj_CompilingClass){ 556 //自身のクラスから静的メンバを参照する場合 557 char temp2[VN_SIZE]; 558 sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName); 559 pVar = globalVars.Find( temp2 ); 560 if( pVar ){ 561 goto GlobalOk; 562 } 563 } 564 565 ///////////////////// 566 // グローバル変数 567 ///////////////////// 568 569 pVar = globalVars.BackSearch( VarName ); 570 if( pVar ){ 530 571 goto GlobalOk; 531 572 } 532 } 533 534 535 ////////////////////////// 536 // クラスの静的メンバ 537 ////////////////////////// 538 539 if(member[0]){ 540 lstrcpy(temporary,member); 541 542 char tempMember[VN_SIZE]; 543 char tempArray[VN_SIZE]; 544 { 545 CClass::RefType refType; 546 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType ); 547 } 548 549 char temp2[VN_SIZE]; 550 sprintf(temp2,"%s.%s",VarName,temporary); 551 for(i=0;i<MaxGlobalVarNum;i++){ 552 if(lstrcmp(temp2,GlobalVar[i].name)==0) break; 553 } 554 555 if(i!=MaxGlobalVarNum){ 556 lstrcpy(member,tempMember); 557 lstrcpy(array,tempArray); 558 goto GlobalOk; 559 } 560 } 561 562 if(pobj_CompilingClass){ 563 //自身のクラスから静的メンバを参照する場合 564 char temp2[VN_SIZE]; 565 sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName); 566 for(i=0;i<MaxGlobalVarNum;i++){ 567 if(lstrcmp(temp2,GlobalVar[i].name)==0) break; 568 } 569 570 if(i!=MaxGlobalVarNum){ 571 goto GlobalOk; 572 } 573 } 574 575 576 //////////////////// 577 // グローバル変数 578 //////////////////// 579 580 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 581 if( GlobalVar[i].bLiving //現在のスコープで有効なもの 582 && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 583 ){ 584 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 585 } 586 } 587 if(i>=0){ 588 goto GlobalOk; 589 } 590 591 592 if(isErrorEnabled) SetError(3,variable,cp); 593 pRelativeVar->dwKind=NON_VAR; 594 return 0; 573 574 if(isErrorEnabled) SetError(3,variable,cp); 575 pRelativeVar->dwKind=NON_VAR; 576 return false; 577 595 578 596 579 597 580 GlobalOk: 598 599 //ポインタ変数の場合 600 if(IsPtrType(GlobalVar[i].type)){ 601 if(GlobalVar[i].SubScripts[0]==-1){ 602 lstrcpy(lpPtrOffset,array); 603 array[0]=0; 604 } 605 } 606 else{ 607 if(lpPtrOffset[0]){ 608 SetError(16,variable,cp); 609 pRelativeVar->dwKind=NON_VAR; 610 return 0; 611 } 612 } 613 614 pRelativeVar->offset=GlobalVar[i].offset; 615 pRelativeVar->bOffsetOffset=0; 616 if(GlobalVar[i].fRef){ 617 // 参照型 618 pRelativeVar->dwKind = VAR_REFGLOBAL; 619 } 620 else pRelativeVar->dwKind=VAR_GLOBAL; 621 *pType=GlobalVar[i].type; 622 lpIndex=GlobalVar[i].u.index; 623 if(plpIndex) *plpIndex=lpIndex; 624 pSubScripts=GlobalVar[i].SubScripts; 625 bConst = GlobalVar[i].bConst; 581 //ポインタ変数の場合 582 if( pVar->IsPointer() ){ 583 if( !pVar->IsArray() ){ 584 lstrcpy(lpPtrOffset,array); 585 array[0]=0; 586 } 587 } 588 else{ 589 if(lpPtrOffset[0]){ 590 SetError(16,variable,cp); 591 pRelativeVar->dwKind=NON_VAR; 592 return false; 593 } 594 } 595 596 pRelativeVar->offset=pVar->offset; 597 pRelativeVar->bOffsetOffset=0; 598 if( pVar->IsRef() ){ 599 // 参照型 600 pRelativeVar->dwKind = VAR_REFGLOBAL; 601 } 602 else pRelativeVar->dwKind=VAR_GLOBAL; 603 resultType = *pVar; 604 pSubScripts=pVar->GetSubScriptsPtr(); 605 bConst = pVar->IsConst(); 606 } 607 626 608 627 609 … … 630 612 if( bConst && isWriteAccess ){ 631 613 //Const定義の変数に書き込みアクセスをしようとした場合 632 if( *pType == DEF_OBJECT){614 if( resultType.IsObject() ){ 633 615 //オブジェクト定数 634 616 SetError(130, VarName, cp ); … … 642 624 if(array[0]==0&&pSubScripts[0]!=-1){ 643 625 //配列の先頭ポインタを示す場合 644 *pType|=FLAG_PTR;626 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR ); 645 627 if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM); 646 return 1;628 return true; 647 629 } 648 630 … … 655 637 } 656 638 if(array[0]){ 657 if(!GetArrayOffset(pSubScripts,array, *pType,lpIndex)){639 if(!GetArrayOffset(pSubScripts,array,resultType)){ 658 640 SetError(14,variable,cp); 659 641 pRelativeVar->dwKind=NON_VAR; 660 return 0;642 return false; 661 643 } 662 644 } 663 645 if(member[0]){ 664 if( *pType==DEF_OBJECT || *pType==DEF_STRUCT){646 if( resultType.IsObject() || resultType.IsStruct() ){ 665 647 //実態オブジェクトのメンバを参照(obj.member) 666 648 if( refType != CClass::Dot ){ 667 649 SetError(104,VarName,cp); 668 650 pRelativeVar->dwKind=NON_VAR; 669 return 0;670 } 671 672 if( *pType==DEF_OBJECT){651 return false; 652 } 653 654 if( resultType.IsObject() ){ 673 655 // 参照内容へのポインタを抽出 674 656 SetRelativeOffset( *pRelativeVar ); 675 657 } 676 658 } 677 else if( *pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){659 else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){ 678 660 //ポインタオブジェクトが示すメンバを参照 679 661 if(lpPtrOffset[0]){ … … 682 664 SetError(104,VarName,cp); 683 665 pRelativeVar->dwKind=NON_VAR; 684 return 0;666 return false; 685 667 } 686 SetRelativeOffset( pType,lpIndex,pRelativeVar,lpPtrOffset);668 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 687 669 pRelativeVar->dwKind=VAR_DIRECTMEM; 688 670 } … … 692 674 SetError(104,VarName,cp); 693 675 pRelativeVar->dwKind=NON_VAR; 694 return 0;676 return false; 695 677 } 696 678 … … 703 685 } 704 686 } 705 else if( *pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){687 else if( resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_OBJECT,2) || resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_STRUCT,2)){ 706 688 //ポインタオブジェクトが示すメンバを参照 707 689 if(lpPtrOffset[0]){ … … 710 692 SetError(104,VarName,cp); 711 693 pRelativeVar->dwKind=NON_VAR; 712 return 0;694 return false; 713 695 } 714 696 715 SetRelativeOffset( pType,lpIndex,pRelativeVar,lpPtrOffset);697 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 716 698 pRelativeVar->dwKind=VAR_DIRECTMEM; 717 699 … … 726 708 SetError(104,VarName,cp); 727 709 pRelativeVar->dwKind=NON_VAR; 728 return 0;710 return false; 729 711 } 730 712 } … … 732 714 SetError(102,VarName,cp); 733 715 pRelativeVar->dwKind=NON_VAR; 734 return 0; 735 } 736 737 LONG_PTR lp2; 738 if(!GetMemberOffset( 716 return false; 717 } 718 719 if(!_member_offset( 739 720 isErrorEnabled, 740 721 isWriteAccess, 741 (CClass *)lpIndex, 742 member,pType,pRelativeVar,&lp2,0)) return 0; 743 if(plpIndex) *plpIndex=lp2; 744 745 return 1; 722 resultType.GetClass(), 723 member,pRelativeVar,resultType,0)) return false; 724 725 return true; 746 726 } 747 727 748 728 if(lpPtrOffset[0]){ 749 SetRelativeOffset( pType,lpIndex,pRelativeVar,lpPtrOffset);729 SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset); 750 730 pRelativeVar->dwKind=VAR_DIRECTMEM; 751 731 } 752 732 753 return 1;733 return true; 754 734 } 755 735 756 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){736 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,char *InitBuf){ 757 737 extern BYTE *initGlobalBuf; 758 int i,i2,i3 ,TypeSize;738 int i,i2,i3; 759 739 char temporary[VN_SIZE]; 760 740 … … 763 743 InitBuf[lstrlen(InitBuf)-1]=0; 764 744 765 TypeSize=GetTypeSize(type,lpIndex);745 int typeSize = type.GetSize(); 766 746 767 747 if(SubScripts[0]!=-1){ 768 TypeSize*=JumpSubScripts(SubScripts+1);748 typeSize*=JumpSubScripts(SubScripts+1); 769 749 i=0; 770 750 i2=0; … … 776 756 i=GetOneParameter(InitBuf,i,temporary); 777 757 if(!SetInitGlobalData( 778 offset+i2* TypeSize,758 offset+i2*typeSize, 779 759 type, 780 lpIndex,781 760 SubScripts+1, 782 temporary)) return 0;761 temporary)) return false; 783 762 i2++; 784 763 if(InitBuf[i]=='\0') break; 785 764 } 786 return -1; 787 } 788 789 if(type==DEF_STRUCT){ 790 CClass *pobj_c; 791 pobj_c=(CClass *)lpIndex; 792 793 for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){ 765 return true; 766 } 767 768 if(type.IsStruct()){ 769 const CClass &objClass = type.GetClass(); 770 771 for(i=0,i2=0;i2<objClass.iMemberNum;i2++){ 794 772 i=GetOneParameter(InitBuf,i,temporary); 795 773 796 i3= pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i2]->name, NULL );774 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->name, NULL ); 797 775 798 776 if(!SetInitGlobalData(offset+i3, 799 pobj_c->ppobj_Member[i2]->TypeInfo.type, 800 pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex, 801 pobj_c->ppobj_Member[i2]->SubScripts, 802 temporary)) return 0; 777 *objClass.ppobj_Member[i2], 778 objClass.ppobj_Member[i2]->SubScripts, 779 temporary)) return false; 803 780 804 781 if(InitBuf[i]=='\0') break; 805 782 } 806 if(i2+1!= pobj_c->iMemberNum){783 if(i2+1!=objClass.iMemberNum){ 807 784 SetError(41,0,cp); 808 return 0;809 } 810 return 1;785 return false; 786 } 787 return true; 811 788 } 812 789 813 790 SetError(41,0,cp); 814 return 0;791 return false; 815 792 } 816 793 … … 820 797 /////////////////////////////////////// 821 798 822 if( type == DEF_OBJECT || type == DEF_STRUCT){799 if( type.IsObject() || type.IsStruct() ){ 823 800 //オブジェクトまたは構造体の場合はありえない 824 801 SetError(300,NULL,cp); 825 return 0;802 return false; 826 803 } 827 804 828 805 if(SubScripts[0]!=-1){ 829 806 SetError(41,0,cp); 830 return 0;807 return false; 831 808 } 832 809 833 810 double dbl; 834 811 _int64 i64data; 835 int CalcType; 836 LONG_PTR lpCalcIndex; 837 CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex); 838 if(IsRealNumberType(CalcType)){ 812 Type calcType; 813 814 if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){ 815 //動的データだった場合 816 return false; 817 } 818 if( calcType.IsReal() ){ 839 819 memcpy(&dbl,&i64data,sizeof(double)); 840 820 i64data=(_int64)dbl; … … 845 825 CheckDifferentType( 846 826 type, 847 lpIndex, 848 CalcType, 849 lpCalcIndex, 827 calcType, 850 828 0,0); 851 829 852 if( type==DEF_DOUBLE)830 if( type.IsDouble() ){ 853 831 *(double *)(initGlobalBuf+offset)=(double)dbl; 854 else if(type==DEF_SINGLE) 832 } 833 else if( type.IsSingle() ){ 855 834 *(float *)(initGlobalBuf+offset)=(float)dbl; 856 else if(type==DEF_INT64||type==DEF_QWORD) 835 } 836 else if( type.Is64() ){ 857 837 *(_int64 *)(initGlobalBuf+offset)=i64data; 858 else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){ 859 if(type==typeOfPtrChar&&lpCalcIndex==LITERAL_STRING){ 838 } 839 else if( type.IsLong() || type.IsDWord() || type.IsPointer() ){ 840 if(type.GetBasicType()==typeOfPtrChar&&calcType.GetIndex()==LITERAL_STRING){ 860 841 //文字列定数のとき 861 842 … … 881 862 } 882 863 } 883 else if( type==DEF_INTEGER||type==DEF_WORD || (isUnicode&&type==DEF_CHAR))864 else if( type.IsWord() || type.IsInteger() ){ 884 865 *(WORD *)(initGlobalBuf+offset)=(WORD)i64data; 885 else if(type==DEF_SBYTE||type==DEF_BYTE||type==DEF_BOOLEAN || (isUnicode==false&&type==DEF_CHAR)) 866 } 867 else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){ 886 868 *(BYTE *)(initGlobalBuf+offset)=(BYTE)i64data; 887 //String型が未完成 888 return 1; 869 } 870 871 return true; 889 872 } 890 BOOL InitLocalVar(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){891 int i,i2,i3 ,TypeSize;873 bool InitLocalVar(int offset,const Type &type,const int *SubScripts,char *InitBuf){ 874 int i,i2,i3; 892 875 char temporary[VN_SIZE]; 893 876 … … 896 879 InitBuf[lstrlen(InitBuf)-1]=0; 897 880 898 TypeSize=GetTypeSize(type,lpIndex);881 int typeSize = type.GetSize(); 899 882 900 883 if(SubScripts[0]!=-1){ 901 TypeSize*=JumpSubScripts(SubScripts+1);884 typeSize*=JumpSubScripts(SubScripts+1); 902 885 i=0; 903 886 i2=0; … … 905 888 if(SubScripts[0]<i2){ 906 889 SetError(41,0,cp); 907 return 0;890 return false; 908 891 } 909 892 i=GetOneParameter(InitBuf,i,temporary); 910 893 if(!InitLocalVar( 911 offset+i2* TypeSize,894 offset+i2*typeSize, 912 895 type, 913 lpIndex,914 896 SubScripts+1, 915 temporary)) return 0;897 temporary)) return false; 916 898 i2++; 917 899 if(InitBuf[i]=='\0') break; 918 900 } 919 return -1; 920 } 921 922 if(type==DEF_STRUCT){ 923 CClass *pobj_c; 924 pobj_c=(CClass *)lpIndex; 925 926 for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){ 901 return true; 902 } 903 904 if(type.IsStruct()){ 905 const CClass &objClass = type.GetClass(); 906 907 for(i=0,i2=0;i2<objClass.iMemberNum;i2++){ 927 908 i=GetOneParameter(InitBuf,i,temporary); 928 909 929 i3 = pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i2]->name, NULL );910 i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->name, NULL ); 930 911 931 912 if(!InitLocalVar(offset+i3, 932 pobj_c->ppobj_Member[i2]->TypeInfo.type, 933 pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex, 934 pobj_c->ppobj_Member[i2]->SubScripts, 935 temporary)) return 0; 913 *objClass.ppobj_Member[i2], 914 objClass.ppobj_Member[i2]->SubScripts, 915 temporary)) return false; 936 916 937 917 if(InitBuf[i]=='\0') break; 938 918 } 939 if(i2+1!= pobj_c->iMemberNum){919 if(i2+1!=objClass.iMemberNum){ 940 920 SetError(41,0,cp); 941 921 return 0; 942 922 } 943 return 1;923 return true; 944 924 } 945 925 946 926 SetError(41,0,cp); 947 return 0;927 return false; 948 928 } 949 929 … … 955 935 if(SubScripts[0]!=-1){ 956 936 SetError(41,0,cp); 957 return 0;937 return false; 958 938 } 959 939 960 940 double dbl; 961 941 _int64 i64data; 962 int CalcType; 963 LONG_PTR lpCalcIndex; 964 CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex); 965 if(!CalcType){ 942 Type calcType; 943 944 if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){ 966 945 //動的データだった場合 967 return 0;968 } 969 if( IsRealNumberType(CalcType)){946 return false; 947 } 948 if( calcType.IsReal() ){ 970 949 memcpy(&dbl,&i64data,sizeof(double)); 971 950 i64data=(_int64)dbl; … … 976 955 CheckDifferentType( 977 956 type, 978 lpIndex, 979 CalcType, 980 lpCalcIndex, 957 calcType, 981 958 0,0); 982 959 983 if( type==DEF_DOUBLE){960 if( type.IsDouble() ){ 984 961 //mov eax,HILONG(dbl) 985 962 OpBuffer[obp++]=(char)0xB8; … … 1006 983 obp+=sizeof(long); 1007 984 } 1008 else if( type==DEF_SINGLE){985 else if( type.IsSingle() ){ 1009 986 float flt; 1010 987 flt=(float)dbl; … … 1021 998 obp+=sizeof(long); 1022 999 } 1023 else if( type==DEF_INT64||type==DEF_QWORD){1000 else if( type.Is64() ){ 1024 1001 //mov eax,HILONG(i64data) 1025 1002 OpBuffer[obp++]=(char)0xB8; … … 1046 1023 obp+=sizeof(long); 1047 1024 } 1048 else if( type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){1049 if(type ==typeOfPtrChar&&lpCalcIndex==LITERAL_STRING){1025 else if( type.IsDWord() || type.IsLong() || type.IsPointer() ){ 1026 if(type.GetBasicType()==typeOfPtrChar&&calcType.GetIndex()==LITERAL_STRING){ 1050 1027 //文字列定数のとき 1051 1028 … … 1075 1052 obp+=sizeof(long); 1076 1053 } 1077 else if( type==DEF_INTEGER||type==DEF_WORD || (isUnicode&&type==DEF_CHAR)){1054 else if( type.IsWord() || type.IsInteger() ){ 1078 1055 //mov ax,InitValue 1079 1056 OpBuffer[obp++]=(char)0x66; … … 1090 1067 obp+=sizeof(long); 1091 1068 } 1092 else if( type==DEF_SBYTE||type==DEF_BYTE||type==DEF_BOOLEAN || (isUnicode==false&&type==DEF_CHAR)){1069 else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){ 1093 1070 //mov byte ptr[ebp+offset],InitValue 1094 1071 OpBuffer[obp++]=(char)0xC6; … … 1100 1077 obp+=sizeof(BYTE); 1101 1078 } 1102 //String型が未完成 1103 return 1;1079 1080 return true; 1104 1081 } 1105 1082 1106 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){ 1107 extern BOOL bCompilingGlobal; 1108 if(bCompilingGlobal){ 1083 void dim(bool isRef, char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags){ 1084 if( UserProc::IsGlobalAreaCompiling() ){ 1109 1085 ///////////////////////// 1110 1086 // グローバル変数 1111 1087 ///////////////////////// 1112 1088 1113 AddGlobalVariable(isRef,VarName,SubScripts, &TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);1089 AddGlobalVariable(isRef,VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags); 1114 1090 } 1115 1091 else{ … … 1118 1094 ///////////////// 1119 1095 1120 int i2,i3; 1121 1122 for(i2=0;i2<MaxLocalVarNum;i2++){ 1123 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){ 1124 if(lstrcmp(LocalVar[i2].name,VarName)==0){ 1125 //2重定義のエラー 1126 SetError(15,VarName,cp); 1127 return; 1128 } 1129 } 1130 } 1131 1132 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 1133 VARIABLE *pVar = &LocalVar[MaxLocalVarNum]; 1134 MaxLocalVarNum++; 1135 1136 if( isRef ){ 1137 //参照型 1138 pVar->fRef = REF_VARIABLE; 1139 TypeSize = PTR_SIZE; 1140 } 1141 else pVar->fRef=0; 1142 1143 for(i2=1,i3=0;i3<255;i3++){ 1144 //配列要素数 1145 pVar->SubScripts[i3]=SubScripts[i3]; 1146 1147 if(SubScripts[i3]==-1) break; 1148 i2*=SubScripts[i3]+1; 1149 } 1150 int VarSize=TypeSize*i2; 1151 if(VarSize%4) VarSize+=4-(VarSize%4); 1152 1153 //変数データを追加 1154 lstrcpy(pVar->name,VarName); 1155 if(dwFlags & DIMFLAG_CONST) pVar->bConst = true; 1156 else pVar->bConst = false; 1157 if(SubScripts[0]==-1) pVar->bArray=0; 1158 else pVar->bArray=1; 1159 pVar->type=TypeInfo.type; 1160 pVar->u.index=TypeInfo.u.lpIndex; 1161 AllLocalVarSize+=VarSize; 1162 pVar->offset=AllLocalVarSize; 1096 if( UserProc::CompilingUserProc().localVars.BackSearch( VarName ) ){ 1097 //2重定義のエラー 1098 SetError(15,VarName,cp); 1099 return; 1100 } 1101 1102 bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false; 1103 1104 Variable *pVar = new Variable( VarName, type, isConst, isRef ); 1105 1106 if( SubScripts[0] != -1 ){ 1107 //配列あり 1108 pVar->SetArray( SubScripts ); 1109 } 1110 1111 //コンストラクタ用パラメータ 1112 pVar->paramStrForConstructor = ConstractParameter; 1163 1113 1164 1114 //レキシカルスコープ … … 1167 1117 pVar->bLiving=TRUE; 1168 1118 1119 //エラー用 1120 pVar->source_code_address=cp; 1121 1122 // 変数を追加 1123 UserProc::CompilingUserProc().localVars.push_back( pVar ); 1124 1125 //アラインメントを考慮 1126 if( pVar->IsStruct() ){ 1127 int alignment = pVar->GetClass().iAlign; 1128 if( alignment ){ 1129 if( AllLocalVarSize % alignment ){ 1130 AllLocalVarSize += alignment - (AllLocalVarSize % alignment); 1131 } 1132 } 1133 } 1134 1135 AllLocalVarSize += pVar->GetMemorySize(); 1136 pVar->offset = AllLocalVarSize; 1137 1138 //レキシカルスコープ 1139 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 1140 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 1141 pVar->bLiving=TRUE; 1142 1169 1143 if(InitBuf[0]){ 1170 1144 //初期代入時のみ、書き込みアクセスを許可する 1171 bool bConstBack = pVar->bConst; 1172 pVar->bConst = false; 1145 if( isConst ){ 1146 pVar->ConstOff(); 1147 } 1173 1148 1174 1149 int result = 0; 1175 if( pVar->type != DEF_OBJECT){1150 if( !pVar->IsObject() ){ 1176 1151 result = InitLocalVar(-pVar->offset, 1177 pVar->type, 1178 pVar->u.index, 1179 pVar->SubScripts, 1152 *pVar, 1153 pVar->GetSubScriptsPtr(), 1180 1154 InitBuf); 1181 1155 } … … 1188 1162 } 1189 1163 1190 pVar->bConst = bConstBack; 1164 if( isConst ){ 1165 pVar->ConstOn(); 1166 } 1191 1167 } 1192 1168 else{ … … 1195 1171 1196 1172 //push VarSize 1197 op_push_V( VarSize);1173 op_push_V( pVar->GetMemorySize() ); 1198 1174 1199 1175 //mov eax,ebp … … 1213 1189 OpBuffer[obp++]=(char)0xFF; 1214 1190 OpBuffer[obp++]=(char)0x15; 1215 DECLAREINFO *pdi; 1216 pdi=GetDeclareHash("FillMemory"); 1217 pdi->bUse=1; 1218 pobj_ImportAddrSchedule->add(pdi); 1191 DllProc *pDllProc = GetDeclareHash("FillMemory"); 1192 pDllProc->Using(); 1193 pobj_ImportAddrSchedule->add(pDllProc); 1219 1194 obp+=sizeof(long); 1220 1195 } … … 1222 1197 1223 1198 //New呼び出し 1224 if( TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){1199 if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){ 1225 1200 char objectSize[255]; 1226 1201 if( SubScripts[0] == -1 ){ … … 1233 1208 sprintf( objectSize, "%d", SubScripts[0] ); 1234 1209 } 1235 Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo);1210 Operator_New( type.GetClass(), objectSize, ConstractParameter, type ); 1236 1211 1237 1212 //pop eax 1238 1213 op_pop( REG_EAX ); 1239 1214 1240 int type;1241 LONG_PTR lpIndex;1242 1215 RELATIVE_VAR RelativeVar; 1243 GetVarOffset( true, false, VarName, & type, &RelativeVar, &lpIndex);1216 GetVarOffset( true, false, VarName, &RelativeVar, Type() ); 1244 1217 if( RelativeVar.dwKind == VAR_DIRECTMEM ){ 1245 1218 SetError(); … … 1248 1221 } 1249 1222 1250 if( TypeInfo.type==DEF_OBJECT){1251 if( TypeInfo.u.pobj_Class->IsAbstract()){1223 if( type.IsObject() ){ 1224 if( type.GetClass().IsAbstract() ){ 1252 1225 //抽象クラスだったとき 1253 SetError(125,TypeInfo.u.pobj_Class->name,cp); 1254 } 1255 } 1256 } 1257 void dim(char *Parameter,DWORD dwFlags){ 1258 extern BOOL bCompilingGlobal; 1259 extern HANDLE hHeap; 1260 int i2; 1261 char VarName[VN_SIZE]; 1262 1263 1264 //参照型かどうか 1265 bool isRef = false; 1266 1267 i2 = 0; 1268 1269 if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){ 1270 //参照型 1271 isRef = true; 1272 Parameter += 2; 1273 } 1274 1275 1276 if(dwFlags & DIMFLAG_CONST){ 1277 ////////////////////////////////// 1278 // 定数変数の場合を考慮 1279 ////////////////////////////////// 1280 for(;;i2++){ 1281 if(Parameter[i2] == '=' || 1282 Parameter[i2] == 1 && Parameter[i2] == ESC_AS || 1283 Parameter[i2] =='('){ 1284 VarName[i2] = 0; 1285 break; 1286 } 1287 VarName[i2] = Parameter[i2]; 1288 } 1289 1290 //定数と2重定義されていないる場合は抜け出す 1291 if(CDBConst::obj.GetType(VarName)){ 1292 return; 1293 } 1294 1295 //定数マクロとして定義されている場合は抜け出す 1296 if(GetConstHash(VarName)){ 1297 return; 1298 } 1299 } 1300 1301 1302 //構文を解析 1303 int SubScripts[MAX_ARRAYDIM]; 1304 TYPEINFO TypeInfo; 1305 char InitBuf[8192]; 1306 char ConstractParameter[VN_SIZE]; 1307 if(!GetDimentionFormat(Parameter, isRef, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter)) 1308 return; 1309 1310 1311 //定数と2重定義されていないかを調べる 1312 if(CDBConst::obj.GetType(VarName)){ 1313 SetError(15,VarName,cp); 1314 return; 1315 } 1316 1317 //定数マクロとして定義されている場合 1318 if(GetConstHash(VarName)){ 1319 SetError(15,VarName,cp); 1320 return; 1321 } 1322 1323 1324 //タイプサイズを取得 1325 int TypeSize; 1326 TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex); 1327 1328 if(dwFlags&DIMFLAG_STATIC){ 1329 if(bCompilingGlobal){ 1330 SetError(60,NULL,cp); 1331 return; 1332 } 1333 1334 ///////////////////// 1335 // Static変数 1336 // ※"Static.Object.Method.Variable" 1337 ///////////////////// 1338 1339 char temporary[VN_SIZE]; 1340 GetNowStaticVarFullName(VarName,temporary); 1341 1342 dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1343 1344 /* 1345 Note: 静的変数のコンストラクタ呼び出しは 1346 _System_InitStaticLocalVariables関数内で一括して行う 1347 */ 1348 } 1349 else{ 1350 dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags ); 1351 } 1352 } 1353 void OpcodeDim(char *Parameter,DWORD dwFlags){ 1354 int i,i2,i3,IsStr=0; 1355 char temporary[8192]; 1356 1357 for(i=0,i2=0;;i++,i2++){ 1358 if(Parameter[i]=='\"') IsStr^=1; 1359 if(Parameter[i]=='('&&IsStr==0){ 1360 i3=GetStringInPare(temporary+i2,Parameter+i); 1361 i+=i3-1; 1362 i2+=i3-1; 1363 continue; 1364 } 1365 if(Parameter[i]=='['&&IsStr==0){ 1366 i3=GetStringInBracket(temporary+i2,Parameter+i); 1367 i+=i3-1; 1368 i2+=i3-1; 1369 continue; 1370 } 1371 if((Parameter[i]==','&&IsStr==0)|| 1372 Parameter[i]=='\0'){ 1373 temporary[i2]=0; 1374 1375 dim(temporary,dwFlags); 1376 1377 if(Parameter[i]=='\0') break; 1378 i2=-1; 1379 continue; 1380 } 1381 temporary[i2]=Parameter[i]; 1226 SetError(125,type.GetClass().name,cp); 1227 } 1382 1228 } 1383 1229 } -
BasicCompiler32/MakePeHdr.cpp
r73 r75 8 8 // 特殊関数の構造体ポインタ 9 9 //////////////////////////// 10 SubInfo 10 UserProc 11 11 *pSub_System_StartupProgram, 12 12 *pSub_DebugSys_StartProc, … … 150 150 151 151 //関数ポインタ情報を初期化 152 extern P ROCPTRINFO *pProcPtrInfo;152 extern ProcPointer **ppProcPtrInfo; 153 153 extern int ProcPtrInfoNum; 154 p ProcPtrInfo=(PROCPTRINFO*)HeapAlloc(hHeap,0,1);154 ppProcPtrInfo=(ProcPointer **)HeapAlloc(hHeap,0,1); 155 155 ProcPtrInfoNum=0; 156 156 … … 184 184 185 185 if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1)) 186 pSub_System_StartupProgram-> bUse=1;186 pSub_System_StartupProgram->Using(); 187 187 188 188 if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1)) 189 pSub_DebugSys_StartProc-> bUse=1;189 pSub_DebugSys_StartProc->Using(); 190 190 191 191 if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1)) 192 pSub_DebugSys_EndProc-> bUse=1;192 pSub_DebugSys_EndProc->Using(); 193 193 194 194 if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1)) 195 pSub_DebugSys_SaveContext-> bUse=1;195 pSub_DebugSys_SaveContext->Using(); 196 196 197 197 if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){ 198 pSub_System_GetEip-> bUse=1;199 pSub_System_GetEip-> bSystem=1;198 pSub_System_GetEip->Using(); 199 pSub_System_GetEip->ThisIsSystemProc(); 200 200 } 201 201 202 202 if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){ 203 pSub_System_InitDllGlobalVariables-> bUse=1;204 pSub_System_InitDllGlobalVariables-> bSystem=1;203 pSub_System_InitDllGlobalVariables->Using(); 204 pSub_System_InitDllGlobalVariables->ThisIsSystemProc(); 205 205 } 206 206 207 207 if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){ 208 pSub_System_InitStaticLocalVariables-> bUse=1;209 pSub_System_InitStaticLocalVariables-> bSystem=1;208 pSub_System_InitStaticLocalVariables->Using(); 209 pSub_System_InitStaticLocalVariables->ThisIsSystemProc(); 210 210 } 211 211 212 212 if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){ 213 pSub_System_Call_Destructor_of_GlobalObject-> bUse=1;214 pSub_System_Call_Destructor_of_GlobalObject-> bSystem=1;213 pSub_System_Call_Destructor_of_GlobalObject->Using(); 214 pSub_System_Call_Destructor_of_GlobalObject->ThisIsSystemProc(); 215 215 } 216 216 217 217 if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){ 218 pSub_System_GetSp-> bUse=1;219 pSub_System_GetSp-> bSystem=1;218 pSub_System_GetSp->Using(); 219 pSub_System_GetSp->ThisIsSystemProc(); 220 220 } 221 221 222 222 if(pSub_pow=GetSubHash("pow",1)) 223 pSub_pow-> bUse=1;223 pSub_pow->Using(); 224 224 225 225 if(pSub_calloc=GetSubHash("calloc",1)) 226 pSub_calloc-> bUse=1;226 pSub_calloc->Using(); 227 227 228 228 if(pSub_realloc=GetSubHash("realloc",1)) 229 pSub_realloc-> bUse=1;229 pSub_realloc->Using(); 230 230 231 231 if(pSub_free=GetSubHash("free",1)) 232 pSub_free-> bUse=1;232 pSub_free->Using(); 233 233 234 234 if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) ) 235 pSub_System_GC_malloc_ForObject-> bUse = 1;235 pSub_System_GC_malloc_ForObject->Using(); 236 236 237 237 if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) ) 238 pSub_System_GC_malloc_ForObjectPtr-> bUse = 1;238 pSub_System_GC_malloc_ForObjectPtr->Using(); 239 239 240 240 if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) ) 241 pSub_System_GC_free_for_SweepingDelete-> bUse = 1;241 pSub_System_GC_free_for_SweepingDelete->Using(); 242 242 243 243 pSub_allrem=GetSubHash("_allrem"); 244 pSub_allrem-> bUse=1;245 pSub_allrem-> bSystem=1;244 pSub_allrem->Using(); 245 pSub_allrem->ThisIsSystemProc(); 246 246 247 247 pSub_aullrem=GetSubHash("_aullrem"); 248 pSub_aullrem-> bUse=1;249 pSub_aullrem-> bSystem=1;248 pSub_aullrem->Using(); 249 pSub_aullrem->ThisIsSystemProc(); 250 250 251 251 pSub_allmul=GetSubHash("_allmul"); 252 pSub_allmul-> bUse=1;253 pSub_allmul-> bSystem=1;252 pSub_allmul->Using(); 253 pSub_allmul->ThisIsSystemProc(); 254 254 255 255 pSub_alldiv=GetSubHash("_alldiv"); 256 pSub_alldiv-> bUse=1;257 pSub_alldiv-> bSystem=1;256 pSub_alldiv->Using(); 257 pSub_alldiv->ThisIsSystemProc(); 258 258 259 259 pSub_aulldiv=GetSubHash("_aulldiv"); 260 pSub_aulldiv-> bUse=1;261 pSub_aulldiv-> bSystem=1;260 pSub_aulldiv->Using(); 261 pSub_aulldiv->ThisIsSystemProc(); 262 262 263 263 pSub_allshl=GetSubHash("_allshl"); 264 pSub_allshl-> bUse=1;265 pSub_allshl-> bSystem=1;264 pSub_allshl->Using(); 265 pSub_allshl->ThisIsSystemProc(); 266 266 267 267 pSub_allshr=GetSubHash("_allshr"); 268 pSub_allshr-> bUse=1;269 pSub_allshr-> bSystem=1;268 pSub_allshr->Using(); 269 pSub_allshr->ThisIsSystemProc(); 270 270 271 271 pSub_aullshr=GetSubHash("_aullshr"); 272 pSub_aullshr-> bUse=1;273 pSub_aullshr-> bSystem=1;272 pSub_aullshr->Using(); 273 pSub_aullshr->ThisIsSystemProc(); 274 274 275 275 pSub_esp_error=GetSubHash("_esp_error"); 276 pSub_esp_error-> bUse=1;276 pSub_esp_error->Using(); 277 277 278 278 … … 391 391 392 392 //call _System_Call_Destructor_of_GlobalObject 393 extern SubInfo*pSub_System_Call_Destructor_of_GlobalObject;393 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject; 394 394 op_call(pSub_System_Call_Destructor_of_GlobalObject); 395 395 … … 425 425 for(i=0;i<SynonymErrorNum;i++) HeapDefaultFree(SynonymErrorWords[i]); 426 426 HeapDefaultFree(SynonymErrorWords); 427 SynonymErrorWords=0; 427 428 428 429 … … 451 452 //////////////////////////////// 452 453 for(i=0;i<MAX_HASH;i++){ 453 extern DECLAREINFO **ppDeclareHash; 454 DECLAREINFO *pdi; 455 pdi=ppDeclareHash[i]; 456 while(pdi){ 457 if(pdi->bUse==0){ 458 pdi=pdi->pNextData; 454 extern DllProc **ppDeclareHash; 455 const DllProc *pDllProc = ppDeclareHash[i]; 456 while(pDllProc){ 457 if( !pDllProc->IsUsing() ){ 458 pDllProc=pDllProc->pNextData; 459 459 continue; 460 460 } … … 462 462 //エラーチェック 463 463 HINSTANCE hLib; 464 hLib=LoadLibrary( pdi->file);464 hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() ); 465 465 if(!hLib){ 466 466 extern char OutputFileName[MAX_PATH]; … … 468 468 _splitpath(OutputFileName,temp2,temp3,NULL,NULL); 469 469 lstrcat(temp2,temp3); 470 lstrcpy(temp3,p di->file);470 lstrcpy(temp3,pDllProc->GetDllFileName().c_str()); 471 471 GetFullPath(temp3,temp2); 472 472 hLib=LoadLibrary(temp3); 473 473 474 474 if(!hLib){ 475 SetError(-106,p di->file,pdi->pos);475 SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos()); 476 476 } 477 477 } 478 478 479 479 if(hLib){ 480 if(!GetProcAddress(hLib,p di->alias)){480 if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){ 481 481 FreeLibrary(hLib); 482 SetError(-107,p di->alias,pdi->pos);482 SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos()); 483 483 } 484 484 FreeLibrary(hLib); 485 485 } 486 486 487 p di=pdi->pNextData;487 pDllProc=pDllProc->pNextData; 488 488 } 489 489 } … … 522 522 ExportNamesLength=lstrlen(lpExportNames)+1; 523 523 524 extern SubInfo**ppSubHash;525 SubInfo *psi,*psi2;524 extern UserProc **ppSubHash; 525 UserProc *pUserProc,*psi2; 526 526 while(1){ 527 527 //辞書順にサーチ 528 528 temporary[0]=0; 529 529 for(i=0,psi2=0;i<MAX_HASH;i++){ 530 p si=ppSubHash[i];531 while(p si){532 if(p si->bExport){530 pUserProc=ppSubHash[i]; 531 while(pUserProc){ 532 if(pUserProc->IsExport()){ 533 533 if(temporary[0]=='\0'){ 534 lstrcpy(temporary,p si->name);535 psi2=p si;534 lstrcpy(temporary,pUserProc->GetName().c_str()); 535 psi2=pUserProc; 536 536 } 537 537 else{ 538 538 i3=lstrlen(temporary); 539 i4= lstrlen(psi->name);539 i4=(int)pUserProc->GetName().size(); 540 540 if(i3<i4) i3=i4; 541 if(memcmp(temporary,p si->name,i3)>0){542 lstrcpy(temporary,p si->name);543 psi2=p si;541 if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){ 542 lstrcpy(temporary,pUserProc->GetName().c_str()); 543 psi2=pUserProc; 544 544 } 545 545 } 546 546 } 547 p si=psi->pNextData;547 pUserProc=pUserProc->pNextData; 548 548 } 549 549 } 550 550 if(psi2==0) break; 551 psi=psi2; 552 553 psi->bExport=0; 554 555 if(lstrcmpi(psi->name,"DllMain")==0) 556 DllMain_EntryPoint=psi->CompileAddress; 551 pUserProc=psi2; 552 553 pUserProc->ExportOff(); 554 555 if( pUserProc->GetName() == "DllMain" ){ 556 DllMain_EntryPoint=pUserProc->beginOpAddress; 557 } 557 558 558 559 lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD)); 559 lpdwExportAddressTable[ExportNum]=p si->CompileAddress;560 lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress; 560 561 561 562 lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD)); … … 565 566 lpwExportOrdinalTable[ExportNum]=ExportNum; 566 567 567 lstrcpy(lpExportNames+ExportNamesLength,p si->name);568 lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str()); 568 569 ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1; 569 570 … … 598 599 //インポートDLL情報 599 600 ///////////////////// 600 extern DECLAREINFO **ppDeclareHash; 601 DECLAREINFO *pdi; 601 extern DllProc **ppDeclareHash; 602 602 char **ppDllNames; 603 603 int ImportDllNum; … … 621 621 ImportDllNum=0; 622 622 for(i=0;i<MAX_HASH;i++){ 623 pdi=ppDeclareHash[i]; 624 while(pdi){ 625 if(pdi->dwType==DECLARE_STATIC|| 626 pdi->bUse==0){ 627 pdi=pdi->pNextData; 623 const DllProc *pDllProc=ppDeclareHash[i]; 624 while(pDllProc){ 625 if( !pDllProc->IsUsing() ){ 626 pDllProc=pDllProc->pNextData; 628 627 continue; 629 628 } 630 629 631 if( lstrlen(pdi->file)>16){630 if( pDllProc->GetDllFileName().size() > 16 ){ 632 631 SetError(7,NULL,cp); 633 632 break; 634 633 } 635 634 for(i2=0;i2<ImportDllNum;i2++){ 636 if(lstrcmp(ppDllNames[i2],pdi->file)==0) break; 635 if( pDllProc->GetDllFileName() == ppDllNames[i2] ){ 636 break; 637 } 637 638 } 638 639 if(i2==ImportDllNum){ 639 640 ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **)); 640 641 ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16); 641 lstrcpy(ppDllNames[ImportDllNum],p di->file);642 lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str()); 642 643 ImportDllNum++; 643 644 } 644 645 645 p di=pdi->pNextData;646 pDllProc=pDllProc->pNextData; 646 647 } 647 648 } … … 660 661 pImportTable[i].Name=i3+i*0x10; 661 662 for(i2=0;i2<MAX_HASH;i2++){ 662 pdi=ppDeclareHash[i2]; 663 while(pdi){ 664 if(pdi->dwType==DECLARE_STATIC|| 665 pdi->bUse==0){ 666 pdi=pdi->pNextData; 663 const DllProc *pDllProc=ppDeclareHash[i2]; 664 while(pDllProc){ 665 if( !pDllProc->IsUsing() ){ 666 pDllProc=pDllProc->pNextData; 667 667 continue; 668 668 } 669 669 670 if( lstrcmp(ppDllNames[i],pdi->file)==0){670 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 671 671 //ルックアップデータのサイズを追加 672 672 LookupSize+=sizeof(DWORD); 673 673 } 674 674 675 p di=pdi->pNextData;675 pDllProc=pDllProc->pNextData; 676 676 } 677 677 } … … 691 691 for(i=0,i5=0;i<ImportDllNum;i++){ 692 692 for(i2=0;i2<MAX_HASH;i2++){ 693 pdi=ppDeclareHash[i2]; 694 while(pdi){ 695 if(pdi->dwType==DECLARE_STATIC|| 696 pdi->bUse==0){ 697 pdi=pdi->pNextData; 693 DllProc *pDllProc=ppDeclareHash[i2]; 694 while(pDllProc){ 695 if( !pDllProc->IsUsing() ){ 696 pDllProc=pDllProc->pNextData; 698 697 continue; 699 698 } 700 699 701 if( lstrcmp(ppDllNames[i],pdi->file)==0){700 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 702 701 //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる) 703 p di->LookupAddress=i3+(i5*sizeof(DWORD));702 pDllProc->SetLookupAddress( i3+(i5*sizeof(DWORD)) ); 704 703 705 704 //ルックアップ テーブル … … 709 708 pHintTable[HintSize++]=0; 710 709 pHintTable[HintSize++]=0; 711 lstrcpy(pHintTable+HintSize,p di->alias);712 i4= lstrlen(pdi->alias);710 lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str()); 711 i4=(int)pDllProc->GetAlias().size(); 713 712 HintSize+=i4+1; 714 713 if(i4%2==0) pHintTable[HintSize++]=0; … … 720 719 } 721 720 722 p di=pdi->pNextData;721 pDllProc=pDllProc->pNextData; 723 722 } 724 723 } … … 993 992 994 993 for(i2=0;i2<MAX_HASH;i2++){ 995 pdi=ppDeclareHash[i2];996 while(p di){997 if( pdi->bUse==0){998 p di=pdi->pNextData;994 const DllProc *pDllProc=ppDeclareHash[i2]; 995 while(pDllProc){ 996 if( !pDllProc->IsUsing() ){ 997 pDllProc=pDllProc->pNextData; 999 998 continue; 1000 999 } 1001 1000 1002 if( lstrcmp(ppDllNames[i],pdi->file)==0){1001 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 1003 1002 //ルックアップ テーブル 1004 1003 pLookupTable[i5++]+=MemPos_ImportSection; 1005 1004 } 1006 1005 1007 p di=pdi->pNextData;1006 pDllProc=pDllProc->pNextData; 1008 1007 } 1009 1008 } … … 1028 1027 // インポートテーブルスケジュール(インポート アドレス テーブルを指し示させる) 1029 1028 for(i=0;i<pobj_ImportAddrSchedule->num;i++){ 1030 DECLAREINFO *pdi; 1031 pdi=pobj_ImportAddrSchedule->ppdi[i]; 1029 const DllProc *pDllProc=pobj_ImportAddrSchedule->ppdi[i]; 1032 1030 *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))= 1033 1031 ImageBase+ … … 1035 1033 LookupSize+ //ルックアップテーブル 1036 1034 HintSize+ //ヒント名(関数名)テーブル 1037 p di->LookupAddress;1035 pDllProc->GetLookupAddress(); 1038 1036 } 1039 1037 delete pobj_ImportAddrSchedule; … … 1043 1041 // プロシージャポインタスケジュール 1044 1042 for(i=0;i<pobj_SubAddrSchedule->num;i++){ 1045 if(pobj_SubAddrSchedule->ppsi[i]-> CompileAddress==01046 &&pobj_SubAddrSchedule->ppsi[i]-> EndOpAddr==0){1043 if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0 1044 &&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){ 1047 1045 SetError(300,NULL,-1); 1048 1046 } … … 1050 1048 if(pobj_SubAddrSchedule->pbCall[i]){ 1051 1049 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))= 1052 pobj_SubAddrSchedule->ppsi[i]-> CompileAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));1050 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long)); 1053 1051 } 1054 1052 else{ 1055 1053 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))= 1056 pobj_SubAddrSchedule->ppsi[i]-> CompileAddress+ImageBase+MemPos_CodeSection;1054 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection; 1057 1055 } 1058 1056 } -
BasicCompiler32/NumOpe.cpp
r69 r75 78 78 79 79 extern CClass *pobj_StringClass; 80 T YPEINFObaseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };80 Type baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass }; 81 81 Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo ); 82 82 … … 97 97 if(Command[0]==1&& Command[1]==ESC_NEW ){ 98 98 //New演算子(オブジェクト生成) 99 T YPEINFObaseTypeInfo = { BaseType, lpBaseIndex };99 Type baseTypeInfo = { BaseType, lpBaseIndex }; 100 100 int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo ); 101 101 … … 157 157 if(type[sp-2]==DEF_OBJECT){ 158 158 //オーバーロードされたオペレータを呼び出す 159 T YPEINFOBaseTypeInfo={BaseType,lpBaseIndex};159 Type BaseTypeInfo={BaseType,lpBaseIndex}; 160 160 i2=CallOperatorProc(idCalc,&BaseTypeInfo,type,index_stack,bUseHeap,sp); 161 161 if(i2==0){ … … 195 195 CClass *pobj_Class; 196 196 pobj_Class=(CClass *)lpBaseIndex; 197 T YPEINFOBaseTypeInfo = {BaseType,lpBaseIndex};197 Type BaseTypeInfo = {BaseType,lpBaseIndex}; 198 198 if(IsStringObjectType(BaseTypeInfo)){ 199 199 //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合 … … 342 342 i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0); 343 343 if(i2==DEF_OBJECT){ 344 T YPEINFORetTypeInfo;344 Type RetTypeInfo; 345 345 CallIndexerGetterProc(pobj_c,variable,array_element,RetTypeInfo); 346 346 type[sp]=RetTypeInfo.type; … … 500 500 501 501 if(GetSubHash(VarName,0)){ 502 T YPEINFORetTypeInfo;502 Type RetTypeInfo; 503 503 CallPropertyMethod(term,NULL,&RetTypeInfo); 504 504 -
BasicCompiler32/NumOpe_Arithmetic.cpp
r73 r75 270 270 271 271 //call _allmul 272 extern SubInfo*pSub_allmul;272 extern UserProc *pSub_allmul; 273 273 op_call(pSub_allmul); 274 274 … … 460 460 461 461 //call _aullrem 462 extern SubInfo*pSub_aullrem;462 extern UserProc *pSub_aullrem; 463 463 op_call(pSub_aullrem); 464 464 } … … 467 467 468 468 //call _allrem 469 extern SubInfo*pSub_allrem;469 extern UserProc *pSub_allrem; 470 470 op_call(pSub_allrem); 471 471 } … … 720 720 721 721 //call _aulldiv 722 extern SubInfo*pSub_aulldiv;722 extern UserProc *pSub_aulldiv; 723 723 op_call(pSub_aulldiv); 724 724 } … … 727 727 728 728 //call _alldiv 729 extern SubInfo*pSub_alldiv;729 extern UserProc *pSub_alldiv; 730 730 op_call(pSub_alldiv); 731 731 } … … 1000 1000 1001 1001 //call pow 1002 extern SubInfo*pSub_pow;1002 extern UserProc *pSub_pow; 1003 1003 op_call(pSub_pow); 1004 1004 … … 1156 1156 1157 1157 //call _allshl 1158 extern SubInfo*pSub_allshl;1158 extern UserProc *pSub_allshl; 1159 1159 op_call(pSub_allshl); 1160 1160 … … 1361 1361 1362 1362 //call _aullshr 1363 extern SubInfo*pSub_aullshr;1363 extern UserProc *pSub_aullshr; 1364 1364 op_call(pSub_aullshr); 1365 1365 } … … 1368 1368 1369 1369 //call _allshr 1370 extern SubInfo*pSub_allshr;1370 extern UserProc *pSub_allshr; 1371 1371 op_call(pSub_allshr); 1372 1372 } -
BasicCompiler32/Opcode.h
r73 r75 102 102 //NumOpe.cpp 103 103 void PushReturnValue(int type); 104 int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0); 104 bool NumOpe( const char *Command, 105 const Type &baseType, 106 Type &resultType, 107 BOOL *pbUseHeap = NULL ); 105 108 106 109 //NumOpe_Arithmetic.cpp … … 136 139 //Compile_Set_Var.cpp 137 140 BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar); 138 void SetStructVariable( LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap);141 void SetStructVariable( const Type &varType, const Type &calcType, BOOL bUseHeap); 139 142 void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar); 140 143 void SetWholeVariable( int varSize,int calcType, RELATIVE_VAR *pRelative ); … … 174 177 175 178 //Compile_Object.cpp 176 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ); 177 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ); 179 void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ); 178 180 void OpcodeDelete(const char *Parameter, bool isSweeping); 179 181 … … 182 184 void GetWithName(char *buffer); 183 185 void SetThisPtrToReg(int reg); 184 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);185 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);186 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = 0); 187 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,char *InitBuf); 186 188 #define DIMFLAG_INITDEBUGVAR 1 187 189 #define DIMFLAG_NONCALL_CONSTRACTOR 2 188 190 #define DIMFLAG_STATIC 4 189 191 #define DIMFLAG_CONST 8 190 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 191 void OpcodeDim(char *Parameter,DWORD dwFlag); 192 void dim(bool isRef, char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags); 192 193 void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar); 193 194 … … 201 202 class ParamImpl{ 202 203 char *Parms[255]; 203 T YPEINFOtypes[255];204 Type types[255]; 204 205 int ParmsNum; 205 206 206 T YPEINFOReturnTypeInfo;207 Type ReturnTypeInfo; 207 208 208 209 //一時オブジェクト管理用 … … 213 214 public: 214 215 ParamImpl(const char *buffer); 215 ParamImpl(const PARAMETER_INFO *pParamInfo, const int ParmNum); 216 ParamImpl::ParamImpl(const Parameters ¶ms); 216 ParamImpl(const Parameters ¶ms); 217 217 ~ParamImpl(); 218 void SetReturnType( TYPEINFO *pTypeInfo);218 void SetReturnType( const Type &returnType ); 219 219 220 220 private: 221 BOOL _overload_check( Parameters ¶ms,TYPEINFO*pReturnTypeInfo,int overload_level);222 SubInfo *OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo*> &subs );221 BOOL _overload_check( const Parameters ¶ms,Type *pReturnTypeInfo,int overload_level); 222 UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ); 223 223 public: 224 SubInfo *OverloadSolution( const char *name, std::vector<SubInfo *> &subs ); 225 226 BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 227 bool ErrorCheck( const char *procName, const Parameters ¶ms, int SecondParmNum ); 228 void MacroParameterSupport(PARAMETER_INFO *ppi); 224 UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs ); 225 226 bool ErrorCheck( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); 229 227 void MacroParameterSupport( const Parameters ¶ms ); 230 228 void SetStructParameter(CClass *pobj_Class,LPSTR Parameter); 231 int SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 232 int SetParameter( const char *procName, const Parameters ¶ms, int SecondParmNum ); 229 int SetParameter( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); 233 230 234 231 //一時オブジェクトパラメータの生成と破棄 235 int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 236 int NewTempParameters( const char *procName, const Parameters ¶ms, int SecondParmNum ); 232 int NewTempParameters( const string &procName, const Parameters ¶ms, int SecondParmNum = -1 ); 237 233 void DeleteTempParameters(); 238 234 }; … … 241 237 void AddLocalVarAddrSchedule(); 242 238 #define PROCFLAG_NEW 1 243 int Opcode_CallProcPtr(char *variable,char *Parameter,P ROCPTRINFO *pi,LONG_PTR *plpIndex);244 void Opcode_CallProc(const char *Parameter, SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType);245 int Opcode_CallDllProc(char *Parameter,D ECLAREINFO *pdi,LONG_PTR *plpIndex);239 int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex); 240 void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType); 241 int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex); 246 242 247 243 //Compile_ProcOp.cpp … … 251 247 int GetFunctionType(int FuncNum); 252 248 int GetFunctionFromName(char *FuncName); 253 void Opcode_CallFunc( const char *Parameter, const int FuncNum, T YPEINFO&ReturnTypeInfo );249 void Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo ); 254 250 255 251 //OperatorProc.cpp 256 252 void FreeTempObject(int reg,CClass *pobj_c); 257 int CallOperatorProc(int idCalc,T YPEINFO*pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);258 void CallCastOperatorProc( int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex);259 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,T YPEINFO&RetTypeInfo);253 int CallOperatorProc(int idCalc,Type *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp); 254 void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType); 255 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,Type &RetTypeInfo); 260 256 261 257 //Compile_Statement.cpp … … 268 264 void OpcodeContinue(void); 269 265 void OpcodeExitSub(void); 270 void OpcodeSelect(c har *Parameter);266 void OpcodeSelect(const char *Parameter); 271 267 void OpcodeCase(char *Parameter); 272 268 void OpcodeGosub(char *Parameter); … … 344 340 void fpu_cast_end(); 345 341 346 void op_call( SubInfo *psi);342 void op_call(UserProc *pUserProc); -
BasicCompiler32/OperatorProc.cpp
r73 r75 11 11 12 12 //call DestructorProcAddr 13 op_call( method->p si);13 op_call( method->pUserProc ); 14 14 } 15 15 … … 18 18 19 19 //call free 20 extern SubInfo*pSub_free;20 extern UserProc *pSub_free; 21 21 op_call(pSub_free); 22 22 } 23 23 24 int CallOperatorProc(int idCalc,T YPEINFO*pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){24 int CallOperatorProc(int idCalc,Type *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){ 25 25 //オーバーロードされたオペレータ関数を呼び出す 26 26 CClass *pobj_c; 27 27 pobj_c=(CClass *)index_stack[sp-2]; 28 28 29 std::vector< SubInfo*> subs;29 std::vector<UserProc *> subs; 30 30 pobj_c->EnumMethod( idCalc, subs ); 31 31 if( subs.size() == 0 ){ … … 41 41 int i; 42 42 BOOL bReturnTypeIsObject=1; 43 T YPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};44 foreach( SubInfo *psi, subs ){45 if(p si->ReturnType!=DEF_OBJECT)43 Type ReturnType={DEF_OBJECT,subs[0]->ReturnType().GetIndex()}; 44 foreach( UserProc *pUserProc, subs ){ 45 if(pUserProc->ReturnType().IsObject()) 46 46 bReturnTypeIsObject=0; 47 47 } … … 61 61 ///////////////////////////////////////////// 62 62 63 PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3); 64 int iParmNum=0; 65 66 if(bTwoTerm){ 67 ppi[iParmNum].bArray=0; 68 ppi[iParmNum].bByVal=0; 69 ppi[iParmNum].name=0; 70 ppi[iParmNum].type=type[sp-1]; 71 ppi[iParmNum].u.index=index_stack[sp-1]; 72 ppi[iParmNum].SubScripts[0]=-1; 73 iParmNum++; 74 } 75 63 Parameters params; 64 65 if(bTwoTerm){ 66 params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) ); 67 } 76 68 77 69 //オーバーロードを解決 … … 79 71 if(idCalc==CALC_EQUAL) lstrcpy(temporary,"=="); 80 72 else GetCalcName(idCalc,temporary); 81 SubInfo *psi; 82 psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo); 83 84 if(!psi){ 85 HeapDefaultFree(ppi); 73 Type returnType; 74 if( pBaseTypeInfo ){ 75 returnType.SetBasicType( pBaseTypeInfo->type ); 76 returnType.SetIndex( pBaseTypeInfo->u.lpIndex ); 77 } 78 UserProc *pUserProc = OverloadSolution( temporary, subs, params, returnType ); 79 80 if(!pUserProc){ 81 if(bTwoTerm){ 82 delete params[0]; 83 } 86 84 return -1; 87 85 } 88 86 else{ 89 87 //オーバーロードされていないが、パラメータ個数が一致しないとき 90 if(iParmNum!=psi->params.size()){ 91 HeapDefaultFree(ppi); 88 if(params.size()!=pUserProc->Params().size()){ 89 if(bTwoTerm){ 90 delete params[0]; 91 } 92 92 return -1; 93 93 } 94 94 } 95 95 96 for(i=0;i< iParmNum;i++){96 for(i=0;i<(int)params.size();i++){ 97 97 CheckDifferentType( 98 p si->params[i]->GetBasicType(),99 p si->params[i]->GetIndex(),100 p pi[i].type,101 p pi[i].u.index,98 pUserProc->Params()[i]->GetBasicType(), 99 pUserProc->Params()[i]->GetIndex(), 100 params[i]->GetBasicType(), 101 params[i]->GetIndex(), 102 102 "", 103 103 i); 104 104 } 105 105 106 HeapDefaultFree(ppi); 106 if(bTwoTerm){ 107 delete params[0]; 108 } 107 109 108 110 int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]); 109 111 110 112 if(bTwoTerm){ 111 if( p si->realParams[1]->IsStruct() &&psi->realParams[1]->IsRef() == false ){113 if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){ 112 114 //一時オブジェクトはメソッド内で破棄される 113 115 bUseHeap[sp-1]=0; … … 116 118 117 119 118 if( psi->ReturnType==DEF_STRUCT){120 if( pUserProc->ReturnType().IsStruct() ){ 119 121 ////////////////////////////////////////////////////// 120 122 // 戻り値に構造体インスタンスを持つ場合 … … 122 124 ////////////////////////////////////////////////////// 123 125 124 int object_size = p si->u.Return_pobj_c->GetSize();126 int object_size = pUserProc->ReturnType().GetClass().GetSize(); 125 127 126 128 //push object_size … … 128 130 129 131 //call calloc 130 extern SubInfo*pSub_calloc;132 extern UserProc *pSub_calloc; 131 133 op_call(pSub_calloc); 132 134 … … 180 182 } 181 183 182 if( p si->realParams[1]->IsRef() ){184 if( pUserProc->RealParams()[1]->IsRef() ){ 183 185 //一時参照を作成 184 186 … … 191 193 } 192 194 193 if( psi->ReturnType==DEF_STRUCT){195 if( pUserProc->ReturnType().IsStruct() ){ 194 196 //push ebx 195 197 op_push(REG_EBX); … … 200 202 201 203 //call operator_proc 202 op_call(p si);203 204 if(bTwoTerm){ 205 if( p si->realParams[1]->IsRef() ){204 op_call(pUserProc); 205 206 if(bTwoTerm){ 207 if( pUserProc->RealParams()[1]->IsRef() ){ 206 208 //一時参照を破棄 207 209 op_pop( REG_NON ); … … 209 211 } 210 212 211 if( psi->ReturnType!=DEF_NON){213 if( !pUserProc->ReturnType().IsNull() ){ 212 214 //スタックへプッシュ 213 PushReturnValue(p si->ReturnType);215 PushReturnValue(pUserProc->ReturnType().GetBasicType()); 214 216 } 215 217 … … 222 224 223 225 sp--; 224 type[sp-1]=p si->ReturnType;225 index_stack[sp-1]=p si->u.ReturnIndex;226 227 if( psi->ReturnType==DEF_STRUCT){226 type[sp-1]=pUserProc->ReturnType().GetBasicType(); 227 index_stack[sp-1]=pUserProc->ReturnType().GetIndex(); 228 229 if( pUserProc->ReturnType().IsStruct() ){ 228 230 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 229 231 //※後にfreeする必要あり … … 254 256 array_bUseHeap[1]=0; 255 257 256 T YPEINFOBaseTypeInfo={ToType,lpToIndex};258 Type BaseTypeInfo={ToType,lpToIndex}; 257 259 258 260 int iRet; … … 272 274 SetError(-1,"キャスト演算子がオーバーロードされていません。",cp); 273 275 } 274 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,T YPEINFO&RetTypeInfo){275 std::vector< SubInfo*> subs;276 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,Type &RetTypeInfo){ 277 std::vector<UserProc *> subs; 276 278 pobj_Class->EnumMethod( CALC_ARRAY_GET, subs ); 277 279 if( subs.size() == 0 ){ … … 280 282 281 283 Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT); 282 RetTypeInfo.type = subs[0]->ReturnType ;283 RetTypeInfo.u.lpIndex = subs[0]-> u.ReturnIndex;284 } 284 RetTypeInfo.type = subs[0]->ReturnType().GetBasicType(); 285 RetTypeInfo.u.lpIndex = subs[0]->ReturnType().GetIndex(); 286 } -
BasicCompiler32/VarList.cpp
r73 r75 348 348 if(pobj_dti->lplpSpBase[i2]==0) return; 349 349 350 extern SubInfo**ppSubHash;351 SubInfo *psi;350 extern UserProc **ppSubHash; 351 UserProc *pUserProc; 352 352 for(i3=0,sw=0;i3<MAX_HASH;i3++){ 353 p si=ppSubHash[i3];354 while(p si){355 if(rva_to_real(p si->CompileAddress) <= pobj_dti->lplpObp[i2] &&356 pobj_dti->lplpObp[i2] < rva_to_real(p si->EndOpAddr)){353 pUserProc=ppSubHash[i3]; 354 while(pUserProc){ 355 if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2] && 356 pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){ 357 357 sw=1; 358 358 break; 359 359 } 360 360 361 p si=psi->pNextData;361 pUserProc=pUserProc->pNextData; 362 362 } 363 363 if(sw) break; 364 364 } 365 if(!p si) return;366 367 for(i=0;i<p si->VarNum;i++){368 VARIABLE *pVar=&p si->pVar[i];365 if(!pUserProc) return; 366 367 for(i=0;i<pUserProc->VarNum;i++){ 368 VARIABLE *pVar=&pUserProc->pVar[i]; 369 369 370 370 //スコープ外の場合は無視 … … 416 416 417 417 TreeView_DeleteAllItems(hVarTree_This); 418 if(!p si->pobj_ParentClass) return;418 if(!pUserProc->GetParentClassPtr()) return; 419 419 420 420 //Thisポインタを取得 421 421 LONG_PTR pThis; 422 for(i=0;i<p si->VarNum;i++){423 if(lstrcmp(p si->pVar[i].name,"_System_LocalThis")==0) break;424 } 425 if(i==p si->VarNum) return;426 lpData=pobj_dti->lplpSpBase[i2]+p si->pVar[i].offset;422 for(i=0;i<pUserProc->VarNum;i++){ 423 if(lstrcmp(pUserProc->pVar[i].name,"_System_LocalThis")==0) break; 424 } 425 if(i==pUserProc->VarNum) return; 426 lpData=pobj_dti->lplpSpBase[i2]+pUserProc->pVar[i].offset; 427 427 ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&lpAccBytes); 428 428 429 for(i=0;i<p si->pobj_ParentClass->iMemberNum;i++){430 offset = p si->pobj_ParentClass->GetMemberOffset( psi->pobj_ParentClass->ppobj_Member[i]->name, &i2 );431 432 if(p si->pobj_ParentClass->ppobj_Member[i]->SubScripts[0]!=-1){429 for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){ 430 offset = pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->name, &i2 ); 431 432 if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){ 433 433 //配列 434 434 sprintf(temporary,"%s %s(&H%X)", 435 p si->pobj_ParentClass->ppobj_Member[i]->name,435 pUserProc->GetParentClassPtr()->ppobj_Member[i]->name, 436 436 STRING_ARRAY, 437 437 offset); … … 442 442 VarList_Array(hVarTree_This,hParent, 443 443 pThis+offset, 444 p si->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,445 p si->pobj_ParentClass->ppobj_Member[i]->SubScripts,446 p si->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);444 pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.type, 445 pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts, 446 pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.u.lpIndex); 447 447 } 448 448 else{ 449 449 VarList_Insert(hVarTree_This,&tv, 450 p si->pobj_ParentClass->ppobj_Member[i]->name,451 p si->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,450 pUserProc->GetParentClassPtr()->ppobj_Member[i]->name, 451 pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.type, 452 452 pThis+offset, 453 p si->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);453 pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.u.lpIndex); 454 454 } 455 455 } … … 583 583 584 584 //プロシージャ コンボボックス 585 extern SubInfo**ppSubHash;586 SubInfo *psi;585 extern UserProc **ppSubHash; 586 UserProc *pUserProc; 587 587 int sw; 588 588 SendMessage(hProcCombo,CB_RESETCONTENT,0,0); 589 589 for(i2=pobj_dti->iProcLevel;i2>=0;i2--){ 590 590 for(i3=0,sw=0;i3<MAX_HASH;i3++){ 591 p si=ppSubHash[i3];592 while(p si){593 if(rva_to_real(p si->CompileAddress) <= pobj_dti->lplpObp[i2] &&594 pobj_dti->lplpObp[i2] < rva_to_real(p si->EndOpAddr)){595 lstrcpy(temporary,p si->name);591 pUserProc=ppSubHash[i3]; 592 while(pUserProc){ 593 if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2] && 594 pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){ 595 lstrcpy(temporary,pUserProc->GetName().c_str()); 596 596 sw=1; 597 597 break; 598 598 } 599 p si=psi->pNextData;599 pUserProc=pUserProc->pNextData; 600 600 } 601 601 if(sw) break; 602 602 } 603 if(!p si){603 if(!pUserProc){ 604 604 if(i2==0){ 605 605 lstrcpy(temporary,"Global"); … … 706 706 707 707 if(pobj_dti->lplpSpBase[i2]){ 708 extern SubInfo**ppSubHash;709 SubInfo *psi;708 extern UserProc **ppSubHash; 709 UserProc *pUserProc; 710 710 for(i3=0,sw=0;i3<MAX_HASH;i3++){ 711 p si=ppSubHash[i3];712 while(p si){713 if(rva_to_real(p si->CompileAddress) <= pobj_dti->lplpObp[i2] &&714 pobj_dti->lplpObp[i2] < rva_to_real(p si->EndOpAddr)){711 pUserProc=ppSubHash[i3]; 712 while(pUserProc){ 713 if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2] && 714 pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){ 715 715 sw=1; 716 716 break; 717 717 } 718 718 719 p si=psi->pNextData;719 pUserProc=pUserProc->pNextData; 720 720 } 721 721 if(sw) break; … … 723 723 724 724 725 if(p si){726 LocalVar=p si->pVar;727 MaxLocalVarNum=p si->VarNum;728 729 pobj_CompilingClass=p si->pobj_ParentClass;725 if(pUserProc){ 726 LocalVar=pUserProc->pVar; 727 MaxLocalVarNum=pUserProc->VarNum; 728 729 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 730 730 } 731 731 } -
BasicCompiler32/WatchList.cpp
r73 r75 308 308 ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){ 309 309 int i; 310 SubInfo *psi;310 UserProc *pUserProc; 311 311 312 312 //ripからプロシージャを取得 313 p si=GetSubFromObp(obp_Rip);314 315 for(i=0;i<p si->VarNum;i++){316 if(lstrcmp(p si->pVar[i].name,"_System_LocalThis")==0) break;317 } 318 if(i==p si->VarNum) return 0;319 320 return p si->pVar[i].offset;313 pUserProc=GetSubFromObp(obp_Rip); 314 315 for(i=0;i<pUserProc->VarNum;i++){ 316 if(lstrcmp(pUserProc->pVar[i].name,"_System_LocalThis")==0) break; 317 } 318 if(i==pUserProc->VarNum) return 0; 319 320 return pUserProc->pVar[i].offset; 321 321 } 322 322 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){ -
BasicCompiler32/increment.cpp
r64 r75 3 3 4 4 void IncDec(int idCalc, char *lpszLeft, char *lpszRight){ 5 int VarType;6 LONG_PTR lpVarIndex;7 RELATIVE_VAR VarRelativeVar;8 9 5 10 6 /////////////////////////// … … 12 8 /////////////////////////// 13 9 10 RELATIVE_VAR VarRelativeVar; 11 Type varType; 14 12 if(!GetVarOffsetReadWrite( 15 13 lpszLeft, 16 &VarType,17 14 &VarRelativeVar, 18 &lpVarIndex)) return;15 varType)) return; 19 16 20 17 if(IsUse_ecx(&VarRelativeVar)){ … … 28 25 /////////////////////////////////// 29 26 30 if( IsRealNumberType(VarType)){27 if( varType.IsReal() ){ 31 28 //実数 32 SetReg_RealVariable( VarType,&VarRelativeVar);29 SetReg_RealVariable(varType.GetBasicType(),&VarRelativeVar); 33 30 } 34 31 else{ 35 32 //整数 36 SetReg_WholeVariable( VarType,&VarRelativeVar,REG_EAX);33 SetReg_WholeVariable(varType.GetBasicType(),&VarRelativeVar,REG_EAX); 37 34 } 38 35 39 36 40 if( IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&37 if(varType.IsWhole()&&lstrcmp(lpszRight,"1")==0&& 41 38 (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){ 42 39 //////////////////////////////////////////// … … 44 41 //////////////////////////////////////////// 45 42 46 if( Is64Type(VarType)){43 if( varType.Is64() ){ 47 44 if(idCalc==CALC_ADDITION){ 48 45 //64ビット インクリメント … … 80 77 op_push(REG_ECX); 81 78 82 83 if(VarType==DEF_DOUBLE){ 79 if( varType.IsDouble() ){ 84 80 //sub esp,8 85 81 op_sub_esp(8); 86 82 87 83 //fstp qword ptr[esp] 88 op_fstp_basereg( VarType,REG_ESP);89 } 90 else if( VarType==DEF_SINGLE){84 op_fstp_basereg(varType.GetBasicType(),REG_ESP); 85 } 86 else if( varType.IsSingle() ){ 91 87 //sub esp,4 92 88 op_sub_esp(4); 93 89 94 90 //fstp dword ptr[esp] 95 op_fstp_basereg( VarType,REG_ESP);96 } 97 else if( Is64Type(VarType)){91 op_fstp_basereg(varType.GetBasicType(),REG_ESP); 92 } 93 else if( varType.Is64() ){ 98 94 //push edx 99 95 op_push(REG_EDX); … … 107 103 } 108 104 109 int CalcType; 110 CalcType=NumOpe(lpszRight,VarType,lpVarIndex,0); 111 112 if(VarType==DEF_DOUBLE) ChangeTypeToDouble(CalcType); 113 else if(VarType==DEF_SINGLE) ChangeTypeToSingle(CalcType); 114 else ChangeTypeToWhole(CalcType,VarType); 115 116 int type[255],sp; 105 Type calcType; 106 if( !NumOpe(lpszRight,varType,calcType) ){ 107 return; 108 } 109 110 if( varType.IsDouble() ) ChangeTypeToDouble(calcType.GetBasicType()); 111 else if( varType.IsSingle() ) ChangeTypeToSingle(calcType.GetBasicType()); 112 else ChangeTypeToWhole(calcType.GetBasicType(),varType.GetBasicType()); 113 114 int type_stack[255],sp; 117 115 LONG_PTR index_stack[255]; 118 type [0]=VarType;119 type [1]=VarType;120 index_stack[0]= lpVarIndex;121 index_stack[1]= lpVarIndex;116 type_stack[0]=varType.GetBasicType(); 117 type_stack[1]=varType.GetBasicType(); 118 index_stack[0]=varType.GetIndex(); 119 index_stack[1]=varType.GetIndex(); 122 120 sp=2; 123 121 124 122 switch(idCalc){ 125 123 case CALC_XOR: 126 Calc_Xor(type ,index_stack,&sp);124 Calc_Xor(type_stack,index_stack,&sp); 127 125 break; 128 126 case CALC_OR: 129 Calc_Or(type ,index_stack,&sp);127 Calc_Or(type_stack,index_stack,&sp); 130 128 break; 131 129 case CALC_AND: 132 Calc_And(type ,index_stack,&sp);130 Calc_And(type_stack,index_stack,&sp); 133 131 break; 134 132 case CALC_SHL: 135 Calc_SHL(type ,&sp);133 Calc_SHL(type_stack,&sp); 136 134 break; 137 135 case CALC_SHR: 138 Calc_SHR(type ,&sp);136 Calc_SHR(type_stack,&sp); 139 137 break; 140 138 case CALC_ADDITION: 141 139 case CALC_SUBTRACTION: 142 140 case CALC_PRODUCT: 143 CalcTwoTerm_Arithmetic(idCalc,type ,index_stack,&sp);141 CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp); 144 142 break; 145 143 case CALC_MOD: 146 Calc_Mod(type ,&sp);144 Calc_Mod(type_stack,&sp); 147 145 break; 148 146 case CALC_QUOTIENT: 149 Calc_Divide(type ,&sp,VarType);147 Calc_Divide(type_stack,&sp,varType.GetBasicType()); 150 148 break; 151 149 case CALC_INTQUOTIENT: 152 Calc_IntDivide(type ,index_stack,&sp);150 Calc_IntDivide(type_stack,index_stack,&sp); 153 151 break; 154 152 case CALC_POWER: 155 Calc_Power(type ,&sp);156 break; 157 } 158 159 160 if( VarType==DEF_DOUBLE){153 Calc_Power(type_stack,&sp); 154 break; 155 } 156 157 158 if( varType.IsDouble() ){ 161 159 //fld qword ptr[esp] 162 op_fld_basereg( VarType,REG_ESP);160 op_fld_basereg(varType.GetBasicType(),REG_ESP); 163 161 164 162 //add esp,8 165 163 op_add_esp(8); 166 164 } 167 else if( VarType==DEF_SINGLE){165 else if( varType.IsSingle() ){ 168 166 //fld dword ptr[esp] 169 op_fld_basereg( VarType,REG_ESP);167 op_fld_basereg(varType.GetBasicType(),REG_ESP); 170 168 171 169 //add esp,4 172 170 op_add_esp(4); 173 171 } 174 else if( Is64Type(VarType)){172 else if( varType.Is64() ){ 175 173 //pop eax 176 174 op_pop(REG_EAX); … … 200 198 } 201 199 202 SetVariableFromEax( VarType,VarType,&VarRelativeVar);200 SetVariableFromEax(varType.GetBasicType(),varType.GetBasicType(),&VarRelativeVar); 203 201 } -
BasicCompiler32/op32_main.cpp
r73 r75 974 974 ///////////////////////////// 975 975 976 void op_call( SubInfo *psi){976 void op_call(UserProc *pUserProc){ 977 977 OpBuffer[obp++]=(char)0xE8; 978 pobj_SubAddrSchedule->add(p si,1);979 p si->bUse=1;978 pobj_SubAddrSchedule->add(pUserProc,1); 979 pUserProc->Using(); 980 980 obp+=sizeof(long); 981 981 }
Note:
See TracChangeset
for help on using the changeset viewer.