Changeset 75 in dev for BasicCompiler32/Compile_CallProc.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.