Changeset 64 in dev for BasicCompiler64/OperatorProc.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/OperatorProc.cpp
r63 r64 55 55 if(pBaseTypeInfo){ 56 56 if(pBaseTypeInfo->type==DEF_OBJECT){ 57 bReturnTypeIsObject=1;58 57 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex; 59 58 } … … 113 112 HeapDefaultFree(ppi); 114 113 115 int right_side_size;116 if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;117 else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);118 119 114 if(bTwoTerm){ 120 if(psi->p ParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){115 if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){ 121 116 //一時オブジェクトはメソッド内で破棄される 122 117 bUseHeap[sp-1]=0; … … 124 119 } 125 120 126 127 if(psi->ReturnType==DEF_OBJECT){ 128 ////////////////////////////////////////////////////// 129 // 戻り値にオブジェクト インスタンスを持つ場合 130 // ※ByRef _System_ReturnObject パラメータ用領域を取得 121 if(psi->ReturnType==DEF_STRUCT){ 122 ////////////////////////////////////////////////////// 123 // 戻り値に構造体インスタンスを持つ場合 124 // ※ByRef _System_ReturnValue パラメータ用領域を取得 131 125 ////////////////////////////////////////////////////// 132 126 … … 154 148 }//////////////////////////////////////////// 155 149 } 156 157 150 158 151 int reg1,reg2; … … 161 154 SetOneTermToReg_Whole64Calc(type[sp-1],®2); 162 155 pobj_reg->UnlockReg(); 156 if( !psi->pRealParmInfo[1].bByVal ){ 157 //一時参照を作成 158 pobj_sf->push( reg2 ); 159 pobj_sf->mov_sp( reg2 ); 160 } 163 161 } 164 162 … … 192 190 193 191 if(bTwoTerm){ 194 if(psi->ReturnType==DEF_ OBJECT){192 if(psi->ReturnType==DEF_STRUCT){ 195 193 //mov r8,reg2 196 194 op_mov_RR(REG_R8,reg2); … … 202 200 } 203 201 204 if(psi->ReturnType==DEF_ OBJECT){202 if(psi->ReturnType==DEF_STRUCT){ 205 203 //mov rdx,r13 206 204 op_mov_RR(REG_RDX,REG_R13); … … 213 211 op_call(psi); 214 212 215 if(psi->ReturnType!= -1){213 if(psi->ReturnType!=DEF_NON){ 216 214 //戻り値を一時的に退避 217 215 … … 254 252 } 255 253 256 if(psi->ReturnType!=-1){ 254 if(bTwoTerm){ 255 if( !psi->pRealParmInfo[1].bByVal ){ 256 //一時参照を破棄 257 pobj_sf->pop(); 258 } 259 } 260 261 if(psi->ReturnType!=DEF_NON){ 257 262 //戻り値をreg1にセット 258 263 reg1=pobj_reg->LockReg(); … … 266 271 index_stack[sp-1]=psi->u.ReturnIndex; 267 272 268 if(psi->ReturnType==DEF_ OBJECT){269 // Object型が戻ったときはヒープ領域にインスタンスが格納されている273 if(psi->ReturnType==DEF_STRUCT){ 274 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 270 275 //※後にfreeする必要あり 271 276 bUseHeap[sp-1]=1;
Note:
See TracChangeset
for help on using the changeset viewer.