- Timestamp:
- Sep 9, 2007, 12:37:48 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Object.cpp
r303 r319 205 205 206 206 207 //仮想関数テーブルを初期化 208 if( classObj.IsExistVirtualFunctions() 209 && !classObj.IsAbstract() ) 210 { 211 // mov ecx,vtblAddress 212 compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, &classObj ); 213 214 //mov dword ptr[eax],ecx 215 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 216 217 // 仮想関数になるメソッドに使用チェックをつける 218 BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() ) 219 { 220 if( pMethod->IsVirtual() ) 221 { 222 pMethod->GetUserProc().Using(); 223 } 224 } 225 } 226 227 207 228 // ※ここでプッシュされた値はNew演算子の戻り値となる 208 229 //push eax -
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r316 r319 536 536 } 537 537 } 538 539 //仮想関数テーブルを初期化540 if( compiler.pCompilingClass->IsExistVirtualFunctions()541 && !compiler.pCompilingClass->IsAbstract() )542 {543 // mov eax,vtblAddress544 compiler.codeGenerator.op_mov_RV_vtbl( REG_EAX, compiler.pCompilingClass );545 546 //Thisポインタをecxにコピー547 SetThisPtrToReg(REG_ECX);548 549 //mov dword ptr[ecx],eax550 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ECX, 0, MOD_BASE );551 552 553 // 仮想関数になるメソッドに使用チェックをつける554 BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )555 {556 if( pMethod->IsVirtual() )557 {558 pMethod->GetUserProc().Using();559 }560 }561 }562 538 } 563 539 else if( pUserProc->IsDestructor() ){ -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r301 r319 73 73 74 74 char *parameter = (char *)malloc( lstrlen( str ) + 32 ); 75 sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS ); 76 SetStringQuotes( parameter ); 75 sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS ); 77 76 78 77 Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) ); … … 763 762 } 764 763 765 if(term[0]=='\"'){ 766 //リテラル文字列 767 if(!RemoveStringQuotes(term)){ 768 SetError(43,NULL,cp); 769 goto error; 770 } 771 i3=lstrlen(term); 772 StrLiteral: 773 774 if( baseType.IsObject() || baseType.IsNull() ){ 764 if( (term[0]=='e'||term[0]=='E') 765 && (term[1]=='x'||term[1]=='X') 766 && term[2]=='\"' 767 || term[0] == '\"' ) 768 { 769 if( baseType.IsObject() || baseType.IsNull() ) 770 { 775 771 //要求タイプがオブジェクト、または未定のとき 776 772 … … 786 782 } 787 783 788 784 bool isEx = true; 785 if( term[0] == '\"' ) 786 { 787 isEx = false; 788 } 789 790 if( isEx ) 791 { 792 // 拡張版リテラル文字列(エスケープシーケンス可能) 793 if(!RemoveStringQuotes(term+2)){ 794 SetError(43,NULL,cp); 795 goto error; 796 } 797 i3=FormatString_EscapeSequence(term+2); 798 term+=2; 799 } 800 else 801 { 802 // 通常文字列 803 if(!RemoveStringQuotes(term)){ 804 SetError(43,NULL,cp); 805 goto error; 806 } 807 i3=lstrlen(term); 808 } 809 StrLiteral: 789 810 type_stack[sp]=typeOfPtrChar; 790 811 bLiteralCalculation=0; … … 794 815 //push DataSize 795 816 compiler.codeGenerator.op_push_V( i2, Schedule::DataTable ); 796 }797 else if((term[0]=='e'||term[0]=='E')&&798 (term[1]=='x'||term[1]=='X')&&799 term[2]=='\"'){800 //拡張版リテラル文字列(エスケープシーケンス可能)801 if(!RemoveStringQuotes(term+2)){802 SetError(43,NULL,cp);803 goto error;804 }805 i3=FormatString_EscapeSequence(term+2);806 term+=2;807 808 goto StrLiteral;809 817 } 810 818 else if(IsVariableTopChar(term[0])|| … … 896 904 //リテラル文字列 897 905 906 if( baseType.IsObject() || baseType.IsNull() ) 907 { 908 //要求タイプがオブジェクト、または未定のとき 909 910 //String型オブジェクトを生成 911 NewStringObject(term); 912 913 type_stack[sp]=DEF_OBJECT; 914 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(); 915 bLiteralCalculation=0; 916 917 sp++; 918 break; 919 } 920 898 921 double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(term); 899 922 memcpy(&i64data,&dbl,sizeof(double)); -
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r308 r319 200 200 201 201 202 //仮想関数テーブルを初期化 203 if( classObj.IsExistVirtualFunctions() 204 && !classObj.IsAbstract() ) 205 { 206 // mov rcx,vtblAddress 207 compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, &classObj ); 208 209 //mov qword ptr[rax],rcx 210 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 211 212 213 // 仮想関数になるメソッドに使用チェックをつける 214 BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() ) 215 { 216 if( pMethod->IsVirtual() ) 217 { 218 pMethod->GetUserProc().Using(); 219 } 220 } 221 } 222 223 202 224 ///////////////////////////////////////////////////////////////////// 203 225 -
trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
r318 r319 507 507 } 508 508 } 509 510 //仮想関数テーブルを初期化511 if( compiler.pCompilingClass->IsExistVirtualFunctions()512 && !compiler.pCompilingClass->IsAbstract() )513 {514 // mov rax,vtblAddress515 compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, compiler.pCompilingClass );516 517 //Thisポインタをrcxにコピー518 SetThisPtrToReg(REG_RCX);519 520 //mov qword ptr[rcx],rax521 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);522 523 524 // 仮想関数になるメソッドに使用チェックをつける525 BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )526 {527 if( pMethod->IsVirtual() )528 {529 pMethod->GetUserProc().Using();530 }531 }532 }533 509 } 534 510 else if( pUserProc->IsDestructor() ){ -
trunk/abdev/BasicCompiler64/NumOpe.cpp
r318 r319 22 22 23 23 char *parameter = (char *)malloc( lstrlen( str ) + 32 ); 24 sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS ); 25 SetStringQuotes( parameter ); 24 sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS ); 26 25 27 26 Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) ); … … 429 428 GetArrayElement(termFull,VarName,ArrayElements); 430 429 if(ArrayElements[0]){ 431 GetVarType(VarName,resultType,false); 432 if( resultType.IsObject() ){ 433 CallIndexerGetterProc(UseReg,resultType,VarName,ArrayElements,resultType); 430 Type classType; 431 GetVarType(VarName,classType,false); 432 if( classType.IsObject() ) 433 { 434 CallIndexerGetterProc(UseReg,classType,VarName,ArrayElements,resultType); 434 435 435 436 isLiteral = false; … … 788 789 } 789 790 790 if(term[0]=='\"'){ 791 //リテラル文字列 792 if(!RemoveStringQuotes(term)){ 793 SetError(43,NULL,cp); 794 goto error; 795 } 796 i3=lstrlen(term); 797 StrLiteral: 798 799 if( baseType.IsObject() || baseType.IsNull() ){ 791 if( (term[0]=='e'||term[0]=='E') 792 && (term[1]=='x'||term[1]=='X') 793 && term[2]=='\"' 794 || term[0] == '\"' ) 795 { 796 if( baseType.IsObject() || baseType.IsNull() ) 797 { 800 798 //要求タイプがオブジェクト、または未定のとき 801 799 … … 814 812 } 815 813 814 bool isEx = true; 815 if( term[0] == '\"' ) 816 { 817 isEx = false; 818 } 819 820 if( isEx ) 821 { 822 // 拡張版リテラル文字列(エスケープシーケンス可能) 823 if(!RemoveStringQuotes(term+2)){ 824 SetError(43,NULL,cp); 825 goto error; 826 } 827 i3=FormatString_EscapeSequence(term+2); 828 term+=2; 829 } 830 else 831 { 832 // 通常文字列 833 if(!RemoveStringQuotes(term)){ 834 SetError(43,NULL,cp); 835 goto error; 836 } 837 i3=lstrlen(term); 838 } 839 StrLiteral: 840 816 841 type_stack[sp]=typeOfPtrChar; 817 842 bLiteralCalculation=0; … … 827 852 } 828 853 } 829 else if((term[0]=='e'||term[0]=='E')&&830 (term[1]=='x'||term[1]=='X')&&831 term[2]=='\"'){832 //拡張版リテラル文字列(エスケープシーケンス可能)833 if(!RemoveStringQuotes(term+2)){834 SetError(43,NULL,cp);835 goto error;836 }837 i3=FormatString_EscapeSequence(term+2);838 term+=2;839 840 goto StrLiteral;841 }842 854 else if(IsVariableTopChar(term[0])|| 843 855 term[0]=='*'|| 844 (term[0]=='.'&&IsVariableTopChar(term[1]))){ 856 (term[0]=='.'&&IsVariableTopChar(term[1]))) 857 { 845 858 ////////////////// 846 859 // 何らかの識別子 … … 938 951 //リテラル文字列 939 952 953 if( baseType.IsObject() || baseType.IsNull() ) 954 { 955 //要求タイプがオブジェクト、または未定のとき 956 957 //String型オブジェクトを生成 958 NewStringObject(UseReg,term); 959 960 type_stack[sp]=DEF_OBJECT; 961 index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(); 962 bLiteralCalculation=0; 963 964 if(bXmm) pobj_reg->LockXmmReg(); 965 else pobj_reg->LockReg(); 966 967 sp++; 968 break; 969 } 970 940 971 double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(term); 941 972 memcpy(&i64data,&dbl,sizeof(double)); … … 961 992 goto Literal; 962 993 } 963 /*else if(i3==DEF_STRING){964 //リテラル文字列965 966 //バイト数967 i3=(int)dbl;968 969 memcpy(term,temporary,i3);970 goto StrLiteral;971 }*/972 994 else{ 973 995 SetError(1,NULL,0); -
trunk/abdev/BasicCompiler_Common/ParamImpl.cpp
r290 r319 42 42 for(i++,i2++;;i++,i2++){ 43 43 temporary[i2]=buffer[i]; 44 if( buffer[i] == '\0' ) 45 { 46 SetError(); 47 break; 48 } 44 49 if(buffer[i]=='\"') break; 45 50 } -
trunk/abdev/BasicCompiler_Common/Subroutine.cpp
r316 r319 494 494 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 495 495 496 // _System_CGarbageCollection.RegisterGlobalRootsは一番最後にコンパイル 497 extern const UserProc *pUserProc_System_CGarbageCollection_RegisterGlobalRoots; 498 pUserProc_System_CGarbageCollection_RegisterGlobalRoots->CompleteCompile(); 499 496 500 repeat: 497 501 compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset(); … … 531 535 pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus(); 532 536 CompileBufferInProcedure( *pSub_System_Call_Destructor_of_GlobalObject ); 533 } 534 } 537 538 // _System_CGarbageCollection.RegisterGlobalRootsは一番最後にコンパイル 539 pUserProc_System_CGarbageCollection_RegisterGlobalRoots->KillCompileStatus(); 540 CompileBufferInProcedure( *pUserProc_System_CGarbageCollection_RegisterGlobalRoots ); 541 } 542 }
Note:
See TracChangeset
for help on using the changeset viewer.