Changeset 75 in dev for BasicCompiler64/Compile_Object.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Object.cpp

    r73 r75  
    22#include "opcode.h"
    33
    4 void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
     4void _call_constructor( const CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
    55    ////////////////////////////
    66    // コンストラクタの呼び出し
     
    3232    ////////////////////////
    3333
    34     std::vector<SubInfo *> subs;
     34    std::vector<UserProc *> subs;
    3535    pobj_c->EnumMethod( pobj_c->name, subs );
    3636
    37     SubInfo *psi;
     37    UserProc *pUserProc;
    3838    if( subs.size() > 0 ){
    3939        //オーバーロードを解決
    40         psi=OverloadSolutionWithStrParam(pobj_c->name,
    41             subs,CreateParameter,"",NULL);
    42 
    43         if(!psi) return;
     40        pUserProc=OverloadSolutionWithStrParam(pobj_c->name,
     41            subs,CreateParameter,"");
     42
     43        if(!pUserProc) return;
    4444    }
    4545
    4646    //コンストラクタを呼び出す
    4747    Opcode_CallProc(CreateParameter,
    48         psi,
     48        pUserProc,
    4949        PROCFLAG_NEW,"",0);
    5050
     
    7373    }
    7474}
    75 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){
     75void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){
    7676    int typeSize = classObj.GetSize();
    7777
     
    8686
    8787        int reg=REG_RAX;
    88         int type = NumOpe(&reg,objectSizeStr,0,0,0);
    89         if(!IsWholeNumberType(type)) SetError(49,NULL,cp);
     88        Type tempType;
     89        NumOpe(&reg,objectSizeStr,Type(),tempType);
     90        if( !tempType.IsWhole() ) SetError(49,NULL,cp);
    9091
    9192        //※添え字上限値であることを考慮
     
    117118    }
    118119
    119     if( baseTypeInfo.type == DEF_OBJECT ){
    120         //DeleteはGCで処理
     120    if( baseType.IsObject() ){
     121        // オブジェクト インスタンス
     122        // ※DeleteはGCで処理
    121123
    122124        //call _System_GC_malloc_ForObject
    123         extern SubInfo *pSub_System_GC_malloc_ForObject;
     125        extern UserProc *pSub_System_GC_malloc_ForObject;
    124126        op_call(pSub_System_GC_malloc_ForObject);
    125127    }
    126128    else{
    127         //明示的なDeleteが必要
     129        // オブジェクトポインタ
     130        // ※明示的なDeleteが必要
    128131
    129132        //call _System_GC_malloc_ForObjectPtr
    130         extern SubInfo *pSub_System_GC_malloc_ForObjectPtr;
     133        extern UserProc *pSub_System_GC_malloc_ForObjectPtr;
    131134        op_call(pSub_System_GC_malloc_ForObjectPtr);
    132135    }
     
    162165    op_mov_RV(sizeof(_int64),REG_RCX,0);
    163166    obp-=sizeof(long);
    164     pobj_SubAddrSchedule->add(method->psi,0);
    165     method->psi->bUse=1;
     167    pobj_SubAddrSchedule->add(method->pUserProc,0);
     168    method->pUserProc->Using();
    166169    obp+=sizeof(long);
    167170
     
    190193    pobj_sf->pop(REG_RAX);
    191194}
    192 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
    193     char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
    194     int i,i2;
    195 
    196     i=0;
    197 
    198     if(Parameter[0]=='['){
    199         i=GetStringInBracket(objectSizeStr,Parameter);
    200 
    201         SlideString(objectSizeStr+1,-1);
    202         objectSizeStr[i-2]=0;
    203     }
    204     else objectSizeStr[0]=0;
    205 
    206     for(i2=0;;i++,i2++){
    207         if(Parameter[i]=='('){
    208             TypeName[i2]=0;
    209 
    210             //コンストラクタに渡すパラメータを取得
    211             i2=GetStringInPare(CreateParameter,Parameter+i);
    212             RemoveStringPare(CreateParameter);
    213             i+=i2;
    214             if(Parameter[i]!='\0'){
    215                 SetError(42,NULL,cp);
    216                 return 0;
    217             }
    218             break;
    219         }
    220         TypeName[i2]=Parameter[i];
    221         if(Parameter[i]=='\0'){
    222             CreateParameter[0]=0;
    223             break;
    224         }
    225     }
    226 
    227     int type;
    228     type=GetTypeFixed(TypeName,plpIndex);
    229     if(type==-1){
    230         SetError(3,TypeName,cp);
    231         return 0;
    232     }
    233 
    234     if(type!=DEF_OBJECT){
    235         ////////////////////////
    236         // 通常のデータ型の場合
    237         ////////////////////////
    238 
    239         SetError(121,NULL,cp);
    240         return 0;
    241     }
    242 
    243     CClass *pobj_c;
    244     pobj_c=(CClass *)*plpIndex;
    245 
    246     Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );
    247 
    248     if( baseTypeInfo.type == DEF_OBJECT ){
    249         return DEF_OBJECT;
    250     }
    251     return DEF_PTR_OBJECT;
    252 }
    253 
    254195void OpcodeDelete(const char *Parameter, bool isSweeping){
    255     int type;
    256 
    257196    int reg=REG_RAX;
    258     type=NumOpe(&reg,Parameter,0,0,0);
    259     if(type==-1) return;
    260     if(!(type==DEF_PTR_OBJECT||type==DEF_PTR_VOID)) SetError(122,NULL,cp);
     197    Type tempType;
     198    if( !NumOpe(&reg,Parameter,Type(),tempType) ){
     199        return;
     200    }
     201    if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) SetError(122,NULL,cp);
    261202
    262203    //sub rax,PTR_SIZE*3
     
    328269    if( isSweeping ){
    329270        //call _System_GC_free_for_SweepingDelete
    330         extern SubInfo *pSub_System_GC_free_for_SweepingDelete;
     271        extern UserProc *pSub_System_GC_free_for_SweepingDelete;
    331272        op_call(pSub_System_GC_free_for_SweepingDelete);
    332273    }
    333274    else{
    334275        //call free
    335         extern SubInfo *pSub_free;
     276        extern UserProc *pSub_free;
    336277        op_call(pSub_free);
    337278    }
Note: See TracChangeset for help on using the changeset viewer.