Changeset 75 in dev for BasicCompiler64/Compile_CallProc.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/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,PROCPTRINFO *pi,LONG_PTR *plpIndex){ 35 extern HANDLE hHeap; 36 int i; 37 34 bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){ 38 35 39 36 extern BOOL bDebugCompile; … … 49 46 //パラメータオブジェクトを生成 50 47 ParamImpl *pobj_parameter=0; 51 pobj_parameter=new ParamImpl( Parameter);48 pobj_parameter=new ParamImpl(lpszParms); 52 49 53 50 //エラーチェック 54 if( !pobj_parameter->ErrorCheck(variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum) ){51 if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){ 55 52 //パラメータにエラーがあるときは処理を終える 56 return pi->ReturnType;53 return false; 57 54 } 58 55 59 56 //スタックフレームに存在する既存のパラメータをバックアップ 60 pobj_parameter->BackupParameter( pi->ParmNum);57 pobj_parameter->BackupParameter( (int)pProcPointer->Params().size() ); 61 58 62 59 //一時オブジェクトを生成 63 pobj_parameter->NewTempParameters( variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum);60 pobj_parameter->NewTempParameters( variable,pProcPointer->Params() ); 64 61 65 62 //レジスタ、スタックフレームにセット 66 pobj_parameter->SetParameter(variable,p i->pParmInfo,pi->ParmNum,pi->ParmNum);63 pobj_parameter->SetParameter(variable,pProcPointer->Params() ); 67 64 68 65 69 66 70 67 RELATIVE_VAR RelativeVar; 71 LONG_PTR lp; 72 GetVarOffsetReadOnly(variable,&i,&RelativeVar,&lp); 68 GetVarOffsetReadOnly(variable,&RelativeVar,Type()); 73 69 SetVarPtrToReg(REG_RAX,&RelativeVar); 74 70 … … 88 84 89 85 //スタックフレームに存在する既存のパラメータを復元 90 pobj_parameter->RestoreParameter( pi->ParmNum);86 pobj_parameter->RestoreParameter( (int)pProcPointer->Params().size() ); 91 87 92 88 //パラメータオブジェクトを破棄 93 89 delete pobj_parameter; 94 90 95 return pi->ReturnType;91 return true; 96 92 } 97 93 98 void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){94 bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){ 99 95 int i2; 100 96 101 if( psi->dwType==SUBTYPE_MACRO){102 if( lstrcmpi(psi->name,"Print")==0){97 if( pUserProc->IsMacro() ){ 98 if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){ 103 99 Opcode_Print(Parameter,0); 104 return ;105 } 106 if( lstrcmpi(psi->name,"Input")==0){100 return true; 101 } 102 if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){ 107 103 Opcode_Input(Parameter); 108 return ;109 } 110 if( lstrcmpi(psi->name,"Write")==0){104 return true; 105 } 106 if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){ 111 107 Opcode_Print(Parameter,1); 112 return ;113 } 114 } 115 116 p si->bUse=1;108 return true; 109 } 110 } 111 112 pUserProc->Using(); 117 113 118 114 bool isStatic = false; 119 CClass *pobj_c = NULL;115 const CClass *pobj_c = NULL; 120 116 CMethod *pMethod = NULL; 121 if( psi->pobj_ParentClass){117 if( pUserProc->GetParentClassPtr() ){ 122 118 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う 123 119 if(ObjectName[0]){ … … 128 124 else{ 129 125 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し 130 int type = GetVarType(ObjectName,(LONG_PTR *)&pobj_c,0); 131 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){ 126 Type varType; 127 GetVarType( ObjectName, varType, false ); 128 pobj_c = &varType.GetClass(); 129 if( NATURAL_TYPE( varType.GetBasicType() ) != DEF_OBJECT ){ 132 130 pobj_c=pobj_DBClass->check(ObjectName); 133 131 if( pobj_c ){ … … 143 141 if(dwFlags&PROCFLAG_NEW){ 144 142 //New演算子によるコンストラクタ呼び出し 145 pobj_c=p si->pobj_ParentClass;143 pobj_c=pUserProc->GetParentClassPtr(); 146 144 } 147 145 else{ … … 156 154 ///////////////////////////////// 157 155 pMethod = NULL; 158 if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( p si);156 if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc ); 159 157 if( ! pMethod ){ 160 158 //動的メソッドが取得できなかったときは静的メソッドを当たる 161 pMethod = pobj_c->GetStaticMethodInfo( p si);159 pMethod = pobj_c->GetStaticMethodInfo( pUserProc ); 162 160 if( !pMethod ){ 163 161 SetError(300,NULL,cp); 164 return ;162 return false; 165 163 } 166 164 … … 180 178 //同一クラスオブジェクトの場合はプライベートアクセスを容認する 181 179 if(dwAccess==ACCESS_NON){ 182 SetError(109,p si->name,cp);183 return ;180 SetError(109,pUserProc->GetName(),cp); 181 return false; 184 182 } 185 183 } … … 187 185 if(dwAccess==ACCESS_PRIVATE|| 188 186 dwAccess==ACCESS_NON){ 189 SetError(109,p si->name,cp);190 return ;187 SetError(109,pUserProc->GetName(),cp); 188 return false; 191 189 } 192 190 if(dwAccess==ACCESS_PROTECTED){ 193 SetError(110,p si->name,cp);194 return ;191 SetError(110,pUserProc->GetName(),cp); 192 return false; 195 193 } 196 194 } … … 199 197 //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする) 200 198 if(dwAccess==ACCESS_NON){ 201 SetError(109,p si->name,cp);202 return ;199 SetError(109,pUserProc->GetName(),cp); 200 return false; 203 201 } 204 202 } … … 211 209 212 210 char temporary[VN_SIZE]={0}; 213 if( p si->pobj_ParentClass&& isStatic == false ){211 if( pUserProc->GetParentClassPtr() && isStatic == false ){ 214 212 //_System_LocalThis(第一パラメータ)のダミーを作成 215 213 lstrcpy(temporary,"0,"); … … 234 232 235 233 //エラーチェック 236 if( !pobj_parameter->ErrorCheck(p si->name,psi->realParams,psi->SecondParmNum) ){234 if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){ 237 235 //パラメータにエラーがあるときは処理を終える 238 return ;239 } 240 241 if(p si->dwType==SUBTYPE_MACRO){236 return false; 237 } 238 239 if(pUserProc->IsMacro()){ 242 240 //マクロ関数の場合は、パラメータ省略を考慮する 243 pobj_parameter->MacroParameterSupport( psi->realParams);241 pobj_parameter->MacroParameterSupport( pUserProc->RealParams() ); 244 242 } 245 243 246 244 //スタックフレームに存在する既存のパラメータをバックアップ 247 pobj_parameter->BackupParameter( psi->RealParmNum);245 pobj_parameter->BackupParameter( (int)pUserProc->RealParams().size() ); 248 246 249 247 //一時オブジェクトを生成 250 pobj_parameter->NewTempParameters( p si->name,psi->realParams,psi->RealSecondParmNum);248 pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() ); 251 249 252 250 //レジスタ、スタックフレームにセット 253 pobj_parameter->SetParameter(p si->name,psi->realParams,psi->RealSecondParmNum);254 255 if(p si->ReturnType==DEF_STRUCT && psi->isReturnRef == false){251 pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() ); 252 253 if(pUserProc->ReturnType().IsStruct() ){ 256 254 ////////////////////////////////////////////////////// 257 255 // 戻り値に構造体インスタンスを持つ場合 … … 265 263 ////////////////////////////////////////////////////// 266 264 267 int object_size = p si->u.Return_pobj_c->GetSize();265 int object_size = pUserProc->ReturnType().GetClass().GetSize(); 268 266 269 267 //mov rcx,object_size … … 271 269 272 270 //call calloc 273 extern SubInfo*pSub_calloc;271 extern UserProc *pSub_calloc; 274 272 op_call(pSub_calloc); 275 273 … … 282 280 }//////////////////////////////////////////// 283 281 284 if( p si->pobj_ParentClass&& isStatic == false ){282 if( pUserProc->GetParentClassPtr() && isStatic == false ){ 285 283 //mov rdx,r13 286 284 op_mov_RR(REG_RDX,REG_R13); … … 293 291 294 292 295 if( p si->pobj_ParentClass&& isStatic == false ){293 if( pUserProc->GetParentClassPtr() && isStatic == false ){ 296 294 /////////////////////////////// 297 295 // メンバ関数の場合 … … 305 303 if( pMethod->isConst ){ 306 304 //Constアクセスが可能なメソッドの場合 307 if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return; 305 if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){ 306 return false; 307 } 308 308 } 309 309 else{ 310 310 //Constアクセスが不可能なメソッドの場合 311 if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return; 311 if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){ 312 return false; 313 } 312 314 } 313 315 … … 334 336 } 335 337 336 if( psi->bVirtual){338 if( pUserProc->IsVirtual() ){ 337 339 //仮想関数(オブジェクトメソッド)呼び出し 338 340 //pObj->func_table->func1 … … 343 345 op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 344 346 345 i2 = pobj_c->GetFuncNumInVtbl( p si);347 i2 = pobj_c->GetFuncNumInVtbl( pUserProc ); 346 348 347 349 //call qword ptr[r11+func_index] … … 364 366 365 367 //call ProcAddr 366 op_call(p si);368 op_call(pUserProc); 367 369 } 368 370 369 371 /* 64コンパイラでは不要 370 if(p di->bCdecl){372 if(pDllProc->bCdecl){ 371 373 //add esp,ParmSize 372 374 }*/ … … 380 382 381 383 //スタックフレームに存在する既存のパラメータを復元 382 pobj_parameter->RestoreParameter( psi->RealParmNum);384 pobj_parameter->RestoreParameter( (int)pUserProc->RealParams().size() ); 383 385 384 386 //パラメータオブジェクトを破棄 385 387 delete pobj_parameter; 388 389 return true; 386 390 } 387 391 388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){ 389 char *temporary; 390 391 temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1); 392 bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){ 392 393 393 394 extern BOOL bDebugCompile; 394 395 extern BOOL bDebugSupportProc; 395 if(bDebugCompile&&bDebugSupportProc==0&& lstrcmp(pdi->name,"DebugBreak")!=0)396 if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){ 396 397 Call_DebugSys_SaveContext(); 397 398 } 398 399 399 400 … … 404 405 //パラメータオブジェクトを生成 405 406 ParamImpl *pobj_parameter=0; 406 pobj_parameter=new ParamImpl( Parameter);407 pobj_parameter=new ParamImpl(lpszParms); 407 408 408 409 //エラーチェック 409 if( !pobj_parameter->ErrorCheck( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){410 if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){ 410 411 //パラメータにエラーがあるときは処理を終える 411 return pdi->ReturnType;412 return false; 412 413 } 413 414 414 415 //スタックフレームに存在する既存のパラメータをバックアップ 415 pobj_parameter->BackupParameter( pdi->ParmNum);416 pobj_parameter->BackupParameter( (int)pDllProc->Params().size() ); 416 417 417 418 //一時オブジェクトを生成 418 pobj_parameter->NewTempParameters( p di->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);419 pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() ); 419 420 420 421 //レジスタ、スタックフレームにセット 421 pobj_parameter->SetParameter(p di->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);422 pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() ); 422 423 423 424 … … 429 430 430 431 //call dword ptr[ImportTable] 431 op_call( p di);432 op_call( pDllProc ); 432 433 433 434 /* 64コンパイラでは不要 434 if(p di->bCdecl){435 if(pDllProc->bCdecl){ 435 436 //add esp,ParmSize 436 437 }*/ … … 440 441 441 442 //スタックフレームに存在する既存のパラメータを復元 442 pobj_parameter->RestoreParameter( pdi->ParmNum);443 pobj_parameter->RestoreParameter( (int)pDllProc->Params().size() ); 443 444 444 445 //パラメータオブジェクトを破棄 445 446 delete pobj_parameter; 446 447 447 if(plpIndex) *plpIndex=pdi->u.ReturnIndex; 448 449 HeapDefaultFree(temporary); 450 451 return pdi->ReturnType; 448 return true; 452 449 }
Note:
See TracChangeset
for help on using the changeset viewer.