Changeset 350 in dev for trunk/abdev/BasicCompiler64


Ignore:
Timestamp:
Oct 14, 2007, 9:41:03 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイスを実装

Location:
trunk/abdev/BasicCompiler64
Files:
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r345 r350  
    795795                    >
    796796                    <File
    797                         RelativePath=".\Compile_Interface.cpp"
    798                         >
    799                         <FileConfiguration
    800                             Name="Debug|Win32"
    801                             >
    802                             <Tool
    803                                 Name="VCCLCompilerTool"
    804                                 UsePrecompiledHeader="2"
    805                             />
    806                         </FileConfiguration>
    807                         <FileConfiguration
    808                             Name="Release|Win32"
    809                             >
    810                             <Tool
    811                                 Name="VCCLCompilerTool"
    812                                 UsePrecompiledHeader="2"
    813                             />
    814                         </FileConfiguration>
    815                     </File>
    816                     <File
    817797                        RelativePath=".\Compile_Object.cpp"
    818798                        >
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r349 r350  
    164164        /////////////////////////////////
    165165        pMethod = NULL;
    166         if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
     166        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
    167167        if( ! pMethod ){
    168168            //動的メソッドが取得できなかったときは静的メソッドを当たる
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r331 r350  
    179179        UserProc::CompileStartForUserProc( pBackUserProc );
    180180        cp=BackCp;
     181    }
     182    else if( userProc.HasParentClass()
     183        && userProc.IsCastOperator()
     184        && userProc.ReturnType().IsInterface() )
     185    {
     186        // インターフェイス型にキャストするためのメソッド
     187
     188        int vtblMasterListIndex = userProc.GetParentClass().GetVtblMasterListIndex( &userProc.ReturnType().GetClass() );
     189
     190        char temporary[1024];
     191        sprintf( temporary,
     192            "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
     193            userProc.ReturnType().GetClass().GetName().c_str(),
     194            vtblMasterListIndex
     195        );
     196        MakeMiddleCode( temporary );
     197
     198        ChangeOpcode( temporary );
    181199    }
    182200    else{
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r339 r350  
    12261226    }
    12271227
    1228     //コンストラクタ呼び出し
    1229     if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1228    //New呼び出し
     1229    if( type.IsObject()
     1230        && !type.IsInterface()
     1231        &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
     1232        &&InitBuf[0]=='\0')
     1233    {
    12301234        char objectSize[255];
    12311235        if( subscripts.size() == 0 ){
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r347 r350  
    233233    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    234234
    235     objClass.EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
     235    objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
    236236    if(userProcs.size()){
    237237        //オーバーロードを解決
     
    751751
    752752
     753    if( strstr(expression,"xxxxx"))
     754    {
     755        int test=0;
     756    }
    753757
    754758    ////////////////////////////////
     
    789793                        // ダウンキャストを許可する
    790794                }
    791                 else if( idCalc == CALC_AS
    792                     && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) && ((CClass *)index_stack[sp-1])->IsInterface()
    793                     ){
    794                         // インターフェイスへのキャスト
    795                         // TODO: 実装
    796                         CastToInterface( pobj_reg->GetLockingReg(), REG_R15, *(CClass *)index_stack[sp-2], *(CClass *)index_stack[sp-1] );
    797                 }
    798795                else{
    799796                    //オーバーロードされたオペレータを呼び出す
     
    853850                    || term[0] == '\"' )
    854851                {
    855                     if( baseType.IsObject() || baseType.IsNull() )
     852                    if( !baseType.IsPointer() )
    856853                    {
    857854                        //要求タイプがオブジェクト、または未定のとき
  • trunk/abdev/BasicCompiler64/Opcode.h

    r339 r350  
    245245void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg);
    246246
    247 //Compile_Interface.cpp
    248 bool CastToInterface( int reg, int vtblReg, const CClass &baseClass, const CClass &interfaceClass );
    249 
    250247//Compile_Object.cpp
    251248void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
  • trunk/abdev/BasicCompiler64/OperatorProc.cpp

    r345 r350  
    3333}
    3434
    35 int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     35int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp)
     36{
     37    Type leftType( type_stack[sp-2], index_stack[sp-2] );
     38    Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
     39
    3640    //オーバーロードされたオペレータ関数を呼び出す
    37     CClass *pobj_c;
    38     pobj_c=(CClass *)index_stack[sp-2];
     41    const CClass *pobj_c = &leftType.GetClass();
    3942
    4043    std::vector<const UserProc *> subs;
     
    5659    Parameters params;
    5760
    58     if(bTwoTerm){
    59         params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
     61    if(bTwoTerm)
     62    {
     63        params.push_back( new Parameter( "", rightType ) );
    6064    }
    6165
     
    9498    }
    9599
    96     int right_side_size = Type(type_stack[sp-1],index_stack[sp-1]).GetSize();
     100    int right_side_size = rightType.GetSize();
    97101
    98102    if(bTwoTerm){
Note: See TracChangeset for help on using the changeset viewer.