Changeset 64 in dev for BasicCompiler64/CParameter.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/CParameter.cpp
r63 r64 2 2 #include "opcode.h" 3 3 4 voidCParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){4 int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 5 5 /////////////////////////////////////////////////////// 6 6 // 一時オブジェクトをあらかじめスタックに積んでおく 7 7 /////////////////////////////////////////////////////// 8 9 int stackItemNum = 0; 8 10 9 11 useTempObject = false; … … 60 62 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 61 63 64 if( type == DEF_OBJECT ){ 65 //一時参照を作成 66 pobj_sf->push( reg ); 67 pobj_sf->mov_sp( reg ); 68 69 stackItemNum++; 70 } 71 62 72 //スタックフレームへコピー 63 73 StackOffsetOfTempObject[i2] = pobj_sf->push(reg); 74 75 stackItemNum++; 64 76 65 77 bool result = CheckDifferentType( … … 81 93 } 82 94 } 95 96 return stackItemNum * PTR_SIZE; 83 97 } 84 98 void CParameter::DeleteTempParameters(){ … … 90 104 for(int i2=ParmsNum-1;i2>=0;i2--){ 91 105 if( useTempParameters[i2] ){ 92 //スタックフレームから取得93 pobj_sf->ref(REG_RCX);94 95 //デストラクタを呼び出す96 97 //call destructor98 CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod(); 99 if( method ){100 op_call( method->psi );101 }102 103 //メモリを解放する104 105 pobj_sf->pop(REG_RCX);106 107 //call free108 extern SUBINFO *pSub_free;109 op_call(pSub_free);106 if( types[i2].type == DEF_STRUCT ){ 107 // 構造体の一時メモリ 108 109 //メモリを解放する 110 111 pobj_sf->pop( REG_RCX ); 112 113 //call free 114 extern SUBINFO *pSub_free; 115 op_call(pSub_free); 116 } 117 else if( types[i2].type == DEF_OBJECT ){ 118 pobj_sf->pop(); 119 pobj_sf->pop(); 120 } 121 else{ 122 SetError(300,NULL,cp); 123 } 110 124 } 111 125 } 112 126 } 113 127 114 void CParameter::Set ObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){128 void CParameter::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){ 115 129 ////////////////////////////////////////////////////// 116 130 ///// レジスタ資源のバックアップ … … 133 147 pobj_sf->push(REG_R11); 134 148 135 TYPEINFO BaseType={DEF_ OBJECT,(LONG_PTR)pobj_Class};149 TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class}; 136 150 TYPEINFO CalcType; 137 151 CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex); 138 152 153 /* 154 TODO: 消す 139 155 if( pobj_Class->GetCopyConstructorMethod() 140 156 && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){ … … 178 194 op_call(pobj_Class->GetConstructorMethod()->psi); 179 195 } 196 */ 180 197 181 198 182 199 BOOL bUseHeap; 183 200 int temp_reg=REG_RAX; 184 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_ OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);201 CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap); 185 202 186 203 … … 194 211 RelativeVar.dwKind=VAR_DIRECTMEM; 195 212 196 Set ObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);197 198 }213 SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap); 214 215 //} 199 216 200 217 //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用 … … 209 226 op_mov_RR(reg,REG_R11); 210 227 } 228 211 229 212 230 void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ … … 298 316 } 299 317 300 if(DummyTypeInfo.type==DEF_ OBJECT){301 Set ObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);318 if(DummyTypeInfo.type==DEF_STRUCT){ 319 SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]); 302 320 goto next; 303 321 } … … 318 336 319 337 if(CalcType==DEF_OBJECT){ 320 //キャスト演算子のオーバーロードに対応する 321 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 338 if( DummyTypeInfo.type != DEF_OBJECT 339 || 340 DummyTypeInfo.type == DEF_OBJECT && 341 !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){ 342 //キャスト演算子のオーバーロードに対応する 343 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex); 344 } 322 345 } 323 346 … … 419 442 } 420 443 } 444 else if(DummyTypeInfo.type==DEF_STRUCT){ 445 if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){ 446 SetError(11,Parms[i2],cp); 447 } 448 } 421 449 } 422 450 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ … … 442 470 } 443 471 } 472 444 473 next: 474 445 475 if(reg==REG_RAX){ 446 476 //スタックフレームへコピー
Note:
See TracChangeset
for help on using the changeset viewer.