Changeset 97 in dev for BasicCompiler64
- Timestamp:
- Apr 16, 2007, 3:52:40 AM (18 years ago)
- Location:
- BasicCompiler64
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/BasicCompiler.vcproj
r91 r97 385 385 IgnoreDefaultLibraryNames="libcpmtd" 386 386 GenerateDebugInformation="false" 387 ProgramDatabaseFile=".\Release/BasicCompiler64.pdb" 388 SubSystem="2" 389 TargetMachine="0" 390 /> 391 <Tool 392 Name="VCALinkTool" 393 /> 394 <Tool 395 Name="VCManifestTool" 396 AdditionalManifestFiles="$(ProjectDir)\manifest.xml" 397 /> 398 <Tool 399 Name="VCXDCMakeTool" 400 /> 401 <Tool 402 Name="VCBscMakeTool" 403 SuppressStartupBanner="true" 404 OutputFile="$(OutDir)/$(ProjectName).bsc" 405 /> 406 <Tool 407 Name="VCFxCopTool" 408 /> 409 <Tool 410 Name="VCAppVerifierTool" 411 /> 412 <Tool 413 Name="VCWebDeploymentTool" 414 /> 415 <Tool 416 Name="VCPostBuildEventTool" 417 /> 418 </Configuration> 419 <Configuration 420 Name="test_release|Win32" 421 OutputDirectory="$(ConfigurationName)" 422 IntermediateDirectory="$(ConfigurationName)" 423 ConfigurationType="1" 424 UseOfMFC="0" 425 ATLMinimizesCRunTimeLibraryUsage="false" 426 CharacterSet="2" 427 > 428 <Tool 429 Name="VCPreBuildEventTool" 430 /> 431 <Tool 432 Name="VCCustomBuildTool" 433 /> 434 <Tool 435 Name="VCXMLDataGeneratorTool" 436 /> 437 <Tool 438 Name="VCWebServiceProxyGeneratorTool" 439 /> 440 <Tool 441 Name="VCMIDLTool" 442 PreprocessorDefinitions="_DEBUG" 443 MkTypLibCompatible="true" 444 SuppressStartupBanner="true" 445 TargetEnvironment="1" 446 TypeLibraryName=".\Debug/BasicCompiler.tlb" 447 HeaderFileName="" 448 /> 449 <Tool 450 Name="VCCLCompilerTool" 451 Optimization="0" 452 AdditionalIncludeDirectories="..\cpplibs\boost;..\BasicCompiler_Common\include" 453 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;_AMD64_;_WIN64" 454 MinimalRebuild="false" 455 BasicRuntimeChecks="0" 456 RuntimeLibrary="2" 457 UsePrecompiledHeader="0" 458 PrecompiledHeaderFile=".\Release/BasicCompiler.pch" 459 AssemblerListingLocation=".\Release/" 460 ObjectFile=".\Release/" 461 ProgramDataBaseFileName=".\Release/" 462 BrowseInformation="0" 463 WarningLevel="3" 464 SuppressStartupBanner="true" 465 Detect64BitPortabilityProblems="true" 466 DebugInformationFormat="3" 467 CallingConvention="0" 468 /> 469 <Tool 470 Name="VCManagedResourceCompilerTool" 471 /> 472 <Tool 473 Name="VCResourceCompilerTool" 474 PreprocessorDefinitions="_DEBUG,JPN" 475 Culture="1041" 476 /> 477 <Tool 478 Name="VCPreLinkEventTool" 479 /> 480 <Tool 481 Name="VCLinkerTool" 482 AdditionalOptions="/MACHINE:AMD64" 483 AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib bufferoverflowu.lib" 484 OutputFile="../ActiveBasic/BasicCompiler64.exe" 485 LinkIncremental="2" 486 SuppressStartupBanner="true" 487 IgnoreDefaultLibraryNames="libcpmtd" 488 GenerateDebugInformation="true" 387 489 ProgramDatabaseFile=".\Release/BasicCompiler64.pdb" 388 490 SubSystem="2" … … 578 680 /> 579 681 </FileConfiguration> 682 <FileConfiguration 683 Name="test_release|Win32" 684 > 685 <Tool 686 Name="VCResourceCompilerTool" 687 PreprocessorDefinitions="_DEBUG;JPN;$(NoInherit)" 688 /> 689 </FileConfiguration> 580 690 </File> 581 691 <Filter … … 624 734 /> 625 735 </FileConfiguration> 736 <FileConfiguration 737 Name="test_release|Win32" 738 > 739 <Tool 740 Name="VCCLCompilerTool" 741 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 742 UsePrecompiledHeader="0" 743 BrowseInformation="0" 744 /> 745 </FileConfiguration> 626 746 </File> 627 747 <File … … 667 787 /> 668 788 </FileConfiguration> 789 <FileConfiguration 790 Name="test_release|Win32" 791 > 792 <Tool 793 Name="VCCLCompilerTool" 794 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 795 UsePrecompiledHeader="0" 796 BrowseInformation="0" 797 /> 798 </FileConfiguration> 669 799 </File> 670 800 <File … … 710 840 /> 711 841 </FileConfiguration> 842 <FileConfiguration 843 Name="test_release|Win32" 844 > 845 <Tool 846 Name="VCCLCompilerTool" 847 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 848 UsePrecompiledHeader="0" 849 BrowseInformation="0" 850 /> 851 </FileConfiguration> 712 852 </File> 713 853 <File … … 745 885 <FileConfiguration 746 886 Name="Release2|Win32" 887 > 888 <Tool 889 Name="VCCLCompilerTool" 890 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 891 UsePrecompiledHeader="0" 892 BrowseInformation="0" 893 /> 894 </FileConfiguration> 895 <FileConfiguration 896 Name="test_release|Win32" 747 897 > 748 898 <Tool … … 800 950 /> 801 951 </FileConfiguration> 952 <FileConfiguration 953 Name="test_release|Win32" 954 > 955 <Tool 956 Name="VCCLCompilerTool" 957 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 958 UsePrecompiledHeader="0" 959 BrowseInformation="0" 960 /> 961 </FileConfiguration> 802 962 </File> 803 963 <File … … 843 1003 /> 844 1004 </FileConfiguration> 1005 <FileConfiguration 1006 Name="test_release|Win32" 1007 > 1008 <Tool 1009 Name="VCCLCompilerTool" 1010 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1011 UsePrecompiledHeader="0" 1012 BrowseInformation="0" 1013 /> 1014 </FileConfiguration> 845 1015 </File> 846 1016 <File … … 886 1056 /> 887 1057 </FileConfiguration> 1058 <FileConfiguration 1059 Name="test_release|Win32" 1060 > 1061 <Tool 1062 Name="VCCLCompilerTool" 1063 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1064 UsePrecompiledHeader="0" 1065 BrowseInformation="0" 1066 /> 1067 </FileConfiguration> 888 1068 </File> 889 1069 <File … … 933 1113 /> 934 1114 </FileConfiguration> 1115 <FileConfiguration 1116 Name="test_release|Win32" 1117 > 1118 <Tool 1119 Name="VCCLCompilerTool" 1120 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1121 UsePrecompiledHeader="0" 1122 BrowseInformation="0" 1123 /> 1124 </FileConfiguration> 935 1125 </File> 936 1126 <File … … 976 1166 /> 977 1167 </FileConfiguration> 1168 <FileConfiguration 1169 Name="test_release|Win32" 1170 > 1171 <Tool 1172 Name="VCCLCompilerTool" 1173 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1174 UsePrecompiledHeader="0" 1175 BrowseInformation="0" 1176 /> 1177 </FileConfiguration> 978 1178 </File> 979 1179 <File … … 1019 1219 /> 1020 1220 </FileConfiguration> 1221 <FileConfiguration 1222 Name="test_release|Win32" 1223 > 1224 <Tool 1225 Name="VCCLCompilerTool" 1226 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1227 UsePrecompiledHeader="0" 1228 BrowseInformation="0" 1229 /> 1230 </FileConfiguration> 1021 1231 </File> 1022 1232 <File … … 1062 1272 /> 1063 1273 </FileConfiguration> 1274 <FileConfiguration 1275 Name="test_release|Win32" 1276 > 1277 <Tool 1278 Name="VCCLCompilerTool" 1279 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1280 UsePrecompiledHeader="0" 1281 BrowseInformation="0" 1282 /> 1283 </FileConfiguration> 1064 1284 </File> 1065 1285 <File … … 1097 1317 <FileConfiguration 1098 1318 Name="Release2|Win32" 1319 > 1320 <Tool 1321 Name="VCCLCompilerTool" 1322 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1323 UsePrecompiledHeader="0" 1324 BrowseInformation="0" 1325 /> 1326 </FileConfiguration> 1327 <FileConfiguration 1328 Name="test_release|Win32" 1099 1329 > 1100 1330 <Tool … … 1160 1390 /> 1161 1391 </FileConfiguration> 1392 <FileConfiguration 1393 Name="test_release|Win32" 1394 > 1395 <Tool 1396 Name="VCCLCompilerTool" 1397 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1398 UsePrecompiledHeader="0" 1399 BrowseInformation="0" 1400 /> 1401 </FileConfiguration> 1162 1402 </File> 1163 1403 <File … … 1219 1459 /> 1220 1460 </FileConfiguration> 1461 <FileConfiguration 1462 Name="test_release|Win32" 1463 > 1464 <Tool 1465 Name="VCCLCompilerTool" 1466 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1467 UsePrecompiledHeader="0" 1468 BrowseInformation="0" 1469 /> 1470 </FileConfiguration> 1221 1471 </File> 1222 1472 <File … … 1254 1504 <FileConfiguration 1255 1505 Name="Release2|Win32" 1506 > 1507 <Tool 1508 Name="VCCLCompilerTool" 1509 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)" 1510 UsePrecompiledHeader="0" 1511 BrowseInformation="0" 1512 /> 1513 </FileConfiguration> 1514 <FileConfiguration 1515 Name="test_release|Win32" 1256 1516 > 1257 1517 <Tool … … 1435 1695 <FileConfiguration 1436 1696 Name="Release2|Win32" 1697 > 1698 <Tool 1699 Name="VCCLCompilerTool" 1700 ObjectFile="$(IntDir)\$(InputName)1.obj" 1701 XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" 1702 /> 1703 </FileConfiguration> 1704 <FileConfiguration 1705 Name="test_release|Win32" 1437 1706 > 1438 1707 <Tool -
BasicCompiler64/BasicCompiler64.sln
r3 r97 9 9 English_Rel|Win32 = English_Rel|Win32 10 10 Release|Win32 = Release|Win32 11 test_release|Win32 = test_release|Win32 11 12 EndGlobalSection 12 13 GlobalSection(ProjectConfigurationPlatforms) = postSolution … … 17 18 {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.ActiveCfg = Release2|Win32 18 19 {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.Build.0 = Release2|Win32 20 {864B921B-423B-4F9E-9E6B-31B15968EDF9}.test_release|Win32.ActiveCfg = test_release|Win32 21 {864B921B-423B-4F9E-9E6B-31B15968EDF9}.test_release|Win32.Build.0 = test_release|Win32 19 22 EndGlobalSection 20 23 GlobalSection(SolutionProperties) = preSolution -
BasicCompiler64/Compile_CallProc.cpp
r77 r97 96 96 97 97 bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){ 98 // TODO: RefTypeは不必要なので削除する 98 99 int i2; 99 100 … … 120 121 if( pUserProc->GetParentClassPtr() ){ 121 122 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う 122 if(ObjectName[0] ){123 if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){ 123 124 if(lstrcmpi(ObjectName,"Super")==0){ 124 125 //クラスメンバ関数内から基底クラスの呼び出し … … 303 304 /////////////////////////////// 304 305 305 if(ObjectName[0] ){306 if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){ 306 307 if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember; 307 308 else{ -
BasicCompiler64/Compile_Func.cpp
r88 r97 57 57 } 58 58 59 if( type.IsString Object() ){59 if( type.IsStringClass() ){ 60 60 //Stringオブジェクトの場合 61 61 sprintf(temporary,"%s.Length",tempParm); -
BasicCompiler64/Compile_Statement.cpp
r88 r97 58 58 59 59 if(pUserProc){ 60 if( !pUserProc->IsMacro() ) SetError(10,Command,cp); 60 if( !pUserProc->IsMacro() ){ 61 SetError(10,Command,cp); 62 } 61 63 62 64 Opcode_CallProc("",pUserProc,0,"",0); -
BasicCompiler64/Compile_Var.cpp
r96 r97 366 366 return true; 367 367 } 368 void GetWithName(char *buffer){369 extern WITHINFO WithInfo;370 int i;371 372 buffer[0]=0;373 for(i=0;i<WithInfo.num;i++)374 lstrcat(buffer,WithInfo.ppName[i]);375 }376 368 377 369 int LocalVar_ThisPtrOffset; … … 401 393 //例: func().member 402 394 395 // TODO: 消す 396 SetError(); 397 return false; 398 /* 403 399 void *pInfo; 404 400 int idProc=GetProc(VarName,(void **)&pInfo); … … 435 431 436 432 return true; 437 } 433 }*/ 438 434 } 439 435 … … 864 860 } 865 861 else if( type.Is64() || type.IsPointer() ){ 866 if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){862 if(type.GetBasicType()==typeOfPtrChar){ 867 863 //文字列定数のとき 868 864 … … 1010 1006 } 1011 1007 else if( type.Is64() || type.IsPointer() ){ 1012 if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){1008 if(type.GetBasicType()==typeOfPtrChar ){ 1013 1009 //文字列定数のとき 1014 1010 -
BasicCompiler64/NumOpe.cpp
r94 r97 83 83 } 84 84 85 86 bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){ 87 int UseReg=pobj_reg->GetNextReg(); 88 int XmmReg=pobj_reg->GetNextXmmReg(); 89 90 //大きな型への暗黙の変換 91 int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 92 93 if(resultType.GetBasicType()&FLAG_PTR){ 94 //配列ポインタ 95 resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) ); 96 97 SetVarPtrToReg(UseReg,&relativeVar); 98 } 99 else if(resultType.IsReal()){ 100 //実数型 101 if( resultType.IsDouble() ) 102 SetXmmReg_DoubleVariable(&relativeVar,XmmReg); 103 if( resultType.IsSingle() ) 104 SetXmmReg_SingleVariable(&relativeVar,XmmReg); 105 } 106 else if( resultType.IsWhole() || resultType.IsObject()){ 107 //整数型 108 SetReg_WholeVariable(resultType.GetBasicType(),&relativeVar,UseReg); 109 } 110 else if( resultType.IsStruct() ){ 111 //構造体ポインタをUseRegへ格納(構造体は値型) 112 SetVarPtrToReg(UseReg,&relativeVar); 113 } 114 else{ 115 return false; 116 } 117 118 if( resultType.GetBasicType() != bigType ){ 119 // 大きな型へ変換された場合 120 // ※レジスタの値をキャストする 121 ExtendRegToBigType( UseReg, bigType, resultType.GetBasicType() ); 122 123 resultType.SetBasicType( bigType ); 124 } 125 126 return true; 127 } 128 bool TermMemberOpe( const CClass &objClass, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member ){ 129 130 int UseReg=pobj_reg->GetNextReg(); 131 int XmmReg=pobj_reg->GetNextXmmReg(); 132 133 134 if( GetMemberType( objClass, member, resultType, 0, false ) ){ 135 // メンバが見つかったとき 136 137 //オブジェクトポインタをr11にコピー 138 op_mov_RR( REG_R11, UseReg ); 139 140 RELATIVE_VAR relativeVar; 141 relativeVar.dwKind=VAR_DIRECTMEM; 142 143 if( !_member_offset( 144 true, //エラー表示あり 145 false, //読み込み専用 146 objClass, 147 member,&relativeVar,resultType,0)){ 148 return false; 149 } 150 151 if( !VarToReg( relativeVar, baseType, resultType ) ){ 152 SetError(11,termFull,cp); 153 } 154 155 return true; 156 } 157 158 159 /////////////////////////////////////////////////////////////////// 160 // 動的メソッドを検索 161 /////////////////////////////////////////////////////////////////// 162 vector<UserProc *> userProcs; 163 164 char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1]; 165 CClass::RefType refType; 166 lstrcpy( methodName, member ); 167 GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType); 168 169 objClass.EnumMethod( methodName, userProcs ); 170 UserProc *pUserProc; 171 if(userProcs.size()){ 172 //オーバーロードを解決 173 pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft); 174 175 if( pUserProc ){ 176 177 resultType = pUserProc->ReturnType(); 178 179 180 ////////////////////////////////////////////////////// 181 ///// レジスタ資源のバックアップ 182 { BACKUP_REGISTER_RESOURCE 183 ////////////////////////////////////////////////////// 184 185 //オブジェクトポインタをスタックに入れておく 186 //mov qword ptr[rsp+offset],reg ※スタックフレームを利用 187 pobj_sf->push( UseReg ); 188 189 if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft,0 ) ){ 190 //レジスタ資源を復元 191 RESTORE_REGISTER_RESOURCE 192 193 return false; 194 } 195 196 pobj_sf->pop(); 197 198 ///////////////////// 199 // 戻り値の処理 200 ///////////////////// 201 202 //大きな型への暗黙の変換 203 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 204 205 if( resultType.GetBasicType() != bigType ){ 206 // 大きな型へ変換された場合 207 // ※レジスタの値をキャストする 208 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 209 210 resultType.SetBasicType( bigType ); 211 } 212 213 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 214 215 216 ///////////////////////////////////////////// 217 ////// レジスタ資源を復元 218 RESTORE_REGISTER_RESOURCE 219 }//////////////////////////////////////////// 220 221 return true; 222 } 223 } 224 225 return false; 226 } 227 bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL ){ 228 char parameter[VN_SIZE]; 229 230 // Withを解決 231 char termFull[VN_SIZE]; 232 if(term[0]=='.'){ 233 GetWithName(termFull); 234 lstrcat(termFull,term); 235 } 236 else lstrcpy(termFull,term); 237 238 char termLeft[VN_SIZE]; 239 lstrcpy(termLeft,termFull); 240 241 if( (string)term=="DayOfWeek"){ 242 int test=0; 243 } 244 245 // パース 246 char member[VN_SIZE]; 247 CClass::RefType refType; 248 if( SplitMemberName( termFull, termLeft, member, refType ) ){ 249 /////////////////////////////////////////////////////////////////// 250 // オブジェクトとメンバに分解できるとき 251 // termLeft.member 252 /////////////////////////////////////////////////////////////////// 253 254 isLiteral = false; 255 256 // オブジェクト側の型を取得 257 bool isClassName = false; 258 Type leftType; 259 if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){ 260 return false; 261 } 262 263 if( isClassName ){ 264 // 静的メンバ/メソッドの場合 265 goto globalArea; 266 } 267 268 if( !leftType.HasMember() ){ 269 // メンバを持たない型の場合 270 return false; 271 } 272 273 return TermMemberOpe( leftType.GetClass(), baseType, resultType, termFull, termLeft, member ); 274 } 275 276 277 ////////////////////////////////////////////// 278 // クラス名かどうかをチェック(静的メンバ用) 279 ////////////////////////////////////////////// 280 281 if( pIsClassName ){ 282 if( pobj_DBClass->check( termFull ) ){ 283 *pIsClassName = true; 284 return true; 285 } 286 } 287 288 289 ///////////////////////////////////////////////////////////////// 290 // グローバル属性エリア 291 ///////////////////////////////////////////////////////////////// 292 globalArea: 293 294 int UseReg=pobj_reg->GetNextReg(); 295 int XmmReg=pobj_reg->GetNextXmmReg(); 296 297 298 if(lstrcmpi(termFull,"This")==0){ 299 //Thisオブジェクト 300 resultType.SetType( DEF_OBJECT, pobj_CompilingClass ); 301 302 SetThisPtrToReg( UseReg ); 303 304 isLiteral = false; 305 306 return true; 307 } 308 309 310 ////////////////////////////////////// 311 // 関数(DLL、ユーザー定義、組み込み) 312 ////////////////////////////////////// 313 char procName[VN_SIZE]; 314 char temporary[8192]; 315 316 int i2=GetCallProcName(termFull,procName); 317 if(termFull[i2]=='('){ 318 int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1); 319 320 void *pInfo; 321 int idProc=GetProc(procName,(void **)&pInfo); 322 323 if(idProc){ 324 //閉じカッコ")"に続く文字がNULLでないとき 325 if(termFull[i2+1+i4+1]!='\0'){ 326 SetError(42,NULL,cp); 327 } 328 329 330 ////////////////////////////////////////////////////// 331 ///// レジスタ資源のバックアップ 332 { BACKUP_REGISTER_RESOURCE 333 ////////////////////////////////////////////////////// 334 335 336 //////////////// 337 // 呼び出し 338 //////////////// 339 340 CallProc(idProc,pInfo,procName,parameter,resultType); 341 342 343 ///////////////////// 344 // 戻り値の処理 345 ///////////////////// 346 347 //大きな型への暗黙の変換 348 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 349 350 if( resultType.GetBasicType() != bigType ){ 351 // 大きな型へ変換された場合 352 // ※レジスタの値をキャストする 353 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 354 355 resultType.SetBasicType( bigType ); 356 } 357 358 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 359 360 ///////////////////////////////////////////// 361 ////// レジスタ資源を復元 362 RESTORE_REGISTER_RESOURCE 363 }//////////////////////////////////////////// 364 365 if(resultType.IsStruct()){ 366 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 367 //※後にfreeする必要あり 368 // TODO: 解放はGCに任せる 369 *pbUseHeap = 1; 370 } 371 372 isLiteral = false; 373 374 return true; 375 } 376 else if(GetConstCalcBuffer(procName,parameter,temporary)){ 377 ///////////////////////// 378 // マクロ関数 379 ///////////////////////// 380 381 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 382 if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 383 384 //マクロ関数の場合 385 NumOpe(&UseReg,temporary,Type(),resultType); 386 387 if(!IS_LITERAL(resultType.GetIndex())){ 388 //リテラル値ではなかったとき 389 isLiteral = false; 390 } 391 392 return true; 393 } 394 } 395 396 397 //////////////////////////////// 398 // インデクサ(getアクセサ) 399 //////////////////////////////// 400 401 char VarName[VN_SIZE],ArrayElements[VN_SIZE]; 402 GetArrayElement(termFull,VarName,ArrayElements); 403 if(ArrayElements[0]){ 404 GetVarType(VarName,resultType,false); 405 if( resultType.IsObject() ){ 406 CallIndexerGetterProc(UseReg,&resultType.GetClass(),VarName,ArrayElements,resultType); 407 408 isLiteral = false; 409 410 return true; 411 } 412 } 413 414 415 //////////////////////////////// 416 // 変数 417 //////////////////////////////// 418 419 RELATIVE_VAR relativeVar; 420 if(GetVarOffset( 421 false, //エラー表示なし 422 false, //読み込み専用 423 termFull, 424 &relativeVar,resultType)){ 425 ////////// 426 // 変数 427 ////////// 428 429 if( !VarToReg( relativeVar, baseType, resultType ) ){ 430 SetError(11,termFull,cp); 431 } 432 433 isLiteral = false; 434 435 return true; 436 } 437 438 /* 439 //////////////////////////////// 440 // 型名 441 //////////////////////////////// 442 443 if( Type::StringToType( termFull, resultType ) ){ 444 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 445 return true; 446 }*/ 447 448 449 ///////////////////////////////// 450 // プロパティ用のメソッド 451 ///////////////////////////////// 452 453 //配列要素を排除 454 GetArrayElement(termFull,VarName,ArrayElements); 455 456 if(GetSubHash(VarName,0)){ 457 458 ////////////////////////////////////////////////////// 459 ///// レジスタ資源のバックアップ 460 { BACKUP_REGISTER_RESOURCE 461 ////////////////////////////////////////////////////// 462 463 CallPropertyMethod(termFull,NULL,resultType); 464 465 //大きな型への暗黙の変換 466 int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() ); 467 468 if( resultType.GetBasicType() != bigType ){ 469 // 大きな型へ変換された場合 470 // ※レジスタの値をキャストする 471 ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() ); 472 473 resultType.SetBasicType( bigType ); 474 } 475 476 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg); 477 478 ///////////////////////////////////////////// 479 ////// レジスタ資源を復元 480 RESTORE_REGISTER_RESOURCE 481 }//////////////////////////////////////////// 482 483 if(resultType.IsStruct()){ 484 //構造体が戻ったときはヒープ領域にインスタンスが格納されている 485 //※後にfreeする必要あり 486 // TODO: 解放はGCに任せる 487 *pbUseHeap = 1; 488 } 489 490 isLiteral = false; 491 492 return true; 493 } 494 495 496 return false; 497 } 498 85 499 bool NumOpe( int *pReg, 86 500 const char *expression, … … 89 503 BOOL *pbUseHeap ){ 90 504 91 int i,i2,i3 ,i4;92 char temporary[1024],temp2[1024] ,temp3[1024];505 int i,i2,i3; 506 char temporary[1024],temp2[1024]; 93 507 94 508 if(expression[0]=='\0'){ … … 289 703 term=values[i]; 290 704 705 if( calc[i+1]%100 == CALC_AS ){ 706 // As演算子の右辺値 707 //型名 708 if( Type::StringToType( term, resultType ) ){ 709 resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST ); 710 } 711 else{ 712 SetError(3, term, cp ); 713 goto error; 714 } 715 716 type_stack[sp] = resultType.GetBasicType(); 717 index_stack[sp] = resultType.GetIndex(); 718 sp++; 719 720 break; 721 } 722 291 723 if(term[0]=='\"'){ 292 724 //リテラル文字列 … … 298 730 StrLiteral: 299 731 300 if( baseType.IsObject() ){ 301 if( baseType.IsStringObject() ){ 302 //要求タイプがStringのとき 303 304 //String型オブジェクトを生成 305 NewStringObject(UseReg,term); 306 307 extern CClass *pobj_StringClass; 308 type_stack[sp]=DEF_OBJECT; 309 index_stack[sp]=(LONG_PTR)pobj_StringClass; 310 bLiteralCalculation=0; 311 312 if(bXmm) pobj_reg->LockXmmReg(); 313 else pobj_reg->LockReg(); 314 315 sp++; 316 break; 317 } 732 if( baseType.IsObject() || baseType.IsNull() ){ 733 //要求タイプがオブジェクト、または未定のとき 734 735 //String型オブジェクトを生成 736 NewStringObject(UseReg,term); 737 738 extern CClass *pobj_StringClass; 739 type_stack[sp]=DEF_OBJECT; 740 index_stack[sp]=(LONG_PTR)pobj_StringClass; 741 bLiteralCalculation=0; 742 743 if(bXmm) pobj_reg->LockXmmReg(); 744 else pobj_reg->LockReg(); 745 746 sp++; 747 break; 318 748 } 319 749 … … 353 783 // 何らかの識別子 354 784 355 ////////////////////////////////////// 356 // 関数(DLL、ユーザー定義、組み込み) 357 ////////////////////////////////////// 358 359 i2=GetCallProcName(term,temporary); 360 if(term[i2]=='('){ 361 i4=GetStringInPare_RemovePare(temp2,term+i2+1); 362 363 void *pInfo; 364 int idProc=GetProc(temporary,(void **)&pInfo); 365 366 Type resultType; 367 if(idProc){ 368 //閉じカッコ")"に続く文字がNULLでないとき 369 if(term[i2+1+i4+1]!='\0'){ 370 if( term[i2+1+i4+1] == '.' 371 || term[i2+1+i4+1] == 1 && term[i2+1+i4+2] == ESC_PSMEM ){ 372 goto NonProc; 373 } 374 else{ 375 SetError(42,NULL,cp); 785 bool isLiteral; 786 if( TermOpe( term, baseType, resultType, isLiteral, &bUseHeap[sp] ) ){ 787 if(resultType.IsNull()){ 788 //戻り値が存在しないとき 789 for(i2=0;;i2++){ 790 if(term[i2]=='('||term[i2]=='\0'){ 791 term[i2]=0; 792 break; 376 793 } 377 794 } 378 379 380 ////////////////////////////////////////////////////// 381 ///// レジスタ資源のバックアップ 382 { BACKUP_REGISTER_RESOURCE 383 ////////////////////////////////////////////////////// 384 385 386 //////////////// 387 // 呼び出し 388 //////////////// 389 390 CallProc(idProc,pInfo,temporary,temp2,resultType); 391 if(resultType.IsNull()){ 392 //戻り値が存在しないとき 393 for(i2=2;;i2++){ 394 if(term[i2]=='('||term[i2]=='\0'){ 395 term[i2]=0; 396 break; 397 } 398 } 399 SetError(38,term,cp); 400 401 //レジスタ資源を復元 402 RESTORE_REGISTER_RESOURCE 403 404 goto error; 795 SetError(38,term,cp); 796 797 goto error; 798 } 799 800 type_stack[sp] = resultType.GetBasicType(); 801 index_stack[sp] = resultType.GetIndex(); 802 803 if( !isLiteral ){ 804 bLiteralCalculation=0; 805 } 806 807 if( resultType.GetBasicType() & FLAG_CAST ){ 808 // 型名のみ 809 SetError(); 810 } 811 else{ 812 if( resultType.IsReal() == false && UseReg==REG_R14 ){ 813 //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用 814 pobj_sf->push(REG_R14); 815 } 816 if( resultType.IsReal() && XmmReg==REG_XMM4 ){ 817 if(resultType.IsDouble()){ 818 //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用 819 pobj_sf->push(REG_XMM4,sizeof(double)); 405 820 } 406 407 408 ///////////////////// 409 // 戻り値の処理 410 ///////////////////// 411 412 //大きな型への暗黙の変換 413 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType()); 414 index_stack[sp] = resultType.GetIndex(); 415 bLiteralCalculation=0; 416 417 if( type_stack[sp] != resultType.GetBasicType() ){ 418 // 大きな型へ変換された場合 419 // ※レジスタの値をキャストする 420 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() ); 821 if(resultType.IsSingle()){ 822 //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用 823 pobj_sf->push(REG_XMM4,sizeof(float)); 421 824 } 422 423 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);424 425 if(resultType.IsReal()) bXmm=1;426 else bXmm=0;427 428 /////////////////////////////////////////////429 ////// レジスタ資源を復元430 RESTORE_REGISTER_RESOURCE431 }////////////////////////////////////////////432 433 434 if(bXmm) pobj_reg->LockXmmReg();435 else pobj_reg->LockReg();436 437 if(resultType.IsStruct()){438 //構造体が戻ったときはヒープ領域にインスタンスが格納されている439 //※後にfreeする必要あり440 bUseHeap[sp]=1;441 825 } 442 826 443 sp++; 444 break; 445 } 446 else if(GetConstCalcBuffer(temporary,temp2,temp3)){ 447 ///////////////////////// 448 // マクロ関数 449 ///////////////////////// 450 451 //閉じカッコ")"に続く文字がNULLでないときはエラーにする 452 if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp); 453 454 //マクロ関数の場合 455 NumOpe(&UseReg,temp3,Type(),resultType); 456 457 if(!IS_LITERAL(resultType.GetIndex())){ 458 //リテラル値ではなかったとき 459 bLiteralCalculation=0; 827 if( resultType.IsReal() ){ 828 pobj_reg->LockXmmReg(); 460 829 } 461 462 type_stack[sp] = resultType.GetBasicType(); 463 index_stack[sp] = resultType.GetIndex(); 464 465 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 466 else pobj_reg->LockReg(); 467 468 sp++; 469 break; 470 } 471 } 472 NonProc: 473 474 475 //インデクサ(getアクセサ) 476 char variable[VN_SIZE],array_element[VN_SIZE]; 477 GetArrayElement(term,variable,array_element); 478 if(array_element[0]){ 479 Type resultType; 480 GetVarType(variable,resultType,0); 481 if( resultType.IsObject() ){ 482 CallIndexerGetterProc(UseReg,&resultType.GetClass(),variable,array_element,resultType); 483 type_stack[sp]=resultType.GetBasicType(); 484 index_stack[sp]=resultType.GetIndex(); 485 bLiteralCalculation=0; 486 487 if(resultType.IsReal()) pobj_reg->LockXmmReg(); 488 else pobj_reg->LockReg(); 489 sp++; 490 break; 491 } 830 else{ 831 pobj_reg->LockReg(); 832 } 833 } 834 835 sp++; 836 break; 492 837 } 493 838 … … 516 861 517 862 pobj_reg->LockReg(); 518 sp++;519 break;520 }521 522 523 RELATIVE_VAR RelativeVar;524 Type varType;525 if(GetVarOffset(526 false, //エラー表示あり527 false, //読み込み専用528 term,529 &RelativeVar,varType)){530 //////////531 // 変数532 //////////533 534 //大きな型への暗黙の変換535 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());536 index_stack[sp] = varType.GetIndex();537 bLiteralCalculation=0;538 539 if(varType.GetBasicType()&FLAG_PTR){540 //配列ポインタ541 type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);542 543 SetVarPtrToReg(UseReg,&RelativeVar);544 }545 else if(varType.IsReal()){546 //実数型547 bXmm=1;548 549 if( varType.IsDouble() )550 SetXmmReg_DoubleVariable(&RelativeVar,XmmReg);551 if( varType.IsSingle() )552 SetXmmReg_SingleVariable(&RelativeVar,XmmReg);553 }554 else if( varType.IsWhole() || varType.IsObject()){555 //整数型556 SetReg_WholeVariable(varType.GetBasicType(),&RelativeVar,UseReg);557 }558 else if( varType.IsStruct() ){559 //構造体ポインタをUseRegへ格納(構造体は値型)560 SetVarPtrToReg(UseReg,&RelativeVar);561 }562 else SetError(11,term,cp);563 564 if( type_stack[sp] != varType.GetBasicType() ){565 // 大きな型へ変換された場合566 // ※レジスタの値をキャストする567 ExtendRegToBigType( UseReg, type_stack[sp], varType.GetBasicType() );568 }569 570 if(bXmm==0&&UseReg==REG_R14){571 //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用572 pobj_sf->push(REG_R14);573 }574 if(bXmm&&XmmReg==REG_XMM4){575 if(varType.IsDouble()){576 //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用577 pobj_sf->push(REG_XMM4,sizeof(double));578 }579 if(varType.IsSingle()){580 //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用581 pobj_sf->push(REG_XMM4,sizeof(float));582 }583 }584 585 if(bXmm) pobj_reg->LockXmmReg();586 else pobj_reg->LockReg();587 863 sp++; 588 864 break; … … 622 898 } 623 899 } 624 625 626 //////////////627 // 型名の場合628 //////////////629 Type tempType;630 if( Type::StringToType( term, tempType ) ){631 type_stack[sp] = tempType.GetBasicType() | FLAG_CAST;632 index_stack[sp] = tempType.GetIndex();633 sp++;634 break;635 }636 637 638 /////////////////////////////////639 // プロパティ用のメソッド640 /////////////////////////////////641 642 //配列要素を排除643 char VarName[VN_SIZE],ArrayElements[VN_SIZE];644 GetArrayElement(term,VarName,ArrayElements);645 646 if(GetSubHash(VarName,0)){647 648 //////////////////////////////////////////////////////649 ///// レジスタ資源のバックアップ650 { BACKUP_REGISTER_RESOURCE651 //////////////////////////////////////////////////////652 653 Type resultType;654 CallPropertyMethod(term,NULL,resultType);655 656 //大きな型への暗黙の変換657 type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());658 index_stack[sp]=resultType.GetIndex();659 bLiteralCalculation=0;660 661 if( type_stack[sp] != resultType.GetBasicType() ){662 // 大きな型へ変換された場合663 // ※レジスタの値をキャストする664 ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );665 }666 667 SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);668 669 if(IsRealNumberType(type_stack[sp])) bXmm=1;670 else bXmm=0;671 672 /////////////////////////////////////////////673 ////// レジスタ資源を復元674 RESTORE_REGISTER_RESOURCE675 }////////////////////////////////////////////676 677 if(type_stack[sp]==DEF_STRUCT){678 //構造体が戻ったときはヒープ領域にインスタンスが格納されている679 //※後にfreeする必要あり680 bUseHeap[sp]=1;681 }682 683 if(bXmm) pobj_reg->LockXmmReg();684 else pobj_reg->LockReg();685 sp++;686 break;687 }688 689 900 690 901 … … 735 946 736 947 if(XmmReg==REG_XMM4){ 948 SetError(); // TODO: 未実装 737 949 //push term 738 950 op_push_value(i32data); -
BasicCompiler64/Opcode.h
r95 r97 315 315 316 316 //Compile_Var.cpp 317 void GetWithName(char *buffer);317 bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess); 318 318 void SetThisPtrToReg(int reg); 319 319 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL);
Note:
See TracChangeset
for help on using the changeset viewer.