Ignore:
Timestamp:
Nov 5, 2008, 1:27:28 AM (16 years ago)
Author:
イグトランス (egtra)
Message:

#230 Unicodeコンパイル時、文字列リテラルの長さが正しく設定されていない問題を解決。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/DataTableGenerator.cpp

    r750 r762  
    11#include "stdafx.h"
     2#include <boost/scoped_array.hpp>
    23
    34using namespace ActiveBasic::Compiler;
     
    147148}
    148149
    149 int DataTableGenerator::MakeConstStringObjectToProcessStaticBuffer( DataTable &dataTable, const char *str )
     150namespace
     151{
     152
     153//仕様通りのStringオブジェクトにするため、strには\0終端の文字列を渡すこと。
     154int MakeConstStringObjectToProcessStaticBufferImpl( DataTable &dataTable, const void *str, int len, int charSize )
    150155{
    151156    const CClass &strClass = *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
    152     const CClass &objClass = strClass.GetSuperClass();
    153157
    154158    // クラスに必要なバッファサイズを取得
     
    164168
    165169    // クラスのバッファイメージを作成
    166     BYTE *buffer = (BYTE *)calloc( size, 1 );
    167     *(long *)(buffer + offsetForLength) = lstrlen( str );
    168     *(LONG_PTR *)(buffer + offsetForChars) = headOffset + size;
     170    boost::scoped_array<BYTE> buffer(new BYTE[size]);
     171    *(long *)&buffer[offsetForLength] = len;
     172    *(LONG_PTR *)&buffer[offsetForChars] = headOffset + size;
    169173
    170174    // クラスのバッファイメージをデータ領域へ追加
    171     int dataTableOffset = dataTable.AddBinary( buffer, size );
     175    int dataTableOffset = dataTable.AddBinary( &buffer[0], size );
    172176
    173177    // スケジューリング
     
    178182
    179183    // 文字列バッファをデータ領域へ追加
    180     compiler.AddStringToDataTable( str );
     184    dataTable.AddBinary( str, (len + 1) * charSize );
    181185
    182186    return dataTableOffset;
     187}
     188
     189}
     190
     191int DataTableGenerator::MakeConstStringObjectToProcessStaticBuffer( DataTable &dataTable, const char *str )
     192{
     193    if ( compiler.IsUnicode() )
     194    {
     195        std::wstring ws = Jenga::Common::ToWString( str );
     196        return MakeConstStringObjectToProcessStaticBufferImpl(
     197            dataTable, ws.c_str(), static_cast<int>(ws.size()), sizeof (wchar_t) );
     198    }
     199    else
     200    {
     201        int len = (int)strlen( str );
     202        return MakeConstStringObjectToProcessStaticBufferImpl( dataTable, str, len, sizeof (char) );
     203    }
    183204}
    184205
Note: See TracChangeset for help on using the changeset viewer.