source: dev/trunk/abdev/BasicCompiler32/Compile_Func.cpp@ 357

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

例外処理機構実装中...

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