Changeset 687 in dev for trunk


Ignore:
Timestamp:
Jul 13, 2008, 2:56:09 PM (16 years ago)
Author:
dai_9181
Message:

VarPtr(This)をエラーとして扱うようにした。
・デリゲート生成時にThisに対するオブジェクトポインタが正常に取得できないバグを修正。

Location:
trunk/ab5.0/abdev
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Messenger.cpp

    r664 r687  
    250250    if(errorCode==142) lstrcpy(msg,"不正なThis参照です。");
    251251    if(errorCode==143) sprintf(msg,"\"%s\" ジェネリクス型に型パラメータが指定されていません。",tempKeyWord);
     252    if(errorCode==144) sprintf(msg,"Thisの変数ポインタを取得することはできません。",tempKeyWord);
    252253
    253254    //Enum関連
  • trunk/ab5.0/abdev/compiler_x64/Compile_Func.cpp

    r672 r687  
    77
    88#include "FunctionValue.h"
     9
     10void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn, int resultReg = REG_RAX );
    911
    1012int GetFunctionFromName(char *FuncName){
     
    239241        }
    240242
    241         // オブジェクト ポインタを取得
    242         RELATIVE_VAR relativeVar;
    243         GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
    244         if( !type.IsObject() )
    245         {
    246             extern int cp;
    247             compiler.errorMessenger.Output(1,NULL,cp);
    248             return;
    249         }
    250 
    251         SetVarPtrToReg( REG_RAX, &relativeVar );
    252 
    253         //mov rcx,dword ptr[rax]
    254         compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RCX, REG_RAX, 0, MOD_BASE );
     243        // オブジェクト ポインタをrcxに取得
     244        Opcode_Func_ObjPtr( thisPtrName, type, true, REG_RCX );
    255245
    256246        pobj_BlockReg->unlock( REG_RDX );
     
    419409    }
    420410
     411    if( lstrcmpi( Parameter, "This" )==0 )
     412    {
     413        compiler.errorMessenger.Output( 144, "", cp );
     414    }
     415
    421416    RELATIVE_VAR RelativeVar;
    422417
     
    441436    }*/
    442437}
    443 void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
     438void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn, int resultReg ){
    444439    if( isCallOn == false ){
    445440        // 戻り値の型を取得するだけ
     
    462457    resultType.PtrLevelUp();
    463458
    464     SetVarPtrToReg(REG_RAX,&RelativeVar);
     459    SetVarPtrToReg(resultReg,&RelativeVar);
    465460
    466461    if( lstrcmpi( Parameter, "This" )==0 ){
     
    470465        //参照をオブジェクトポインタに変更
    471466
    472         //mov rax,qword ptr[rax]
    473         compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     467        //mov resultReg,qword ptr[resultReg]
     468        compiler.codeGenerator.op_mov_RM( sizeof(_int64), resultReg, resultReg, 0, MOD_BASE );
    474469    }
    475470    else{
  • trunk/ab5.0/abdev/compiler_x86/Compile_CallProc.cpp

    r598 r687  
    552552
    553553        // 参照を実体ポインタにする
     554        //mov ecx,dword ptr[eax]
    554555        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    555556
  • trunk/ab5.0/abdev/compiler_x86/Compile_Func.cpp

    r672 r687  
    77
    88#include "FunctionValue.h"
     9
     10void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn );
    911
    1012int GetFunctionFromName(char *FuncName){
     
    392394
    393395        // オブジェクト ポインタを取得
    394         RELATIVE_VAR relativeVar;
    395         GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
    396         if( !type.IsObject() )
    397         {
    398             extern int cp;
    399             compiler.errorMessenger.Output(1,NULL,cp);
    400             return;
    401         }
    402 
    403         SetVarPtrToEax( &relativeVar );
    404 
    405         //mov eax,dword ptr[eax]
    406         compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     396        Opcode_Func_ObjPtr( thisPtrName, type, true );
    407397
    408398        //push eax
     
    553543    compiler.codeGenerator.op_mov_RV( REG_EAX, tempType.GetClass().GetSize() );
    554544}
    555 void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
    556     if( isCallOn == false ){
     545void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn )
     546{
     547    if( isCallOn == false )
     548    {
    557549        // 戻り値の型を取得するだけ
    558550
     
    563555
    564556        return;
     557    }
     558
     559    if( lstrcmpi( Parameter, "This" )==0 )
     560    {
     561        compiler.errorMessenger.Output( 144, "", cp );
    565562    }
    566563
Note: See TracChangeset for help on using the changeset viewer.