Ignore:
Timestamp:
Jul 21, 2007, 11:47:40 PM (17 years ago)
Author:
dai_9181
Message:

CodeGeneratorクラスのベースを実装

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r206 r225  
    11#include "stdafx.h"
     2
     3#include <Compiler.h>
    24
    35#include "../BasicCompiler_Common/common.h"
     
    2426
    2527        //push ebx
    26         op_push(REG_EBX);
     28        compiler.codeGenerator.op_push(REG_EBX);
    2729    }
    2830
    2931    // ※ここでプッシュされた値はコンストラクタのthisポインタとなる
    3032    //push eax
    31     op_push(REG_EAX);
     33    compiler.codeGenerator.op_push(REG_EAX);
    3234
    3335
     
    7577
    7678    //pop eax
    77     op_pop(REG_EAX);
     79    compiler.codeGenerator.op_pop(REG_EAX);
    7880
    7981    if(bSomeObjects){
    8082        //pop ebx
    81         op_pop(REG_EBX);
     83        compiler.codeGenerator.op_pop(REG_EBX);
    8284
    8385        //add eax,TypeSize
     
    8789
    8890        //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);
    9292
    9393        //jnz ↑
     
    116116
    117117        //pop eax
    118         op_pop(REG_EAX);
     118        compiler.codeGenerator.op_pop(REG_EAX);
    119119
    120120        //※添え字上限値であることを考慮
     
    142142
    143143        //push eax
    144         op_push(REG_EAX);
     144        compiler.codeGenerator.op_push(REG_EAX);
    145145    }
    146146    else{
     
    164164        //call _System_GC_malloc_ForObject
    165165        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);
    167167    }
    168168    else{
     
    172172        //call _System_GC_malloc_ForObjectPtr
    173173        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);
    175175    }
    176176
     
    186186
    187187    //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 );
    190189
    191190    //add eax,sizeof(DWORD)
     
    201200
    202201    //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 );
    205203
    206204    //add eax,sizeof(DWORD)
     
    220218
    221219    //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 );
    224221
    225222    //add eax,sizeof(DWORD)
     
    238235    // ※ここでプッシュされた値はNew演算子の戻り値となる
    239236    //push eax
    240     op_push(REG_EAX);
     237    compiler.codeGenerator.op_push(REG_EAX);
    241238
    242239
     
    257254
    258255    //pop eax
    259     op_pop(REG_EAX);
     256    compiler.codeGenerator.op_pop(REG_EAX);
    260257
    261258    //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 );
    263260
    264261    //push eax
    265     op_push(REG_EAX);
     262    compiler.codeGenerator.op_push(REG_EAX);
    266263
    267264
     
    313310
    314311    //push ecx
    315     op_push(REG_ECX);
     312    compiler.codeGenerator.op_push(REG_ECX);
    316313
    317314    //push edx
    318     op_push(REG_EDX);
     315    compiler.codeGenerator.op_push(REG_EDX);
    319316
    320317    //push ecx(Thisポインタ   ※隠れた第一パラメータ)
    321     op_push(REG_ECX);
     318    compiler.codeGenerator.op_push(REG_ECX);
    322319
    323320    //call edx
     
    326323
    327324    //pop edx
    328     op_pop(REG_EDX);
     325    compiler.codeGenerator.op_pop(REG_EDX);
    329326
    330327    //pop ecx
    331     op_pop(REG_ECX);
     328    compiler.codeGenerator.op_pop(REG_ECX);
    332329
    333330    //add ecx,esi
    334     OpBuffer[obp++]=(char)0x03;
    335     OpBuffer[obp++]=(char)0xCE;
     331    compiler.codeGenerator.op_add_RR( REG_ECX, REG_ESI );
    336332
    337333    //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);
    341335
    342336    //jnz ↑
     
    354348        //call _System_GC_free_for_SweepingDelete
    355349        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);
    357351    }
    358352    else{
    359353        //call free
    360354        extern const UserProc *pSub_free;
    361         op_call(pSub_free);
     355        compiler.codeGenerator.op_call(pSub_free);
    362356    }
    363357}
Note: See TracChangeset for help on using the changeset viewer.