Changeset 64 in dev for BasicCompiler64/Compile_Object.cpp
- Timestamp:
- Mar 8, 2007, 2:49:34 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_Object.cpp
r51 r64 2 2 #include "opcode.h" 3 3 4 void _call_constructor(CClass *pobj_c,c har *CreateParameter,int ObjectSize,BOOL bSomeObjects){4 void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){ 5 5 //////////////////////////// 6 6 // コンストラクタの呼び出し … … 73 73 } 74 74 } 75 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){ 76 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE]; 75 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){ 76 int typeSize = classObj.GetSize(); 77 78 if(classObj.IsAbstract()){ 79 //抽象クラスだったとき 80 SetError(125,classObj.name,cp); 81 } 82 83 BOOL bSomeObjects=0; 84 if(objectSizeStr[0]){ 85 bSomeObjects=1; 86 87 int reg=REG_RAX; 88 int type = NumOpe(®,objectSizeStr,0,0,0); 89 if(!IsWholeNumberType(type)) SetError(49,NULL,cp); 90 91 //※添え字上限値であることを考慮 92 //add rax,1 93 op_add_RV(REG_RAX,1); 94 95 //オブジェクトの個数をrbxに一時保持 96 //※rbxは関数が呼ばれても不変 97 //mov rbx,rax 98 op_mov_RR(REG_RBX,REG_RAX); 99 100 //imul rax,size 101 op_imul_RV(sizeof(_int64),REG_RAX,typeSize); 102 103 //add rax,PTR_SIZE*3 104 op_add_RV(REG_RAX,PTR_SIZE*3); 105 106 //mov rcx,rax 107 op_mov_RR(REG_RCX,REG_RAX); 108 } 109 else{ 110 //オブジェクトの個数をrbxに一時保持 111 //※rbxは関数が呼ばれても不変 112 //mov rbx,1 113 op_mov_RV(sizeof(_int64),REG_RBX,1); 114 115 //mov rcx,typeSize+PTR_SIZE*3 116 op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3); 117 } 118 119 if( baseTypeInfo.type == DEF_OBJECT ){ 120 //DeleteはGCで処理 121 122 //call _System_GC_malloc_ForObject 123 extern SUBINFO *pSub_System_GC_malloc_ForObject; 124 op_call(pSub_System_GC_malloc_ForObject); 125 } 126 else{ 127 //明示的なDeleteが必要 128 129 //call _System_GC_malloc_ForObjectPtr 130 extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr; 131 op_call(pSub_System_GC_malloc_ForObjectPtr); 132 } 133 134 135 /* 136 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 137 pPtr-=sizeof(DWORD)*3 138 pPtr[0]=オブジェクトの個数 139 pPtr[1]=オブジェクトのサイズ 140 pPtr[2]=デストラクタの関数ポインタ 141 */ 142 143 144 //mov qword ptr[rax],rbx(オブジェクトの個数) 145 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 146 147 //add rax,PTR_SIZE 148 op_add_RV(REG_RAX,PTR_SIZE); 149 150 151 //mov qword ptr[rax],typeSize(オブジェクトのサイズ) 152 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize); 153 154 //add rax,PTR_SIZE 155 op_add_RV(REG_RAX,PTR_SIZE); 156 157 158 CMethod *method = classObj.GetDestructorMethod(); 159 if( method == NULL ) return; 160 161 //mov rcx,DestructorProcAddr 162 op_mov_RV(sizeof(_int64),REG_RCX,0); 163 obp-=sizeof(long); 164 pobj_SubAddrSchedule->add(method->psi,0); 165 method->psi->bUse=1; 166 obp+=sizeof(long); 167 168 //mov qword ptr[rax],rcx 169 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 170 171 //add rax,PTR_SIZE 172 op_add_RV(REG_RAX,PTR_SIZE); 173 174 175 // ※ここでプッシュされた値はNew演算子の戻り値となる 176 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 177 pobj_sf->push(REG_RAX); 178 179 180 ///////////////////////////////////////////////////////////////////// 181 182 //////////////////////////// 183 // コンストラクタの呼び出し 184 //////////////////////////// 185 186 _call_constructor(&classObj,parameter,typeSize,bSomeObjects); 187 188 189 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 190 pobj_sf->pop(REG_RAX); 191 } 192 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){ 193 char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE]; 77 194 int i,i2; 78 int reg;79 195 80 196 i=0; 81 197 82 198 if(Parameter[0]=='['){ 83 i=GetStringInBracket( ObjectSize,Parameter);84 85 SlideString( ObjectSize+1,-1);86 ObjectSize[i-2]=0;87 } 88 else ObjectSize[0]=0;199 i=GetStringInBracket(objectSizeStr,Parameter); 200 201 SlideString(objectSizeStr+1,-1); 202 objectSizeStr[i-2]=0; 203 } 204 else objectSizeStr[0]=0; 89 205 90 206 for(i2=0;;i++,i2++){ … … 109 225 } 110 226 111 int type ,TypeSize;227 int type; 112 228 type=GetTypeFixed(TypeName,plpIndex); 113 229 if(type==-1){ … … 115 231 return 0; 116 232 } 117 TypeSize=GetTypeSize(type,*plpIndex);118 233 119 234 if(type!=DEF_OBJECT){ … … 129 244 pobj_c=(CClass *)*plpIndex; 130 245 131 if(pobj_c->IsAbstract()){ 132 //抽象クラスだったとき 133 SetError(125,pobj_c->name,cp); 134 } 135 136 BOOL bSomeObjects=0; 137 if(ObjectSize[0]){ 138 bSomeObjects=1; 139 140 reg=REG_RAX; 141 i2=NumOpe(®,ObjectSize,0,0,0); 142 if(!IsWholeNumberType(i2)) SetError(49,NULL,cp); 143 144 //※添え字上限値であることを考慮 145 //add rax,1 146 op_add64_value(REG_RAX,1); 147 148 //オブジェクトの個数をrbxに一時保持 149 //※rbxは関数が呼ばれても不変 150 //mov rbx,rax 151 op_mov64_ToReg_FromReg(REG_RBX,REG_RAX); 152 153 //imul rax,size 154 op_imul_value(sizeof(_int64),REG_RAX,TypeSize); 155 156 //add rax,PTR_SIZE*3 157 op_add64_value(REG_RAX,PTR_SIZE*3); 158 159 //mov rcx,rax 160 op_mov64_ToReg_FromReg(REG_RCX,REG_RAX); 161 } 162 else{ 163 //オブジェクトの個数をrbxに一時保持 164 //※rbxは関数が呼ばれても不変 165 //mov rbx,1 166 op_mov_RV(sizeof(_int64),REG_RBX,1); 167 168 //mov rcx,TypeSize+PTR_SIZE*3 169 op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3); 170 } 171 172 //call calloc 173 extern SUBINFO *pSub_calloc; 174 op_call(pSub_calloc); 175 176 177 /* 178 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、 179 pPtr-=sizeof(DWORD)*3 180 pPtr[0]=オブジェクトの個数 181 pPtr[1]=オブジェクトのサイズ 182 pPtr[2]=デストラクタの関数ポインタ 183 */ 184 185 186 //mov qword ptr[rax],rbx(オブジェクトの個数) 187 op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE); 188 189 //add rax,PTR_SIZE 190 op_add64_value(REG_RAX,PTR_SIZE); 191 192 193 //mov qword ptr[rax],TypeSize(オブジェクトのサイズ) 194 op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize); 195 196 //add rax,PTR_SIZE 197 op_add64_value(REG_RAX,PTR_SIZE); 198 199 200 CMethod *method = pobj_c->GetDestructorMethod(); 201 if( method == NULL ) return 0; 202 203 //mov rcx,DestructorProcAddr 204 op_mov_RV(sizeof(_int64),REG_RCX,0); 205 obp-=sizeof(long); 206 pobj_SubAddrSchedule->add(method->psi,0); 207 method->psi->bUse=1; 208 obp+=sizeof(long); 209 210 //mov qword ptr[rax],rcx 211 op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 212 213 //add rax,PTR_SIZE 214 op_add64_value(REG_RAX,PTR_SIZE); 215 216 217 // ※ここでプッシュされた値はNew演算子の戻り値となる 218 //mov qword ptr[rsp+offset],rax ※スタックフレームを利用 219 pobj_sf->push(REG_RAX); 220 221 222 ///////////////////////////////////////////////////////////////////// 223 224 //////////////////////////// 225 // コンストラクタの呼び出し 226 //////////////////////////// 227 228 _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects); 229 230 231 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 232 pobj_sf->pop(REG_RAX); 233 246 Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo ); 247 248 if( baseTypeInfo.type == DEF_OBJECT ){ 249 return DEF_OBJECT; 250 } 234 251 return DEF_PTR_OBJECT; 235 252 } 236 253 237 void OpcodeDelete(const char *Parameter ){254 void OpcodeDelete(const char *Parameter, bool isSweeping){ 238 255 int type; 239 256 … … 254 271 255 272 //add rax,PTR_SIZE 256 op_add 64_value(REG_RAX,PTR_SIZE);273 op_add_RV(REG_RAX,PTR_SIZE); 257 274 258 275 … … 261 278 262 279 //add rax,PTR_SIZE 263 op_add 64_value(REG_RAX,PTR_SIZE);280 op_add_RV(REG_RAX,PTR_SIZE); 264 281 265 282 … … 268 285 269 286 //add rax,PTR_SIZE 270 op_add 64_value(REG_RAX,PTR_SIZE);287 op_add_RV(REG_RAX,PTR_SIZE); 271 288 272 289 273 290 //mov rcx,rax 274 op_mov 64_ToReg_FromReg(REG_RCX,REG_RAX);291 op_mov_RR(REG_RCX,REG_RAX); 275 292 276 293 … … 279 296 jnz_back=obp; 280 297 281 //mov qword ptr[rsp+offset],r ax ※スタックフレームを利用282 pobj_sf->push(REG_R AX);298 //mov qword ptr[rsp+offset],rcx ※スタックフレームを利用 299 pobj_sf->push(REG_RCX); 283 300 284 301 //call rdi … … 309 326 pobj_sf->pop(REG_RCX); 310 327 311 //call free 312 extern SUBINFO *pSub_free; 313 op_call(pSub_free); 328 if( isSweeping ){ 329 //call _System_GC_free_for_SweepingDelete 330 extern SUBINFO *pSub_System_GC_free_for_SweepingDelete; 331 op_call(pSub_System_GC_free_for_SweepingDelete); 332 } 333 else{ 334 //call free 335 extern SUBINFO *pSub_free; 336 op_call(pSub_free); 337 } 314 338 }
Note:
See TracChangeset
for help on using the changeset viewer.