source: dev/trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp @ 463

Last change on this file since 463 was 463, checked in by dai_9181, 16 years ago

[461]を64bit版にマージ。

File size: 18.7 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
8#ifdef _AMD64_
9#include "../BasicCompiler64/FunctionValue.h"
10#else
11#include "../BasicCompiler32/FunctionValue.h"
12#endif
13
14int GetFunctionFromName(char *FuncName){
15    if( lstrcmpi( FuncName, "Len" ) == 0 )              return FUNC_LEN;
16    if( lstrcmpi( FuncName, "AddressOf" ) == 0 )        return FUNC_ADDRESSOF;
17    if( lstrcmpi( FuncName, "SizeOf" ) == 0 )           return FUNC_SIZEOF;
18    if( lstrcmpi( FuncName, "VarPtr" ) == 0 )           return FUNC_VARPTR;
19    if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )           return FUNC_OBJPTR;
20    if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )    return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
21    if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )     return FUNC_DELEGATE_STATICMETHOD_CALL;
22    if( lstrcmpi( FuncName, "_System_GetNowScopeCatchAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS;
23    if( lstrcmpi( FuncName, "_System_GetNowScopeFinallyAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS;
24    if( lstrcmpi( FuncName, "_System_GetBp" ) == 0 )    return FUNC_SYSTEM_GET_BP;
25    if( lstrcmpi( FuncName, "_System_GetSp" ) == 0 )    return FUNC_SYSTEM_GET_SP;
26    if( lstrcmp( FuncName, "_System_GetComVtbl" ) == 0 )        return FUNC_SYSTEM_GET_COM_VTBL;
27    if( lstrcmp( FuncName, "_System_GetVtblList" ) == 0 )       return FUNC_SYSTEM_GET_VTBL_LIST;
28    if( lstrcmp( FuncName, "_System_GetDefaultConstructor" ) == 0 ) return FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR;
29    if( lstrcmp( FuncName, "_System_GetDestructor" ) == 0 )         return FUNC_SYSTEM_GET_DESTRUCTOR;
30    if( lstrcmpi( FuncName, "GetDouble" ) == 0 )        return FUNC_GETDOUBLE;
31    if( lstrcmpi( FuncName, "GetSingle" ) == 0 )        return FUNC_GETSINGLE;
32    if( lstrcmpi( FuncName, "GetQWord" ) == 0 )         return FUNC_GETQWORD;
33    if( lstrcmpi( FuncName, "GetDWord" ) == 0 )         return FUNC_GETDWORD;
34    if( lstrcmpi( FuncName, "GetWord" ) == 0 )          return FUNC_GETWORD;
35    if( lstrcmpi( FuncName, "GetByte" ) == 0 )          return FUNC_GETBYTE;
36    return 0;
37}
38void Opcode_Func_Len( const char *Parameter ){
39    BOOL bArrayHead;
40
41    const char *tempParm=Parameter;
42    char temporary[VN_SIZE];
43    char temp2[32];
44    Type type;
45    if( !GetVarType(Parameter,type,0) ){
46        sprintf(temporary,"_System_DummyStr2=%s",Parameter);
47        OpcodeCalc(temporary);
48
49        lstrcpy(temp2,"_System_DummyStr2");
50        tempParm=temp2;
51
52        type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
53    }
54
55    if( type.IsStringClass() ){
56        //Stringオブジェクトの場合
57        sprintf(temporary,"%s.Length",tempParm);
58
59        int reg=REG_RAX;
60        NumOpe(&reg,temporary,Type(),Type());
61        return;
62    }
63
64    Subscripts subscripts;
65    RELATIVE_VAR RelativeVar;
66    if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,&subscripts)) return;
67
68    if(type.GetBasicType()&FLAG_PTR){
69        type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
70
71        bArrayHead=1;
72    }
73    else bArrayHead=0;
74
75    int typeSize = type.GetSize();
76
77    if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
78
79    //mov rax,TypeSize
80    compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
81
82    return;
83}
84
85void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
86{
87    if( userProc.IsVirtual() )
88    {
89        ///////////////////////////////
90        // 仮想関数の場合
91        // thisポインタをrcxにコピー
92        ///////////////////////////////
93
94        const CClass *pobj_c;
95
96        char ObjectName[VN_SIZE];
97        ReferenceKind referenceKind;
98        SplitObjectName(methodInstanceName,ObjectName, referenceKind );
99
100        if(ObjectName[0]){
101            if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
102            else{
103                RELATIVE_VAR RelativeVar;
104                Type type;
105                if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
106                SetVarPtrToReg(REG_RCX,&RelativeVar);
107
108                //参照タイプが整合しているかをチェック
109                if( !( type.IsObject() && referenceKind == RefDot
110                    || type.IsObjectPtr() && referenceKind == RefPointer ) )
111                {
112                    SetError(104,ObjectName,cp);
113                }
114
115                if(type.IsObjectPtr()){
116                    //mov rcx,qword ptr[rcx]
117                    compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
118                }
119            }
120        }
121        else{
122InClassMember:
123            //自身のオブジェクトのThisポインタをrcxにコピー
124            SetThisPtrToReg(REG_RCX);
125
126            pobj_c=compiler.pCompilingClass;
127        }
128
129
130        int vtblIndex;
131        if( pobj_c->IsInterface() )
132        {
133            // インターフェイスメソッド
134
135            int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
136
137            // vtblのポインタを取得
138            //mov r11,qword ptr[rcx+offset_vtbl]
139            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8);
140
141            int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
142
143            // インターフェイスの場合は更に__thisを取得する
144            //mov rcx,qword ptr[rcx+offset_this]
145            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8);
146
147            int vtblMasterListIndex;
148            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
149            if( vtblMasterListIndex != 0 )
150            {
151                SetError();
152            }
153        }
154        else if( pobj_c->IsComInterface() )
155        {
156            //仮想関数(オブジェクトメソッド)
157            // pObj -> vtbl1 -> func1
158            //               -> func2
159            //               -> func3
160
161            int vtblMasterListIndex;
162            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
163
164            // vtblのポインタを取得
165            //mov r11,qword ptr[rcx]
166            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
167        }
168        else
169        {
170            //仮想関数(オブジェクトメソッド)
171            // pObj -> vtbl_master_list -> vtbl1 -> func1
172            //                                   -> func2
173            //                                   -> func3
174            //                          -> vtbl2 -> func1
175            //                                   -> func2
176            //                                   -> func3
177
178            int vtblMasterListIndex;
179            pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
180
181            // vtblマスターリストのポインタを取得
182            //mov r11,qword ptr[rcx+sizeof(com_vtbl)]
183            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8);
184
185            // vtblのポインタを取得
186            //mov r11,dword ptr[r11+vtblMasterListIndex]
187            compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
188        }
189
190        //mov rax,qword ptr[r11+func_index]
191        if( vtblIndex * PTR_SIZE <= 0x7F )
192        {
193            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP8);
194        }
195        else
196        {
197            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
198        }
199    }
200    else{
201        //一般の関数
202
203        //mov rax,ProcAddr
204        compiler.codeGenerator.op_addressof( REG_RAX, &userProc );
205    }
206
207    userProc.Using();
208}
209void Opcode_CreateDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc )
210{
211    /////////////////////////////////////////////////////////////////
212    // 関数ポインタをpush
213    /////////////////////////////////////////////////////////////////
214
215    //mov rax,AddressOf
216    _Opcode_Func_AddressOf( methodInstanceName, userProc );
217
218
219    if( userProc.GetMethod().IsDynamic() )
220    {
221        //mov rdx,rax
222        compiler.codeGenerator.op_mov_RR( REG_RDX, REG_RAX );
223
224        pobj_BlockReg->lock( REG_RDX );
225
226
227        /////////////////////////////////////////////////////////////////
228        // オブジェクト ポインタをpush
229        /////////////////////////////////////////////////////////////////
230
231        // オブジェクト名を取得
232        char objectName[VN_SIZE];
233        char memberName[VN_SIZE];
234        char *thisPtrName = "This";
235        Type type;
236        if( SplitMemberName( methodInstanceName, objectName, memberName ) )
237        {
238            if( GetVarType( objectName, type, false ) )
239            {
240                thisPtrName = objectName;
241            }
242        }
243
244        // オブジェクト ポインタを取得
245        RELATIVE_VAR relativeVar;
246        GetVarOffsetReadOnly( thisPtrName, &relativeVar, type );
247        if( !type.IsObject() )
248        {
249            extern int cp;
250            SetError(1,NULL,cp);
251            return;
252        }
253
254        SetVarPtrToReg( REG_RAX, &relativeVar );
255
256        //mov rcx,dword ptr[rax]
257        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RCX, REG_RAX, 0, MOD_BASE );
258
259        pobj_BlockReg->unlock( REG_RDX );
260    }
261    else
262    {
263        //mov rcx,rax
264        compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX );
265    }
266
267
268    /////////////////////////////////////////////////////////////////
269    // call _CreateDynamicDelegate/_CreateStaticDelegate
270    /////////////////////////////////////////////////////////////////
271
272    std::vector<const UserProc *> subs;
273    if( userProc.GetMethod().IsDynamic() )
274    {
275        dgClass.GetStaticMethods().Enum( "_CreateDynamicDelegate", subs );
276    }
277    else
278    {
279        dgClass.GetStaticMethods().Enum( "_CreateStaticDelegate", subs );
280    }
281
282    // call _CreateDynamicDelegate
283    compiler.codeGenerator.op_call( subs[0] );
284}
285void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType )
286{
287    extern int cp;
288
289    const Parameters *pBaseParams = NULL;
290    const Type *pBaseReturnType = NULL;
291    if( baseType.IsProcPtr() )
292    {
293        // 左辺で関数ポインタを要求されているとき
294        const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
295        pBaseParams = &pTempProcPointer->Params();
296        pBaseReturnType = &pTempProcPointer->ReturnType();
297    }
298    else if( baseType.IsDelegate() )
299    {
300        // 左辺でデリゲートを要求されているとき
301        const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
302        pBaseParams = &pTempDelegate->Params();
303        pBaseReturnType = &pTempDelegate->ReturnType();
304    }
305
306    const UserProc *pUserProc;
307    if( pBaseParams && pBaseReturnType )
308    {
309        //左辺の型にのっとり、オーバーロードを解決
310
311        std::vector<const UserProc *> subs;
312        GetOverloadSubHash( name, subs );
313        if( subs.size() == 0 ){
314            SetError(27,name,cp);
315            return;
316        }
317
318        //オーバーロードを解決
319        pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
320
321        if( isCallOn )
322        {
323            // コード生成を伴う場合はエラーチェックを行う
324
325            if( baseType.IsDelegate() )
326            {
327                // デリゲート
328                // 共変戻り値、反変引数をサポート
329                if( !(
330                    pBaseParams->Equals( pUserProc->Params(), true )
331                    && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
332                    ) )
333                {
334                    SetError(67, name, cp );
335                }
336            }
337            else
338            {
339                // 関数ポインタ
340                if( !(
341                    pBaseParams->Equals( pUserProc->Params() )
342                    && pBaseReturnType->Equals( pUserProc->ReturnType() )
343                    ) )
344                {
345                    SetError(66, name, cp );
346                }
347            }
348        }
349
350        if(!pUserProc){
351            SetError(27,name,cp);
352            return;
353        }
354    }
355    else{
356        pUserProc=GetSubHash(name);
357        if(!pUserProc){
358            SetError(27,name,cp);
359            return;
360        }
361    }
362
363    if( baseType.IsDelegate() )
364    {
365        if( isCallOn )
366        {
367            // デリゲートのとき
368            Opcode_CreateDelegate( baseType.GetClass(), name, *pUserProc );
369        }
370        resultType = baseType;
371    }
372    else
373    {
374        if( isCallOn )
375        {
376            // 関数ポインタのとき
377            _Opcode_Func_AddressOf( name, *pUserProc );
378        }
379        resultType.SetBasicType( DEF_PTR_VOID );
380    }
381}
382void Opcode_Func_SizeOf( const string &typeName ){
383    Type tempType;
384    if( !compiler.StringToType( typeName, tempType ) ){
385        SetError(3,typeName,cp);
386        return;
387    }
388
389    int typeSize = ( tempType.IsObject() ) ?
390        tempType.GetClass().GetSize() : tempType.GetSize();
391
392    //mov rax,size
393    compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
394}
395void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
396    if( isCallOn == false ){
397        // 戻り値の型を取得するだけ
398
399        //変数のアドレスを取得
400        if(!GetVarType( Parameter, resultType, true )) return;
401
402        resultType.PtrLevelUp();
403
404        return;
405    }
406
407    RELATIVE_VAR RelativeVar;
408
409    //変数のアドレスを取得
410    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
411
412    int beforeType = resultType.GetBasicType();
413
414    resultType.PtrLevelUp();
415
416    SetVarPtrToReg(REG_RAX,&RelativeVar);
417
418    // TODO: 取り除く(この動きはObjPtrに託す)
419    /*
420    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
421        //参照をオブジェクトポインタに変更
422
423        //mov rax,qword ptr[rax]
424        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
425
426        SetError(-120,NULL,cp);
427    }*/
428}
429void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
430    if( isCallOn == false ){
431        // 戻り値の型を取得するだけ
432
433        //変数のアドレスを取得
434        if(!GetVarType( Parameter, resultType, true )) return;
435
436        resultType.PtrLevelUp();
437
438        return;
439    }
440
441    RELATIVE_VAR RelativeVar;
442
443    //変数のアドレスを取得
444    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
445
446    int beforeType = resultType.GetBasicType();
447
448    resultType.PtrLevelUp();
449
450    SetVarPtrToReg(REG_RAX,&RelativeVar);
451
452    if( lstrcmpi( Parameter, "This" )==0 ){
453        // Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
454    }
455    else if( beforeType == DEF_OBJECT ){
456        //参照をオブジェクトポインタに変更
457
458        //mov rax,qword ptr[rax]
459        compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
460    }
461    else{
462        SetError(134,NULL,cp );
463    }
464}
465
466void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
467{
468    if( isCallOn )
469    {
470        int i = 0;
471        char methodPtrParamStr[VN_SIZE];
472        i = GetOneParameter( paramsStr, i, methodPtrParamStr );
473
474        char objPtrValueStr[VN_SIZE] = "";
475        if( isDynamicCall )
476        {
477            i = GetOneParameter( paramsStr, i, objPtrValueStr );
478        }
479
480        Opcode_CallDelegate( compiler.pCompilingClass->GetDelegate(), methodPtrParamStr, objPtrValueStr, paramsStr + i );
481    }
482
483    resultType = UserProc::CompilingUserProc().ReturnType();
484}
485
486void Opcode_Func_System_Get_Bp()
487{
488    //mov rax,rbp
489    compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RBP);
490}
491void Opcode_Func_System_Get_Sp()
492{
493    //mov rax,rsp
494    compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RSP);
495}
496
497void Opcode_Func_System_GetComVtbl( const char *parameter )
498{
499    Type classType;
500    compiler.StringToType( parameter, classType );
501
502    // mov rax,com_vtbl
503    compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RAX, &classType.GetClass() );
504}
505void Opcode_Func_System_GetVtblList( const char *parameter )
506{
507    Type classType;
508    compiler.StringToType( parameter, classType );
509
510    // mov rax,com_vtbl
511    compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, &classType.GetClass() );
512}
513void Opcode_Func_System_GetDefaultConstructor( const char *parameter )
514{
515    Type classType;
516    compiler.StringToType( parameter, classType );
517
518    if( classType.GetClass().GetConstructorMethod() )
519    {
520        //mov rax,ProcAddr
521        compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetConstructorMethod()->GetUserProc() );
522    }
523    else
524    {
525        // デフォルトコンストラクタを持たない
526
527        //xor rax,rax
528        compiler.codeGenerator.op_zero_reg( REG_RAX );
529    }
530}
531void Opcode_Func_System_GetDestructor( const char *parameter )
532{
533    Type classType;
534    compiler.StringToType( parameter, classType );
535
536    //mov rax,ProcAddr
537    compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetDestructorMethod()->GetUserProc() );
538}
539
540void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
541    int reg=REG_RAX;
542    Type tempType;
543    if( !NumOpe(&reg,Parameter,Type(),tempType) ){
544        return;
545    }
546    if(!tempType.IsWhole()){
547        SetError(11,Parameter,cp);
548        return;
549    }
550
551    if(type==DEF_DOUBLE){
552        //movlpd xmm0,qword ptr[rax]
553        compiler.codeGenerator.op_movlpd_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
554    }
555    else if(type==DEF_SINGLE){
556        //movss xmm0,dword ptr[rax]
557        compiler.codeGenerator.op_movss_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
558    }
559    else{
560        //mov rax,ptr[rax]
561        compiler.codeGenerator.op_mov_RM(Type(type).GetSize(),REG_RAX,REG_RAX,0,MOD_BASE);
562    }
563}
564
565bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn )
566{
567    switch(FuncNum){
568        case FUNC_LEN:
569            if( isCallOn ) Opcode_Func_Len(Parameter);
570            resultType.SetBasicType( DEF_LONG );
571            break;
572        case FUNC_ADDRESSOF:
573            Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
574            break;
575        case FUNC_SIZEOF:
576            if( isCallOn ) Opcode_Func_SizeOf(Parameter);
577            resultType.SetBasicType( DEF_LONG );
578            break;
579        case FUNC_VARPTR:
580            Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
581            break;
582        case FUNC_OBJPTR:
583            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
584            break;
585        case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
586            Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
587            break;
588        case FUNC_DELEGATE_STATICMETHOD_CALL:
589            Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
590            break;
591        case FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS:
592            if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeCatchAddress();
593            resultType.SetBasicType( DEF_PTR_VOID );
594            break;
595        case FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS:
596            if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeFinallyAddress();
597            resultType.SetBasicType( DEF_PTR_VOID );
598            break;
599        case FUNC_SYSTEM_GET_BP:
600            if( isCallOn ) Opcode_Func_System_Get_Bp();
601            resultType.SetBasicType( DEF_INT64 );
602            break;
603        case FUNC_SYSTEM_GET_SP:
604            if( isCallOn ) Opcode_Func_System_Get_Sp();
605            resultType.SetBasicType( DEF_INT64 );
606            break;
607        case FUNC_SYSTEM_GET_COM_VTBL:
608            if( isCallOn ) Opcode_Func_System_GetComVtbl( Parameter );
609            resultType.SetBasicType( DEF_PTR_VOID );
610            break;
611        case FUNC_SYSTEM_GET_VTBL_LIST:
612            if( isCallOn ) Opcode_Func_System_GetVtblList( Parameter );
613            resultType.SetBasicType( DEF_PTR_VOID );
614            break;
615        case FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR:
616            if( isCallOn ) Opcode_Func_System_GetDefaultConstructor( Parameter );
617            resultType.SetBasicType( DEF_PTR_VOID );
618            break;
619        case FUNC_SYSTEM_GET_DESTRUCTOR:
620            if( isCallOn ) Opcode_Func_System_GetDestructor( Parameter );
621            resultType.SetBasicType( DEF_PTR_VOID );
622            break;
623
624        case FUNC_GETDOUBLE:
625            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
626            resultType.SetBasicType( DEF_DOUBLE );
627            break;
628        case FUNC_GETSINGLE:
629            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
630            resultType.SetBasicType( DEF_SINGLE );
631            break;
632        case FUNC_GETQWORD:
633            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
634            resultType.SetBasicType( DEF_QWORD );
635            break;
636        case FUNC_GETDWORD:
637            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
638            resultType.SetBasicType( DEF_DWORD );
639            break;
640        case FUNC_GETWORD:
641            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
642            resultType.SetBasicType( DEF_WORD );
643            break;
644        case FUNC_GETBYTE:
645            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
646            resultType.SetBasicType( DEF_BYTE );
647            break;
648        default:
649            return false;
650    }
651    return true;
652}
Note: See TracBrowser for help on using the repository browser.