Changeset 123 in dev


Ignore:
Timestamp:
May 14, 2007, 1:08:14 AM (17 years ago)
Author:
dai_9181
Message:

オブジェクトの先頭バッファのサイズを4ポインタ分に拡張した(偶数個数なところがキモ)。

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Object.cpp

    r94 r123  
    134134        obp+=sizeof(long);
    135135
    136         //add eax,sizeof(DWORD)*2
     136        //add eax,OBJECT_HEAD_SIZE
    137137        OpBuffer[obp++]=(char)0x05;
    138         *((long *)(OpBuffer+obp))=sizeof(DWORD)*3;
     138        *((long *)(OpBuffer+obp))=OBJECT_HEAD_SIZE;
    139139        obp+=sizeof(long);
    140140
     
    150150        obp+=sizeof(long);
    151151
    152         //push size
     152        //push size + OBJECT_HEAD_SIZE
    153153        OpBuffer[obp++]=(char)0x68;
    154         *((long *)(OpBuffer+obp))=typeSize+sizeof(DWORD)*3;
     154        *((long *)(OpBuffer+obp))=typeSize + OBJECT_HEAD_SIZE;
    155155        obp+=sizeof(long);
    156156    }
     
    176176    /*
    177177    確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
    178     pPtr-=sizeof(DWORD)*3
    179178    pPtr[0]=オブジェクトの個数
    180179    pPtr[1]=オブジェクトのサイズ
    181180    pPtr[2]=デストラクタの関数ポインタ
     181    pPtr[3]=reserve
    182182    */
    183183
     
    198198    obp+=sizeof(long);
    199199
    200     //mov dword ptr[eax],ecx
     200    //mov dword ptr[eax],ecx(オブジェクトのサイズ)
    201201    OpBuffer[obp++]=(char)0x89;
    202202    OpBuffer[obp++]=(char)0x08;
     
    217217    obp+=sizeof(long);
    218218
    219     //mov dword ptr[eax],ecx
     219    //mov dword ptr[eax],ecx(デストラクタの関数ポインタ)
    220220    OpBuffer[obp++]=(char)0x89;
    221221    OpBuffer[obp++]=(char)0x08;
    222222
     223    //add eax,sizeof(DWORD)
     224    OpBuffer[obp++]=(char)0x05;
     225    *((long *)(OpBuffer+obp))=sizeof(DWORD);
     226    obp+=sizeof(long);
     227
     228
     229    // リザーブ領域
    223230    //add eax,sizeof(DWORD)
    224231    OpBuffer[obp++]=(char)0x05;
     
    251258
    252259    //sub eax,sizeof(DWORD)*3
    253     OpBuffer[obp++]=(char)0x83;
    254     OpBuffer[obp++]=(char)0xE8;
    255     OpBuffer[obp++]=(char)0x0C;
     260    op_sub_RV8( REG_EAX, OBJECT_HEAD_SIZE );
    256261
    257262    //push eax
     
    283288    OpBuffer[obp++]=(char)0x10;
    284289
     290    //add eax,sizeof(DWORD)
     291    OpBuffer[obp++]=(char)0x05;
     292    *((long *)(OpBuffer+obp))=sizeof(DWORD);
     293    obp+=sizeof(long);
     294
     295
     296    // リザーブ領域
    285297    //add eax,sizeof(DWORD)
    286298    OpBuffer[obp++]=(char)0x05;
  • BasicCompiler64/Compile_Object.cpp

    r94 r123  
    121121        op_imul_RV(sizeof(_int64),REG_RAX,typeSize);
    122122
    123         //add rax,PTR_SIZE*3
    124         op_add_RV(REG_RAX,PTR_SIZE*3);
     123        //add rax,OBJECT_HEAD_SIZE
     124        op_add_RV(REG_RAX,OBJECT_HEAD_SIZE);
    125125
    126126        //mov rcx,rax
     
    133133        op_mov_RV(sizeof(_int64),REG_RBX,1);
    134134
    135         //mov rcx,typeSize+PTR_SIZE*3
    136         op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3);
     135        //mov rcx,typeSize+OBJECT_HEAD_SIZE
     136        op_mov_RV(sizeof(_int64),REG_RCX,typeSize+OBJECT_HEAD_SIZE);
    137137    }
    138138
     
    157157    /*
    158158    確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
    159     pPtr-=sizeof(DWORD)*3
     159    pPtr-=OBJECT_HEAD_SIZE ... ( sizeof(DWORD)*4 )
    160160    pPtr[0]=オブジェクトの個数
    161161    pPtr[1]=オブジェクトのサイズ
    162162    pPtr[2]=デストラクタの関数ポインタ
     163    pPtr[3]=reserve
    163164    */
    164165
     
    181182    if( method == NULL ) return;
    182183
    183     //mov rcx,DestructorProcAddr
     184    //mov rcx,DestructorProcAddr(デストラクタの関数ポインタ)
    184185    op_mov_RV(sizeof(_int64),REG_RCX,0);
    185186    obp-=sizeof(long);
     
    191192    op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
    192193
     194    //add rax,PTR_SIZE
     195    op_add_RV(REG_RAX,PTR_SIZE);
     196
     197
     198    // リザーブ領域
    193199    //add rax,PTR_SIZE
    194200    op_add_RV(REG_RAX,PTR_SIZE);
     
    220226    if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) SetError(122,NULL,cp);
    221227
    222     //sub rax,PTR_SIZE*3
    223     op_sub_RV(sizeof(_int64),REG_RAX,PTR_SIZE*3);
     228    //sub rax,OBJECT_HEAD_SIZE
     229    op_sub_RV(sizeof(_int64),REG_RAX,OBJECT_HEAD_SIZE);
    224230
    225231    //mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
     
    244250    op_mov_RM(sizeof(_int64),REG_RDI,REG_RAX,0,MOD_BASE);
    245251
     252    //add rax,PTR_SIZE
     253    op_add_RV(REG_RAX,PTR_SIZE);
     254
     255
     256    // リザーブ領域
    246257    //add rax,PTR_SIZE
    247258    op_add_RV(REG_RAX,PTR_SIZE);
  • BasicCompiler_Common/common.h

    r118 r123  
    6262
    6363#define PTR_SIZE        sizeof(LONG_PTR)
     64#define OBJECT_HEAD_SIZE PTR_SIZE*4
    6465
    6566#define MAX_LEN         65535
  • ProjectEditor/ProjectEditor.vcproj

    r107 r123  
    266266            <Tool
    267267                Name="VCLinkerTool"
    268                 AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib"
     268                AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib libcp.lib"
    269269                OutputFile="../TheText/TheText.exe"
    270270                LinkIncremental="1"
Note: See TracChangeset for help on using the changeset viewer.