Changeset 64 in dev for BasicCompiler32/NumOpe.cpp


Ignore:
Timestamp:
Mar 8, 2007, 2:49:34 AM (18 years ago)
Author:
dai_9181
Message:

すべてのオブジェクトを参照型に切り替えた。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/NumOpe.cpp

    r63 r64  
    66    //※この処理内では、esi、ediは使用不可
    77
    8     if(type==DEF_OBJECT){
     8    if(type==DEF_OBJECT || type==DEF_STRUCT){
    99        //push eax
    1010        op_push(REG_EAX);
     
    6262        op_push(REG_EAX);
    6363    }
    64     else if(type==DEF_PTR_BYTE){
    65         //push eax
    66         op_push(REG_EAX);
     64    else{
     65        SetError();
    6766    }
    6867}
     
    7170    ///////////////////////////////////////////////////////
    7271    // lpszTextを元にStringオブジェクトを生成し、
    73     // オブジェクトポインタをスタックに格納する
     72    // オブジェクトポインタをregに格納する
    7473    ///////////////////////////////////////////////////////
    7574
     75    char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 );
     76    lstrcpy( parameter, lpszText );
     77    SetStringQuotes( parameter );
     78
    7679    extern CClass *pobj_StringClass;
    77     int object_size = pobj_StringClass->GetSize();
    78 
    79     //push object_size
    80     op_push_value(object_size);
    81 
    82     //call calloc
    83     extern SUBINFO *pSub_calloc;
    84     op_call(pSub_calloc);
    85 
    86     //push eax
    87     op_push(REG_EAX);
    88 
    89     //push eax
    90     op_push(REG_EAX);
    91 
    92     {
    93         //push eax
    94         op_push(REG_EAX);
    95 
    96         //call constructor
    97         op_call(pobj_StringClass->GetConstructorMethod()->psi);
    98     }
    99 
    100     // TODO: Ex表記による文字列長に対応する
    101     int i2 = dataTable.AddString( lpszText );
    102 
    103     //push lpszPtr
    104     OpBuffer[obp++]=(char)0x68;
    105     *((long *)(OpBuffer+obp))=i2;
    106     pobj_DataTableSchedule->add();
    107     obp+=sizeof(long);
    108 
    109 
    110     SetObjectVariable((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,0);
     80    TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     81    Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
     82
     83    free( parameter );
    11184}
    11285
     
    12295    }
    12396
    124     if(Command[0]==1&&Command[1]==ESC_NEW){
     97    if(Command[0]==1&& Command[1]==ESC_NEW ){
    12598        //New演算子(オブジェクト生成)
    126         return Operator_New(Command+2,plpIndex);
     99        TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex };
     100        int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
     101
     102        return resultType;
    127103    }
    128104
     
    221197                        TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex};
    222198                        if(IsStringSubsituation(pobj_Class)
    223                             || IsStringObjectType(&BaseTypeInfo)){
     199                            || IsStringObjectType(BaseTypeInfo)){
    224200                            //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    225201
     
    239215
    240216
    241                     type[sp]=DEF_PTR_BYTE;
     217                    type[sp]=DEF_PTR_CHAR;
    242218                    index_stack[sp]=LITERAL_STRING;
    243219                    bLiteralCalculation=0;
     
    329305                            }
    330306
    331                             if(i2==DEF_OBJECT){
    332                                 //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     307                            if(i2==DEF_STRUCT){
     308                                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    333309                                //※後にfreeする必要あり
    334310                                bUseHeap[sp]=1;
     
    413389                        }
    414390                        else if(i2==DEF_LONG||i2==DEF_DWORD||i2==DEF_SINGLE||
    415                             IsPtrType(i2)){
     391                            IsPtrType(i2) || i2==DEF_OBJECT){
    416392                            //32ビット型
    417393                            PushLongVariable(&RelativeVar);
     
    429405                            PushByteVariable(&RelativeVar);
    430406                        }
    431                         else if(i2==DEF_OBJECT){
    432                             //オブジェクト ポインタをeaxへ格納
     407                        else if(i2==DEF_STRUCT){
     408                            //構造体ポインタをeaxへ格納(構造体は値型)
    433409                            SetVarPtrToEax(&RelativeVar);
    434410
     
    436412                            op_push(REG_EAX);
    437413                        }
     414                        else SetError(11,term,cp);
    438415
    439416                        if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
     
    517494                        PushReturnValue(RetTypeInfo.type);
    518495
    519                         if(type[sp]==DEF_OBJECT){
    520                             //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     496                        if(type[sp]==DEF_STRUCT){
     497                            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    521498                            //※後にfreeする必要あり
    522499                            bUseHeap[sp]=1;
Note: See TracChangeset for help on using the changeset viewer.