Changeset 325 in dev for trunk


Ignore:
Timestamp:
Sep 25, 2007, 8:56:38 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r320 r325  
    424424    return true;
    425425}
     426
     427void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
     428{
     429    ///////////////////////////////////////////////////////////////
     430    // _System_LocalThisのダミーをセット
     431    ///////////////////////////////////////////////////////////////
     432
     433    char temporary[VN_SIZE]={0};
     434    if( objPtrValueStr && objPtrValueStr[0] ){
     435        //_System_LocalThis(第一パラメータ)のダミーを作成
     436        lstrcpy(temporary,"0,");
     437    }
     438    if( dg.ReturnType().IsStruct() ){
     439        // ※ByRef _System_ReturnValue パラメータのダミーをセット
     440        lstrcat(temporary,"0,");
     441    }
     442
     443    if(params[0]=='\0'&&temporary[0])
     444        temporary[lstrlen(temporary)-1]=0;
     445    else lstrcat(temporary,params);
     446
     447
     448    ParamImpl *pobj_parameter = new ParamImpl( params );
     449
     450    //一時オブジェクトを生成
     451    pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() );
     452
     453    //レジスタ、スタックフレームにセット
     454    int ParmSize = pobj_parameter->SetParameter( dg.GetName(), dg.Params() );
     455
     456
     457    if( objPtrValueStr && objPtrValueStr[0] )
     458    {
     459        RELATIVE_VAR RelativeVar;
     460        //Constアクセスが不可能なメソッドの場合
     461        if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
     462            Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
     463            return;
     464        }
     465
     466        SetVarPtrToEax(&RelativeVar);
     467
     468        // 参照を実体ポインタにする
     469        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     470
     471        //push ecx
     472        compiler.codeGenerator.op_push(REG_ECX);
     473    }
     474
     475
     476    {
     477        ////////////////////////
     478        // call
     479        ////////////////////////
     480        RELATIVE_VAR RelativeVar;
     481        GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
     482        SetVarPtrToEax( &RelativeVar );
     483
     484        //mov eax,dword ptr[eax]
     485        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     486
     487        //call eax
     488        compiler.codeGenerator.op_call_R( REG_EAX );
     489    }
     490
     491
     492    //一時オブジェクトを破棄
     493    pobj_parameter->DeleteTempParameters();
     494
     495    //パラメータオブジェクトを破棄
     496    delete pobj_parameter;
     497}
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r301 r325  
    99
    1010int GetFunctionFromName(char *FuncName){
    11     if(lstrcmpi(FuncName,"CUDbl")==0)       return FUNC_CUDBL;
    12     if(lstrcmpi(FuncName,"Fix")==0)         return FUNC_FIX;
    13     if(lstrcmpi(FuncName,"Len")==0)         return FUNC_LEN;
    14     if(lstrcmpi(FuncName,"AddressOf")==0)   return FUNC_ADDRESSOF;
    15     if(lstrcmpi(FuncName,"SizeOf")==0)      return FUNC_SIZEOF;
    16     if(lstrcmpi(FuncName,"VarPtr")==0)      return FUNC_VARPTR;
    17     if(lstrcmpi(FuncName,"ObjPtr")==0)      return FUNC_OBJPTR;
    18     if(lstrcmpi(FuncName,"GetDouble")==0)   return FUNC_GETDOUBLE;
    19     if(lstrcmpi(FuncName,"GetSingle")==0)   return FUNC_GETSINGLE;
    20     if(lstrcmpi(FuncName,"GetQWord")==0)    return FUNC_GETQWORD;
    21     if(lstrcmpi(FuncName,"GetDWord")==0)    return FUNC_GETDWORD;
    22     if(lstrcmpi(FuncName,"GetWord")==0)     return FUNC_GETWORD;
    23     if(lstrcmpi(FuncName,"GetByte")==0)     return FUNC_GETBYTE;
     11    if( lstrcmpi( FuncName, "CUDbl" ) == 0 )            return FUNC_CUDBL;
     12    if( lstrcmpi( FuncName, "Fix" ) == 0 )              return FUNC_FIX;
     13    if( lstrcmpi( FuncName, "Len" ) == 0 )              return FUNC_LEN;
     14    if( lstrcmpi( FuncName, "AddressOf" ) == 0 )        return FUNC_ADDRESSOF;
     15    if( lstrcmpi( FuncName, "SizeOf" ) == 0 )           return FUNC_SIZEOF;
     16    if( lstrcmpi( FuncName, "VarPtr" ) == 0 )           return FUNC_VARPTR;
     17    if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )           return FUNC_OBJPTR;
     18    if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )    return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
     19    if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )     return FUNC_DELEGATE_STATICMETHOD_CALL;
     20    if( lstrcmpi( FuncName, "GetDouble" ) == 0 )        return FUNC_GETDOUBLE;
     21    if( lstrcmpi( FuncName, "GetSingle" ) == 0 )        return FUNC_GETSINGLE;
     22    if( lstrcmpi( FuncName, "GetQWord" ) == 0 )         return FUNC_GETQWORD;
     23    if( lstrcmpi( FuncName, "GetDWord" ) == 0 )         return FUNC_GETDWORD;
     24    if( lstrcmpi( FuncName, "GetWord" ) == 0 )          return FUNC_GETWORD;
     25    if( lstrcmpi( FuncName, "GetByte" ) == 0 )          return FUNC_GETBYTE;
    2426    return 0;
    2527}
     
    394396    }
    395397}
     398
     399void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
     400{
     401    if( isCallOn )
     402    {
     403        int i = 0;
     404        char methodPtrParamStr[VN_SIZE];
     405        i = GetOneParameter( paramsStr, i, methodPtrParamStr );
     406
     407        char objPtrValueStr[VN_SIZE];
     408        if( isDynamicCall )
     409        {
     410            i = GetOneParameter( paramsStr, i, objPtrValueStr );
     411        }
     412
     413        Opcode_CallDelegate( compiler.pCompilingClass->GetDelegate(), methodPtrParamStr, objPtrValueStr, paramsStr + i );
     414    }
     415
     416    resultType = UserProc::CompilingUserProc().ReturnType();
     417}
     418
    396419void Opcode_Func_GetPtrData(const char *Parameter,const int type){
    397420    Type tempType;
     
    482505            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
    483506            break;
     507        case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
     508            Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
     509            break;
     510        case FUNC_DELEGATE_STATICMETHOD_CALL:
     511            Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
     512            break;
    484513
    485514        case FUNC_GETDOUBLE:
  • trunk/abdev/BasicCompiler32/FunctionValue.h

    r109 r325  
    1313
    1414//その他
    15 #define FUNC_ADDRESSOF  0x0619
    16 #define FUNC_SIZEOF     0x0620
     15#define FUNC_ADDRESSOF      0x0619
     16#define FUNC_SIZEOF         0x0620
     17#define FUNC_DELEGATE_DYNAMICMETHOD_CALL    0x0621
     18#define FUNC_DELEGATE_STATICMETHOD_CALL     0x0622
    1719
    1820//ポインタ
    19 #define FUNC_GETDOUBLE  0x0630
    20 #define FUNC_GETSINGLE  0x0631
    21 #define FUNC_GETQWORD   0x0632
    22 #define FUNC_GETDWORD   0x0633
    23 #define FUNC_GETWORD    0x0634
    24 #define FUNC_GETBYTE    0x0635
     21#define FUNC_GETDOUBLE      0x0630
     22#define FUNC_GETSINGLE      0x0631
     23#define FUNC_GETQWORD       0x0632
     24#define FUNC_GETDWORD       0x0633
     25#define FUNC_GETWORD        0x0634
     26#define FUNC_GETBYTE        0x0635
  • trunk/abdev/BasicCompiler32/Opcode.h

    r316 r325  
    215215bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName );
    216216bool Opcode_CallDllProc( const char *lpszParms, const DllProc *pDllProc );
     217void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params );
    217218
    218219//Compile_ProcOp.cpp
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r320 r325  
    474474    return true;
    475475}
     476
     477void UnsafeCall( const char *methodPtrValueStr, const char *params )
     478{
     479}
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r308 r325  
    99
    1010int GetFunctionFromName(char *FuncName){
    11     if(lstrcmpi(FuncName,"Len")==0)         return FUNC_LEN;
    12     if(lstrcmpi(FuncName,"AddressOf")==0)   return FUNC_ADDRESSOF;
    13     if(lstrcmpi(FuncName,"SizeOf")==0)      return FUNC_SIZEOF;
    14     if(lstrcmpi(FuncName,"VarPtr")==0)      return FUNC_VARPTR;
    15     if(lstrcmpi(FuncName,"ObjPtr")==0)      return FUNC_OBJPTR;
    16     if(lstrcmpi(FuncName,"GetDouble")==0)   return FUNC_GETDOUBLE;
    17     if(lstrcmpi(FuncName,"GetSingle")==0)   return FUNC_GETSINGLE;
    18     if(lstrcmpi(FuncName,"GetQWord")==0)    return FUNC_GETQWORD;
    19     if(lstrcmpi(FuncName,"GetDWord")==0)    return FUNC_GETDWORD;
    20     if(lstrcmpi(FuncName,"GetWord")==0)     return FUNC_GETWORD;
    21     if(lstrcmpi(FuncName,"GetByte")==0)     return FUNC_GETBYTE;
     11    if( lstrcmpi( FuncName, "Len" ) == 0 )              return FUNC_LEN;
     12    if( lstrcmpi( FuncName, "AddressOf" ) == 0 )        return FUNC_ADDRESSOF;
     13    if( lstrcmpi( FuncName, "SizeOf" ) == 0 )           return FUNC_SIZEOF;
     14    if( lstrcmpi( FuncName, "VarPtr" ) == 0 )           return FUNC_VARPTR;
     15    if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )           return FUNC_OBJPTR;
     16    if( lstrcmpi( FuncName, "__unsafe_call" ) == 0 )    return FUNC_UNSAFE_CALL;
     17    if( lstrcmpi( FuncName, "GetDouble" ) == 0 )        return FUNC_GETDOUBLE;
     18    if( lstrcmpi( FuncName, "GetSingle" ) == 0 )        return FUNC_GETSINGLE;
     19    if( lstrcmpi( FuncName, "GetQWord" ) == 0 )         return FUNC_GETQWORD;
     20    if( lstrcmpi( FuncName, "GetDWord" ) == 0 )         return FUNC_GETDWORD;
     21    if( lstrcmpi( FuncName, "GetWord" ) == 0 )          return FUNC_GETWORD;
     22    if( lstrcmpi( FuncName, "GetByte" ) == 0 )          return FUNC_GETBYTE;
    2223    return 0;
    2324}
     
    251252    }
    252253}
     254
     255void Opcode_Func_unsafe_call( const char *paramsStr, Type &resultType, bool isCallOn )
     256{
     257    if( isCallOn )
     258    {
     259        int i = 0;
     260        char methodPtrParamStr[8192];
     261        GetOneParameter( paramsStr, i, methodPtrParamStr );
     262        UnsafeCall( methodPtrParamStr, paramsStr + i );
     263    }
     264
     265    resultType = UserProc::CompilingUserProc().ReturnType();
     266}
     267
    253268void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
    254269    int reg=REG_RAX;
     
    296311            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
    297312            break;
     313        case FUNC_UNSAFE_CALL:
     314            Opcode_Func_unsafe_call( Parameter, resultType, isCallOn );
     315            break;
    298316
    299317        case FUNC_GETDOUBLE:
  • trunk/abdev/BasicCompiler64/FunctionValue.h

    r109 r325  
    1212
    1313//その他
    14 #define FUNC_ADDRESSOF  0x0619
    15 #define FUNC_SIZEOF     0x0620
     14#define FUNC_ADDRESSOF      0x0619
     15#define FUNC_SIZEOF         0x0620
     16#define FUNC_UNSAFE_CALL    0x0621
    1617
    1718//ポインタ
    18 #define FUNC_GETDOUBLE  0x0630
    19 #define FUNC_GETSINGLE  0x0631
    20 #define FUNC_GETQWORD   0x0632
    21 #define FUNC_GETDWORD   0x0634
    22 #define FUNC_GETWORD    0x0635
    23 #define FUNC_GETBYTE    0x0636
     19#define FUNC_GETDOUBLE      0x0630
     20#define FUNC_GETSINGLE      0x0631
     21#define FUNC_GETQWORD       0x0632
     22#define FUNC_GETDWORD       0x0634
     23#define FUNC_GETWORD        0x0635
     24#define FUNC_GETBYTE        0x0636
  • trunk/abdev/BasicCompiler64/Opcode.h

    r316 r325  
    333333bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
    334334bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
     335void UnsafeCall( const char *methodPtrValueStr, const char *params );
    335336
    336337//Compile_ProcOp.cpp
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r299 r325  
    1010class UserProc;
    1111class CClass;
     12class Delegate;
    1213
    1314class InheritedInterface
     
    366367    }
    367368
     369    // デリゲート情報を取得
     370    const ::Delegate &GetDelegate() const;
     371
    368372    // vtblに存在する仮想関数の数
    369373    int GetVtblNum() const
  • trunk/abdev/BasicCompiler_Common/include/Delegate.h

    r322 r325  
    22
    33#include <Hashmap.h>
    4 #include <Symbol.h>
     4#include <Procedure.h>
    55
    66class Delegate : public Procedure, public Jenga::Common::ObjectInHashmap<Delegate>
  • trunk/abdev/BasicCompiler_Common/include/Parameter.h

    r322 r325  
    146146
    147147    bool Analyze( const char *sourceOfParams, int nowLine );
     148
     149    std::string GetString() const;
    148150};
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r322 r325  
    589589
    590590    return 0;
     591}
     592
     593const ::Delegate &CClass::GetDelegate() const
     594{
     595    const ::Delegate *dg = compiler.GetObjectModule().meta.GetDelegates().GetHashArrayElement( GetName().c_str() );
     596    while( dg )
     597    {
     598        if( dg->IsEqualSymbol( GetNamespaceScopes(), GetName() ) ){
     599            //名前空間とクラス名が一致した
     600            return *dg;
     601        }
     602        dg = dg->GetChainNext();
     603    }
     604
     605    Jenga::Throw( "CClass::GetDelegateメソッドに失敗" );
     606    static ::Delegate dummy;
     607    return dummy;
    591608}
    592609
  • trunk/abdev/BasicCompiler_Common/src/Delegate.cpp

    r322 r325  
    120120
    121121        std::map<std::string,std::string> values;
    122         values.insert( std::map<std::string,std::string>::value_type( "name", dg.GetName() ) );
    123         values.insert( std::map<std::string,std::string>::value_type( "params", "" ) );
     122
     123        if( dg.GetNamespaceScopes().size() )
     124        {
     125            std::string namespaceScopesCommandStr = "";
     126            std::string endNamespaceScopesCommandStr = "";
     127            BOOST_FOREACH( const std::string &namespaceStr, dg.GetNamespaceScopes() )
     128            {
     129                if( namespaceScopesCommandStr.size() )
     130                {
     131                    namespaceScopesCommandStr += ":";
     132                    endNamespaceScopesCommandStr += ":";
     133                }
     134                namespaceScopesCommandStr += "Namespace " + namespaceStr;
     135                endNamespaceScopesCommandStr += "End Namespace";
     136            }
     137
     138            values.insert( std::map<std::string,std::string>::value_type(
     139                "#namespace_begin#",
     140                namespaceScopesCommandStr
     141            ) );
     142            values.insert( std::map<std::string,std::string>::value_type(
     143                "#namespace_end#",
     144                endNamespaceScopesCommandStr
     145            ) );
     146        }
     147        else
     148        {
     149            values.insert( std::map<std::string,std::string>::value_type( "#namespace_begin#", "" ) );
     150            values.insert( std::map<std::string,std::string>::value_type( "#namespace_end#", "" ) );
     151        }
     152
     153        values.insert( std::map<std::string,std::string>::value_type( "#name#", dg.GetName() ) );
     154
     155        std::string paramsStr = dg.Params().GetString();
     156
     157        if( dg.IsFunction() )
     158        {
     159            values.insert( std::map<std::string,std::string>::value_type(
     160                "#call_method_begin#",
     161                (string)"Function Call(" + paramsStr + ") As " + compiler.TypeToString( dg.ReturnType() )
     162            ) );
     163
     164            values.insert( std::map<std::string,std::string>::value_type(
     165                "#call_method_end#",
     166                "End Function"
     167            ) );
     168
     169            values.insert( std::map<std::string,std::string>::value_type( "#result#", "Call=" ) );
     170        }
     171        else
     172        {
     173            values.insert( std::map<std::string,std::string>::value_type(
     174                "#call_method_begin#",
     175                (string)"Sub Call(" + paramsStr + ")"
     176            ) );
     177
     178            values.insert( std::map<std::string,std::string>::value_type(
     179                "#call_method_end#",
     180                "End Sub"
     181            ) );
     182
     183            values.insert( std::map<std::string,std::string>::value_type( "#result#", "" ) );
     184        }
     185
     186        values.insert( std::map<std::string,std::string>::value_type( "#params#", paramsStr ) );
     187
    124188        destSource += sourceTemplate.GetResult( values );
    125189    }
     190
     191    ts( destSource.c_str() );
    126192}
  • trunk/abdev/BasicCompiler_Common/src/Parameter.cpp

    r322 r325  
    159159    return true;
    160160}
     161
     162std::string Parameters::GetString() const
     163{
     164    std::string result;
     165
     166    const Parameters &params = *this;
     167    BOOST_FOREACH( const Parameter *pParam, params )
     168    {
     169        if( result.size() )
     170        {
     171            result += ",";
     172        }
     173
     174        result += pParam->GetVarName() + " As " + compiler.TypeToString( *pParam );
     175    }
     176    return result;
     177}
  • trunk/abdev/BasicCompiler_Common/src/Source.cpp

    r322 r325  
    10481048        while( true )
    10491049        {
    1050             std::string::size_type index = result.find( "#" + it->first + "#" );
     1050            std::string::size_type index = result.find( it->first );
    10511051            if( index == std::string::npos )
    10521052            {
     
    10541054            }
    10551055
    1056             result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() + 2 );
     1056            result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() );
    10571057        }
    10581058        it++;
Note: See TracChangeset for help on using the changeset viewer.