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

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

File:
1 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;
Note: See TracChangeset for help on using the changeset viewer.