Changeset 225 in dev for trunk/abdev/BasicCompiler32/Compile_Object.cpp
- Timestamp:
- Jul 21, 2007, 11:47:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Object.cpp
r206 r225 1 1 #include "stdafx.h" 2 3 #include <Compiler.h> 2 4 3 5 #include "../BasicCompiler_Common/common.h" … … 24 26 25 27 //push ebx 26 op_push(REG_EBX);28 compiler.codeGenerator.op_push(REG_EBX); 27 29 } 28 30 29 31 // ※ここでプッシュされた値はコンストラクタのthisポインタとなる 30 32 //push eax 31 op_push(REG_EAX);33 compiler.codeGenerator.op_push(REG_EAX); 32 34 33 35 … … 75 77 76 78 //pop eax 77 op_pop(REG_EAX);79 compiler.codeGenerator.op_pop(REG_EAX); 78 80 79 81 if(bSomeObjects){ 80 82 //pop ebx 81 op_pop(REG_EBX);83 compiler.codeGenerator.op_pop(REG_EBX); 82 84 83 85 //add eax,TypeSize … … 87 89 88 90 //sub ebx,1 89 OpBuffer[obp++]=(char)0x83; 90 OpBuffer[obp++]=(char)0xEB; 91 OpBuffer[obp++]=(char)0x01; 91 compiler.codeGenerator.op_sub_RV8(REG_EBX,1); 92 92 93 93 //jnz ↑ … … 116 116 117 117 //pop eax 118 op_pop(REG_EAX);118 compiler.codeGenerator.op_pop(REG_EAX); 119 119 120 120 //※添え字上限値であることを考慮 … … 142 142 143 143 //push eax 144 op_push(REG_EAX);144 compiler.codeGenerator.op_push(REG_EAX); 145 145 } 146 146 else{ … … 164 164 //call _System_GC_malloc_ForObject 165 165 extern const UserProc *pSub_System_GC_malloc_ForObject; 166 op_call(pSub_System_GC_malloc_ForObject);166 compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObject); 167 167 } 168 168 else{ … … 172 172 //call _System_GC_malloc_ForObjectPtr 173 173 extern const UserProc *pSub_System_GC_malloc_ForObjectPtr; 174 op_call(pSub_System_GC_malloc_ForObjectPtr);174 compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObjectPtr); 175 175 } 176 176 … … 186 186 187 187 //mov dword ptr[eax],ebx(オブジェクトの個数) 188 OpBuffer[obp++]=(char)0x89; 189 OpBuffer[obp++]=(char)0x18; 188 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE ); 190 189 191 190 //add eax,sizeof(DWORD) … … 201 200 202 201 //mov dword ptr[eax],ecx(オブジェクトのサイズ) 203 OpBuffer[obp++]=(char)0x89; 204 OpBuffer[obp++]=(char)0x08; 202 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 205 203 206 204 //add eax,sizeof(DWORD) … … 220 218 221 219 //mov dword ptr[eax],ecx(デストラクタの関数ポインタ) 222 OpBuffer[obp++]=(char)0x89; 223 OpBuffer[obp++]=(char)0x08; 220 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 224 221 225 222 //add eax,sizeof(DWORD) … … 238 235 // ※ここでプッシュされた値はNew演算子の戻り値となる 239 236 //push eax 240 op_push(REG_EAX);237 compiler.codeGenerator.op_push(REG_EAX); 241 238 242 239 … … 257 254 258 255 //pop eax 259 op_pop(REG_EAX);256 compiler.codeGenerator.op_pop(REG_EAX); 260 257 261 258 //sub eax,sizeof(DWORD)*3 262 op_sub_RV8( REG_EAX, OBJECT_HEAD_SIZE );259 compiler.codeGenerator.op_sub_RV8( REG_EAX, OBJECT_HEAD_SIZE ); 263 260 264 261 //push eax 265 op_push(REG_EAX);262 compiler.codeGenerator.op_push(REG_EAX); 266 263 267 264 … … 313 310 314 311 //push ecx 315 op_push(REG_ECX);312 compiler.codeGenerator.op_push(REG_ECX); 316 313 317 314 //push edx 318 op_push(REG_EDX);315 compiler.codeGenerator.op_push(REG_EDX); 319 316 320 317 //push ecx(Thisポインタ ※隠れた第一パラメータ) 321 op_push(REG_ECX);318 compiler.codeGenerator.op_push(REG_ECX); 322 319 323 320 //call edx … … 326 323 327 324 //pop edx 328 op_pop(REG_EDX);325 compiler.codeGenerator.op_pop(REG_EDX); 329 326 330 327 //pop ecx 331 op_pop(REG_ECX);328 compiler.codeGenerator.op_pop(REG_ECX); 332 329 333 330 //add ecx,esi 334 OpBuffer[obp++]=(char)0x03; 335 OpBuffer[obp++]=(char)0xCE; 331 compiler.codeGenerator.op_add_RR( REG_ECX, REG_ESI ); 336 332 337 333 //sub ebx,1 338 OpBuffer[obp++]=(char)0x83; 339 OpBuffer[obp++]=(char)0xEB; 340 OpBuffer[obp++]=(char)0x01; 334 compiler.codeGenerator.op_sub_RV8(REG_EBX,1); 341 335 342 336 //jnz ↑ … … 354 348 //call _System_GC_free_for_SweepingDelete 355 349 extern const UserProc *pSub_System_GC_free_for_SweepingDelete; 356 op_call(pSub_System_GC_free_for_SweepingDelete);350 compiler.codeGenerator.op_call(pSub_System_GC_free_for_SweepingDelete); 357 351 } 358 352 else{ 359 353 //call free 360 354 extern const UserProc *pSub_free; 361 op_call(pSub_free);355 compiler.codeGenerator.op_call(pSub_free); 362 356 } 363 357 }
Note:
See TracChangeset
for help on using the changeset viewer.