Ignore:
Timestamp:
Feb 10, 2007, 6:13:37 AM (17 years ago)
Author:
dai_9181
Message:

戻り値オブジェクトのメンバを直接的に参照できるようにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r41 r49  
    327327                index_stack[sp]=-1;
    328328
    329                 if(values[i][0]=='\"'){
     329                char *term;
     330                term = values[i];
     331
     332                if(term[0]=='\"'){
    330333StrLiteral:
    331334
     
    349352                    bLiteralCalculation=0;
    350353                }
    351                 else if((values[i][0]=='e'||values[i][0]=='E')&&
    352                     (values[i][1]=='x'||values[i][1]=='X')&&
    353                     values[i][2]=='\"'){
     354                else if((term[0]=='e'||term[0]=='E')&&
     355                    (term[1]=='x'||term[1]=='X')&&
     356                    term[2]=='\"'){
    354357                    //拡張版リテラル文字列(エスケープシーケンス可能)
    355358                    goto StrLiteral;
    356359                }
    357                 else if(IsVariableTopChar(values[i][0])||
    358                     values[i][0]=='*'||
    359                     (values[i][0]=='.'&&IsVariableTopChar(values[i][1]))){
     360                else if(IsVariableTopChar(term[0])||
     361                    term[0]=='*'||
     362                    (term[0]=='.'&&IsVariableTopChar(term[1]))){
    360363                    //////////////////
    361364                    // 何らかの識別子
     
    365368                    //////////////////////////////////////
    366369
    367                     i2=GetCallProcName(values[i],temporary);
    368                     if(values[i][i2]=='('){
    369                         i4=GetStringInPare_RemovePare(temp2,values[i]+i2+1);
     370                    i2=GetCallProcName(term,temporary);
     371                    if(term[i2]=='('){
     372                        i4=GetStringInPare_RemovePare(temp2,term+i2+1);
    370373
    371374                        int idProc;
     
    374377
    375378                        if(idProc){
    376                             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    377                             if(values[i][i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     379                            //閉じカッコ")"に続く文字がNULLでないとき
     380                            if(term[i2+1+i4+1]!='\0'){
     381                                if( term[i2+1+i4+1] == '.'
     382                                    || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){
     383                                        goto NonProc;
     384                                }
     385                                else{
     386                                    SetError(42,NULL,cp);
     387                                }
     388                            }
    378389
    379390
     
    400411
    401412                            //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    402                             if(values[i][i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     413                            if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
    403414
    404415                            //マクロ関数の場合
     
    416427                        }
    417428                    }
    418 
     429NonProc:
    419430
    420431                    //インデクサ(getアクセサ)
    421432                    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    422                     GetArrayElement(values[i],VarName,ArrayElements);
     433                    GetArrayElement(term,VarName,ArrayElements);
    423434                    if(ArrayElements[0]){
    424435                        CClass *pobj_c;
     
    440451
    441452
    442                     i2=GetVarType(values[i],&index_stack[sp],0);
     453                    i2=GetVarType(term,&index_stack[sp],0);
    443454                    if(i2!=-1){
    444455                        //////////
     
    457468                    //////////////
    458469
    459                     i3 = CDBConst::obj.GetType(values[i]);
     470                    i3 = CDBConst::obj.GetType(term);
    460471                    if(i3){
    461472                        type[sp]=i3;
     
    488499
    489500                    LONG_PTR lp;
    490                     i3=GetTypeFixed(values[i],&lp);
     501                    i3=GetTypeFixed(term,&lp);
    491502                    if(i3!=-1){
    492503                        type[sp]=i3|FLAG_CAST;
     
    503514
    504515                    //配列要素を排除
    505                     GetArrayElement(values[i],VarName,ArrayElements);
     516                    GetArrayElement(term,VarName,ArrayElements);
    506517
    507518                    if(GetSubHash(VarName,0)){
    508519                        TYPEINFO RetTypeInfo;
    509                         GetReturnTypeOfPropertyMethod(values[i],NULL,&RetTypeInfo);
     520                        GetReturnTypeOfPropertyMethod(term,NULL,&RetTypeInfo);
    510521
    511522                        //大きな型への暗黙の変換
     
    523534                    //該当する識別子が見当たらないときはエラー扱いにする
    524535                    bError=1;
    525                     SetError(3,values[i],cp);
     536                    SetError(3,term,cp);
    526537                    type[sp]=DEF_DOUBLE;
    527538                }
     
    531542                    base_type=0;
    532543                    if(pBaseType) base_type=pBaseType->type;
    533                     type[sp]=GetLiteralValue(values[i],&i64data,base_type);
     544                    type[sp]=GetLiteralValue(term,&i64data,base_type);
    534545Literal:
    535546                    if((long)i64data==0&&index_stack[sp]==-1) index_stack[sp]=LITERAL_NULL;
Note: See TracChangeset for help on using the changeset viewer.