Changeset 436 in dev for trunk/abdev/BasicCompiler64/OperatorProc.cpp
- Timestamp:
- Mar 15, 2008, 3:33:36 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/OperatorProc.cpp
r425 r436 31 31 } 32 32 33 int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack, BOOL *bUseHeap,int &sp)33 int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp) 34 34 { 35 35 Type leftType( type_stack[sp-2], index_stack[sp-2] ); … … 101 101 if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){ 102 102 //一時オブジェクトはメソッド内で破棄される 103 bUseHeap[sp-1]=0;103 isNeedHeapFreeStructureStack[sp-1] = false; 104 104 } 105 105 } … … 153 153 154 154 //ヒープ解放用に退避 155 if( bUseHeap[sp-1]){155 if(isNeedHeapFreeStructureStack[sp-1]){ 156 156 //mov qword ptr[rsp+offset],reg2 ※スタックフレームを利用 157 157 pobj_sf->push(reg2); 158 158 } 159 if( bUseHeap[sp-2]){159 if(isNeedHeapFreeStructureStack[sp-2]){ 160 160 //mov qword ptr[rsp+offset],reg1 ※スタックフレームを利用 161 161 pobj_sf->push(reg1); … … 213 213 214 214 215 if( bUseHeap[sp-2]||bUseHeap[sp-1]){216 215 if( isNeedHeapFreeStructureStack[sp-2] || isNeedHeapFreeStructureStack[sp-1] ) 216 { 217 217 ////////////////////////////////////////////////////// 218 218 ///// レジスタ資源のバックアップ … … 220 220 ////////////////////////////////////////////////////// 221 221 222 if(bUseHeap[sp-2]){ 222 if( isNeedHeapFreeStructureStack[sp-2] ) 223 { 223 224 //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用 224 225 pobj_sf->pop(REG_R14); … … 226 227 FreeTempObject(REG_R14,(CClass *)index_stack[sp-2]); 227 228 } 228 if(bUseHeap[sp-1]){ 229 if( isNeedHeapFreeStructureStack[sp-1] ) 230 { 229 231 //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用 230 232 pobj_sf->pop(REG_R14); … … 258 260 index_stack[sp-1]=pUserProc->ReturnType().GetIndex(); 259 261 260 if( pUserProc->ReturnType().IsStruct() ){ 262 if( pUserProc->ReturnType().IsStruct() ) 263 { 261 264 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 262 265 //※後にfreeする必要あり 263 bUseHeap[sp-1]=1; 264 } 265 else bUseHeap[sp-1]=0; 266 isNeedHeapFreeStructureStack[sp-1] = true; 267 } 268 else 269 { 270 isNeedHeapFreeStructureStack[sp-1] = false; 271 } 266 272 267 273 return 1; … … 271 277 int type_stack[10]; 272 278 LONG_PTR index_stack[10]; 273 BOOLarray_bUseHeap[10];279 bool array_bUseHeap[10]; 274 280 int sp=2; 275 281 int iRet;
Note:
See TracChangeset
for help on using the changeset viewer.