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