Changeset 94 in dev
- Timestamp:
- Apr 14, 2007, 8:36:04 PM (18 years ago)
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Object.cpp
r90 r94 18 18 jnz_back=obp; 19 19 20 //push ebx 21 op_push(REG_EBX); 20 if(bSomeObjects){ 21 SetError(); 22 23 //push ebx 24 op_push(REG_EBX); 25 } 22 26 23 27 // ※ここでプッシュされた値はコンストラクタのthisポインタとなる … … 71 75 op_pop(REG_EAX); 72 76 73 //pop ebx74 op_pop(REG_EBX);75 76 77 if(bSomeObjects){ 78 //pop ebx 79 op_pop(REG_EBX); 80 77 81 //add eax,TypeSize 78 82 OpBuffer[obp++]=(char)0x05; -
BasicCompiler32/Compile_ProcOp.cpp
r92 r94 873 873 } 874 874 875 //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル 876 extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes; 877 pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile(); 878 875 879 //_System_InitStaticLocalVariablesは一番最後にコンパイル 876 880 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない … … 882 886 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 883 887 884 Repeat:888 repeat: 885 889 for(i2=0;i2<MAX_HASH;i2++){ 886 890 pUserProc=ppSubHash[i2]; … … 891 895 } 892 896 893 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 894 for(i2=0;i2<MAX_HASH;i2++){ 895 pUserProc=ppSubHash[i2]; 896 while(pUserProc){ 897 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 898 goto Repeat; 899 } 900 901 pUserProc=pUserProc->pNextData; 897 if( IsNeedProcCompile() ){ 898 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 899 goto repeat; 900 } 901 902 //_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル 903 pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus(); 904 CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes ); 905 906 if( IsNeedProcCompile() ){ 907 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 908 for(i2=0;i2<MAX_HASH;i2++){ 909 pUserProc=ppSubHash[i2]; 910 while(pUserProc){ 911 CompileBufferInProcedure( *pUserProc ); 912 pUserProc=pUserProc->pNextData; 913 } 902 914 } 903 915 } -
BasicCompiler32/NumOpe.cpp
r93 r94 224 224 || isNothing_stack[sp-2] ){ 225 225 // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない 226 } 227 else if( idCalc == CALC_AS 228 && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) 229 && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] ) 230 )){ 231 // ダウンキャストを許可する 226 232 } 227 233 else{ -
BasicCompiler64/Compile_Object.cpp
r90 r94 19 19 20 20 if(bSomeObjects){ 21 SetError(); 21 22 //mov qword ptr[rsp+offset],rbx ※スタックフレームを利用 22 23 pobj_sf->push(REG_RBX); -
BasicCompiler64/Compile_ProcOp.cpp
r91 r94 845 845 } 846 846 847 //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル 848 extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes; 849 pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile(); 850 847 851 //_System_InitStaticLocalVariablesは一番最後にコンパイル 848 852 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない … … 854 858 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 855 859 856 Repeat:860 repeat: 857 861 for(i2=0;i2<MAX_HASH;i2++){ 858 862 pUserProc=ppSubHash[i2]; … … 863 867 } 864 868 865 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 866 for(i2=0;i2<MAX_HASH;i2++){ 867 pUserProc=ppSubHash[i2]; 868 while(pUserProc){ 869 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 870 goto Repeat; 871 } 872 873 pUserProc=pUserProc->pNextData; 869 if( IsNeedProcCompile() ){ 870 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 871 goto repeat; 872 } 873 874 //_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル 875 pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus(); 876 CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes ); 877 878 if( IsNeedProcCompile() ){ 879 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 880 for(i2=0;i2<MAX_HASH;i2++){ 881 pUserProc=ppSubHash[i2]; 882 while(pUserProc){ 883 CompileBufferInProcedure( *pUserProc ); 884 pUserProc=pUserProc->pNextData; 885 } 874 886 } 875 887 } -
BasicCompiler64/NumOpe.cpp
r93 r94 249 249 // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない 250 250 } 251 else if( idCalc == CALC_AS 252 && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) 253 && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] ) 254 )){ 255 // ダウンキャストを許可する 256 } 251 257 else{ 252 258 //オーバーロードされたオペレータを呼び出す -
BasicCompiler_Common/Class.cpp
r92 r94 742 742 if( IsEquals( pClass ) ) return true; 743 743 return IsSubClass( pClass ); 744 } 745 746 // 自身と等しいまたは派生クラス、基底クラスかどうかを確認 747 bool CClass::IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const 748 { 749 if( IsEquals( &objClass ) ) return true; 750 if( IsSubClass( &objClass ) ) return true; 751 if( objClass.IsSubClass( this ) ) return true; 752 return false; 744 753 } 745 754 … … 1542 1551 if( !objClass.IsUsing() ){ 1543 1552 // 未使用のクラスは無視する 1553 if( (string)objClass.name == "CTest"){ 1554 int test=0; 1555 } 1544 1556 continue; 1545 1557 } 1546 1558 1559 char referenceOffsetsBuffer[1024] = ""; 1560 int numOfReference = 0; 1561 for( int i=0; i<objClass.iMemberNum; i++ ){ 1562 CMember &member = *objClass.ppobj_Member[i]; 1563 1564 if( member.IsObject() || member.IsPointer() ){ 1565 if( referenceOffsetsBuffer[0] ){ 1566 lstrcat( referenceOffsetsBuffer, "," ); 1567 } 1568 1569 sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ), 1570 "%d", 1571 objClass.GetMemberOffset( member.name ) ); 1572 1573 numOfReference++; 1574 } 1575 } 1576 1547 1577 sprintf( temporary 1548 , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\" ))"1578 , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\",[%s],%d))" 1549 1579 , 1 1550 1580 , ESC_NEW 1551 , "" // 名前空間 (TODO: 実装) 1552 , objClass.name // クラス名 1581 , "" // 名前空間 (TODO: 実装) 1582 , objClass.name // クラス名 1583 , referenceOffsetsBuffer // 参照メンバオフセット配列 1584 , numOfReference // 参照メンバの個数 1553 1585 ); 1554 1586 -
BasicCompiler_Common/Class.h
r91 r94 157 157 158 158 // メンバのオフセットを取得 159 int GetMemberOffset( const char *memberName, int *pMemberNum ) const;159 int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const; 160 160 161 161 private: … … 199 199 //自身と等しいまたは派生クラスかどうかを確認 200 200 bool IsEqualsOrSubClass( const CClass *pClass ) const; 201 202 // 自身と等しいまたは派生クラス、基底クラスかどうかを確認 203 bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const; 201 204 202 205 -
BasicCompiler_Common/NumOpe_GetType.cpp
r79 r94 309 309 } 310 310 311 if( expression[0] == '[' ){ 312 if( !baseType.IsPointer() ){ 313 SetError(1,NULL,cp); 314 return false; 315 } 316 317 resultType = baseType; 318 return true; 319 } 320 311 321 312 322 ///////////////////////////////// … … 353 363 || isNothing_stack[sp-2] ){ 354 364 // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない 365 } 366 else if( idCalc == CALC_AS 367 && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST ) 368 && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] ) 369 )){ 370 // ダウンキャストを許可する 355 371 } 356 372 else{ -
BasicCompiler_Common/Subroutine.cpp
r88 r94 792 792 Smoothie::Meta::procPointers.clear(); 793 793 } 794 795 796 797 bool IsNeedProcCompile(){ 798 for(int i2=0;i2<MAX_HASH;i2++){ 799 extern UserProc **ppSubHash; 800 UserProc *pUserProc=ppSubHash[i2]; 801 while(pUserProc){ 802 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 803 return true; 804 } 805 806 pUserProc=pUserProc->pNextData; 807 } 808 } 809 return false; 810 } -
BasicCompiler_Common/common.h
r93 r94 445 445 int AddProcPtrInfo( const string &typeExpression, int nowLine ); 446 446 void DeleteProcPtrInfo(void); 447 bool IsNeedProcCompile(); 447 448 448 449 //OldStatement.cpp
Note:
See TracChangeset
for help on using the changeset viewer.