Changeset 432 in dev for trunk/abdev/BasicCompiler64/Compile_Func.cpp
- Timestamp:
- Mar 11, 2008, 7:22:05 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_Func.cpp
r427 r432 7 7 #include "../BasicCompiler_Common/common.h" 8 8 #include "Opcode.h" 9 10 #ifdef _AMD64_ 11 #include "../BasicCompiler64/FunctionValue.h" 12 #else 13 #include "../BasicCompiler32/FunctionValue.h" 14 #endif 9 15 10 16 int GetFunctionFromName(char *FuncName){ … … 20 26 if( lstrcmpi( FuncName, "_System_GetBp" ) == 0 ) return FUNC_SYSTEM_GET_BP; 21 27 if( lstrcmpi( FuncName, "_System_GetSp" ) == 0 ) return FUNC_SYSTEM_GET_SP; 22 if( lstrcmp( FuncName, "_System_New" ) == 0 ) return FUNC_SYSTEM_NEW; 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; 23 32 if( lstrcmpi( FuncName, "GetDouble" ) == 0 ) return FUNC_GETDOUBLE; 24 33 if( lstrcmpi( FuncName, "GetSingle" ) == 0 ) return FUNC_GETSINGLE; … … 471 480 } 472 481 473 void Opcode_Func_System_New( const char *parameter, Type &resultType, bool isCallOn ) 474 { 475 if( !compiler.StringToType( parameter, resultType ) ) 476 { 477 SetError(); 478 return; 479 } 480 if( !resultType.IsObject() ) 481 { 482 SetError(); 483 return; 484 } 485 486 if( isCallOn ) 487 { 488 Type tempResultType; 489 if( !Operator_New( parameter, resultType, tempResultType ) ) 490 { 491 return; 492 } 493 494 if( !resultType.Equals( tempResultType ) ) 495 { 496 SetError(); 497 } 498 } 482 void Opcode_Func_System_GetComVtbl( const char *parameter ) 483 { 484 Type classType; 485 compiler.StringToType( parameter, classType ); 486 487 // mov rax,com_vtbl 488 compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RAX, &classType.GetClass() ); 489 } 490 void Opcode_Func_System_GetVtblList( const char *parameter ) 491 { 492 Type classType; 493 compiler.StringToType( parameter, classType ); 494 495 // mov rax,com_vtbl 496 compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, &classType.GetClass() ); 497 } 498 void Opcode_Func_System_GetDefaultConstructor( const char *parameter ) 499 { 500 Type classType; 501 compiler.StringToType( parameter, classType ); 502 503 if( classType.GetClass().GetConstructorMethod() ) 504 { 505 //mov rax,ProcAddr 506 compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetConstructorMethod()->GetUserProc() ); 507 } 508 else 509 { 510 // デフォルトコンストラクタを持たない 511 512 //xor rax,rax 513 compiler.codeGenerator.op_zero_reg( REG_RAX ); 514 } 515 } 516 void Opcode_Func_System_GetDestructor( const char *parameter ) 517 { 518 Type classType; 519 compiler.StringToType( parameter, classType ); 520 521 //mov rax,ProcAddr 522 compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetDestructorMethod()->GetUserProc() ); 499 523 } 500 524 … … 566 590 resultType.SetBasicType( DEF_INT64 ); 567 591 break; 568 case FUNC_SYSTEM_NEW: 569 Opcode_Func_System_New( Parameter, resultType, isCallOn ); 592 case FUNC_SYSTEM_GET_COM_VTBL: 593 if( isCallOn ) Opcode_Func_System_GetComVtbl( Parameter ); 594 resultType.SetBasicType( DEF_PTR_VOID ); 595 break; 596 case FUNC_SYSTEM_GET_VTBL_LIST: 597 if( isCallOn ) Opcode_Func_System_GetVtblList( Parameter ); 598 resultType.SetBasicType( DEF_PTR_VOID ); 599 break; 600 case FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR: 601 if( isCallOn ) Opcode_Func_System_GetDefaultConstructor( Parameter ); 602 resultType.SetBasicType( DEF_PTR_VOID ); 603 break; 604 case FUNC_SYSTEM_GET_DESTRUCTOR: 605 if( isCallOn ) Opcode_Func_System_GetDestructor( Parameter ); 606 resultType.SetBasicType( DEF_PTR_VOID ); 570 607 break; 571 608
Note:
See TracChangeset
for help on using the changeset viewer.