Changeset 319 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Sep 9, 2007, 12:37:48 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler32
- Files:
-
- 3 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));
Note:
See TracChangeset
for help on using the changeset viewer.