Ignore:
Timestamp:
May 13, 2007, 1:50:02 PM (17 years ago)
Author:
dai_9181
Message:

(呼び出し単体コードも対応→)関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Statement.cpp

    r88 r122  
    44void OpcodeOthers(char *Command){
    55    int i,i2;
    6     char buffer[8192];
    76    UserProc *pUserProc;
    87
     8    char leftTerm[8192];
     9    int lastParePos = 0;
    910    for(i=0;;i++){
    10         if(Command[i]=='['){
    11             i2=GetStringInBracket(buffer+i,Command+i);
     11        if(Command[i]=='\"'){
     12            //ダブルクォートは不正なのでエラー扱い
     13            leftTerm[i]=0;
     14            SetError(3,leftTerm,cp);
     15            return;
     16        }
     17
     18        if(Command[i]=='('){
     19            lastParePos = i;
     20            i2=GetStringInPare(leftTerm+i,Command+i);
    1221            i+=i2-1;
    1322            continue;
    1423        }
    15         if(Command[i]==1&&Command[i+1]==ESC_PSMEM){
    16             buffer[i]=Command[i];
    17             i++;
    18             buffer[i]=Command[i];
     24        if(Command[i]=='['){
     25            i2=GetStringInBracket(leftTerm+i,Command+i);
     26            i+=i2-1;
    1927            continue;
    2028        }
    21         if(!IsVariableChar(Command[i])){
    22             buffer[i]=0;
     29        if(Command[i]=='\0'){
     30            leftTerm[i] = 0;
    2331            break;
    2432        }
    25         buffer[i]=Command[i];
    26     }
    27 
     33
     34        if( IsNumCalcMark( Command, i ) ){
     35            leftTerm[i] = 0;
     36            break;
     37        }
     38
     39        leftTerm[i]=Command[i];
     40    }
    2841    if(!(
    29         IsVariableTopChar(buffer[0])||
    30         buffer[0]=='.'||
    31         (buffer[0]==1&&buffer[1]==ESC_PSMEM)
     42        IsVariableTopChar(leftTerm[0])||
     43        leftTerm[0]=='.'||
     44        (leftTerm[0]==1&&leftTerm[1]==ESC_PSMEM)
    3245        )){
    3346        SetError(1,NULL,cp);
     
    3649
    3750
    38     if(Command[i]=='\0'){
     51    if(Command[i]=='\0' && lastParePos == 0){
    3952        //////////////////////////////
    4053        // パラメータ無しのマクロ検索
     
    5871
    5972        if(pUserProc){
    60             if( !pUserProc->IsMacro() ) SetError(10,Command,cp);
     73            if( !pUserProc->IsMacro() ){
     74                SetError(10,Command,cp);
     75            }
    6176
    6277            Opcode_CallProc("",pUserProc,0,"",0);
     
    7186    }
    7287
    73     int idProc;
    74     void *pProc;
    75     idProc=GetProc(buffer,(void **)&pProc);
    76 
    77     int i4;
    78     char temp2[VN_SIZE];
    79     if(idProc){
    80         if(Command[i]!='('){
    81             SetError(10,buffer,cp);
    82             return;
    83         }
    84         i4=GetStringInPare_RemovePare(temp2,Command+i+1);
    85 
    86         //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    87         if(Command[i+1+i4+1]!='\0') SetError(42,NULL,cp);
    88 
    89         ////////////////
    90         // 呼び出し
    91         ////////////////
    92 
    93         Type resultType;
    94         CallProc(idProc,pProc,buffer,temp2,resultType);
    95 
     88
     89    Type resultType;
     90    bool isLiteral;
     91    BOOL bUseHeap;
     92    bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, NULL, true );
     93
     94    if( result ){
    9695
    9796        /////////////////////
     
    110109            FreeTempObject(REG_EBX,&resultType.GetClass());
    111110        }
     111
     112        //成功
    112113        return;
    113114    }
    114115
    115 
    116     //////////////////////////
    117     // その他は代入演算を行う
    118     //////////////////////////
    119     OpcodeCalc(Command);
     116    // 失敗
     117    SetError(1, NULL,cp);
    120118}
    121119
Note: See TracChangeset for help on using the changeset viewer.