Changeset 111 in dev


Ignore:
Timestamp:
May 7, 2007, 2:41:36 AM (18 years ago)
Author:
dai_9181
Message:

ObjPtr(This)がエラーになるバグを修正。
オーバーロードのチェックレベルを一つ増やした(整数型のサイズ照合によるオーバーロードチェックを可能にした)。

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Func.cpp

    r110 r111  
    22#include "Opcode.h"
    33
    4 int GetFunctionType(int FuncNum){
    5     switch(FuncNum){
    6         case FUNC_CUDBL:
    7             return DEF_DOUBLE;
    8         case FUNC_FIX:
    9         case FUNC_LEN:
    10             return DEF_LONG;
    11         case FUNC_ADDRESSOF:
    12         case FUNC_SIZEOF:
    13         case FUNC_VARPTR:
    14         case FUNC_OBJPTR:
    15             return DEF_DWORD;
    16         case FUNC_GETDOUBLE:
    17             return DEF_DOUBLE;
    18         case FUNC_GETSINGLE:
    19             return DEF_SINGLE;
    20         case FUNC_GETQWORD:
    21             return DEF_QWORD;
    22         case FUNC_GETDWORD:
    23             return DEF_DWORD;
    24         case FUNC_GETWORD:
    25             return DEF_WORD;
    26         case FUNC_GETBYTE:
    27             return DEF_BYTE;
    28     }
    29     return 0;
    30 }
    314int GetFunctionFromName(char *FuncName){
    325    if(lstrcmpi(FuncName,"CUDbl")==0)       return FUNC_CUDBL;
     
    411384    SetVarPtrToEax(&RelativeVar);
    412385
    413     if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     386    if( lstrcmpi( Parameter, "This" )==0 ){
     387        // Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
     388    }
     389    else if( beforeType == DEF_OBJECT ){
    414390        //参照をオブジェクトポインタに変更
    415391
  • BasicCompiler32/Opcode.h

    r97 r111  
    250250
    251251//Compile_Func.cpp
    252 int GetFunctionType(int FuncNum);
    253252int GetFunctionFromName(char *FuncName);
    254253bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &resultType, bool isCallOn = true );
  • BasicCompiler64/Compile_Func.cpp

    r109 r111  
    22#include "Opcode.h"
    33
    4 int GetFunctionType(int FuncNum){
    5     switch(FuncNum){
    6         case FUNC_LEN:
    7             return DEF_LONG;
    8         case FUNC_SIZEOF:
    9             return DEF_LONG;
    10         case FUNC_ADDRESSOF:
    11         case FUNC_VARPTR:
    12         case FUNC_OBJPTR:
    13             return DEF_PTR_VOID;
    14         case FUNC_GETDOUBLE:
    15             return DEF_DOUBLE;
    16         case FUNC_GETSINGLE:
    17             return DEF_SINGLE;
    18         case FUNC_GETQWORD:
    19             return DEF_QWORD;
    20         case FUNC_GETDWORD:
    21             return DEF_DWORD;
    22         case FUNC_GETWORD:
    23             return DEF_WORD;
    24         case FUNC_GETBYTE:
    25             return DEF_BYTE;
    26     }
    27     return 0;
    28 }
    294int GetFunctionFromName(char *FuncName){
    305    if(lstrcmpi(FuncName,"Len")==0)         return FUNC_LEN;
     
    229204        //mov rax,qword ptr[rax]
    230205        op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     206
     207        SetError(-120,NULL,cp);
    231208    }
    232209}
     
    254231    SetVarPtrToReg(REG_RAX,&RelativeVar);
    255232
    256     if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     233    if( lstrcmpi( Parameter, "This" )==0 ){
     234        // Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
     235    }
     236    else if( beforeType == DEF_OBJECT ){
    257237        //参照をオブジェクトポインタに変更
    258238
  • BasicCompiler64/Opcode.h

    r97 r111  
    389389
    390390//Compile_Func.cpp
    391 int GetFunctionType(int FuncNum);
    392391int GetFunctionFromName(char *FuncName);
    393392bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo, bool isCallOn = true );
  • BasicCompiler_Common/ParamImpl.cpp

    r100 r111  
    88
    99#define OVERLOAD_MIN_LEVEL 0
    10 #define OVERLOAD_MAX_LEVEL 5
     10#define OVERLOAD_MAX_LEVEL 6
    1111#define OVERLOAD_LEVEL0 0       // 型調整なし。厳密に等しい
    1212#define OVERLOAD_LEVEL1 1       // 型調整なし。レベル1以上はオブジェクトの場合は派生関係を考慮
    13 #define OVERLOAD_LEVEL2 2       // 型調整なし。整数型/実数型レベルでの同一性チェック
    14 #define OVERLOAD_LEVEL3 3       // 型調整あり。厳密に等しい
    15 #define OVERLOAD_LEVEL4 4       // 型調整あり。整数型/実数型レベルでの同一性チェック
    16 #define OVERLOAD_LEVEL5 5       // 型調整あり。数値型/クラス型レベルでの同一性チェック
     13#define OVERLOAD_LEVEL2 2       // 型調整なし。整数型/実数型レベルでの同一性チェック(サイズ照合あり)
     14#define OVERLOAD_LEVEL3 3       // 型調整なし。整数型/実数型レベルでの同一性チェック
     15#define OVERLOAD_LEVEL4 4       // 型調整あり。厳密に等しい
     16#define OVERLOAD_LEVEL5 5       // 型調整あり。整数型/実数型レベルでの同一性チェック
     17#define OVERLOAD_LEVEL6 6       // 型調整あり。数値型/クラス型レベルでの同一性チェック
    1718
    1819ParamImpl::ParamImpl(const char *buffer):
     
    128129
    129130            NumOpe_GetType(Parms[i],
    130                 ( level <= OVERLOAD_LEVEL2 )? nullParam : param,
     131                ( level <= OVERLOAD_LEVEL3 )? nullParam : param,
    131132                argType);
    132133        }
     
    136137
    137138        if(argType.GetBasicType()!=param.GetBasicType()){
    138             if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL3 ){
     139            if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL4 ){
    139140                return false;
    140141            }
    141             else if( level == OVERLOAD_LEVEL2 || level==OVERLOAD_LEVEL4){
     142            else if( level == OVERLOAD_LEVEL2 ){
     143                if( !(argType.IsWhole() && param.IsWhole() && argType.GetBasicSize() == param.GetBasicSize() ) ){
     144                    // サイズ違い
     145                    return false;
     146                }
     147            }
     148            else if( level == OVERLOAD_LEVEL3 || level==OVERLOAD_LEVEL5){
    142149                if(!(
    143150                    argType.IsWhole()&&param.IsWhole()||
     
    147154                }
    148155            }
    149             else if(level==OVERLOAD_LEVEL5){
     156            else if(level==OVERLOAD_LEVEL6){
    150157                if(argType.IsObject()||param.IsObject()) return false;
    151158            }
Note: See TracChangeset for help on using the changeset viewer.