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

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

・デリゲートの共変戻り値、反変引数に対応した。
・core.libで定義されたデリゲートがアプリケーションプロジェクトで利用できないバグを修正。

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