Changeset 565 in dev for trunk/ab5.0/abdev/BasicCompiler_Common/src
- Timestamp:
- May 5, 2008, 2:48:41 PM (17 years ago)
- Location:
- trunk/ab5.0/abdev/BasicCompiler_Common/src
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp
r564 r565 648 648 } 649 649 650 651 void Classes::InitStaticMember(){652 //静的メンバをグローバル領域に作成653 654 //イテレータをリセット655 656 extern int cp;657 int back_cp=cp;658 659 this->Iterator_Reset();660 while(this->Iterator_HasNext()){661 CClass &objClass = *this->Iterator_GetNext();662 if( objClass.isTargetObjectModule == false )663 {664 // 静的リンクライブラリの場合は飛ばす(既にインスタンスが定義済みであるため)665 continue;666 }667 668 // 名前空間をセット669 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = objClass.GetNamespaceScopes();670 671 DWORD dwFlags = 0;672 if( objClass.GetName() == "_System_TypeBase" )673 {674 // _System_TypeBaseクラスはグローバル、スタティック領域を初期化するためのクラスなのでここでの初期化は除外する675 dwFlags |= DIMFLAG_NONCALL_CONSTRACTOR;676 }677 678 // コンパイル中クラスとしてセット679 compiler.SetCompilingClass( &objClass );680 681 const EnumInfo *pEnumInfo = NULL;682 if( objClass.IsEnum() )683 {684 pEnumInfo = compiler.enumInfoCollection.Find( objClass );685 }686 687 int i=0;688 BOOST_FOREACH( Member *member, objClass.GetStaticMembers() )689 {690 if( pEnumInfo )691 {692 cp = pEnumInfo->GetEnumMember( member->GetName() ).GetSourceIndex();693 }694 695 char temporary[VN_SIZE];696 sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str());697 dim(698 temporary,699 member->GetSubscripts(),700 member->GetType(),701 member->GetInitializeExpression().c_str(),702 member->GetConstructParameter().c_str(),703 dwFlags);704 705 i++;706 }707 708 compiler.SetCompilingClass( NULL );709 }710 711 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().clear();712 713 cp=back_cp;714 }715 716 void Classes::Compile_System_InitializeUserTypes(){717 char temporary[VN_SIZE];718 719 ////////////////////////////////////////////////////////////////////720 // クラス登録721 ////////////////////////////////////////////////////////////////////722 723 // イテレータをリセット724 Iterator_Reset();725 726 while( Iterator_HasNext() ){727 const CClass &objClass = *Iterator_GetNext();728 729 if( !objClass.IsUsing() ){730 // 未使用のクラスは無視する731 continue;732 }733 734 std::string referenceOffsetsBuffer;735 int numOfReference = 0;736 objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );737 738 sprintf( temporary739 , "Add(%c%c_System_TypeForClass[strNamespace=\"%s\",name=\"%s\",fullName=\"%s\",referenceOffsets=[%s],numOfReference=%d])"740 , 1741 , ESC_SYSTEM_STATIC_NEW742 , objClass.GetNamespaceScopes().ToString().c_str() // 名前空間743 , objClass.GetName().c_str() // クラス名744 , objClass.GetFullName().c_str() // フルネーム745 , referenceOffsetsBuffer.c_str() // 参照メンバオフセット配列746 , numOfReference // 参照メンバの個数747 );748 749 // コンパイル750 ChangeOpcode( temporary );751 752 objClass.SetTypeInfoDataTableOffset(753 compiler.GetObjectModule().dataTable.GetLastMadeConstObjectDataTableOffset()754 );755 }756 }757 void Classes::Compile_System_InitializeUserTypesForBaseType()758 {759 extern int cp;760 cp = -1;761 ////////////////////////////////////////////////////////////////////762 // 基底クラスを登録763 ////////////////////////////////////////////////////////////////////764 765 char temporary[8192];766 sprintf(temporary, "%c%ctempType=Nothing%c%c_System_TypeForClass"767 , HIBYTE( COM_DIM )768 , LOBYTE( COM_DIM )769 , 1770 , ESC_AS771 );772 ChangeOpcode( temporary );773 774 // イテレータをリセット775 Iterator_Reset();776 777 while( Iterator_HasNext() ){778 const CClass &objClass = *Iterator_GetNext();779 780 if( !objClass.IsUsing() ){781 // 未使用のクラスは無視する782 continue;783 }784 785 if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){786 sprintf( temporary787 , "tempType=Search(\"%s\") As ActiveBasic.Core._System_TypeForClass"788 , objClass.GetFullName().c_str()789 );790 791 // コンパイル792 MakeMiddleCode( temporary );793 ChangeOpcode( temporary );794 795 sprintf( temporary796 , "tempType.SetClassInfo(%d,_System_GetComVtbl(%s),_System_GetVtblList(%s),_System_GetDefaultConstructor(%s),_System_GetDestructor(%s))"797 , objClass.GetSize()798 , objClass.GetFullName().c_str()799 , objClass.GetFullName().c_str()800 , objClass.GetFullName().c_str()801 , objClass.GetFullName().c_str()802 , objClass.GetName().c_str()803 );804 805 // コンパイル806 ChangeOpcode( temporary );807 808 if( objClass.HasSuperClass() )809 {810 sprintf( temporary811 , "tempType.SetBaseType(Search(\"%s\"))"812 , objClass.GetSuperClass().GetFullName().c_str()813 );814 815 // コンパイル816 ChangeOpcode( temporary );817 }818 819 if( objClass.GetDynamicMembers().size() )820 {821 // メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得822 sprintf(823 temporary,824 "tempType.SetMembers([%s],[%s],[%s],%d)",825 objClass.GetStaticDefiningStringAsMemberNames().c_str(),826 objClass.GetStaticDefiningStringAsMemberTypeInfoNames().c_str(),827 objClass.GetStaticDefiningStringAsMemberOffsets().c_str(),828 objClass.GetDynamicMembers().size()829 );830 ChangeOpcode( temporary );831 }832 }833 }834 }835 836 650 const CClass *Classes::Find( const NamespaceScopes &namespaceScopes, const std::string &name ) const 837 651 {
Note:
See TracChangeset
for help on using the changeset viewer.