Changeset 64 in dev for BasicCompiler64/NumOpe.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/NumOpe.cpp

    r63 r64  
    1414    //////////////////////////////////////////////////////
    1515
     16        char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 );
     17        lstrcpy( parameter, lpszText );
     18        SetStringQuotes( parameter );
     19
    1620        extern CClass *pobj_StringClass;
    17         int object_size = pobj_StringClass->GetSize();
    18 
    19         //mov rcx,object_size
    20         op_mov_RV(sizeof(_int64),REG_RCX,object_size);
    21 
    22         //call calloc
    23         extern SUBINFO *pSub_calloc;
    24         op_call(pSub_calloc);
    25 
    26         //mov r11,rax
    27         op_mov_RR(REG_R11,REG_RAX);
    28 
    29         //mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
    30         pobj_sf->push(REG_R11);
    31 
    32         //mov rcx,rax
    33         op_mov_RR(REG_RCX,REG_RAX);
    34 
    35         //call constructor
    36         op_call(pobj_StringClass->GetConstructorMethod()->psi);
    37 
    38         // TODO: Ex表記による文字列長に対応する
    39         int i2 = dataTable.AddString( lpszText );
    40 
    41         //mov rax,i2
    42         op_mov_RV(sizeof(_int64),REG_RAX,i2);
    43         obp-=sizeof(long);
    44         pobj_DataTableSchedule->add();
    45         obp+=sizeof(long);
    46 
    47 
    48         //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    49         pobj_sf->ref(REG_R11);
    50 
    51 
    52         RELATIVE_VAR RelativeVar;
    53         RelativeVar.bOffsetOffset=0;
    54         RelativeVar.offset=0;
    55         RelativeVar.dwKind=VAR_DIRECTMEM;
    56 
    57         SetObjectVariableFromRax((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,&RelativeVar,0);
    58 
    59         //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    60         pobj_sf->pop(REG_R11);
    61 
     21        TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     22        Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
     23
     24        free( parameter );
     25
     26        //mov reg,rax
     27        op_mov_RR( reg, REG_RAX );
    6228
    6329    /////////////////////////////////////////////
     
    6531        RESTORE_REGISTER_RESOURCE
    6632    }////////////////////////////////////////////
    67 
    68     //mov reg,r11
    69     op_mov_RR(reg,REG_R11);
    7033}
    7134
     
    10265        else{
    10366            //mov reg,rax
    104             op_mov64_ToReg_FromReg(UseReg,REG_RAX);
     67            op_mov_RR(UseReg,REG_RAX);
    10568        }
    10669    }
     
    11780    }
    11881
    119     if(Command[0]==1&&Command[1]==ESC_NEW){
     82    if(Command[0]==1&& Command[1]==ESC_NEW ){
    12083        //New演算子(オブジェクト生成)
    121         return Operator_New(Command+2,plpIndex);
     84        TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex };
     85        int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
     86
     87        //mov reg,rax
     88        op_mov_RR( *pReg, REG_RAX );
     89
     90        return resultType;
    12291    }
    12392
     
    245214                        TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex};
    246215                        if(IsStringSubsituation(pobj_Class)
    247                             || IsStringObjectType(&BaseTypeInfo)){
     216                            || IsStringObjectType(BaseTypeInfo)){
    248217                            //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    249218
     
    265234                    }
    266235
    267                     type[sp]=DEF_PTR_BYTE;
     236                    type[sp]=DEF_PTR_CHAR;
    268237                    bLiteralCalculation=0;
    269238
     
    375344                            else pobj_reg->LockReg();
    376345
    377                             if(i2==DEF_OBJECT){
    378                                 //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     346                            if(i2==DEF_STRUCT){
     347                                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    379348                                //※後にfreeする必要あり
    380349                                bUseHeap[sp]=1;
     
    469438                                SetXmmReg_SingleVariable(&RelativeVar,XmmReg);
    470439                        }
    471                         else if(IsWholeNumberType(i2)){
     440                        else if(IsWholeNumberType(i2) || i2==DEF_OBJECT){
    472441                            //整数型
    473442                            SetReg_WholeVariable(i2,&RelativeVar,UseReg);
    474443                        }
    475                         else if(i2==DEF_OBJECT){
    476                             //オブジェクト ポインタをUseRegへ格納
     444                        else if(i2==DEF_STRUCT){
     445                            //構造体ポインタをUseRegへ格納(構造体は値型)
    477446                            SetVarPtrToReg(UseReg,&RelativeVar);
    478447                        }
     
    585554                        }////////////////////////////////////////////
    586555
    587                         if(type[sp]==DEF_OBJECT){
    588                             //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     556                        if(type[sp]==DEF_STRUCT){
     557                            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    589558                            //※後にfreeする必要あり
    590559                            bUseHeap[sp]=1;
Note: See TracChangeset for help on using the changeset viewer.