Changeset 97 in dev for BasicCompiler64


Ignore:
Timestamp:
Apr 16, 2007, 3:52:40 AM (18 years ago)
Author:
dai_9181
Message:

関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。

Location:
BasicCompiler64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/BasicCompiler.vcproj

    r91 r97  
    385385                IgnoreDefaultLibraryNames="libcpmtd"
    386386                GenerateDebugInformation="false"
     387                ProgramDatabaseFile=".\Release/BasicCompiler64.pdb"
     388                SubSystem="2"
     389                TargetMachine="0"
     390            />
     391            <Tool
     392                Name="VCALinkTool"
     393            />
     394            <Tool
     395                Name="VCManifestTool"
     396                AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
     397            />
     398            <Tool
     399                Name="VCXDCMakeTool"
     400            />
     401            <Tool
     402                Name="VCBscMakeTool"
     403                SuppressStartupBanner="true"
     404                OutputFile="$(OutDir)/$(ProjectName).bsc"
     405            />
     406            <Tool
     407                Name="VCFxCopTool"
     408            />
     409            <Tool
     410                Name="VCAppVerifierTool"
     411            />
     412            <Tool
     413                Name="VCWebDeploymentTool"
     414            />
     415            <Tool
     416                Name="VCPostBuildEventTool"
     417            />
     418        </Configuration>
     419        <Configuration
     420            Name="test_release|Win32"
     421            OutputDirectory="$(ConfigurationName)"
     422            IntermediateDirectory="$(ConfigurationName)"
     423            ConfigurationType="1"
     424            UseOfMFC="0"
     425            ATLMinimizesCRunTimeLibraryUsage="false"
     426            CharacterSet="2"
     427            >
     428            <Tool
     429                Name="VCPreBuildEventTool"
     430            />
     431            <Tool
     432                Name="VCCustomBuildTool"
     433            />
     434            <Tool
     435                Name="VCXMLDataGeneratorTool"
     436            />
     437            <Tool
     438                Name="VCWebServiceProxyGeneratorTool"
     439            />
     440            <Tool
     441                Name="VCMIDLTool"
     442                PreprocessorDefinitions="_DEBUG"
     443                MkTypLibCompatible="true"
     444                SuppressStartupBanner="true"
     445                TargetEnvironment="1"
     446                TypeLibraryName=".\Debug/BasicCompiler.tlb"
     447                HeaderFileName=""
     448            />
     449            <Tool
     450                Name="VCCLCompilerTool"
     451                Optimization="0"
     452                AdditionalIncludeDirectories="..\cpplibs\boost;..\BasicCompiler_Common\include"
     453                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;_AMD64_;_WIN64"
     454                MinimalRebuild="false"
     455                BasicRuntimeChecks="0"
     456                RuntimeLibrary="2"
     457                UsePrecompiledHeader="0"
     458                PrecompiledHeaderFile=".\Release/BasicCompiler.pch"
     459                AssemblerListingLocation=".\Release/"
     460                ObjectFile=".\Release/"
     461                ProgramDataBaseFileName=".\Release/"
     462                BrowseInformation="0"
     463                WarningLevel="3"
     464                SuppressStartupBanner="true"
     465                Detect64BitPortabilityProblems="true"
     466                DebugInformationFormat="3"
     467                CallingConvention="0"
     468            />
     469            <Tool
     470                Name="VCManagedResourceCompilerTool"
     471            />
     472            <Tool
     473                Name="VCResourceCompilerTool"
     474                PreprocessorDefinitions="_DEBUG,JPN"
     475                Culture="1041"
     476            />
     477            <Tool
     478                Name="VCPreLinkEventTool"
     479            />
     480            <Tool
     481                Name="VCLinkerTool"
     482                AdditionalOptions="/MACHINE:AMD64"
     483                AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib bufferoverflowu.lib"
     484                OutputFile="../ActiveBasic/BasicCompiler64.exe"
     485                LinkIncremental="2"
     486                SuppressStartupBanner="true"
     487                IgnoreDefaultLibraryNames="libcpmtd"
     488                GenerateDebugInformation="true"
    387489                ProgramDatabaseFile=".\Release/BasicCompiler64.pdb"
    388490                SubSystem="2"
     
    578680                    />
    579681                </FileConfiguration>
     682                <FileConfiguration
     683                    Name="test_release|Win32"
     684                    >
     685                    <Tool
     686                        Name="VCResourceCompilerTool"
     687                        PreprocessorDefinitions="_DEBUG;JPN;$(NoInherit)"
     688                    />
     689                </FileConfiguration>
    580690            </File>
    581691            <Filter
     
    624734                        />
    625735                    </FileConfiguration>
     736                    <FileConfiguration
     737                        Name="test_release|Win32"
     738                        >
     739                        <Tool
     740                            Name="VCCLCompilerTool"
     741                            PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     742                            UsePrecompiledHeader="0"
     743                            BrowseInformation="0"
     744                        />
     745                    </FileConfiguration>
    626746                </File>
    627747                <File
     
    667787                        />
    668788                    </FileConfiguration>
     789                    <FileConfiguration
     790                        Name="test_release|Win32"
     791                        >
     792                        <Tool
     793                            Name="VCCLCompilerTool"
     794                            PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     795                            UsePrecompiledHeader="0"
     796                            BrowseInformation="0"
     797                        />
     798                    </FileConfiguration>
    669799                </File>
    670800                <File
     
    710840                        />
    711841                    </FileConfiguration>
     842                    <FileConfiguration
     843                        Name="test_release|Win32"
     844                        >
     845                        <Tool
     846                            Name="VCCLCompilerTool"
     847                            PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     848                            UsePrecompiledHeader="0"
     849                            BrowseInformation="0"
     850                        />
     851                    </FileConfiguration>
    712852                </File>
    713853                <File
     
    745885                    <FileConfiguration
    746886                        Name="Release2|Win32"
     887                        >
     888                        <Tool
     889                            Name="VCCLCompilerTool"
     890                            PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     891                            UsePrecompiledHeader="0"
     892                            BrowseInformation="0"
     893                        />
     894                    </FileConfiguration>
     895                    <FileConfiguration
     896                        Name="test_release|Win32"
    747897                        >
    748898                        <Tool
     
    800950                            />
    801951                        </FileConfiguration>
     952                        <FileConfiguration
     953                            Name="test_release|Win32"
     954                            >
     955                            <Tool
     956                                Name="VCCLCompilerTool"
     957                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     958                                UsePrecompiledHeader="0"
     959                                BrowseInformation="0"
     960                            />
     961                        </FileConfiguration>
    802962                    </File>
    803963                    <File
     
    8431003                            />
    8441004                        </FileConfiguration>
     1005                        <FileConfiguration
     1006                            Name="test_release|Win32"
     1007                            >
     1008                            <Tool
     1009                                Name="VCCLCompilerTool"
     1010                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1011                                UsePrecompiledHeader="0"
     1012                                BrowseInformation="0"
     1013                            />
     1014                        </FileConfiguration>
    8451015                    </File>
    8461016                    <File
     
    8861056                            />
    8871057                        </FileConfiguration>
     1058                        <FileConfiguration
     1059                            Name="test_release|Win32"
     1060                            >
     1061                            <Tool
     1062                                Name="VCCLCompilerTool"
     1063                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1064                                UsePrecompiledHeader="0"
     1065                                BrowseInformation="0"
     1066                            />
     1067                        </FileConfiguration>
    8881068                    </File>
    8891069                    <File
     
    9331113                            />
    9341114                        </FileConfiguration>
     1115                        <FileConfiguration
     1116                            Name="test_release|Win32"
     1117                            >
     1118                            <Tool
     1119                                Name="VCCLCompilerTool"
     1120                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1121                                UsePrecompiledHeader="0"
     1122                                BrowseInformation="0"
     1123                            />
     1124                        </FileConfiguration>
    9351125                    </File>
    9361126                    <File
     
    9761166                            />
    9771167                        </FileConfiguration>
     1168                        <FileConfiguration
     1169                            Name="test_release|Win32"
     1170                            >
     1171                            <Tool
     1172                                Name="VCCLCompilerTool"
     1173                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1174                                UsePrecompiledHeader="0"
     1175                                BrowseInformation="0"
     1176                            />
     1177                        </FileConfiguration>
    9781178                    </File>
    9791179                    <File
     
    10191219                            />
    10201220                        </FileConfiguration>
     1221                        <FileConfiguration
     1222                            Name="test_release|Win32"
     1223                            >
     1224                            <Tool
     1225                                Name="VCCLCompilerTool"
     1226                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1227                                UsePrecompiledHeader="0"
     1228                                BrowseInformation="0"
     1229                            />
     1230                        </FileConfiguration>
    10211231                    </File>
    10221232                    <File
     
    10621272                            />
    10631273                        </FileConfiguration>
     1274                        <FileConfiguration
     1275                            Name="test_release|Win32"
     1276                            >
     1277                            <Tool
     1278                                Name="VCCLCompilerTool"
     1279                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1280                                UsePrecompiledHeader="0"
     1281                                BrowseInformation="0"
     1282                            />
     1283                        </FileConfiguration>
    10641284                    </File>
    10651285                    <File
     
    10971317                        <FileConfiguration
    10981318                            Name="Release2|Win32"
     1319                            >
     1320                            <Tool
     1321                                Name="VCCLCompilerTool"
     1322                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1323                                UsePrecompiledHeader="0"
     1324                                BrowseInformation="0"
     1325                            />
     1326                        </FileConfiguration>
     1327                        <FileConfiguration
     1328                            Name="test_release|Win32"
    10991329                            >
    11001330                            <Tool
     
    11601390                            />
    11611391                        </FileConfiguration>
     1392                        <FileConfiguration
     1393                            Name="test_release|Win32"
     1394                            >
     1395                            <Tool
     1396                                Name="VCCLCompilerTool"
     1397                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1398                                UsePrecompiledHeader="0"
     1399                                BrowseInformation="0"
     1400                            />
     1401                        </FileConfiguration>
    11621402                    </File>
    11631403                    <File
     
    12191459                            />
    12201460                        </FileConfiguration>
     1461                        <FileConfiguration
     1462                            Name="test_release|Win32"
     1463                            >
     1464                            <Tool
     1465                                Name="VCCLCompilerTool"
     1466                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1467                                UsePrecompiledHeader="0"
     1468                                BrowseInformation="0"
     1469                            />
     1470                        </FileConfiguration>
    12211471                    </File>
    12221472                    <File
     
    12541504                        <FileConfiguration
    12551505                            Name="Release2|Win32"
     1506                            >
     1507                            <Tool
     1508                                Name="VCCLCompilerTool"
     1509                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
     1510                                UsePrecompiledHeader="0"
     1511                                BrowseInformation="0"
     1512                            />
     1513                        </FileConfiguration>
     1514                        <FileConfiguration
     1515                            Name="test_release|Win32"
    12561516                            >
    12571517                            <Tool
     
    14351695                        <FileConfiguration
    14361696                            Name="Release2|Win32"
     1697                            >
     1698                            <Tool
     1699                                Name="VCCLCompilerTool"
     1700                                ObjectFile="$(IntDir)\$(InputName)1.obj"
     1701                                XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
     1702                            />
     1703                        </FileConfiguration>
     1704                        <FileConfiguration
     1705                            Name="test_release|Win32"
    14371706                            >
    14381707                            <Tool
  • BasicCompiler64/BasicCompiler64.sln

    r3 r97  
    99        English_Rel|Win32 = English_Rel|Win32
    1010        Release|Win32 = Release|Win32
     11        test_release|Win32 = test_release|Win32
    1112    EndGlobalSection
    1213    GlobalSection(ProjectConfigurationPlatforms) = postSolution
     
    1718        {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.ActiveCfg = Release2|Win32
    1819        {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.Build.0 = Release2|Win32
     20        {864B921B-423B-4F9E-9E6B-31B15968EDF9}.test_release|Win32.ActiveCfg = test_release|Win32
     21        {864B921B-423B-4F9E-9E6B-31B15968EDF9}.test_release|Win32.Build.0 = test_release|Win32
    1922    EndGlobalSection
    2023    GlobalSection(SolutionProperties) = preSolution
  • BasicCompiler64/Compile_CallProc.cpp

    r77 r97  
    9696
    9797bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
     98    // TODO: RefTypeは不必要なので削除する
    9899    int i2;
    99100
     
    120121    if( pUserProc->GetParentClassPtr() ){
    121122        //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
    122         if(ObjectName[0]){
     123        if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){
    123124            if(lstrcmpi(ObjectName,"Super")==0){
    124125                //クラスメンバ関数内から基底クラスの呼び出し
     
    303304        ///////////////////////////////
    304305
    305         if(ObjectName[0]){
     306        if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){
    306307            if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
    307308            else{
  • BasicCompiler64/Compile_Func.cpp

    r88 r97  
    5757    }
    5858
    59     if( type.IsStringObject() ){
     59    if( type.IsStringClass() ){
    6060        //Stringオブジェクトの場合
    6161        sprintf(temporary,"%s.Length",tempParm);
  • BasicCompiler64/Compile_Statement.cpp

    r88 r97  
    5858
    5959        if(pUserProc){
    60             if( !pUserProc->IsMacro() ) SetError(10,Command,cp);
     60            if( !pUserProc->IsMacro() ){
     61                SetError(10,Command,cp);
     62            }
    6163
    6264            Opcode_CallProc("",pUserProc,0,"",0);
  • BasicCompiler64/Compile_Var.cpp

    r96 r97  
    366366    return true;
    367367}
    368 void GetWithName(char *buffer){
    369     extern WITHINFO WithInfo;
    370     int i;
    371 
    372     buffer[0]=0;
    373     for(i=0;i<WithInfo.num;i++)
    374         lstrcat(buffer,WithInfo.ppName[i]);
    375 }
    376368
    377369int LocalVar_ThisPtrOffset;
     
    401393        //例: func().member
    402394
     395        // TODO: 消す
     396        SetError();
     397        return false;
     398        /*
    403399        void *pInfo;
    404400        int idProc=GetProc(VarName,(void **)&pInfo);
     
    435431
    436432            return true;
    437         }
     433        }*/
    438434    }
    439435
     
    864860    }
    865861    else if( type.Is64() || type.IsPointer() ){
    866         if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){
     862        if(type.GetBasicType()==typeOfPtrChar){
    867863            //文字列定数のとき
    868864
     
    10101006    }
    10111007    else if( type.Is64() || type.IsPointer() ){
    1012         if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){
     1008        if(type.GetBasicType()==typeOfPtrChar ){
    10131009            //文字列定数のとき
    10141010
  • BasicCompiler64/NumOpe.cpp

    r94 r97  
    8383}
    8484
     85
     86bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){
     87    int UseReg=pobj_reg->GetNextReg();
     88    int XmmReg=pobj_reg->GetNextXmmReg();
     89
     90    //大きな型への暗黙の変換
     91    int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
     92
     93    if(resultType.GetBasicType()&FLAG_PTR){
     94        //配列ポインタ
     95        resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) );
     96
     97        SetVarPtrToReg(UseReg,&relativeVar);
     98    }
     99    else if(resultType.IsReal()){
     100        //実数型
     101        if( resultType.IsDouble() )
     102            SetXmmReg_DoubleVariable(&relativeVar,XmmReg);
     103        if( resultType.IsSingle() )
     104            SetXmmReg_SingleVariable(&relativeVar,XmmReg);
     105    }
     106    else if( resultType.IsWhole() || resultType.IsObject()){
     107        //整数型
     108        SetReg_WholeVariable(resultType.GetBasicType(),&relativeVar,UseReg);
     109    }
     110    else if( resultType.IsStruct() ){
     111        //構造体ポインタをUseRegへ格納(構造体は値型)
     112        SetVarPtrToReg(UseReg,&relativeVar);
     113    }
     114    else{
     115        return false;
     116    }
     117
     118    if( resultType.GetBasicType() != bigType ){
     119        // 大きな型へ変換された場合
     120        // ※レジスタの値をキャストする
     121        ExtendRegToBigType( UseReg, bigType, resultType.GetBasicType() );
     122
     123        resultType.SetBasicType( bigType );
     124    }
     125
     126    return true;
     127}
     128bool TermMemberOpe( const CClass &objClass, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member ){
     129
     130    int UseReg=pobj_reg->GetNextReg();
     131    int XmmReg=pobj_reg->GetNextXmmReg();
     132
     133
     134    if( GetMemberType( objClass, member, resultType, 0, false ) ){
     135        // メンバが見つかったとき
     136
     137        //オブジェクトポインタをr11にコピー
     138        op_mov_RR( REG_R11, UseReg );
     139
     140        RELATIVE_VAR relativeVar;
     141        relativeVar.dwKind=VAR_DIRECTMEM;
     142
     143        if( !_member_offset(
     144            true,   //エラー表示あり
     145            false,  //読み込み専用
     146            objClass,
     147            member,&relativeVar,resultType,0)){
     148                return false;
     149        }
     150
     151        if( !VarToReg( relativeVar, baseType, resultType ) ){
     152            SetError(11,termFull,cp);
     153        }
     154
     155        return true;
     156    }
     157
     158
     159    ///////////////////////////////////////////////////////////////////
     160    // 動的メソッドを検索
     161    ///////////////////////////////////////////////////////////////////
     162    vector<UserProc *> userProcs;
     163
     164    char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1];
     165    CClass::RefType refType;
     166    lstrcpy( methodName, member );
     167    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
     168
     169    objClass.EnumMethod( methodName, userProcs );
     170    UserProc *pUserProc;
     171    if(userProcs.size()){
     172        //オーバーロードを解決
     173        pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
     174
     175        if( pUserProc ){
     176
     177            resultType = pUserProc->ReturnType();
     178
     179
     180            //////////////////////////////////////////////////////
     181            /////    レジスタ資源のバックアップ
     182            {   BACKUP_REGISTER_RESOURCE
     183            //////////////////////////////////////////////////////
     184
     185                //オブジェクトポインタをスタックに入れておく
     186                //mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
     187                pobj_sf->push( UseReg );
     188
     189                if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft,0 ) ){
     190                    //レジスタ資源を復元
     191                    RESTORE_REGISTER_RESOURCE
     192
     193                    return false;
     194                }
     195
     196                pobj_sf->pop();
     197
     198                /////////////////////
     199                // 戻り値の処理
     200                /////////////////////
     201
     202                //大きな型への暗黙の変換
     203                int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
     204
     205                if( resultType.GetBasicType() != bigType ){
     206                    // 大きな型へ変換された場合
     207                    // ※レジスタの値をキャストする
     208                    ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
     209
     210                    resultType.SetBasicType( bigType );
     211                }
     212
     213                SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     214
     215
     216            /////////////////////////////////////////////
     217            //////   レジスタ資源を復元
     218                RESTORE_REGISTER_RESOURCE
     219            }////////////////////////////////////////////
     220           
     221            return true;
     222        }
     223    }
     224
     225    return false;
     226}
     227bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL ){
     228    char parameter[VN_SIZE];
     229
     230    // Withを解決
     231    char termFull[VN_SIZE];
     232    if(term[0]=='.'){
     233        GetWithName(termFull);
     234        lstrcat(termFull,term);
     235    }
     236    else lstrcpy(termFull,term);
     237
     238    char termLeft[VN_SIZE];
     239    lstrcpy(termLeft,termFull);
     240
     241    if( (string)term=="DayOfWeek"){
     242        int test=0;
     243    }
     244
     245    // パース
     246    char member[VN_SIZE];
     247    CClass::RefType refType;
     248    if( SplitMemberName( termFull, termLeft, member, refType ) ){
     249        ///////////////////////////////////////////////////////////////////
     250        // オブジェクトとメンバに分解できるとき
     251        // termLeft.member
     252        ///////////////////////////////////////////////////////////////////
     253
     254        isLiteral = false;
     255
     256        // オブジェクト側の型を取得
     257        bool isClassName = false;
     258        Type leftType;
     259        if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){
     260            return false;
     261        }
     262
     263        if( isClassName ){
     264            // 静的メンバ/メソッドの場合
     265            goto globalArea;
     266        }
     267
     268        if( !leftType.HasMember() ){
     269            // メンバを持たない型の場合
     270            return false;
     271        }
     272
     273        return TermMemberOpe( leftType.GetClass(), baseType, resultType, termFull, termLeft, member );
     274    }
     275
     276
     277    //////////////////////////////////////////////
     278    // クラス名かどうかをチェック(静的メンバ用)
     279    //////////////////////////////////////////////
     280
     281    if( pIsClassName ){
     282        if( pobj_DBClass->check( termFull ) ){
     283            *pIsClassName = true;
     284            return true;
     285        }
     286    }
     287
     288
     289    /////////////////////////////////////////////////////////////////
     290    // グローバル属性エリア
     291    /////////////////////////////////////////////////////////////////
     292globalArea:
     293
     294    int UseReg=pobj_reg->GetNextReg();
     295    int XmmReg=pobj_reg->GetNextXmmReg();
     296
     297
     298    if(lstrcmpi(termFull,"This")==0){
     299        //Thisオブジェクト
     300        resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
     301
     302        SetThisPtrToReg( UseReg );
     303
     304        isLiteral = false;
     305
     306        return true;
     307    }
     308
     309
     310    //////////////////////////////////////
     311    // 関数(DLL、ユーザー定義、組み込み)
     312    //////////////////////////////////////
     313    char procName[VN_SIZE];
     314    char temporary[8192];
     315
     316    int i2=GetCallProcName(termFull,procName);
     317    if(termFull[i2]=='('){
     318        int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
     319
     320        void *pInfo;
     321        int idProc=GetProc(procName,(void **)&pInfo);
     322
     323        if(idProc){
     324            //閉じカッコ")"に続く文字がNULLでないとき
     325            if(termFull[i2+1+i4+1]!='\0'){
     326                SetError(42,NULL,cp);
     327            }
     328
     329
     330            //////////////////////////////////////////////////////
     331            /////    レジスタ資源のバックアップ
     332            {   BACKUP_REGISTER_RESOURCE
     333            //////////////////////////////////////////////////////
     334
     335
     336                ////////////////
     337                // 呼び出し
     338                ////////////////
     339
     340                CallProc(idProc,pInfo,procName,parameter,resultType);
     341
     342
     343                /////////////////////
     344                // 戻り値の処理
     345                /////////////////////
     346
     347                //大きな型への暗黙の変換
     348                int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
     349
     350                if( resultType.GetBasicType() != bigType ){
     351                    // 大きな型へ変換された場合
     352                    // ※レジスタの値をキャストする
     353                    ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
     354
     355                    resultType.SetBasicType( bigType );
     356                }
     357
     358                SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     359
     360            /////////////////////////////////////////////
     361            //////   レジスタ資源を復元
     362                RESTORE_REGISTER_RESOURCE
     363            }////////////////////////////////////////////
     364
     365            if(resultType.IsStruct()){
     366                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
     367                //※後にfreeする必要あり
     368                // TODO: 解放はGCに任せる
     369                *pbUseHeap = 1;
     370            }
     371
     372            isLiteral = false;
     373
     374            return true;
     375        }
     376        else if(GetConstCalcBuffer(procName,parameter,temporary)){
     377            /////////////////////////
     378            // マクロ関数
     379            /////////////////////////
     380
     381            //閉じカッコ")"に続く文字がNULLでないときはエラーにする
     382            if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     383
     384            //マクロ関数の場合
     385            NumOpe(&UseReg,temporary,Type(),resultType);
     386
     387            if(!IS_LITERAL(resultType.GetIndex())){
     388                //リテラル値ではなかったとき
     389                isLiteral = false;
     390            }
     391
     392            return true;
     393        }
     394    }
     395
     396
     397    ////////////////////////////////
     398    // インデクサ(getアクセサ)
     399    ////////////////////////////////
     400
     401    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
     402    GetArrayElement(termFull,VarName,ArrayElements);
     403    if(ArrayElements[0]){
     404        GetVarType(VarName,resultType,false);
     405        if( resultType.IsObject() ){
     406            CallIndexerGetterProc(UseReg,&resultType.GetClass(),VarName,ArrayElements,resultType);
     407
     408            isLiteral = false;
     409
     410            return true;
     411        }
     412    }
     413
     414
     415    ////////////////////////////////
     416    // 変数
     417    ////////////////////////////////
     418
     419    RELATIVE_VAR relativeVar;
     420    if(GetVarOffset(
     421        false,  //エラー表示なし
     422        false,  //読み込み専用
     423        termFull,
     424        &relativeVar,resultType)){
     425        //////////
     426        // 変数
     427        //////////
     428
     429        if( !VarToReg( relativeVar, baseType, resultType ) ){
     430            SetError(11,termFull,cp);
     431        }
     432
     433        isLiteral = false;
     434
     435        return true;
     436    }
     437
     438/*
     439    ////////////////////////////////
     440    // 型名
     441    ////////////////////////////////
     442
     443    if( Type::StringToType( termFull, resultType ) ){
     444        resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
     445        return true;
     446    }*/
     447
     448
     449    /////////////////////////////////
     450    // プロパティ用のメソッド
     451    /////////////////////////////////
     452
     453    //配列要素を排除
     454    GetArrayElement(termFull,VarName,ArrayElements);
     455
     456    if(GetSubHash(VarName,0)){
     457
     458        //////////////////////////////////////////////////////
     459        /////    レジスタ資源のバックアップ
     460        {   BACKUP_REGISTER_RESOURCE
     461        //////////////////////////////////////////////////////
     462
     463            CallPropertyMethod(termFull,NULL,resultType);
     464
     465            //大きな型への暗黙の変換
     466            int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
     467
     468            if( resultType.GetBasicType() != bigType ){
     469                // 大きな型へ変換された場合
     470                // ※レジスタの値をキャストする
     471                ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
     472
     473                resultType.SetBasicType( bigType );
     474            }
     475
     476            SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     477
     478        /////////////////////////////////////////////
     479        //////   レジスタ資源を復元
     480            RESTORE_REGISTER_RESOURCE
     481        }////////////////////////////////////////////
     482
     483        if(resultType.IsStruct()){
     484            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
     485            //※後にfreeする必要あり
     486            // TODO: 解放はGCに任せる
     487            *pbUseHeap = 1;
     488        }
     489
     490        isLiteral = false;
     491
     492        return true;
     493    }
     494
     495
     496    return false;
     497}
     498
    85499bool NumOpe( int *pReg,
    86500            const char *expression,
     
    89503            BOOL *pbUseHeap ){
    90504
    91     int i,i2,i3,i4;
    92     char temporary[1024],temp2[1024],temp3[1024];
     505    int i,i2,i3;
     506    char temporary[1024],temp2[1024];
    93507
    94508    if(expression[0]=='\0'){
     
    289703                term=values[i];
    290704
     705                if( calc[i+1]%100 == CALC_AS ){
     706                    // As演算子の右辺値
     707                    //型名
     708                    if( Type::StringToType( term, resultType ) ){
     709                        resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
     710                    }
     711                    else{
     712                        SetError(3, term, cp );
     713                        goto error;
     714                    }
     715
     716                    type_stack[sp] = resultType.GetBasicType();
     717                    index_stack[sp] = resultType.GetIndex();
     718                    sp++;
     719
     720                    break;
     721                }
     722
    291723                if(term[0]=='\"'){
    292724                    //リテラル文字列
     
    298730StrLiteral:
    299731
    300                     if( baseType.IsObject() ){
    301                         if( baseType.IsStringObject() ){
    302                             //要求タイプがStringのとき
    303 
    304                             //String型オブジェクトを生成
    305                             NewStringObject(UseReg,term);
    306 
    307                             extern CClass *pobj_StringClass;
    308                             type_stack[sp]=DEF_OBJECT;
    309                             index_stack[sp]=(LONG_PTR)pobj_StringClass;
    310                             bLiteralCalculation=0;
    311 
    312                             if(bXmm) pobj_reg->LockXmmReg();
    313                             else pobj_reg->LockReg();
    314 
    315                             sp++;
    316                             break;
    317                         }
     732                    if( baseType.IsObject() || baseType.IsNull() ){
     733                        //要求タイプがオブジェクト、または未定のとき
     734
     735                        //String型オブジェクトを生成
     736                        NewStringObject(UseReg,term);
     737
     738                        extern CClass *pobj_StringClass;
     739                        type_stack[sp]=DEF_OBJECT;
     740                        index_stack[sp]=(LONG_PTR)pobj_StringClass;
     741                        bLiteralCalculation=0;
     742
     743                        if(bXmm) pobj_reg->LockXmmReg();
     744                        else pobj_reg->LockReg();
     745
     746                        sp++;
     747                        break;
    318748                    }
    319749
     
    353783                    // 何らかの識別子
    354784
    355                     //////////////////////////////////////
    356                     // 関数(DLL、ユーザー定義、組み込み)
    357                     //////////////////////////////////////
    358 
    359                     i2=GetCallProcName(term,temporary);
    360                     if(term[i2]=='('){
    361                         i4=GetStringInPare_RemovePare(temp2,term+i2+1);
    362 
    363                         void *pInfo;
    364                         int idProc=GetProc(temporary,(void **)&pInfo);
    365 
    366                         Type resultType;
    367                         if(idProc){
    368                             //閉じカッコ")"に続く文字がNULLでないとき
    369                             if(term[i2+1+i4+1]!='\0'){
    370                                 if( term[i2+1+i4+1] == '.'
    371                                     || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){
    372                                         goto NonProc;
    373                                 }
    374                                 else{
    375                                     SetError(42,NULL,cp);
     785                    bool isLiteral;
     786                    if( TermOpe( term, baseType, resultType, isLiteral, &bUseHeap[sp] ) ){
     787                        if(resultType.IsNull()){
     788                            //戻り値が存在しないとき
     789                            for(i2=0;;i2++){
     790                                if(term[i2]=='('||term[i2]=='\0'){
     791                                    term[i2]=0;
     792                                    break;
    376793                                }
    377794                            }
    378 
    379 
    380                             //////////////////////////////////////////////////////
    381                             /////    レジスタ資源のバックアップ
    382                             {   BACKUP_REGISTER_RESOURCE
    383                             //////////////////////////////////////////////////////
    384 
    385 
    386                                 ////////////////
    387                                 // 呼び出し
    388                                 ////////////////
    389 
    390                                 CallProc(idProc,pInfo,temporary,temp2,resultType);
    391                                 if(resultType.IsNull()){
    392                                     //戻り値が存在しないとき
    393                                     for(i2=2;;i2++){
    394                                         if(term[i2]=='('||term[i2]=='\0'){
    395                                             term[i2]=0;
    396                                             break;
    397                                         }
    398                                     }
    399                                     SetError(38,term,cp);
    400 
    401                                     //レジスタ資源を復元
    402                                     RESTORE_REGISTER_RESOURCE
    403 
    404                                     goto error;
     795                            SetError(38,term,cp);
     796
     797                            goto error;
     798                        }
     799
     800                        type_stack[sp] = resultType.GetBasicType();
     801                        index_stack[sp] = resultType.GetIndex();
     802
     803                        if( !isLiteral ){
     804                            bLiteralCalculation=0;
     805                        }
     806
     807                        if( resultType.GetBasicType() & FLAG_CAST ){
     808                            // 型名のみ
     809                            SetError();
     810                        }
     811                        else{
     812                            if( resultType.IsReal() == false && UseReg==REG_R14 ){
     813                                //mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
     814                                pobj_sf->push(REG_R14);
     815                            }
     816                            if( resultType.IsReal() && XmmReg==REG_XMM4 ){
     817                                if(resultType.IsDouble()){
     818                                    //movsd qword ptr[rsp+offset],xmm4  ※スタックフレームを利用
     819                                    pobj_sf->push(REG_XMM4,sizeof(double));
    405820                                }
    406 
    407 
    408                                 /////////////////////
    409                                 // 戻り値の処理
    410                                 /////////////////////
    411 
    412                                 //大きな型への暗黙の変換
    413                                 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
    414                                 index_stack[sp] = resultType.GetIndex();
    415                                 bLiteralCalculation=0;
    416 
    417                                 if( type_stack[sp] != resultType.GetBasicType() ){
    418                                     // 大きな型へ変換された場合
    419                                     // ※レジスタの値をキャストする
    420                                     ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );
     821                                if(resultType.IsSingle()){
     822                                    //movss dword ptr[rsp+offset],xmm4  ※スタックフレームを利用
     823                                    pobj_sf->push(REG_XMM4,sizeof(float));
    421824                                }
    422 
    423                                 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
    424 
    425                                 if(resultType.IsReal()) bXmm=1;
    426                                 else bXmm=0;
    427 
    428                             /////////////////////////////////////////////
    429                             //////   レジスタ資源を復元
    430                                 RESTORE_REGISTER_RESOURCE
    431                             }////////////////////////////////////////////
    432 
    433 
    434                             if(bXmm) pobj_reg->LockXmmReg();
    435                             else pobj_reg->LockReg();
    436 
    437                             if(resultType.IsStruct()){
    438                                 //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    439                                 //※後にfreeする必要あり
    440                                 bUseHeap[sp]=1;
    441825                            }
    442826
    443                             sp++;
    444                             break;
    445                         }
    446                         else if(GetConstCalcBuffer(temporary,temp2,temp3)){
    447                             /////////////////////////
    448                             // マクロ関数
    449                             /////////////////////////
    450 
    451                             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    452                             if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
    453 
    454                             //マクロ関数の場合
    455                             NumOpe(&UseReg,temp3,Type(),resultType);
    456 
    457                             if(!IS_LITERAL(resultType.GetIndex())){
    458                                 //リテラル値ではなかったとき
    459                                 bLiteralCalculation=0;
     827                            if( resultType.IsReal() ){
     828                                pobj_reg->LockXmmReg();
    460829                            }
    461 
    462                             type_stack[sp] = resultType.GetBasicType();
    463                             index_stack[sp] = resultType.GetIndex();
    464 
    465                             if(resultType.IsReal()) pobj_reg->LockXmmReg();
    466                             else pobj_reg->LockReg();
    467 
    468                             sp++;
    469                             break;
    470                         }
    471                     }
    472 NonProc:
    473 
    474 
    475                     //インデクサ(getアクセサ)
    476                     char variable[VN_SIZE],array_element[VN_SIZE];
    477                     GetArrayElement(term,variable,array_element);
    478                     if(array_element[0]){
    479                         Type resultType;
    480                         GetVarType(variable,resultType,0);
    481                         if( resultType.IsObject() ){
    482                             CallIndexerGetterProc(UseReg,&resultType.GetClass(),variable,array_element,resultType);
    483                             type_stack[sp]=resultType.GetBasicType();
    484                             index_stack[sp]=resultType.GetIndex();
    485                             bLiteralCalculation=0;
    486 
    487                             if(resultType.IsReal()) pobj_reg->LockXmmReg();
    488                             else pobj_reg->LockReg();
    489                             sp++;
    490                             break;
    491                         }
     830                            else{
     831                                pobj_reg->LockReg();
     832                            }
     833                        }
     834
     835                        sp++;
     836                        break;
    492837                    }
    493838
     
    516861
    517862                        pobj_reg->LockReg();
    518                         sp++;
    519                         break;
    520                     }
    521 
    522 
    523                     RELATIVE_VAR RelativeVar;
    524                     Type varType;
    525                     if(GetVarOffset(
    526                         false,  //エラー表示あり
    527                         false,  //読み込み専用
    528                         term,
    529                         &RelativeVar,varType)){
    530                         //////////
    531                         // 変数
    532                         //////////
    533 
    534                         //大きな型への暗黙の変換
    535                         type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());
    536                         index_stack[sp] = varType.GetIndex();
    537                         bLiteralCalculation=0;
    538 
    539                         if(varType.GetBasicType()&FLAG_PTR){
    540                             //配列ポインタ
    541                             type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);
    542 
    543                             SetVarPtrToReg(UseReg,&RelativeVar);
    544                         }
    545                         else if(varType.IsReal()){
    546                             //実数型
    547                             bXmm=1;
    548 
    549                             if( varType.IsDouble() )
    550                                 SetXmmReg_DoubleVariable(&RelativeVar,XmmReg);
    551                             if( varType.IsSingle() )
    552                                 SetXmmReg_SingleVariable(&RelativeVar,XmmReg);
    553                         }
    554                         else if( varType.IsWhole() || varType.IsObject()){
    555                             //整数型
    556                             SetReg_WholeVariable(varType.GetBasicType(),&RelativeVar,UseReg);
    557                         }
    558                         else if( varType.IsStruct() ){
    559                             //構造体ポインタをUseRegへ格納(構造体は値型)
    560                             SetVarPtrToReg(UseReg,&RelativeVar);
    561                         }
    562                         else SetError(11,term,cp);
    563 
    564                         if( type_stack[sp] != varType.GetBasicType() ){
    565                             // 大きな型へ変換された場合
    566                             // ※レジスタの値をキャストする
    567                             ExtendRegToBigType( UseReg, type_stack[sp], varType.GetBasicType() );
    568                         }
    569 
    570                         if(bXmm==0&&UseReg==REG_R14){
    571                             //mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
    572                             pobj_sf->push(REG_R14);
    573                         }
    574                         if(bXmm&&XmmReg==REG_XMM4){
    575                             if(varType.IsDouble()){
    576                                 //movsd qword ptr[rsp+offset],xmm4  ※スタックフレームを利用
    577                                 pobj_sf->push(REG_XMM4,sizeof(double));
    578                             }
    579                             if(varType.IsSingle()){
    580                                 //movss dword ptr[rsp+offset],xmm4  ※スタックフレームを利用
    581                                 pobj_sf->push(REG_XMM4,sizeof(float));
    582                             }
    583                         }
    584 
    585                         if(bXmm) pobj_reg->LockXmmReg();
    586                         else pobj_reg->LockReg();
    587863                        sp++;
    588864                        break;
     
    622898                        }
    623899                    }
    624 
    625 
    626                     //////////////
    627                     // 型名の場合
    628                     //////////////
    629                     Type tempType;
    630                     if( Type::StringToType( term, tempType ) ){
    631                         type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;
    632                         index_stack[sp] = tempType.GetIndex();
    633                         sp++;
    634                         break;
    635                     }
    636 
    637 
    638                     /////////////////////////////////
    639                     // プロパティ用のメソッド
    640                     /////////////////////////////////
    641 
    642                     //配列要素を排除
    643                     char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    644                     GetArrayElement(term,VarName,ArrayElements);
    645 
    646                     if(GetSubHash(VarName,0)){
    647 
    648                         //////////////////////////////////////////////////////
    649                         /////    レジスタ資源のバックアップ
    650                         {   BACKUP_REGISTER_RESOURCE
    651                         //////////////////////////////////////////////////////
    652 
    653                             Type resultType;
    654                             CallPropertyMethod(term,NULL,resultType);
    655 
    656                             //大きな型への暗黙の変換
    657                             type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
    658                             index_stack[sp]=resultType.GetIndex();
    659                             bLiteralCalculation=0;
    660 
    661                             if( type_stack[sp] != resultType.GetBasicType() ){
    662                                 // 大きな型へ変換された場合
    663                                 // ※レジスタの値をキャストする
    664                                 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );
    665                             }
    666 
    667                             SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
    668 
    669                             if(IsRealNumberType(type_stack[sp])) bXmm=1;
    670                             else bXmm=0;
    671 
    672                         /////////////////////////////////////////////
    673                         //////   レジスタ資源を復元
    674                             RESTORE_REGISTER_RESOURCE
    675                         }////////////////////////////////////////////
    676 
    677                         if(type_stack[sp]==DEF_STRUCT){
    678                             //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    679                             //※後にfreeする必要あり
    680                             bUseHeap[sp]=1;
    681                         }
    682 
    683                         if(bXmm) pobj_reg->LockXmmReg();
    684                         else pobj_reg->LockReg();
    685                         sp++;
    686                         break;
    687                     }
    688 
    689900
    690901
     
    735946
    736947                        if(XmmReg==REG_XMM4){
     948                            SetError();     // TODO: 未実装
    737949                            //push term
    738950                            op_push_value(i32data);
  • BasicCompiler64/Opcode.h

    r95 r97  
    315315
    316316//Compile_Var.cpp
    317 void GetWithName(char *buffer);
     317bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
    318318void SetThisPtrToReg(int reg);
    319319bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL);
Note: See TracChangeset for help on using the changeset viewer.