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

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

64bit版を最新の状態にした

File size: 18.9 KB
RevLine 
[206]1#include "stdafx.h"
2
[198]3#include <Compiler.h>
4
[3]5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
[432]8#ifdef _AMD64_
9#include "../BasicCompiler64/FunctionValue.h"
10#else
11#include "../BasicCompiler32/FunctionValue.h"
12#endif
13
[3]14int GetFunctionFromName(char *FuncName){
[325]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;
[330]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;
[357]22 if( lstrcmpi( FuncName, "_System_GetNowScopeCatchAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS;
[359]23 if( lstrcmpi( FuncName, "_System_GetNowScopeFinallyAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS;
[358]24 if( lstrcmpi( FuncName, "_System_GetBp" ) == 0 ) return FUNC_SYSTEM_GET_BP;
25 if( lstrcmpi( FuncName, "_System_GetSp" ) == 0 ) return FUNC_SYSTEM_GET_SP;
[432]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;
[325]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;
[3]36 return 0;
37}
[46]38void Opcode_Func_Len( const char *Parameter ){
[3]39 BOOL bArrayHead;
40
[46]41 const char *tempParm=Parameter;
[3]42 char temporary[VN_SIZE];
43 char temp2[32];
[75]44 Type type;
45 if( !GetVarType(Parameter,type,0) ){
[3]46 sprintf(temporary,"_System_DummyStr2=%s",Parameter);
47 OpcodeCalc(temporary);
48
49 lstrcpy(temp2,"_System_DummyStr2");
50 tempParm=temp2;
51
[266]52 type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
[3]53 }
54
[97]55 if( type.IsStringClass() ){
[3]56 //Stringオブジェクトの場合
57 sprintf(temporary,"%s.Length",tempParm);
58
59 int reg=REG_RAX;
[76]60 NumOpe(&reg,temporary,Type(),Type());
[3]61 return;
62 }
63
[206]64 Subscripts subscripts;
[3]65 RELATIVE_VAR RelativeVar;
[206]66 if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,&subscripts)) return;
[3]67
[75]68 if(type.GetBasicType()&FLAG_PTR){
69 type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
[3]70
71 bArrayHead=1;
72 }
73 else bArrayHead=0;
74
[75]75 int typeSize = type.GetSize();
[3]76
[206]77 if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
[3]78
79 //mov rax,TypeSize
[226]80 compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
[3]81
82 return;
83}
84
[339]85void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
86{
87 if( userProc.IsVirtual() )
[331]88 {
[3]89 ///////////////////////////////
90 // 仮想関数の場合
91 // thisポインタをrcxにコピー
92 ///////////////////////////////
93
[115]94 const CClass *pobj_c;
[3]95
96 char ObjectName[VN_SIZE];
[308]97 ReferenceKind referenceKind;
[339]98 SplitObjectName(methodInstanceName,ObjectName, referenceKind );
[3]99
100 if(ObjectName[0]){
101 if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
102 else{
103 RELATIVE_VAR RelativeVar;
[75]104 Type type;
105 if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
[3]106 SetVarPtrToReg(REG_RCX,&RelativeVar);
107
108 //参照タイプが整合しているかをチェック
[308]109 if( !( type.IsObject() && referenceKind == RefDot
110 || type.IsObjectPtr() && referenceKind == RefPointer ) )
111 {
[468]112 compiler.errorMessenger.Output(104,ObjectName,cp);
[308]113 }
[3]114
[75]115 if(type.IsObjectPtr()){
[3]116 //mov rcx,qword ptr[rcx]
[226]117 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
[3]118 }
119 }
120 }
121 else{
122InClassMember:
123 //自身のオブジェクトのThisポインタをrcxにコピー
124 SetThisPtrToReg(REG_RCX);
125
[206]126 pobj_c=compiler.pCompilingClass;
[3]127 }
128
129
[349]130 int vtblIndex;
131 if( pobj_c->IsInterface() )
132 {
133 // インターフェイスメソッド
[3]134
[349]135 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
[348]136
[349]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);
[3]140
[349]141 int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
[3]142
[349]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 {
[468]151 compiler.errorMessenger.OutputFatalError();
[349]152 }
153 }
[370]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 }
[349]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マスターリストのポインタを取得
[370]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);
[349]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
[3]190 //mov rax,qword ptr[r11+func_index]
[345]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);
[3]194 }
[345]195 else
196 {
197 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
[3]198 }
199 }
200 else{
201 //一般の関数
202
203 //mov rax,ProcAddr
[339]204 compiler.codeGenerator.op_addressof( REG_RAX, &userProc );
[3]205 }
206
[339]207 userProc.Using();
[3]208}
[339]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;
[468]250 compiler.errorMessenger.Output(1,NULL,cp);
[339]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;
[449]290 const Type *pBaseReturnType = NULL;
[339]291 if( baseType.IsProcPtr() )
292 {
293 // 左辺で関数ポインタを要求されているとき
[449]294 const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
295 pBaseParams = &pTempProcPointer->Params();
296 pBaseReturnType = &pTempProcPointer->ReturnType();
[339]297 }
298 else if( baseType.IsDelegate() )
299 {
300 // 左辺でデリゲートを要求されているとき
[449]301 const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
302 pBaseParams = &pTempDelegate->Params();
303 pBaseReturnType = &pTempDelegate->ReturnType();
[339]304 }
305
[449]306 const UserProc *pUserProc;
307 if( pBaseParams && pBaseReturnType )
[339]308 {
309 //左辺の型にのっとり、オーバーロードを解決
310
311 std::vector<const UserProc *> subs;
312 GetOverloadSubHash( name, subs );
313 if( subs.size() == 0 ){
[468]314 compiler.errorMessenger.Output(27,name,cp);
[339]315 return;
316 }
317
318 //オーバーロードを解決
[425]319 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
[339]320
[449]321 if( isCallOn )
[339]322 {
323 // コード生成を伴う場合はエラーチェックを行う
[449]324
325 if( baseType.IsDelegate() )
[339]326 {
[449]327 // デリゲート
328 // 共変戻り値、反変引数をサポート
329 if( !(
330 pBaseParams->Equals( pUserProc->Params(), true )
331 && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
332 ) )
[339]333 {
[468]334 compiler.errorMessenger.Output(67, name, cp );
[339]335 }
[449]336 }
337 else
338 {
339 // 関数ポインタ
340 if( !(
341 pBaseParams->Equals( pUserProc->Params() )
342 && pBaseReturnType->Equals( pUserProc->ReturnType() )
343 ) )
[339]344 {
[468]345 compiler.errorMessenger.Output(66, name, cp );
[339]346 }
347 }
348 }
349
350 if(!pUserProc){
[468]351 compiler.errorMessenger.Output(27,name,cp);
[339]352 return;
353 }
354 }
355 else{
356 pUserProc=GetSubHash(name);
357 if(!pUserProc){
[468]358 compiler.errorMessenger.Output(27,name,cp);
[339]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}
[79]382void Opcode_Func_SizeOf( const string &typeName ){
383 Type tempType;
[308]384 if( !compiler.StringToType( typeName, tempType ) ){
[468]385 compiler.errorMessenger.Output(3,typeName,cp);
[79]386 return;
[64]387 }
[3]388
[79]389 int typeSize = ( tempType.IsObject() ) ?
390 tempType.GetClass().GetSize() : tempType.GetSize();
391
[3]392 //mov rax,size
[226]393 compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
[3]394}
[75]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
[3]407 RELATIVE_VAR RelativeVar;
408
409 //変数のアドレスを取得
[75]410 if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
[3]411
[75]412 int beforeType = resultType.GetBasicType();
[64]413
[75]414 resultType.PtrLevelUp();
[46]415
[3]416 SetVarPtrToReg(REG_RAX,&RelativeVar);
[64]417
[109]418 // TODO: 取り除く(この動きはObjPtrに託す)
[130]419 /*
[64]420 if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
421 //参照をオブジェクトポインタに変更
422
423 //mov rax,qword ptr[rax]
[226]424 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
[111]425
[468]426 compiler.errorMessenger.Output(-120,NULL,cp);
[130]427 }*/
[3]428}
[109]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
[111]452 if( lstrcmpi( Parameter, "This" )==0 ){
453 // Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
454 }
455 else if( beforeType == DEF_OBJECT ){
[109]456 //参照をオブジェクトポインタに変更
457
458 //mov rax,qword ptr[rax]
[226]459 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
[109]460 }
461 else{
[468]462 compiler.errorMessenger.Output(134,NULL,cp );
[109]463 }
464}
[325]465
[330]466void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
[325]467{
468 if( isCallOn )
469 {
470 int i = 0;
[330]471 char methodPtrParamStr[VN_SIZE];
472 i = GetOneParameter( paramsStr, i, methodPtrParamStr );
473
[339]474 char objPtrValueStr[VN_SIZE] = "";
[330]475 if( isDynamicCall )
476 {
477 i = GetOneParameter( paramsStr, i, objPtrValueStr );
478 }
479
480 Opcode_CallDelegate( compiler.pCompilingClass->GetDelegate(), methodPtrParamStr, objPtrValueStr, paramsStr + i );
[325]481 }
482
483 resultType = UserProc::CompilingUserProc().ReturnType();
484}
485
[357]486void Opcode_Func_System_Get_Bp()
487{
488 //mov rax,rbp
489 compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RBP);
490}
[358]491void Opcode_Func_System_Get_Sp()
492{
493 //mov rax,rsp
494 compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RSP);
495}
[357]496
[432]497void Opcode_Func_System_GetComVtbl( const char *parameter )
[427]498{
[432]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() )
[427]519 {
[432]520 //mov rax,ProcAddr
521 compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetConstructorMethod()->GetUserProc() );
[427]522 }
[432]523 else
[427]524 {
[432]525 // デフォルトコンストラクタを持たない
[427]526
[432]527 //xor rax,rax
528 compiler.codeGenerator.op_zero_reg( REG_RAX );
[427]529 }
530}
[432]531void Opcode_Func_System_GetDestructor( const char *parameter )
532{
533 Type classType;
534 compiler.StringToType( parameter, classType );
[427]535
[432]536 //mov rax,ProcAddr
537 compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetDestructorMethod()->GetUserProc() );
538}
539
[46]540void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
[3]541 int reg=REG_RAX;
[75]542 Type tempType;
543 if( !NumOpe(&reg,Parameter,Type(),tempType) ){
544 return;
545 }
546 if(!tempType.IsWhole()){
[468]547 compiler.errorMessenger.Output(11,Parameter,cp);
[3]548 return;
549 }
550
551 if(type==DEF_DOUBLE){
552 //movlpd xmm0,qword ptr[rax]
[226]553 compiler.codeGenerator.op_movlpd_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
[3]554 }
555 else if(type==DEF_SINGLE){
556 //movss xmm0,dword ptr[rax]
[226]557 compiler.codeGenerator.op_movss_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
[3]558 }
559 else{
560 //mov rax,ptr[rax]
[308]561 compiler.codeGenerator.op_mov_RM(Type(type).GetSize(),REG_RAX,REG_RAX,0,MOD_BASE);
[3]562 }
563}
564
[331]565bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn )
566{
[3]567 switch(FuncNum){
568 case FUNC_LEN:
[75]569 if( isCallOn ) Opcode_Func_Len(Parameter);
570 resultType.SetBasicType( DEF_LONG );
[46]571 break;
[3]572 case FUNC_ADDRESSOF:
[339]573 Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
[46]574 break;
[3]575 case FUNC_SIZEOF:
[75]576 if( isCallOn ) Opcode_Func_SizeOf(Parameter);
577 resultType.SetBasicType( DEF_LONG );
[46]578 break;
[3]579 case FUNC_VARPTR:
[75]580 Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
[46]581 break;
[109]582 case FUNC_OBJPTR:
583 Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
584 break;
[330]585 case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
586 Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
[325]587 break;
[330]588 case FUNC_DELEGATE_STATICMETHOD_CALL:
589 Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
590 break;
[357]591 case FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS:
592 if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeCatchAddress();
[358]593 resultType.SetBasicType( DEF_PTR_VOID );
[357]594 break;
[359]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;
[357]599 case FUNC_SYSTEM_GET_BP:
600 if( isCallOn ) Opcode_Func_System_Get_Bp();
[358]601 resultType.SetBasicType( DEF_INT64 );
[357]602 break;
[358]603 case FUNC_SYSTEM_GET_SP:
604 if( isCallOn ) Opcode_Func_System_Get_Sp();
605 resultType.SetBasicType( DEF_INT64 );
606 break;
[432]607 case FUNC_SYSTEM_GET_COM_VTBL:
608 if( isCallOn ) Opcode_Func_System_GetComVtbl( Parameter );
609 resultType.SetBasicType( DEF_PTR_VOID );
[427]610 break;
[432]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;
[3]623
624 case FUNC_GETDOUBLE:
[75]625 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
626 resultType.SetBasicType( DEF_DOUBLE );
[46]627 break;
[3]628 case FUNC_GETSINGLE:
[75]629 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
630 resultType.SetBasicType( DEF_SINGLE );
[46]631 break;
[3]632 case FUNC_GETQWORD:
[75]633 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
634 resultType.SetBasicType( DEF_QWORD );
[46]635 break;
[3]636 case FUNC_GETDWORD:
[75]637 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
638 resultType.SetBasicType( DEF_DWORD );
[46]639 break;
[3]640 case FUNC_GETWORD:
[75]641 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
642 resultType.SetBasicType( DEF_WORD );
[46]643 break;
[3]644 case FUNC_GETBYTE:
[75]645 if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
646 resultType.SetBasicType( DEF_BYTE );
[46]647 break;
[75]648 default:
649 return false;
[3]650 }
[75]651 return true;
[3]652}
Note: See TracBrowser for help on using the repository browser.