From 9f95c4c383a5cf57e10e54dc5477d34e0337a2b0 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Mon, 10 Sep 2018 14:29:36 -0700 Subject: [PATCH 1/8] Add MethodImplOptions.AggressiveOptimization and use it for tiering Part of fix for https://github.com/dotnet/corefx/issues/32235 Workaround for https://github.com/dotnet/coreclr/issues/19751 - Added and set CORJIT_FLAG_AGGRESSIVE_OPT to indicate that a method is flagged with AggressiveOptimization - For a method flagged with AggressiveOptimization, tiering uses a foreground tier 1 JIT on first call to the method, skipping the tier 0 JIT and call counting - When tiering is disabled, a method flagged with AggressiveOptimization does not use r2r-pregenerated code - R2r crossgen does not generate code for a method flagged with AggressiveOptimization --- .../CompilerServices/MethodImplOptions.cs | 1 + src/ilasm/asmparse.y | 3 +- src/ilasm/prebuilt/asmparse.cpp | 3453 +++++++++-------- src/ildasm/dasm.cpp | 1 + src/inc/corhdr.h | 4 +- src/inc/corjitflags.h | 2 +- src/inc/il_kywd.h | 1 + src/vm/codeversion.cpp | 12 +- src/vm/jitinterface.cpp | 4 + src/vm/method.hpp | 13 +- src/vm/prestub.cpp | 12 +- src/zap/zapinfo.cpp | 6 + .../MethodImplOptionsTests.cs | 152 + .../MethodImplOptionsTests.csproj | 24 + .../MiAggressiveOptimization.il | 21 + 15 files changed, 1973 insertions(+), 1736 deletions(-) create mode 100644 tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs create mode 100644 tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj create mode 100644 tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il diff --git a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/MethodImplOptions.cs b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/MethodImplOptions.cs index 2b5affc699ab..b50ae094ce04 100644 --- a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/MethodImplOptions.cs +++ b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/MethodImplOptions.cs @@ -16,6 +16,7 @@ public enum MethodImplOptions NoOptimization = 0x0040, PreserveSig = 0x0080, AggressiveInlining = 0x0100, + AggressiveOptimization = 0x0200, InternalCall = 0x1000 } } \ No newline at end of file diff --git a/src/ilasm/asmparse.y b/src/ilasm/asmparse.y index 051df9219926..90a59d18222c 100644 --- a/src/ilasm/asmparse.y +++ b/src/ilasm/asmparse.y @@ -78,7 +78,7 @@ %token VALUE_ VALUETYPE_ NATIVE_ INSTANCE_ SPECIALNAME_ FORWARDER_ %token STATIC_ PUBLIC_ PRIVATE_ FAMILY_ FINAL_ SYNCHRONIZED_ INTERFACE_ SEALED_ NESTED_ %token ABSTRACT_ AUTO_ SEQUENTIAL_ EXPLICIT_ ANSI_ UNICODE_ AUTOCHAR_ IMPORT_ ENUM_ -%token VIRTUAL_ NOINLINING_ AGGRESSIVEINLINING_ NOOPTIMIZATION_ UNMANAGEDEXP_ BEFOREFIELDINIT_ +%token VIRTUAL_ NOINLINING_ AGGRESSIVEINLINING_ NOOPTIMIZATION_ AGGRESSIVEOPTIMIZATION_ UNMANAGEDEXP_ BEFOREFIELDINIT_ %token STRICT_ RETARGETABLE_ WINDOWSRUNTIME_ NOPLATFORM_ %token METHOD_ FIELD_ PINNED_ MODREQ_ MODOPT_ SERIALIZABLE_ PROPERTY_ TYPE_ %token ASSEMBLY_ FAMANDASSEM_ FAMORASSEM_ PRIVATESCOPE_ HIDEBYSIG_ NEWSLOT_ RTSPECIALNAME_ PINVOKEIMPL_ @@ -854,6 +854,7 @@ implAttr : /* EMPTY */ { $$ = (CorMethodImp | implAttr NOINLINING_ { $$ = (CorMethodImpl) ($1 | miNoInlining); } | implAttr AGGRESSIVEINLINING_ { $$ = (CorMethodImpl) ($1 | miAggressiveInlining); } | implAttr NOOPTIMIZATION_ { $$ = (CorMethodImpl) ($1 | miNoOptimization); } + | implAttr AGGRESSIVEOPTIMIZATION_ { $$ = (CorMethodImpl) ($1 | miAggressiveOptimization); } | implAttr FLAGS_ '(' int32 ')' { $$ = (CorMethodImpl) ($4); } ; diff --git a/src/ilasm/prebuilt/asmparse.cpp b/src/ilasm/prebuilt/asmparse.cpp index 389546edb287..a5c7ccd93b7f 100644 --- a/src/ilasm/prebuilt/asmparse.cpp +++ b/src/ilasm/prebuilt/asmparse.cpp @@ -140,196 +140,197 @@ typedef union { # define NOINLINING_ 347 # define AGGRESSIVEINLINING_ 348 # define NOOPTIMIZATION_ 349 -# define UNMANAGEDEXP_ 350 -# define BEFOREFIELDINIT_ 351 -# define STRICT_ 352 -# define RETARGETABLE_ 353 -# define WINDOWSRUNTIME_ 354 -# define NOPLATFORM_ 355 -# define METHOD_ 356 -# define FIELD_ 357 -# define PINNED_ 358 -# define MODREQ_ 359 -# define MODOPT_ 360 -# define SERIALIZABLE_ 361 -# define PROPERTY_ 362 -# define TYPE_ 363 -# define ASSEMBLY_ 364 -# define FAMANDASSEM_ 365 -# define FAMORASSEM_ 366 -# define PRIVATESCOPE_ 367 -# define HIDEBYSIG_ 368 -# define NEWSLOT_ 369 -# define RTSPECIALNAME_ 370 -# define PINVOKEIMPL_ 371 -# define _CTOR 372 -# define _CCTOR 373 -# define LITERAL_ 374 -# define NOTSERIALIZED_ 375 -# define INITONLY_ 376 -# define REQSECOBJ_ 377 -# define CIL_ 378 -# define OPTIL_ 379 -# define MANAGED_ 380 -# define FORWARDREF_ 381 -# define PRESERVESIG_ 382 -# define RUNTIME_ 383 -# define INTERNALCALL_ 384 -# define _IMPORT 385 -# define NOMANGLE_ 386 -# define LASTERR_ 387 -# define WINAPI_ 388 -# define AS_ 389 -# define BESTFIT_ 390 -# define ON_ 391 -# define OFF_ 392 -# define CHARMAPERROR_ 393 -# define INSTR_NONE 394 -# define INSTR_VAR 395 -# define INSTR_I 396 -# define INSTR_I8 397 -# define INSTR_R 398 -# define INSTR_BRTARGET 399 -# define INSTR_METHOD 400 -# define INSTR_FIELD 401 -# define INSTR_TYPE 402 -# define INSTR_STRING 403 -# define INSTR_SIG 404 -# define INSTR_TOK 405 -# define INSTR_SWITCH 406 -# define _CLASS 407 -# define _NAMESPACE 408 -# define _METHOD 409 -# define _FIELD 410 -# define _DATA 411 -# define _THIS 412 -# define _BASE 413 -# define _NESTER 414 -# define _EMITBYTE 415 -# define _TRY 416 -# define _MAXSTACK 417 -# define _LOCALS 418 -# define _ENTRYPOINT 419 -# define _ZEROINIT 420 -# define _EVENT 421 -# define _ADDON 422 -# define _REMOVEON 423 -# define _FIRE 424 -# define _OTHER 425 -# define _PROPERTY 426 -# define _SET 427 -# define _GET 428 -# define _PERMISSION 429 -# define _PERMISSIONSET 430 -# define REQUEST_ 431 -# define DEMAND_ 432 -# define ASSERT_ 433 -# define DENY_ 434 -# define PERMITONLY_ 435 -# define LINKCHECK_ 436 -# define INHERITCHECK_ 437 -# define REQMIN_ 438 -# define REQOPT_ 439 -# define REQREFUSE_ 440 -# define PREJITGRANT_ 441 -# define PREJITDENY_ 442 -# define NONCASDEMAND_ 443 -# define NONCASLINKDEMAND_ 444 -# define NONCASINHERITANCE_ 445 -# define _LINE 446 -# define P_LINE 447 -# define _LANGUAGE 448 -# define _CUSTOM 449 -# define INIT_ 450 -# define _SIZE 451 -# define _PACK 452 -# define _VTABLE 453 -# define _VTFIXUP 454 -# define FROMUNMANAGED_ 455 -# define CALLMOSTDERIVED_ 456 -# define _VTENTRY 457 -# define RETAINAPPDOMAIN_ 458 -# define _FILE 459 -# define NOMETADATA_ 460 -# define _HASH 461 -# define _ASSEMBLY 462 -# define _PUBLICKEY 463 -# define _PUBLICKEYTOKEN 464 -# define ALGORITHM_ 465 -# define _VER 466 -# define _LOCALE 467 -# define EXTERN_ 468 -# define _MRESOURCE 469 -# define _MODULE 470 -# define _EXPORT 471 -# define LEGACY_ 472 -# define LIBRARY_ 473 -# define X86_ 474 -# define IA64_ 475 -# define AMD64_ 476 -# define ARM_ 477 -# define MARSHAL_ 478 -# define CUSTOM_ 479 -# define SYSSTRING_ 480 -# define FIXED_ 481 -# define VARIANT_ 482 -# define CURRENCY_ 483 -# define SYSCHAR_ 484 -# define DECIMAL_ 485 -# define DATE_ 486 -# define BSTR_ 487 -# define TBSTR_ 488 -# define LPSTR_ 489 -# define LPWSTR_ 490 -# define LPTSTR_ 491 -# define OBJECTREF_ 492 -# define IUNKNOWN_ 493 -# define IDISPATCH_ 494 -# define STRUCT_ 495 -# define SAFEARRAY_ 496 -# define BYVALSTR_ 497 -# define LPVOID_ 498 -# define ANY_ 499 -# define ARRAY_ 500 -# define LPSTRUCT_ 501 -# define IIDPARAM_ 502 -# define IN_ 503 -# define OUT_ 504 -# define OPT_ 505 -# define PARAM_ 506 -# define _OVERRIDE 507 -# define WITH_ 508 -# define NULL_ 509 -# define HRESULT_ 510 -# define CARRAY_ 511 -# define USERDEFINED_ 512 -# define RECORD_ 513 -# define FILETIME_ 514 -# define BLOB_ 515 -# define STREAM_ 516 -# define STORAGE_ 517 -# define STREAMED_OBJECT_ 518 -# define STORED_OBJECT_ 519 -# define BLOB_OBJECT_ 520 -# define CF_ 521 -# define CLSID_ 522 -# define VECTOR_ 523 -# define _SUBSYSTEM 524 -# define _CORFLAGS 525 -# define ALIGNMENT_ 526 -# define _IMAGEBASE 527 -# define _STACKRESERVE 528 -# define _TYPEDEF 529 -# define _TEMPLATE 530 -# define _TYPELIST 531 -# define _MSCORLIB 532 -# define P_DEFINE 533 -# define P_UNDEF 534 -# define P_IFDEF 535 -# define P_IFNDEF 536 -# define P_ELSE 537 -# define P_ENDIF 538 -# define P_INCLUDE 539 +# define AGGRESSIVEOPTIMIZATION_ 350 +# define UNMANAGEDEXP_ 351 +# define BEFOREFIELDINIT_ 352 +# define STRICT_ 353 +# define RETARGETABLE_ 354 +# define WINDOWSRUNTIME_ 355 +# define NOPLATFORM_ 356 +# define METHOD_ 357 +# define FIELD_ 358 +# define PINNED_ 359 +# define MODREQ_ 360 +# define MODOPT_ 361 +# define SERIALIZABLE_ 362 +# define PROPERTY_ 363 +# define TYPE_ 364 +# define ASSEMBLY_ 365 +# define FAMANDASSEM_ 366 +# define FAMORASSEM_ 367 +# define PRIVATESCOPE_ 368 +# define HIDEBYSIG_ 369 +# define NEWSLOT_ 370 +# define RTSPECIALNAME_ 371 +# define PINVOKEIMPL_ 372 +# define _CTOR 373 +# define _CCTOR 374 +# define LITERAL_ 375 +# define NOTSERIALIZED_ 376 +# define INITONLY_ 377 +# define REQSECOBJ_ 378 +# define CIL_ 379 +# define OPTIL_ 380 +# define MANAGED_ 381 +# define FORWARDREF_ 382 +# define PRESERVESIG_ 383 +# define RUNTIME_ 384 +# define INTERNALCALL_ 385 +# define _IMPORT 386 +# define NOMANGLE_ 387 +# define LASTERR_ 388 +# define WINAPI_ 389 +# define AS_ 390 +# define BESTFIT_ 391 +# define ON_ 392 +# define OFF_ 393 +# define CHARMAPERROR_ 394 +# define INSTR_NONE 395 +# define INSTR_VAR 396 +# define INSTR_I 397 +# define INSTR_I8 398 +# define INSTR_R 399 +# define INSTR_BRTARGET 400 +# define INSTR_METHOD 401 +# define INSTR_FIELD 402 +# define INSTR_TYPE 403 +# define INSTR_STRING 404 +# define INSTR_SIG 405 +# define INSTR_TOK 406 +# define INSTR_SWITCH 407 +# define _CLASS 408 +# define _NAMESPACE 409 +# define _METHOD 410 +# define _FIELD 411 +# define _DATA 412 +# define _THIS 413 +# define _BASE 414 +# define _NESTER 415 +# define _EMITBYTE 416 +# define _TRY 417 +# define _MAXSTACK 418 +# define _LOCALS 419 +# define _ENTRYPOINT 420 +# define _ZEROINIT 421 +# define _EVENT 422 +# define _ADDON 423 +# define _REMOVEON 424 +# define _FIRE 425 +# define _OTHER 426 +# define _PROPERTY 427 +# define _SET 428 +# define _GET 429 +# define _PERMISSION 430 +# define _PERMISSIONSET 431 +# define REQUEST_ 432 +# define DEMAND_ 433 +# define ASSERT_ 434 +# define DENY_ 435 +# define PERMITONLY_ 436 +# define LINKCHECK_ 437 +# define INHERITCHECK_ 438 +# define REQMIN_ 439 +# define REQOPT_ 440 +# define REQREFUSE_ 441 +# define PREJITGRANT_ 442 +# define PREJITDENY_ 443 +# define NONCASDEMAND_ 444 +# define NONCASLINKDEMAND_ 445 +# define NONCASINHERITANCE_ 446 +# define _LINE 447 +# define P_LINE 448 +# define _LANGUAGE 449 +# define _CUSTOM 450 +# define INIT_ 451 +# define _SIZE 452 +# define _PACK 453 +# define _VTABLE 454 +# define _VTFIXUP 455 +# define FROMUNMANAGED_ 456 +# define CALLMOSTDERIVED_ 457 +# define _VTENTRY 458 +# define RETAINAPPDOMAIN_ 459 +# define _FILE 460 +# define NOMETADATA_ 461 +# define _HASH 462 +# define _ASSEMBLY 463 +# define _PUBLICKEY 464 +# define _PUBLICKEYTOKEN 465 +# define ALGORITHM_ 466 +# define _VER 467 +# define _LOCALE 468 +# define EXTERN_ 469 +# define _MRESOURCE 470 +# define _MODULE 471 +# define _EXPORT 472 +# define LEGACY_ 473 +# define LIBRARY_ 474 +# define X86_ 475 +# define IA64_ 476 +# define AMD64_ 477 +# define ARM_ 478 +# define MARSHAL_ 479 +# define CUSTOM_ 480 +# define SYSSTRING_ 481 +# define FIXED_ 482 +# define VARIANT_ 483 +# define CURRENCY_ 484 +# define SYSCHAR_ 485 +# define DECIMAL_ 486 +# define DATE_ 487 +# define BSTR_ 488 +# define TBSTR_ 489 +# define LPSTR_ 490 +# define LPWSTR_ 491 +# define LPTSTR_ 492 +# define OBJECTREF_ 493 +# define IUNKNOWN_ 494 +# define IDISPATCH_ 495 +# define STRUCT_ 496 +# define SAFEARRAY_ 497 +# define BYVALSTR_ 498 +# define LPVOID_ 499 +# define ANY_ 500 +# define ARRAY_ 501 +# define LPSTRUCT_ 502 +# define IIDPARAM_ 503 +# define IN_ 504 +# define OUT_ 505 +# define OPT_ 506 +# define PARAM_ 507 +# define _OVERRIDE 508 +# define WITH_ 509 +# define NULL_ 510 +# define HRESULT_ 511 +# define CARRAY_ 512 +# define USERDEFINED_ 513 +# define RECORD_ 514 +# define FILETIME_ 515 +# define BLOB_ 516 +# define STREAM_ 517 +# define STORAGE_ 518 +# define STREAMED_OBJECT_ 519 +# define STORED_OBJECT_ 520 +# define BLOB_OBJECT_ 521 +# define CF_ 522 +# define CLSID_ 523 +# define VECTOR_ 524 +# define _SUBSYSTEM 525 +# define _CORFLAGS 526 +# define ALIGNMENT_ 527 +# define _IMAGEBASE 528 +# define _STACKRESERVE 529 +# define _TYPEDEF 530 +# define _TEMPLATE 531 +# define _TYPELIST 532 +# define _MSCORLIB 533 +# define P_DEFINE 534 +# define P_UNDEF 535 +# define P_IFDEF 536 +# define P_IFNDEF 537 +# define P_ELSE 538 +# define P_ENDIF 539 +# define P_INCLUDE 540 #define yyclearin yychar = -1 #define yyerrok yyerrflag = 0 #ifndef YYMAXDEPTH @@ -388,7 +389,7 @@ typedef YYEXIND_T yyexind_t; #endif # define YYERRCODE 256 -#line 2051 "asmparse.y" +#line 2052 "asmparse.y" #include "grammar_after.cpp" @@ -401,100 +402,100 @@ YYSTATIC YYCONST short yyexca[] = { #if !(YYOPTTIME) -1, 452, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 621, #endif - 274, 549, - 47, 549, + 274, 550, + 47, 550, -2, 227, #if !(YYOPTTIME) -1, 642, #endif 40, 307, 60, 307, - -2, 549, + -2, 550, #if !(YYOPTTIME) -1, 663, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 686, #endif - 274, 549, - 47, 549, - -2, 510, + 274, 550, + 47, 550, + -2, 511, #if !(YYOPTTIME) -1, 803, #endif 123, 232, - -2, 549, + -2, 550, #if !(YYOPTTIME) -1, 828, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 953, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 986, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 987, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1308, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1309, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1315, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1322, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1447, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) -1, 1479, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) --1, 1545, +-1, 1546, #endif - 41, 532, + 41, 533, -2, 308, #if !(YYOPTTIME) --1, 1562, +-1, 1563, #endif - 41, 532, + 41, 533, -2, 308, }; -# define YYNPROD 838 +# define YYNPROD 839 #if YYOPTTIME YYSTATIC YYCONST yyexind_t yyexcaind[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -651,12 +652,12 @@ YYSTATIC YYCONST yyexind_t yyexcaind[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 78 + 0, 0, 0, 78 }; #endif -# define YYLAST 3904 +# define YYLAST 3932 YYSTATIC YYCONST short YYFARDATA YYACT[] = { 699, 1398, 1121, 1466, 658, 1467, 639, 1024, 1465, 878, @@ -666,572 +667,575 @@ YYSTATIC YYCONST short YYFARDATA YYACT[] = { 690, 852, 273, 153, 219, 660, 24, 44, 776, 218, 307, 10, 190, 176, 78, 81, 6, 86, 5, 598, 673, 262, 204, 515, 3, 188, 217, 983, 17, 301, - 603, 136, 76, 1550, 1194, 1242, 214, 264, 7, 1238, - 1057, 1239, 1113, 1111, 85, 1112, 580, 74, 715, 88, - 87, 137, 89, 300, 115, 56, 139, 712, 672, 113, - 1058, 98, 112, 178, 179, 180, 181, 74, 272, 696, - 322, 519, 1015, 461, 220, 56, 18, 452, 536, 338, - 278, 88, 87, 1021, 89, 268, 216, 269, 1240, 225, - 56, 265, 277, 277, 1228, 1229, 106, 1226, 1227, 590, - 277, 343, 361, 360, 359, 358, 654, 368, 345, 653, - 68, 310, 312, 314, 316, 318, 185, 1554, 460, 1126, - 1127, 1414, 98, 931, 932, 327, 277, 348, 339, 1027, - 342, 778, 1026, 779, 373, 366, 154, 277, 695, 133, - 694, 991, 379, 271, 362, 84, 258, 364, 363, 376, - 614, 192, 387, 105, 1519, 662, 513, 930, 365, 1059, - 369, 202, 203, 371, 370, 1487, 374, 1264, 596, 450, - 661, 451, 763, 372, 416, 469, 186, 467, 471, 470, - 442, 26, 74, 376, 456, 417, 418, 346, 376, 1559, - 352, 472, 474, 599, 353, 305, 483, 388, 88, 87, - 596, 89, 410, 1263, 1478, 500, 492, 1314, 457, 441, - 24, 1200, 357, 491, 435, 10, 825, 797, 787, 56, - 486, 432, 490, 428, 475, 478, 479, 773, 476, 429, - 494, 434, 17, 192, 108, 666, 511, 511, 528, 534, - 375, 433, 7, 351, 267, 321, 480, 481, 473, 485, - 152, 710, 74, 484, 1234, 540, 1345, 116, 1496, 1391, - 56, 1540, 499, 80, 79, 498, 543, 493, 1417, 571, - 959, 268, 1351, 1544, 574, 348, 575, 154, 576, 436, - 18, 266, 548, 1335, 1116, 578, 579, 504, 541, 46, - 420, 544, 421, 422, 423, 933, 934, 570, 935, 88, - 572, 947, 89, 573, 46, 594, 854, 855, 856, 1128, - 640, 641, 600, 135, 198, 88, 87, 962, 89, 199, - 1541, 200, 568, 1510, 192, 487, 1341, 201, 612, 154, - 755, 482, 277, 674, 1543, 510, 510, 527, 533, 74, - 605, 744, 745, 746, 195, 808, 182, 623, 943, 611, - 599, 581, 582, 1141, 497, 1233, 700, 1252, 1142, 196, - 565, 367, 375, 620, 595, 258, 610, 88, 87, 518, - 89, 74, 606, 607, 608, 609, 747, 748, 749, 1542, - 643, 613, 599, 537, 340, 341, 634, 1489, 348, 807, - 459, 618, 619, 621, 780, 1130, 321, 876, 648, 649, - 638, 88, 87, 177, 89, 1231, 88, 87, 847, 89, - 152, 781, 702, 754, 347, 650, 664, 1502, 413, 88, - 87, 670, 946, 1488, 651, 88, 87, 155, 89, 681, - 642, 1518, 1126, 1127, 545, 743, 1118, 177, 993, 994, - 995, 996, 177, 587, 505, 859, 352, 1513, 667, 988, - 353, 678, 80, 79, 479, 177, 647, 692, 646, 1512, - 782, 1511, 61, 62, 47, 63, 536, 1508, 357, 645, - 685, 198, 741, 669, 480, 481, 199, 689, 200, 82, - 63, 74, 701, 479, 201, 711, 680, 453, 72, 679, - 88, 87, 519, 89, 512, 520, 74, 507, 508, 351, - 686, 195, 88, 480, 481, 89, 74, 723, 71, 70, - 354, 355, 356, 538, 691, 216, 196, 1141, 225, 1506, - 1241, 724, 1142, 675, 676, 677, 720, 657, 721, 49, - 50, 51, 52, 53, 54, 55, 671, 709, 74, 644, - 479, 730, 1504, 80, 79, 714, 80, 79, 348, 49, - 50, 51, 52, 53, 54, 55, 719, 74, 1141, 716, - 480, 481, 726, 1142, 49, 50, 51, 52, 53, 54, - 55, 156, 157, 158, 69, 758, 74, 542, 74, 88, - 87, 592, 89, 600, 67, 764, 765, 155, 88, 87, - 688, 89, 74, 783, 98, 638, 729, 1320, 1319, 1318, - 1317, 750, 74, 697, 325, 74, 703, 1172, 1171, 1170, - 1169, 542, 705, 348, 706, 177, 377, 1499, 324, 769, - 770, 771, 1337, 1338, 1339, 642, 815, 789, 813, 819, - 853, 88, 87, 816, 89, 822, 541, 1180, 801, 802, - 80, 79, 798, 823, 88, 812, 806, 89, 74, 66, - 818, 626, 627, 628, 74, 1117, 833, 834, 762, 1450, - 495, 826, 216, 786, 591, 225, 1439, 800, 793, 803, - 74, 809, 796, 636, 846, 824, 382, 383, 384, 385, - 817, 152, 74, 857, 74, 56, 629, 630, 631, 922, - 74, 740, 821, 49, 50, 51, 52, 53, 54, 55, - 1437, 850, 936, 937, 860, 1490, 516, 761, 88, 87, - 375, 89, 832, 1327, 844, 1247, 1243, 1244, 1245, 1246, - 1179, 1435, 769, 600, 949, 192, 845, 942, 1433, 848, - 276, 156, 157, 158, 49, 50, 51, 52, 53, 54, - 55, 97, 74, 924, 111, 925, 926, 927, 928, 929, - 952, 1001, 1416, 1407, 985, 152, 635, 938, 1406, 277, - 1013, 965, 362, 1326, 1011, 74, 354, 355, 356, 442, - 1000, 1009, 528, 605, 1404, 585, 954, 584, 583, 145, - 1390, 1012, 948, 1388, 586, 799, 960, 955, 277, 1017, - 958, 692, 692, 1032, 1378, 1376, 1237, 350, 441, 999, - 1008, 817, 1022, 435, 997, 1007, 851, 1374, 1037, 1014, + 603, 136, 76, 1551, 1194, 1238, 214, 264, 7, 1242, + 1057, 1113, 1111, 1112, 85, 1239, 580, 88, 87, 74, + 89, 137, 74, 300, 115, 56, 139, 715, 712, 113, + 1058, 98, 112, 178, 179, 180, 181, 696, 272, 519, + 322, 1015, 56, 672, 220, 338, 18, 452, 277, 461, + 278, 536, 68, 1228, 1229, 268, 216, 269, 56, 225, + 376, 265, 1240, 277, 88, 87, 106, 89, 590, 931, + 932, 343, 1226, 1227, 1021, 277, 361, 368, 345, 360, + 359, 310, 312, 314, 316, 318, 358, 185, 654, 352, + 653, 1414, 98, 353, 460, 327, 1555, 1519, 339, 1027, + 342, 1126, 1127, 930, 373, 366, 154, 348, 1341, 133, + 277, 357, 379, 1026, 362, 88, 87, 364, 89, 277, + 271, 192, 387, 352, 513, 695, 694, 353, 365, 84, + 369, 202, 203, 105, 363, 1264, 374, 346, 614, 450, + 1059, 451, 351, 258, 416, 357, 88, 87, 186, 89, + 442, 26, 661, 662, 456, 417, 418, 74, 763, 376, + 1541, 472, 474, 371, 370, 305, 483, 388, 599, 1560, + 1478, 1263, 410, 372, 1314, 500, 351, 479, 457, 441, + 24, 1200, 825, 491, 435, 10, 492, 797, 56, 787, + 486, 432, 490, 428, 475, 478, 773, 480, 481, 429, + 494, 434, 17, 192, 666, 1234, 511, 511, 528, 534, + 375, 433, 7, 585, 267, 584, 583, 376, 473, 485, + 1487, 108, 586, 484, 710, 540, 116, 74, 640, 641, + 1542, 74, 499, 479, 596, 498, 543, 493, 700, 571, + 321, 268, 933, 934, 574, 935, 575, 154, 576, 436, + 18, 1417, 548, 480, 481, 578, 579, 504, 541, 80, + 79, 544, 854, 855, 856, 266, 88, 570, 596, 89, + 572, 1545, 46, 573, 1544, 744, 745, 746, 88, 87, + 1118, 89, 600, 469, 1351, 467, 471, 470, 348, 626, + 627, 628, 568, 258, 192, 487, 497, 741, 612, 154, + 88, 482, 1496, 89, 74, 510, 510, 527, 533, 1335, + 605, 747, 748, 749, 177, 88, 87, 623, 89, 611, + 1116, 581, 582, 947, 1141, 629, 630, 631, 594, 1142, + 674, 135, 375, 620, 595, 1543, 610, 518, 348, 1518, + 755, 1141, 606, 607, 608, 609, 1142, 321, 702, 1513, + 643, 613, 1512, 198, 88, 87, 634, 89, 199, 182, + 200, 618, 619, 621, 347, 277, 201, 459, 648, 649, + 638, 1320, 1319, 1318, 1317, 1126, 1127, 88, 87, 1511, + 89, 876, 152, 195, 808, 420, 664, 421, 422, 423, + 847, 670, 1391, 1128, 651, 778, 198, 779, 196, 681, + 642, 199, 962, 200, 943, 74, 1508, 743, 505, 201, + 354, 355, 356, 177, 565, 859, 599, 1506, 667, 587, + 537, 678, 536, 340, 341, 1510, 195, 692, 1252, 807, + 88, 1499, 545, 89, 74, 88, 87, 1502, 89, 74, + 685, 196, 1489, 669, 354, 355, 356, 689, 1130, 63, + 599, 754, 701, 80, 79, 711, 680, 650, 453, 679, + 74, 519, 1504, 512, 520, 647, 507, 508, 646, 645, + 686, 177, 82, 88, 87, 350, 89, 723, 1488, 72, + 71, 644, 70, 538, 691, 216, 413, 1141, 225, 542, + 69, 724, 1142, 657, 74, 1241, 720, 74, 721, 1117, + 49, 50, 51, 52, 53, 54, 55, 709, 675, 676, + 677, 730, 671, 1450, 67, 714, 740, 49, 50, 51, + 52, 53, 54, 55, 352, 74, 719, 479, 353, 716, + 853, 152, 726, 49, 50, 51, 52, 53, 54, 55, + 1172, 1171, 1170, 1169, 56, 758, 357, 480, 481, 348, + 66, 88, 87, 600, 946, 764, 765, 1327, 74, 155, + 688, 1439, 74, 783, 98, 638, 729, 328, 329, 330, + 277, 750, 74, 697, 1437, 74, 703, 351, 80, 79, + 479, 348, 705, 1435, 706, 111, 1433, 177, 377, 769, + 770, 771, 332, 1233, 1416, 642, 815, 789, 813, 819, + 480, 481, 74, 816, 592, 822, 541, 1326, 801, 802, + 990, 1407, 798, 823, 1406, 812, 806, 851, 1404, 1390, + 818, 382, 383, 384, 385, 97, 833, 834, 1180, 74, + 352, 826, 216, 786, 768, 225, 1388, 800, 793, 803, + 74, 809, 796, 1231, 846, 824, 542, 1378, 80, 79, + 817, 152, 357, 857, 80, 79, 479, 1345, 780, 922, + 80, 79, 821, 49, 50, 51, 52, 53, 54, 55, + 516, 850, 936, 937, 860, 781, 480, 481, 1376, 277, + 375, 988, 832, 351, 844, 74, 331, 591, 333, 334, + 335, 336, 769, 600, 949, 192, 845, 942, 337, 848, + 88, 87, 1374, 89, 156, 157, 158, 325, 155, 1372, + 56, 1179, 1370, 924, 636, 925, 926, 927, 928, 929, + 952, 324, 799, 1368, 985, 782, 772, 938, 495, 1366, + 1013, 965, 362, 1364, 1011, 1362, 177, 1359, 1356, 442, + 1000, 1009, 528, 605, 1237, 352, 954, 1354, 1350, 353, + 762, 1012, 948, 1334, 1312, 1196, 960, 955, 46, 1017, + 958, 692, 692, 1032, 277, 476, 276, 357, 441, 999, + 1008, 817, 1022, 435, 997, 1007, 1010, 1044, 1037, 1014, 432, 817, 428, 849, 1019, 1035, 1016, 1018, 429, 1039, - 434, 989, 326, 323, 88, 87, 94, 89, 74, 1372, - 433, 1033, 1034, 1045, 352, 772, 828, 277, 353, 1030, - 80, 79, 479, 1050, 277, 56, 1370, 1368, 691, 691, - 88, 87, 348, 89, 74, 954, 357, 337, 155, 348, - 1366, 1364, 480, 481, 668, 1362, 817, 1359, 436, 998, - 1006, 527, 1356, 1123, 1354, 1350, 56, 1334, 1312, 1055, - 152, 1196, 88, 87, 718, 89, 177, 351, 1044, 1053, - 193, 615, 1043, 194, 1051, 348, 1042, 352, 1041, 46, - 352, 353, 1122, 1023, 768, 820, 1067, 814, 1068, 1126, - 1127, 501, 733, 617, 616, 1124, 198, 177, 1132, 357, - 145, 199, 357, 200, 88, 87, 577, 89, 758, 201, - 564, 1300, 155, 1236, 308, 1119, 455, 109, 1054, 1140, - 1129, 92, 529, 1138, 1125, 1394, 195, 1298, 1115, 1185, - 351, 1183, 1184, 351, 88, 87, 1186, 89, 1178, 277, - 177, 196, 1296, 1491, 1064, 1060, 1061, 1062, 1063, 1025, - 1492, 1133, 145, 1182, 1415, 328, 329, 330, 1294, 1181, - 956, 96, 1301, 590, 104, 103, 102, 101, 1219, 99, - 100, 105, 56, 1, 1175, 1332, 1195, 1173, 1299, 1203, - 332, 941, 156, 157, 158, 1167, 1187, 1188, 1189, 1190, - 1230, 766, 1202, 1297, 1165, 1232, 1191, 1192, 1193, 80, - 79, 479, 588, 1131, 1223, 1225, 1224, 1222, 984, 1295, - 1235, 1197, 1400, 88, 87, 1163, 89, 1198, 1161, 1199, - 945, 480, 481, 589, 1218, 1176, 189, 708, 1174, 88, - 87, 1005, 89, 1003, 1004, 1159, 1168, 155, 1010, 46, - 707, 205, 152, 1157, 704, 1166, 633, 1412, 412, 187, - 625, 790, 61, 62, 47, 63, 156, 157, 158, 1248, - 1177, 192, 192, 192, 192, 177, 1164, 277, 1268, 1162, - 46, 192, 192, 192, 331, 1266, 333, 334, 335, 336, - 1155, 625, 1251, 192, 1411, 1265, 1160, 1269, 1410, 1271, - 1273, 1274, 1255, 1277, 1158, 1279, 1280, 1281, 1282, 1283, + 434, 989, 1247, 1243, 1244, 1245, 1246, 635, 351, 761, + 433, 1033, 1034, 1045, 88, 87, 444, 89, 74, 1030, + 1043, 718, 1042, 1050, 74, 145, 56, 1041, 691, 691, + 88, 87, 348, 89, 74, 954, 88, 87, 155, 89, + 352, 1023, 828, 668, 353, 959, 817, 820, 436, 998, + 1006, 527, 277, 1123, 814, 354, 355, 356, 733, 1055, + 348, 617, 357, 156, 157, 158, 177, 56, 1064, 1060, + 1061, 1062, 1063, 616, 1051, 96, 577, 564, 104, 103, + 102, 101, 1122, 99, 100, 105, 1067, 1236, 1068, 1126, + 1127, 1053, 529, 351, 74, 1124, 1, 1394, 1132, 615, + 308, 88, 87, 448, 89, 58, 32, 59, 758, 1300, + 455, 1337, 1338, 1339, 1298, 1119, 109, 445, 1296, 1140, + 1129, 56, 446, 1138, 1125, 41, 43, 92, 1115, 1185, + 1294, 1183, 1184, 991, 46, 326, 323, 277, 1178, 367, + 1054, 1186, 61, 62, 47, 63, 348, 437, 438, 956, + 189, 1133, 1415, 1182, 766, 1025, 1332, 526, 1175, 1181, + 1301, 354, 355, 356, 205, 1299, 145, 447, 1219, 1297, + 1131, 56, 1173, 590, 1167, 1165, 1195, 88, 87, 1203, + 89, 1295, 984, 156, 157, 158, 1187, 1188, 1189, 1190, + 1230, 941, 1202, 588, 945, 1232, 1191, 1192, 1193, 80, + 79, 479, 443, 440, 1223, 1225, 1224, 1222, 708, 1176, + 1235, 1197, 88, 87, 589, 89, 1163, 1198, 145, 1199, + 707, 480, 481, 1174, 1218, 1168, 1166, 704, 1161, 49, + 50, 51, 52, 53, 54, 55, 633, 521, 412, 187, + 46, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 1400, 625, 790, 1248, + 1177, 192, 192, 192, 192, 88, 87, 1164, 89, 524, + 56, 192, 192, 192, 277, 1412, 354, 355, 356, 1162, + 1159, 46, 1251, 192, 1157, 1265, 1155, 1269, 625, 1271, + 1273, 1274, 1255, 1277, 1411, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1270, 1287, 1288, 1289, 1290, 1291, 1292, 1293, - 1254, 1401, 1259, 56, 1302, 1303, 1153, 1305, 1304, 1151, - 1272, 1149, 1275, 1276, 1147, 1278, 1221, 1048, 1267, 1047, - 836, 1156, 1307, 1286, 354, 355, 356, 1145, 1143, 49, - 50, 51, 52, 53, 54, 55, 742, 1316, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 665, 1313, 352, 317, 1154, 454, 353, - 1152, 315, 1150, 313, 1328, 1148, 378, 1330, 1331, 521, - 1321, 156, 157, 158, 311, 45, 46, 357, 1146, 1144, - 1336, 1340, 309, 1333, 817, 41, 43, 354, 355, 356, - 354, 355, 356, 1135, 1342, 277, 277, 1140, 1552, 526, - 590, 88, 87, 306, 89, 63, 415, 308, 351, 155, - 1315, 1343, 308, 1257, 308, 56, 277, 503, 1452, 512, - 590, 1451, 507, 508, 140, 308, 1380, 1381, 1382, 1383, - 1384, 1385, 1386, 308, 944, 1347, 63, 177, 590, 1539, - 590, 1329, 1344, 1392, 1393, 193, 531, 1346, 194, 532, - 1397, 1396, 940, 831, 308, 138, 1379, 1402, 1403, 1031, - 1524, 590, 923, 1408, 590, 590, 1395, 830, 811, 767, - 760, 198, 177, 1405, 717, 566, 199, 349, 200, 258, - 303, 792, 1564, 117, 201, 97, 1555, 1553, 1140, 49, - 50, 51, 52, 53, 54, 55, 1546, 1523, 817, 1486, - 1485, 195, 1484, 1454, 1449, 1446, 1443, 1442, 1438, 56, - 524, 1436, 1434, 1432, 1419, 1413, 196, 46, 1409, 1389, - 49, 50, 51, 52, 53, 54, 55, 134, 1445, 1387, - 1377, 1375, 1373, 1371, 1369, 1367, 1365, 1363, 1361, 1360, - 526, 1455, 1456, 1457, 1358, 1357, 1355, 1453, 1353, 1444, - 1448, 1352, 63, 156, 157, 158, 1349, 1324, 1348, 1325, + 1254, 63, 1259, 1410, 1302, 1303, 1401, 1305, 1304, 1221, + 1272, 523, 1275, 1276, 525, 1278, 56, 1048, 1267, 1047, + 1153, 1160, 1307, 1286, 836, 1158, 501, 1156, 1151, 982, + 981, 980, 742, 975, 974, 973, 972, 1316, 970, 971, + 105, 1149, 979, 978, 977, 976, 378, 665, 1147, 969, + 967, 354, 355, 356, 1313, 1145, 88, 87, 1143, 89, + 74, 317, 315, 313, 1328, 454, 277, 1330, 1331, 193, + 1321, 1154, 194, 1257, 1135, 46, 277, 590, 1540, 1152, + 1336, 1340, 1001, 1333, 817, 49, 50, 51, 52, 53, + 54, 55, 1150, 944, 1342, 198, 177, 1140, 526, 1148, + 199, 311, 200, 309, 306, 590, 1146, 63, 201, 1144, + 45, 1343, 308, 308, 308, 56, 968, 531, 415, 940, + 532, 993, 994, 995, 996, 195, 1380, 1381, 1382, 1383, + 1384, 1385, 1386, 1315, 831, 1347, 830, 590, 1329, 277, + 196, 811, 1344, 1392, 1393, 61, 62, 47, 63, 767, + 1397, 1396, 308, 760, 308, 308, 1379, 1402, 1403, 140, + 717, 566, 1452, 1408, 590, 1451, 1395, 138, 1553, 1490, + 590, 117, 303, 1405, 46, 193, 349, 1565, 194, 258, + 1031, 792, 590, 923, 1556, 590, 1554, 1547, 1140, 1523, + 1486, 49, 50, 51, 52, 53, 54, 55, 817, 1485, + 1484, 198, 177, 1454, 1449, 1446, 199, 1443, 200, 1442, + 524, 1438, 56, 1436, 201, 134, 1434, 1432, 1419, 152, + 1413, 1409, 1389, 1387, 1377, 1375, 1373, 1371, 1445, 1369, + 46, 195, 49, 50, 51, 52, 53, 54, 55, 1367, + 1365, 1455, 1456, 1457, 1363, 1361, 196, 1453, 1360, 1444, + 1448, 1358, 63, 1357, 1355, 1353, 1352, 1349, 1348, 1325, 1458, 1323, 523, 1311, 1470, 525, 1310, 1471, 1469, 1468, - 1306, 1256, 1253, 258, 1476, 693, 1220, 88, 87, 1114, - 89, 1052, 1481, 1038, 1480, 1036, 1029, 1028, 1020, 961, - 951, 950, 56, 1498, 939, 1483, 1505, 1507, 1509, 858, - 1505, 1507, 1509, 530, 841, 840, 1495, 1507, 1516, 838, - 1520, 1517, 1515, 1514, 1522, 1521, 88, 835, 829, 89, - 827, 56, 810, 1497, 1500, 1501, 791, 774, 738, 46, - 737, 1538, 736, 1493, 735, 734, 49, 50, 51, 52, - 53, 54, 55, 732, 731, 1529, 1505, 1507, 1509, 684, - 637, 524, 569, 425, 424, 344, 258, 320, 206, 1562, - 1547, 1525, 817, 1545, 1479, 1475, 1474, 1473, 1472, 1447, - 1534, 1441, 1440, 1431, 1430, 354, 355, 356, 1551, 1429, - 1549, 1428, 1427, 1548, 1535, 1536, 1537, 449, 1426, 1425, - 1424, 1423, 1561, 63, 1422, 1421, 1560, 1563, 1420, 1418, - 1300, 1298, 1296, 523, 1294, 1322, 525, 1175, 1173, 1557, - 88, 1558, 1167, 89, 1556, 1526, 1527, 1528, 1530, 1531, - 1532, 1533, 1165, 46, 1163, 96, 1161, 1159, 104, 103, - 102, 101, 56, 99, 100, 105, 1157, 1155, 1153, 1151, - 1149, 1309, 1308, 817, 1250, 1249, 1066, 1056, 1049, 1040, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 987, 986, 953, 843, 59, 842, 839, - 837, 208, 259, 210, 228, 212, 213, 49, 50, 51, - 52, 53, 54, 55, 728, 41, 43, 727, 713, 687, - 683, 682, 663, 88, 632, 602, 89, 601, 593, 567, - 547, 546, 61, 62, 47, 63, 46, 496, 419, 411, - 874, 386, 319, 223, 304, 522, 514, 868, 517, 869, - 870, 871, 509, 506, 56, 502, 302, 222, 36, 184, - 93, 33, 468, 466, 465, 46, 464, 463, 244, 462, - 227, 243, 215, 209, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 863, 864, 865, - 95, 59, 226, 224, 207, 208, 259, 210, 228, 212, - 213, 211, 879, 31, 56, 1002, 992, 439, 795, 41, - 43, 431, 794, 430, 427, 539, 1046, 270, 83, 49, - 50, 51, 52, 53, 54, 55, 61, 62, 47, 63, - 29, 57, 862, 866, 867, 34, 872, 223, 25, 873, - 16, 263, 15, 14, 261, 13, 260, 12, 11, 9, - 8, 222, 1086, 4, 2, 234, 242, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 990, 241, 240, 239, 59, 238, 46, 237, 208, 259, - 210, 228, 212, 213, 236, 235, 226, 224, 233, 232, - 231, 230, 41, 43, 229, 114, 77, 42, 56, 38, - 30, 58, 32, 59, 752, 656, 655, 1482, 299, 61, - 62, 47, 63, 49, 50, 51, 52, 53, 54, 55, - 223, 41, 43, 90, 183, 861, 1139, 757, 785, 1258, - 957, 1137, 1136, 604, 222, 1461, 1460, 1459, 61, 62, - 47, 63, 1477, 1463, 1462, 60, 35, 1201, 1120, 597, - 659, 21, 777, 91, 37, 1069, 739, 65, 64, 197, - 875, 39, 40, 0, 426, 0, 0, 0, 0, 226, - 224, 0, 982, 981, 980, 0, 975, 974, 973, 972, - 0, 970, 971, 105, 0, 979, 978, 977, 976, 0, - 0, 0, 969, 967, 0, 0, 49, 50, 51, 52, - 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, - 38, 30, 58, 32, 59, 0, 19, 20, 46, 22, - 23, 48, 0, 27, 28, 49, 50, 51, 52, 53, - 54, 55, 41, 43, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, - 62, 47, 63, 0, 0, 0, 60, 35, 968, 0, - 0, 0, 21, 0, 0, 37, 444, 1097, 0, 874, - 0, 0, 39, 40, 0, 0, 868, 0, 869, 870, - 871, 0, 0, 0, 0, 0, 1073, 1074, 0, 1081, - 1095, 1075, 1076, 1077, 1078, 0, 1079, 1080, 0, 1096, - 1082, 1083, 1084, 1085, 0, 0, 0, 0, 0, 0, - 0, 0, 46, 0, 0, 0, 863, 864, 865, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, - 22, 23, 48, 0, 27, 28, 49, 50, 51, 52, - 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 448, 0, 58, 32, 59, 0, 0, 0, - 444, 862, 866, 867, 0, 872, 445, 0, 873, 0, - 0, 446, 0, 0, 41, 43, 0, 146, 874, 0, - 0, 0, 0, 0, 0, 868, 0, 869, 870, 871, - 0, 61, 62, 47, 63, 0, 437, 438, 0, 921, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, - 0, 0, 0, 0, 0, 863, 864, 865, 49, 50, - 51, 52, 53, 54, 55, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 448, 0, 58, 32, - 59, 443, 440, 0, 0, 0, 0, 0, 0, 0, - 445, 0, 0, 0, 0, 446, 0, 0, 41, 43, - 862, 866, 867, 0, 872, 0, 0, 873, 49, 50, - 51, 52, 53, 54, 55, 61, 62, 47, 63, 1494, - 437, 438, 1071, 1072, 0, 1087, 1088, 1089, 0, 1090, - 1091, 0, 0, 1092, 1093, 0, 1094, 0, 0, 0, - 447, 0, 0, 0, 0, 0, 0, 0, 0, 1070, - 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, - 1108, 1109, 1110, 893, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 443, 440, 920, 0, 0, - 0, 0, 885, 886, 0, 894, 911, 887, 888, 889, - 890, 0, 891, 892, 0, 912, 895, 896, 897, 898, - 893, 0, 49, 50, 51, 52, 53, 54, 55, 0, - 0, 0, 0, 0, 920, 146, 0, 0, 0, 885, - 886, 0, 894, 911, 887, 888, 889, 890, 0, 891, - 892, 0, 912, 895, 896, 897, 898, 0, 0, 0, - 909, 0, 913, 0, 0, 175, 0, 915, 0, 151, - 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, - 168, 169, 917, 0, 171, 172, 173, 174, 563, 0, - 0, 142, 162, 152, 0, 0, 0, 909, 0, 913, - 141, 147, 0, 0, 915, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 918, 143, 144, 149, 917, - 555, 0, 549, 550, 551, 552, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, - 352, 0, 0, 0, 768, 0, 0, 0, 0, 0, - 160, 0, 918, 0, 0, 0, 0, 0, 557, 558, - 559, 560, 357, 0, 554, 0, 0, 0, 561, 562, - 553, 0, 0, 0, 0, 982, 981, 980, 0, 975, - 974, 973, 972, 0, 970, 971, 105, 0, 979, 978, - 977, 976, 0, 622, 0, 969, 967, 0, 0, 0, + 1306, 1256, 97, 1253, 1476, 1563, 258, 1220, 693, 1114, + 1052, 1038, 1481, 1036, 1480, 1029, 49, 50, 51, 52, + 53, 54, 55, 1498, 1028, 1483, 1505, 1507, 1509, 1020, + 1505, 1507, 1509, 961, 951, 950, 1495, 1507, 1516, 56, + 1520, 1517, 1515, 1514, 1522, 1521, 88, 939, 858, 89, + 841, 840, 838, 1497, 1500, 1501, 835, 829, 827, 46, + 810, 41, 43, 1493, 530, 791, 49, 50, 51, 52, + 53, 54, 55, 774, 738, 737, 1505, 1507, 1509, 736, + 735, 63, 56, 734, 732, 731, 684, 94, 522, 637, + 569, 425, 817, 503, 424, 512, 344, 320, 507, 508, + 1548, 1546, 1479, 258, 1475, 206, 1474, 1473, 1472, 1552, + 1447, 1550, 1441, 1005, 1549, 1003, 1004, 1440, 88, 87, + 1431, 89, 1430, 1562, 1429, 1428, 155, 1561, 1564, 1427, + 1426, 1425, 1424, 1423, 61, 62, 47, 63, 152, 1422, + 1558, 1421, 1559, 88, 1420, 1557, 89, 1418, 449, 1300, + 1298, 1296, 1294, 1322, 177, 1175, 46, 1491, 1173, 1167, + 1165, 1163, 1161, 1159, 1492, 49, 50, 51, 52, 53, + 54, 55, 1157, 1155, 817, 514, 1153, 1151, 1149, 1309, + 1308, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 56, 1250, 1249, 1066, 59, 1056, + 1049, 1040, 208, 259, 210, 228, 212, 213, 987, 986, + 953, 843, 842, 839, 837, 728, 41, 43, 727, 517, + 713, 49, 50, 51, 52, 53, 54, 55, 687, 683, + 682, 663, 632, 61, 62, 47, 63, 602, 601, 593, + 88, 567, 96, 89, 223, 104, 103, 102, 101, 547, + 99, 100, 105, 46, 546, 496, 419, 411, 222, 386, + 319, 304, 509, 302, 506, 502, 36, 184, 1324, 93, + 152, 156, 157, 158, 33, 468, 466, 465, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 464, 463, 226, 224, 59, 46, 95, 244, 208, + 259, 210, 228, 212, 213, 462, 227, 88, 87, 243, + 89, 215, 209, 41, 43, 155, 207, 211, 879, 31, + 49, 50, 51, 52, 53, 54, 55, 1002, 992, 439, + 61, 62, 47, 63, 795, 431, 794, 430, 427, 539, + 56, 223, 270, 177, 83, 29, 1268, 57, 1046, 34, + 25, 16, 263, 1266, 15, 222, 14, 261, 13, 260, + 12, 11, 9, 8, 4, 2, 234, 242, 241, 240, + 239, 238, 237, 236, 235, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 1086, 233, + 226, 224, 59, 232, 231, 230, 208, 259, 210, 228, + 212, 213, 229, 114, 77, 42, 426, 752, 46, 656, + 41, 43, 655, 1482, 299, 90, 183, 49, 50, 51, + 52, 53, 54, 55, 861, 1139, 757, 61, 62, 47, + 63, 38, 30, 58, 32, 59, 785, 1258, 223, 88, + 87, 957, 89, 1137, 1136, 604, 1461, 155, 1460, 1459, + 1477, 1463, 222, 41, 43, 1462, 1201, 1120, 597, 659, + 156, 157, 158, 777, 91, 1069, 739, 65, 64, 197, + 61, 62, 47, 63, 875, 177, 0, 60, 35, 0, + 0, 0, 0, 21, 0, 1346, 37, 226, 224, 0, + 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 50, 51, 52, 53, 54, + 55, 874, 0, 0, 0, 0, 0, 0, 868, 0, + 869, 870, 871, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 30, 58, 32, 59, 19, 20, + 0, 22, 23, 48, 46, 27, 28, 49, 50, 51, + 52, 53, 54, 55, 0, 41, 43, 0, 863, 864, + 865, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 61, 62, 47, 63, 0, 0, 921, 60, + 35, 0, 156, 157, 158, 21, 0, 0, 37, 0, + 0, 874, 444, 1097, 0, 39, 40, 0, 868, 0, + 869, 870, 871, 0, 862, 866, 867, 0, 872, 0, + 0, 873, 1073, 1074, 0, 1081, 1095, 1075, 1076, 1077, + 1078, 0, 1079, 1080, 0, 1096, 1082, 1083, 1084, 1085, + 0, 0, 0, 0, 0, 0, 0, 0, 863, 864, + 865, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 20, 0, 22, 23, 48, 0, 27, 28, 49, + 50, 51, 52, 53, 54, 55, 0, 874, 0, 0, + 0, 0, 0, 0, 868, 0, 869, 870, 871, 448, + 0, 58, 32, 59, 862, 866, 867, 0, 872, 0, + 0, 873, 0, 445, 0, 0, 0, 0, 446, 0, + 0, 41, 43, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 893, 0, 863, 864, 865, 0, 61, 62, + 47, 63, 146, 437, 438, 0, 920, 0, 0, 0, + 0, 885, 886, 0, 894, 911, 887, 888, 889, 890, + 0, 891, 892, 447, 912, 895, 896, 897, 898, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 862, 866, 867, 0, 872, 0, 0, 873, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 443, 440, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 909, + 0, 913, 0, 0, 0, 0, 915, 0, 0, 0, + 0, 0, 0, 0, 0, 49, 50, 51, 52, 53, + 54, 55, 917, 1524, 0, 0, 0, 0, 0, 1071, + 1072, 0, 1087, 1088, 1089, 0, 1090, 1091, 0, 0, + 1092, 1093, 0, 1094, 0, 0, 0, 0, 0, 0, + 1494, 0, 0, 0, 0, 918, 1070, 1098, 1099, 1100, + 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 893, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 920, 0, 0, 0, 0, 885, 886, 0, 894, + 911, 887, 888, 889, 890, 0, 891, 892, 0, 912, + 895, 896, 897, 898, 0, 0, 146, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 880, 0, 881, 882, 883, 884, 899, 900, 901, 916, 902, 903, 904, 905, 906, - 907, 908, 910, 914, 0, 0, 0, 919, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 880, 0, 881, 882, 883, 884, 899, 900, - 901, 916, 902, 903, 904, 905, 906, 907, 908, 910, - 914, 968, 88, 87, 919, 89, 0, 0, 0, 0, - 155, 0, 556, 175, 0, 0, 0, 151, 148, 163, - 161, 170, 0, 164, 165, 166, 167, 0, 168, 169, - 0, 0, 171, 172, 173, 174, 146, 0, 177, 142, - 162, 352, 0, 0, 0, 353, 0, 0, 141, 147, + 907, 908, 910, 914, 909, 0, 913, 919, 0, 0, + 175, 915, 0, 0, 151, 148, 163, 161, 170, 0, + 164, 165, 166, 167, 152, 168, 169, 917, 0, 171, + 172, 173, 174, 563, 1539, 0, 142, 162, 0, 0, + 0, 0, 0, 0, 0, 141, 147, 0, 1529, 0, + 146, 0, 0, 0, 0, 352, 0, 0, 0, 768, + 918, 143, 144, 149, 1525, 555, 0, 549, 550, 551, + 552, 0, 0, 1534, 0, 0, 0, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1535, 1536, 1537, + 1538, 0, 0, 0, 0, 0, 160, 0, 0, 0, + 0, 0, 0, 0, 557, 558, 559, 560, 622, 0, + 554, 0, 0, 0, 561, 562, 553, 0, 0, 1526, + 1527, 1528, 1530, 1531, 1532, 1533, 982, 981, 980, 0, + 975, 974, 973, 972, 0, 970, 971, 105, 0, 979, + 978, 977, 976, 0, 0, 0, 969, 967, 0, 0, + 880, 0, 881, 882, 883, 884, 899, 900, 901, 916, + 902, 903, 904, 905, 906, 907, 908, 910, 914, 0, + 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 357, 143, 144, 149, 0, 0, 175, - 0, 0, 0, 0, 0, 163, 161, 170, 0, 164, - 165, 166, 167, 0, 168, 169, 0, 0, 171, 172, - 173, 174, 0, 0, 622, 1261, 162, 0, 160, 159, - 0, 0, 88, 87, 0, 89, 0, 0, 0, 0, - 155, 0, 0, 175, 0, 0, 0, 151, 148, 163, - 161, 170, 0, 164, 165, 166, 167, 0, 168, 169, - 0, 0, 171, 172, 173, 174, 0, 0, 177, 142, - 162, 0, 0, 1262, 0, 0, 0, 0, 141, 147, - 0, 0, 0, 0, 156, 157, 158, 0, 0, 0, - 0, 1260, 0, 0, 143, 144, 149, 0, 0, 0, - 0, 0, 0, 0, 297, 198, 146, 0, 0, 0, - 199, 352, 200, 0, 0, 353, 0, 0, 201, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 160, 0, - 354, 355, 356, 357, 0, 195, 284, 0, 279, 280, - 281, 282, 283, 0, 640, 641, 0, 287, 0, 0, - 196, 0, 0, 0, 0, 0, 285, 0, 0, 0, - 295, 0, 286, 0, 622, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 288, 289, 290, 291, 292, 293, - 294, 298, 0, 0, 156, 157, 158, 296, 0, 0, 0, 0, 0, 88, 87, 0, 89, 0, 0, 0, - 146, 155, 0, 0, 175, 0, 0, 0, 151, 148, - 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, + 0, 155, 0, 0, 175, 0, 0, 0, 151, 148, + 163, 161, 170, 968, 164, 165, 166, 167, 556, 168, 169, 0, 0, 171, 172, 173, 174, 0, 0, 177, 142, 162, 0, 0, 0, 0, 0, 0, 0, 141, - 147, 0, 0, 0, 348, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 143, 144, 149, 274, 1217, - 1216, 1211, 0, 1210, 1209, 1208, 1207, 146, 1205, 1206, - 105, 0, 1215, 1214, 1213, 1212, 0, 0, 0, 0, - 0, 1204, 0, 0, 0, 0, 0, 0, 0, 160, - 0, 354, 355, 356, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 640, 641, 982, 981, 980, - 0, 975, 974, 973, 972, 0, 970, 971, 105, 0, - 979, 978, 977, 976, 0, 274, 0, 969, 967, 0, - 0, 0, 0, 88, 87, 0, 89, 0, 0, 0, - 0, 155, 0, 0, 175, 156, 157, 158, 151, 148, - 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, - 169, 0, 0, 171, 172, 173, 174, 146, 0, 177, - 142, 162, 0, 0, 0, 0, 0, 0, 0, 141, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 968, 0, 143, 144, 149, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 146, 0, 0, 0, 0, 352, + 0, 0, 0, 353, 0, 143, 144, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 88, 87, 160, - 89, 354, 355, 356, 146, 155, 0, 0, 175, 0, - 0, 0, 151, 148, 163, 161, 170, 0, 164, 165, - 166, 167, 0, 168, 169, 0, 0, 171, 172, 173, + 0, 357, 0, 0, 0, 0, 0, 88, 87, 0, + 89, 0, 0, 0, 0, 155, 0, 0, 175, 0, + 160, 159, 151, 148, 163, 161, 170, 0, 164, 165, + 166, 167, 622, 168, 169, 0, 0, 171, 172, 173, 174, 0, 0, 177, 142, 162, 0, 0, 0, 0, 0, 0, 0, 141, 147, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 156, 157, 158, 0, 143, - 144, 149, 274, 805, 88, 87, 0, 89, 0, 0, - 0, 0, 155, 0, 0, 175, 0, 0, 0, 151, - 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, - 168, 169, 0, 160, 171, 172, 173, 174, 146, 0, - 177, 142, 162, 0, 0, 0, 0, 804, 0, 0, - 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 144, 149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, - 157, 158, 0, 0, 0, 0, 274, 0, 0, 0, - 160, 159, 0, 0, 88, 87, 146, 89, 0, 0, - 0, 0, 155, 0, 0, 175, 0, 0, 0, 151, - 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, - 168, 169, 0, 0, 171, 172, 173, 174, 0, 0, - 177, 142, 162, 0, 0, 0, 0, 0, 0, 0, - 141, 147, 0, 0, 0, 0, 156, 157, 158, 0, - 0, 0, 0, 0, 274, 0, 143, 144, 149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, + 144, 149, 0, 0, 0, 0, 156, 157, 158, 0, + 297, 198, 0, 0, 0, 0, 199, 0, 200, 0, + 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 160, 0, 354, 355, 356, 0, + 0, 195, 284, 63, 279, 280, 281, 282, 283, 0, + 640, 641, 146, 287, 0, 0, 196, 352, 0, 0, + 0, 353, 285, 0, 0, 0, 0, 295, 0, 286, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, + 0, 288, 289, 290, 291, 292, 293, 294, 298, 0, + 156, 157, 158, 0, 296, 0, 175, 0, 0, 0, + 0, 0, 163, 161, 170, 0, 164, 165, 166, 167, + 622, 168, 169, 0, 0, 171, 172, 173, 174, 0, + 0, 0, 1261, 162, 0, 0, 0, 0, 0, 0, 0, 88, 87, 0, 89, 0, 0, 0, 0, 155, 0, 0, 175, 0, 0, 0, 151, 148, 163, 161, - 170, 0, 164, 165, 166, 167, 0, 168, 169, 0, - 160, 171, 172, 173, 174, 0, 0, 177, 142, 162, - 0, 0, 0, 0, 0, 0, 0, 759, 147, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 170, 0, 164, 165, 166, 167, 146, 168, 169, 0, + 0, 171, 172, 173, 174, 0, 0, 177, 142, 162, + 1262, 0, 0, 0, 0, 0, 0, 141, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1260, 0, 0, 0, 143, 144, 149, 0, 0, 0, 0, + 0, 0, 982, 981, 980, 0, 975, 974, 973, 972, + 0, 970, 971, 105, 274, 979, 978, 977, 976, 0, + 0, 0, 969, 967, 0, 146, 0, 0, 160, 0, + 354, 355, 356, 348, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 640, 641, 0, 0, 1217, 1216, + 1211, 0, 1210, 1209, 1208, 1207, 0, 1205, 1206, 105, + 0, 1215, 1214, 1213, 1212, 0, 0, 0, 0, 0, + 1204, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 87, 0, 89, 274, 156, 157, 158, 155, 0, 968, + 175, 0, 0, 0, 151, 148, 163, 161, 170, 0, + 164, 165, 166, 167, 0, 168, 169, 0, 0, 171, + 172, 173, 174, 146, 0, 177, 142, 162, 0, 0, + 0, 0, 0, 0, 0, 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 146, 0, 0, 0, 0, 156, 157, 158, 0, - 0, 0, 0, 0, 0, 88, 87, 160, 89, 0, - 0, 0, 0, 155, 0, 0, 175, 0, 0, 0, - 151, 148, 163, 161, 170, 0, 164, 165, 166, 167, - 0, 168, 169, 0, 0, 171, 172, 173, 174, 0, - 0, 177, 142, 162, 0, 0, 146, 0, 0, 0, - 0, 141, 147, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 156, 157, 158, 0, 143, 144, 149, - 0, 0, 0, 88, 87, 0, 89, 0, 0, 0, + 0, 143, 144, 149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 160, 0, 354, 355, + 356, 146, 0, 88, 87, 0, 89, 0, 0, 0, 0, 155, 0, 0, 175, 0, 0, 0, 151, 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, - 169, 652, 146, 171, 172, 173, 174, 0, 0, 177, - 142, 162, 88, 87, 0, 89, 0, 0, 0, 141, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 143, 144, 149, 0, 0, - 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 156, 157, 158, - 988, 0, 0, 0, 0, 0, 0, 0, 0, 458, - 0, 0, 0, 0, 391, 0, 0, 0, 407, 0, - 0, 389, 390, 0, 0, 0, 393, 394, 405, 395, - 396, 397, 398, 399, 400, 401, 402, 392, 0, 0, - 0, 0, 0, 406, 0, 0, 404, 0, 0, 0, - 146, 0, 0, 403, 722, 0, 0, 0, 0, 0, - 0, 0, 408, 0, 0, 156, 157, 158, 488, 175, - 489, 0, 0, 151, 148, 163, 161, 170, 0, 164, + 169, 0, 0, 171, 172, 173, 174, 0, 0, 177, + 142, 162, 0, 0, 0, 0, 0, 0, 0, 141, + 147, 0, 156, 157, 158, 0, 0, 0, 0, 274, + 0, 0, 0, 0, 0, 143, 144, 149, 0, 805, + 0, 0, 88, 87, 0, 89, 0, 0, 0, 0, + 155, 0, 0, 175, 0, 0, 0, 151, 148, 163, + 161, 170, 0, 164, 165, 166, 167, 0, 168, 169, + 160, 146, 171, 172, 173, 174, 0, 0, 177, 142, + 162, 0, 0, 0, 804, 0, 0, 0, 141, 147, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 143, 144, 149, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 156, 157, 158, 274, + 88, 87, 0, 89, 0, 0, 0, 0, 155, 160, + 159, 175, 0, 0, 0, 151, 148, 163, 161, 170, + 0, 164, 165, 166, 167, 0, 168, 169, 0, 0, + 171, 172, 173, 174, 0, 0, 177, 142, 162, 0, + 0, 0, 0, 0, 146, 0, 141, 147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 143, 144, 149, 156, 157, 158, 88, 87, + 0, 89, 0, 0, 0, 0, 155, 0, 0, 175, + 0, 0, 0, 151, 148, 163, 161, 170, 0, 164, + 165, 166, 167, 0, 168, 169, 0, 160, 171, 172, + 173, 174, 274, 0, 177, 142, 162, 146, 0, 0, + 0, 0, 0, 0, 759, 147, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 143, 144, 149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 156, 157, 158, 0, 0, 0, 0, + 0, 0, 0, 146, 0, 160, 0, 0, 88, 87, + 0, 89, 0, 0, 88, 87, 155, 89, 0, 175, + 0, 0, 0, 151, 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, 169, 0, 0, 171, 172, - 173, 174, 0, 0, 177, 142, 162, 0, 0, 0, - 0, 0, 0, 0, 141, 147, 0, 0, 0, 0, + 173, 174, 0, 0, 177, 142, 162, 0, 409, 0, + 0, 0, 0, 0, 141, 147, 0, 146, 0, 0, + 0, 156, 157, 158, 0, 0, 0, 0, 0, 0, + 143, 144, 149, 0, 0, 0, 391, 0, 0, 0, + 407, 0, 0, 389, 390, 0, 0, 0, 393, 394, + 405, 395, 396, 397, 398, 399, 400, 401, 402, 392, + 0, 0, 0, 0, 0, 652, 406, 0, 0, 404, + 0, 88, 87, 146, 89, 988, 403, 0, 0, 155, + 0, 0, 175, 0, 0, 408, 151, 148, 163, 161, + 170, 0, 164, 165, 166, 167, 0, 168, 169, 0, + 0, 171, 172, 173, 174, 0, 0, 177, 142, 162, + 0, 0, 0, 0, 0, 0, 0, 141, 147, 0, + 0, 156, 157, 158, 0, 0, 0, 146, 0, 0, + 0, 722, 0, 143, 144, 149, 0, 0, 0, 0, + 0, 0, 0, 0, 488, 175, 489, 0, 0, 151, + 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, + 168, 169, 0, 0, 171, 172, 173, 174, 458, 0, + 177, 142, 162, 0, 0, 0, 0, 0, 0, 0, + 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 143, 144, 149, 0, + 380, 175, 381, 0, 0, 151, 148, 163, 161, 170, + 0, 164, 165, 166, 167, 0, 168, 169, 0, 0, + 171, 172, 173, 174, 156, 157, 158, 142, 162, 0, + 0, 160, 0, 0, 0, 0, 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 143, 144, 149, 380, 175, 381, 0, 0, 151, 148, - 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, - 169, 0, 0, 171, 172, 173, 174, 0, 0, 0, - 142, 162, 0, 0, 160, 0, 0, 0, 0, 141, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 143, 144, 149, 0, 0, - 175, 0, 0, 0, 151, 148, 163, 161, 170, 0, - 164, 165, 166, 167, 0, 168, 169, 0, 0, 171, - 172, 173, 174, 0, 0, 0, 142, 162, 0, 160, - 0, 0, 0, 0, 0, 141, 147, 0, 0, 0, + 0, 0, 143, 144, 149, 175, 0, 0, 0, 151, + 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, + 168, 169, 0, 0, 171, 172, 173, 174, 0, 0, + 0, 142, 162, 0, 0, 0, 0, 160, 0, 0, + 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 143, 144, 149, 0, + 0, 175, 0, 0, 0, 151, 148, 163, 161, 170, + 0, 164, 165, 166, 167, 0, 168, 169, 0, 0, + 171, 172, 173, 174, 0, 0, 0, 142, 162, 0, + 0, 160, 0, 0, 0, 0, 141, 147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 143, 144, 149, 175, 0, 0, 0, 151, + 148, 163, 161, 170, 0, 164, 165, 166, 167, 0, + 168, 169, 0, 0, 171, 172, 173, 174, 0, 0, + 0, 142, 162, 0, 0, 0, 0, 160, 0, 0, + 141, 147, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 143, 144, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 143, 144, 149, 175, 0, 0, 0, 151, 148, - 163, 161, 170, 0, 164, 165, 166, 167, 0, 168, - 169, 0, 0, 171, 172, 173, 174, 0, 0, 0, - 142, 162, 0, 0, 0, 160, 0, 0, 0, 141, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 143, 144, 149, 175, 0, - 0, 0, 151, 148, 163, 161, 170, 0, 164, 165, - 166, 167, 0, 168, 169, 0, 0, 171, 172, 173, - 174, 0, 0, 0, 142, 162, 0, 0, 0, 160, - 0, 0, 0, 141, 147, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, - 144, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 160 + 0, 160 }; YYSTATIC YYCONST short YYFARDATA YYPACT[] = { --1000, 1543,-1000, 566, 501,-1000,-1000,-1000,-1000,-1000, --1000,-1000, 491, 426, 425, 405,-1000,-1000,-1000, 28, - 28, -454, 39, 39,-1000,-1000,-1000, 396,-1000, -129, - 411,-1000, 890, 743, 7, 886, 28, -366, -369,-1000, - -171, 777, 7, 777,-1000,-1000,-1000, 90, 2292, 411, - 411, 411, 411,-1000,-1000, 124,-1000,-1000,-1000, -162, - 1048,-1000,-1000, 1046, 7, 7,-1000,-1000, 1403,-1000, --1000,-1000,-1000,-1000,-1000,-1000, 28, -139,-1000,-1000, --1000,-1000, 359, -132, 2954, 1220,-1000,-1000,-1000,-1000, - 2430,-1000, 28,-1000, 1317,-1000, 1308, 1644, 7, 1233, - 1212, 1204, 1193, 1191, 1186, 1642, 1486, 18,-1000, 28, - 600, 662,-1000,-1000, 95, 1220, 411, 2954,-1000,-1000, +-1000, 1575,-1000, 497, 461,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, 437, 429, 427, 426,-1000,-1000,-1000, 33, + 33, -455, 65, 65,-1000,-1000,-1000, 419,-1000, -115, + 125,-1000, 896, 1404, 24, 885, 33, -367, -370,-1000, + -173, 669, 24, 669,-1000,-1000,-1000, 138, 2333, 125, + 125, 125, 125,-1000,-1000, 167,-1000,-1000,-1000, -161, + 1038,-1000,-1000, 970, 24, 24,-1000,-1000, 1420,-1000, +-1000,-1000,-1000,-1000,-1000,-1000, 33, -126,-1000,-1000, +-1000,-1000, 510, -125, 3020, 1190,-1000,-1000,-1000,-1000, + 2456,-1000, 33,-1000, 657,-1000, 1300, 1661, 24, 1234, + 1233, 1231, 1193, 1192, 1191, 1660, 1496, 43,-1000, 33, + 733, 283,-1000,-1000, 164, 1190, 125, 3020,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000, 1484, 166, 1303, 448, -244, -245, -246, - -247, 359,-1000, -118, 359, 661, 368,-1000,-1000, -76, --1000, 3547, 186, 1189,-1000,-1000,-1000,-1000,-1000, 3383, +-1000,-1000,-1000, 1495, 146, 1302, 155, -234, -240, -241, + -244, 510,-1000, -102, 510, 1076, 966,-1000,-1000, -46, +-1000, 3574, 187, 1169,-1000,-1000,-1000,-1000,-1000, 3410, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, - 435,-1000,-1000,-1000,-1000,-1000, 1220, 1641, 326, 1220, - 1220, 1220,-1000, 3222, 79,-1000,-1000, 1639, 1047, 2854, --1000, 3547,-1000,-1000,-1000, 216, 216,-1000, 1638,-1000, --1000, 29, 1483, 1482, 1779, 1432,-1000,-1000, 28,-1000, - 28, 77,-1000,-1000,-1000,-1000, 1170,-1000,-1000,-1000, --1000,-1000, 885, 28, 3183,-1000, 67, -94,-1000,-1000, - 424, 28, 39, 228, 7, 424, 661, 3328, 2954, -95, - 216, 2854, 1637,-1000, 282,-1000,-1000,-1000,-1000,-1000, + 410,-1000,-1000,-1000,-1000,-1000, 1190, 1659, 389, 1190, + 1190, 1190,-1000, 3194, 76,-1000,-1000, 1657, 1037, 2932, +-1000, 3574,-1000,-1000,-1000, 171, 171,-1000, 1656,-1000, +-1000, 154, 1493, 1490, 1721, 1463,-1000,-1000, 33,-1000, + 33, 77,-1000,-1000,-1000,-1000, 1177,-1000,-1000,-1000, +-1000,-1000, 879, 33, 3291,-1000, 73, 44,-1000,-1000, + 110, 33, 65, 795, 24, 110, 1076, 3354, 3020, -85, + 171, 2932, 1655,-1000, 240,-1000,-1000,-1000,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, - 826, 71, 1114, 857,-1000, 87,-1000, 298, 359,-1000, --1000, 2954,-1000,-1000, 181, 899, 216, 411,-1000,-1000, + 1071, 69, 972, 827,-1000, 72,-1000, 365, 510,-1000, +-1000, 3020,-1000,-1000, 88, 556, 171, 125,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000,-1000, 1631, 1630, 2084, - 877, 275, 1301, 1629, 79, 1481, 0,-1000, 28, 0, --1000, 39,-1000, 28,-1000, 28,-1000, 28,-1000,-1000, --1000,-1000, 873,-1000, 28, 28,-1000, 1220,-1000,-1000, --1000, -387,-1000,-1000,-1000,-1000,-1000, 662, 488, 94, --1000,-1000, 1220, 1022,-1000, 1292, 581, 1628,-1000, 82, - 411, 115,-1000,-1000,-1000, 1627, 1625, 3547, 411, 411, - 411, 411,-1000, 359,-1000,-1000, 3547, 604,-1000, 1220, --1000, -90,-1000, 899, 838, 861, 860, 411, 411, 2693, --1000,-1000,-1000,-1000,-1000,-1000, 28, 1292, 1081,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1654, 1649, 2139, + 844, 359, 1287, 1641, 76, 1489, -19,-1000, 33, -19, +-1000, 65,-1000, 33,-1000, 33,-1000, 33,-1000,-1000, +-1000,-1000, 843,-1000, 33, 33,-1000, 1190,-1000,-1000, +-1000, -388,-1000,-1000,-1000,-1000,-1000, 283, -44, 99, +-1000,-1000, 1190, 1013,-1000, 1232, 634, 1639,-1000, 135, + 125, 211,-1000,-1000,-1000, 1638, 1637, 3574, 125, 125, + 125, 125,-1000, 510,-1000,-1000, 3574, 614,-1000, 1190, +-1000, -72,-1000, 556, 866, 840, 828, 125, 125, 2759, +-1000,-1000,-1000,-1000,-1000,-1000, 33, 1232, 1088,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000, 362,-1000,-1000,-1000, 1624, - 1045,-1000, 673, 1479,-1000,-1000, 2553,-1000,-1000, 28, --1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 386, - 375, 373,-1000,-1000,-1000,-1000,-1000, 28, 28, 332, - 3115,-1000,-1000, -214, -217,-1000,-1000,-1000,-1000,-1000, --1000,-1000, -65, 1622,-1000, 28, 1165, 1, 216, 813, - 28,-1000, -94, 63, 63, 63, 63, 2954, 282,-1000, +-1000,-1000,-1000,-1000,-1000, 30,-1000,-1000,-1000, 1632, + 1035,-1000, 744, 1488,-1000,-1000, 2611,-1000,-1000, 33, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 416, + 415, 412,-1000,-1000,-1000,-1000,-1000, 33, 33, 404, + 3188,-1000,-1000, -204, -206,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, -53, 1631,-1000, 33, 1159, 0, 171, 812, + 33,-1000, 44, 90, 90, 90, 90, 3020, 240,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, - 1621, 1620, 1478,-1000,-1000,-1000, 2693,-1000,-1000,-1000, --1000, 1292, 1619, 7, 3547,-1000, 424, 1320,-1000, -136, - -138,-1000,-1000, -356,-1000,-1000, 7, 354, 391, 7, --1000,-1000, 1043,-1000,-1000, 7,-1000, 7,-1000, 1039, - 1026,-1000,-1000, 411, -177, -371, 1618,-1000,-1000,-1000, --1000, 411, -380,-1000,-1000, -350,-1000,-1000,-1000, 1300, --1000, 831, 411, 3547, 1220, 3493, 28, 53, 1187,-1000, --1000,-1000,-1000,-1000,-1000,-1000, 1617,-1000,-1000,-1000, --1000,-1000,-1000, 1614,-1000,-1000, 1317, 53, 1473,-1000, - 1472, 859, 1464, 1463, 1461, 1459, 1457,-1000, 468, 1148, --1000, 86, 1220,-1000,-1000,-1000, 52, 411, 53, 330, - 108, 3021,-1000,-1000, 1296, 1220,-1000, 654,-1000,-1000, - -63, 2954, 2954, 989, 1295, 899, 1220, 1220, 1220, 1220, --1000, 2392,-1000, 1220,-1000, 411, 411, 411, 782, 1220, - -7, 1220, 147, 1456,-1000, 128,-1000,-1000,-1000,-1000, --1000,-1000, 28,-1000, 1292,-1000,-1000, 661, -16, 1051, --1000,-1000, 1220, 1455, 1226,-1000,-1000,-1000,-1000,-1000, --1000, -17, 216, 734, 2954, 2787, 59, 488, 1451, 1294, --1000,-1000, 3493, -65, 854, 28, -22, 3547, 28, 1220, - 852,-1000,-1000,-1000, 424,-1000,-1000,-1000,-1000,-1000, --1000,-1000, 28, 39,-1000, -18, 1220, 53, 1449, 836, - 1447, 1293, 1279,-1000, 79, 28, 28, 1446, 1132,-1000, --1000, 1292, 1600, 1438, 1599, 1434, 1433, 1598, 1596, 1220, - 411,-1000, 411, 28, 131, 411, 7, 2954, 411, 753, - 902, 192, -157, 1428, 96, 1824, 120, 2016, 28,-1000, - 1291,-1000, 883,-1000, 883, 883, 883, 883, 883, -120, --1000, 28, 28, 411,-1000,-1000,-1000,-1000,-1000,-1000, - 1220, 1423, 1278, 980,-1000,-1000, 263, 1260, 1019, 199, - 78,-1000, -42, 28, 1420, 1419,-1000, 3547, 1595, 1189, - 1189, 1189, 411, 411,-1000, 958, 270, 128,-1000,-1000, --1000,-1000,-1000, 1418, 232, 1635, 1007, -22, 1594, 1593, - 3439,-1000,-1000, 1685, 56, 666, 973, -22, 3547, 28, - 1220, -337, 411, 1220,-1000,-1000, 3547,-1000,-1000, 1220, --1000, -65, 192, 1417, -266,-1000,-1000, 1220, 2693, 850, - 948, -144, -147, 1416, 1415, 411, 1288,-1000, -65,-1000, - 424, 424,-1000,-1000,-1000,-1000, 354,-1000,-1000,-1000, --1000,-1000,-1000,-1000, 1189, 1220, 1414, 28, 1220, 1412, --1000, 411, -22, 1579, 845, 843, 839, 835,-1000, 53, - 1715,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000, 1131, 1129, 1578, 948, 79, 1410, 887, 7, - 1577, -400, -78,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000, 724,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000, 1576, 1576,-1000, 1576, - 1750,-1000,-1000, -412,-1000, -402,-1000,-1000, -417,-1000, + 1630, 1629, 1485,-1000,-1000,-1000, 2759,-1000,-1000,-1000, +-1000, 1232, 1628, 24, 3574,-1000, 110, 1323,-1000, -120, + -121,-1000,-1000, -359,-1000,-1000, 24, 266, 357, 24, +-1000,-1000, 1026,-1000,-1000, 24,-1000, 24,-1000, 1019, + 1007,-1000,-1000, 125, -175, -371, 1620,-1000,-1000,-1000, +-1000, 125, -372,-1000,-1000, -353,-1000,-1000,-1000, 1286, +-1000, 788, 125, 3574, 1190, 3520, 33, 96, 777,-1000, +-1000,-1000,-1000,-1000,-1000,-1000, 1618,-1000,-1000,-1000, +-1000,-1000,-1000, 1615,-1000,-1000, 657, 96, 1484,-1000, + 1483, 825, 1482, 1479, 1478, 1474, 1473,-1000, 323, 1144, +-1000, 87, 1190,-1000,-1000,-1000, 16, 125, 96, 398, + 148, 3088,-1000,-1000, 1279, 1190,-1000, 776,-1000,-1000, + -47, 3020, 3020, 952, 1275, 556, 1190, 1190, 1190, 1190, +-1000, 2417,-1000, 1190,-1000, 125, 125, 125, 703, 1190, + -8, 1190, 245, 1472,-1000, 422,-1000,-1000,-1000,-1000, +-1000,-1000, 33,-1000, 1232,-1000,-1000, 1076, -15, 1058, +-1000,-1000, 1190, 1464, 1226,-1000,-1000,-1000,-1000,-1000, +-1000, -17, 171, 701, 3020, 2863, 128, -44, 1459, 1267, +-1000,-1000, 3520, -53, 821, 33, -75, 3574, 33, 1190, + 814,-1000,-1000,-1000, 110,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, 33, 65,-1000, -22, 1190, 96, 1457, 862, + 1456, 1262, 1260,-1000, 76, 33, 33, 1455, 1136,-1000, +-1000, 1232, 1614, 1451, 1613, 1450, 1449, 1612, 1611, 1190, + 125,-1000, 125, 33, 143, 125, 24, 3020, 125, 594, + 662, 121, -172, 1447, 95, 1823, 134, 1905, 33,-1000, + 1312,-1000, 869,-1000, 869, 869, 869, 869, 869, -144, +-1000, 33, 33, 125,-1000,-1000,-1000,-1000,-1000,-1000, + 1190, 1446, 1245, 990,-1000,-1000, 349, 1219, 993, 361, + 130,-1000, -37, 33, 1434, 1433,-1000, 3574, 1610, 1169, + 1169, 1169, 125, 125,-1000, 947, 865, 422,-1000,-1000, +-1000,-1000,-1000, 1432, 347, 922, 981, -75, 1609, 1608, + 3464,-1000,-1000, 555, 868, 1127, 721, -75, 3574, 33, + 1190, -339, 125, 1190,-1000,-1000, 3574,-1000,-1000, 1190, +-1000, -53, 121, 1428, -246,-1000,-1000, 1190, 2759, 808, + 954, -133, -147, 1423, 1414, 125, 1309,-1000, -53,-1000, + 110, 110,-1000,-1000,-1000,-1000, 266,-1000,-1000,-1000, +-1000,-1000,-1000,-1000, 1169, 1190, 1412, 33, 1190, 1410, +-1000, 125, -75, 1601, 794, 789, 787, 754,-1000, 96, + 1747,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, 1131, 1129, 1600, 954, 76, 1409, 909, 24, + 1599, -401, -67,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000, 648,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000, 1597, 1597,-1000, 1597, + 1786,-1000,-1000, -414,-1000, -405,-1000,-1000, -419,-1000, -1000,-1000, 1408,-1000,-1000,-1000,-1000,-1000,-1000,-1000, - 79,-1000,-1000,-1000,-1000,-1000, 61, 432, 1220,-1000, - 53, 630, 224,-1000, 3021, 312, 1002,-1000,-1000,-1000, --1000,-1000, 899, -65, 1189, 1220,-1000, 411, 1219, 2954, --1000,-1000,-1000, 200,-1000,-1000,-1000, 1158, 1157, 1144, - 1141, 1139, 1136, 1100, 1063, 1055, 1038, 1035, 1014, 1005, - 366, 997, 994, 7, 637, 1051, -65, -65, 28, 934, --1000,-1000,-1000, 661, 661, 661, 661,-1000,-1000,-1000, --1000,-1000,-1000, 661, 661, 661,-1000,-1000,-1000,-1000, --1000, -434, 2693, 828,-1000, 661, 1220, 1187,-1000, 79, --1000, 79, -23,-1000,-1000, 2602, 79, 28,-1000,-1000, - 1220,-1000, 1405,-1000,-1000, 1128,-1000,-1000, -301, 1050, - 2016,-1000,-1000,-1000,-1000, 1292,-1000, -254, -257, 28, --1000,-1000,-1000,-1000, 352, 169, 53, 882, 745,-1000, --1000,-1000,-1000,-1000,-1000,-1000, -423,-1000,-1000, 37, + 76,-1000,-1000,-1000,-1000,-1000, 127, 306, 1190,-1000, + 96, 630, 338,-1000, 3088, 395, 969,-1000,-1000,-1000, +-1000,-1000, 556, -53, 1169, 1190,-1000, 125, 1200, 3020, +-1000,-1000,-1000, 199,-1000,-1000,-1000, 1188, 1185, 1178, + 1171, 1158, 1150, 1106, 1104, 1100, 1048, 1036, 995, 994, + 329, 992, 978, 24, 658, 1058, -53, -53, 33, 939, +-1000,-1000,-1000, 1076, 1076, 1076, 1076,-1000,-1000,-1000, +-1000,-1000,-1000, 1076, 1076, 1076,-1000,-1000,-1000,-1000, +-1000, -435, 2759, 732,-1000, 1076, 1190, 777,-1000, 76, +-1000, 76, -23,-1000,-1000, 2711, 76, 33,-1000,-1000, + 1190,-1000, 1406,-1000,-1000, 1121,-1000,-1000, -299, 1057, + 1905,-1000,-1000,-1000,-1000, 1232,-1000, -250, -269, 33, +-1000,-1000,-1000,-1000, 620, 150, 96, 856, 723,-1000, +-1000,-1000,-1000,-1000,-1000,-1000, -428,-1000,-1000, 41, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000, 475,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000, 582,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 28,-1000, --1000,-1000,-1000, 1575, 1292, 1574,-1000,-1000,-1000,-1000, --1000, 274, 1401, 1219,-1000, 128, 1400, 1239,-1000, 2348, --1000,-1000,-1000, -56, 28, 829, 28, 2650, 28, 314, - 28, 795, 28, 39, 28, 28, 28, 28, 28, 28, - 28, 39, 28, 28, 28, 28, 28, 28, 28, 978, - 962, 947, 931, 28, 28, -160, 28, 1399, 1292,-1000, --1000, 1572, 1571, 1395, 1392, 825,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000, 216, -27,-1000, 1240,-1000,-1000, - -22,-1000,-1000, 1292,-1000, 1570, 1569, 1568, 1567, 1566, - 1557, 356, 1556, 1554, 1552, 1542, 1538, 1537,-1000,-1000, --1000, 354,-1000, 1535, 1390, 1386,-1000,-1000,-1000,-1000, - 1388,-1000, 710, 28,-1000, 1267, 28, 28, 974, 53, - 824,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 60, 28, - 381, 241,-1000,-1000,-1000,-1000,-1000, 2954, 205,-1000, --1000,-1000, 1011, 1387, 1385, 822, 49, 1380, 1377, 821, - 1375, 819, 1374, 1373, 814, 1368, 1367, 812, 1366, 808, - 1365, 807, 1364, 794, 1363, 793, 1362, 776, 1361, 754, - 1360, 742, 1359, 741, 39, 28, 28, 28, 28, 28, - 28, 28, 1358, 730, 1348, 727,-1000, 174, -65, -65, --1000,-1000, 923, 3547, -22, -65, 1012, 1534, 1532, 1531, - 1530, 1113, -65,-1000,-1000,-1000,-1000, 28, 721, 53, - 705, 700, 28, 1292,-1000,-1000, 1347, 1090, 1086, 1049, - 1344,-1000, 36,-1000, 953, 699, 45,-1000,-1000,-1000, - 1529, 1343,-1000,-1000, 1528,-1000, 1525,-1000,-1000, 1524, --1000,-1000, 1521,-1000, 1520,-1000, 1519,-1000, 1518,-1000, - 1512,-1000, 1511,-1000, 1509,-1000, 1504,-1000, 1503, 1342, - 675, 1341, 668, 1340, 647, 1337, 613,-1000, 1502,-1000, - 1501,-1000, 1336, 1335,-1000, 2693, 1012, 1334, 1499,-1000, - 398, 354, 1333, 606,-1000, 1247,-1000, 2053, 1332,-1000, - 28, 28, 28,-1000,-1000, 2650,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 33,-1000, +-1000,-1000,-1000, 1596, 1232, 1595,-1000,-1000,-1000,-1000, +-1000, 375, 1402, 1200,-1000, 422, 1400, 1199,-1000, 2565, +-1000,-1000,-1000, -58, 33, 1487, 33, 2665, 33, 37, + 33, 384, 33, 65, 33, 33, 33, 33, 33, 33, + 33, 65, 33, 33, 33, 33, 33, 33, 33, 950, + 938, 934, 929, 33, 33, -148, 33, 1399, 1232,-1000, +-1000, 1580, 1579, 1395, 1392, 731,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000, 171, -30,-1000, 1263,-1000,-1000, + -75,-1000,-1000, 1232,-1000, 1578, 1577, 1576, 1573, 1572, + 1563, 160, 1562, 1561, 1560, 1559, 1558, 1555,-1000,-1000, +-1000, 266,-1000, 1553, 1390, 1667,-1000,-1000,-1000,-1000, + 1388,-1000, 584, 33,-1000, 1264, 33, 33, 955, 96, + 730,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 116, 33, + 690, 53,-1000,-1000,-1000,-1000,-1000, 3020, 636,-1000, +-1000,-1000, 1619, 1387, 1386, 725, 91, 1385, 1384, 724, + 1383, 715, 1382, 1380, 714, 1377, 1374, 712, 1373, 710, + 1369, 706, 1368, 700, 1358, 689, 1356, 686, 1355, 679, + 1354, 655, 1353, 624, 65, 33, 33, 33, 33, 33, + 33, 33, 1352, 613, 1351, 596,-1000, 337, -53, -53, +-1000,-1000, 895, 3574, -75, -53, 1056, 1552, 1551, 1550, + 1549, 1118, -53,-1000,-1000,-1000,-1000, 33, 595, 96, + 591, 588, 33, 1232,-1000,-1000, 1350, 1115, 1096, 1077, + 1349,-1000, 36,-1000, 951, 571, 58,-1000,-1000,-1000, + 1547, 1347,-1000,-1000, 1544,-1000, 1541,-1000,-1000, 1539, +-1000,-1000, 1533,-1000, 1532,-1000, 1531,-1000, 1530,-1000, + 1529,-1000, 1525,-1000, 1524,-1000, 1522,-1000, 1520, 1346, + 563, 1345, 560, 1342, 551, 1340, 538,-1000, 1517,-1000, + 1512,-1000, 1338, 1336,-1000, 2759, 1056, 1334, 1510,-1000, + 660, 266, 1333, 490,-1000, 1291,-1000, 2070, 1332,-1000, + 33, 33, 33,-1000,-1000, 2665,-1000,-1000,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000, 1498,-1000, 1497,-1000, 1496,-1000, 1495, --1000,-1000,-1000,-1000, -30, 1494, 948, -65,-1000,-1000, --1000, 53,-1000, 887,-1000, 1331, 1329, 1328,-1000, 164, - 704, 2188, 257, 616, 416, 541, 518, 466, 322, 460, - 458, 446,-1000,-1000,-1000,-1000, 430, 153, -22, -65, --1000, 1326, 1207, 1265,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000, 38,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000, 1508,-1000, 1507,-1000, 1506,-1000, 1504, +-1000,-1000,-1000,-1000, -34, 1502, 954, -53,-1000,-1000, +-1000, 96,-1000, 909,-1000, 1329, 1328, 1319,-1000, 249, + 1298, 2249, 331, 460, 466, 491, 446, 435, 454, 408, + 381, 378,-1000,-1000,-1000,-1000, 368, 126, -75, -53, +-1000, 1318, 2140, 1204,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, -33,-1000,-1000,-1000,-1000,-1000,-1000,-1000, -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000, 319, 378, 333, 272,-1000,-1000, --1000, 1493, 1325,-1000,-1000,-1000,-1000,-1000,-1000,-1000, --1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1490, 53, --1000,-1000,-1000,-1000,-1000, -65, -435, 28, 1227, 1316, - -199, 1315,-1000,-1000, 216,-1000, 3547, 2693, -45, -22, - 1012, 1489, -65, 1311,-1000 +-1000,-1000,-1000,-1000, 259, 364, 303, 300,-1000,-1000, +-1000, 1501, 1316,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 1500, + 96,-1000,-1000,-1000,-1000,-1000, -53, -436, 33, 1297, + 1315, -191, 1313,-1000,-1000, 171,-1000, 3574, 2759, -35, + -75, 1056, 1405, -53, 1306,-1000 }; YYSTATIC YYCONST short YYFARDATA YYPGO[] = { - 0, 53, 57, 6, 1900, 43, 40, 29, 1899, 0, - 1898, 1897, 1896, 195, 50, 1895, 1893, 2, 1892, 48, - 38, 1, 27, 30, 31, 4, 1890, 45, 22, 59, - 1889, 136, 39, 9, 25, 7, 13, 1888, 41, 1887, - 14, 26, 1884, 1883, 5, 3, 8, 10, 1882, 1877, - 1876, 1875, 32, 33, 70, 1873, 1872, 1871, 1870, 12, - 1869, 1868, 11, 1867, 35, 1866, 18, 36, 16, 24, - 42, 23, 458, 65, 1276, 52, 127, 1864, 1863, 1848, - 1847, 1846, 1845, 19, 34, 1844, 1353, 1837, 1836, 28, - 784, 119, 1835, 47, 1245, 1834, 1831, 1830, 1829, 1828, - 1825, 1824, 1817, 1815, 1813, 1812, 1811, 1796, 1795, 1033, - 1794, 64, 62, 1793, 58, 150, 56, 76, 1790, 1789, - 49, 1788, 1787, 1786, 1785, 1784, 1783, 61, 1782, 1781, - 1780, 66, 114, 44, 1778, 15, 284, 1775, 1771, 1770, - 1758, 1757, 1755, 1754, 1753, 1752, 1751, 1748, 1747, 770, - 1746, 1745, 1743, 1742, 1741, 1734, 1713, 1712, 60, 1711, - 1710, 113, 1709, 1708, 1707, 98, 1706, 1704, 1703, 1702, - 1701, 1700, 1699, 69, 1696, 67, 1698, 63, 1695, 484, - 1693, 1692, 1688, 1686, 1685, 1473 + 0, 53, 57, 6, 1914, 43, 40, 29, 1909, 0, + 1908, 1907, 1906, 223, 50, 1905, 1904, 2, 1903, 48, + 38, 1, 27, 30, 31, 4, 1899, 45, 22, 59, + 1898, 136, 39, 9, 25, 7, 13, 1897, 41, 1896, + 14, 26, 1895, 1891, 5, 3, 8, 10, 1890, 1889, + 1888, 1886, 32, 33, 70, 1885, 1884, 1883, 1881, 12, + 1877, 1876, 11, 1866, 35, 1865, 18, 36, 16, 24, + 42, 23, 556, 65, 1288, 52, 127, 1856, 1855, 1854, + 1853, 1852, 1849, 19, 34, 1847, 1341, 1845, 1844, 28, + 655, 115, 1843, 47, 1280, 1842, 1835, 1834, 1833, 1829, + 1814, 1813, 1812, 1811, 1810, 1809, 1808, 1807, 1806, 956, + 1805, 64, 62, 1804, 58, 122, 56, 76, 1803, 1802, + 49, 1801, 1800, 1799, 1798, 1797, 1796, 61, 1794, 1792, + 1791, 66, 114, 44, 1790, 15, 284, 1789, 1787, 1785, + 1784, 1782, 1779, 1778, 1777, 1776, 1775, 1774, 1769, 836, + 1768, 1767, 1759, 1758, 1757, 1756, 1752, 1751, 60, 1749, + 1746, 119, 1745, 1738, 1732, 113, 1731, 1717, 1716, 1715, + 1714, 1709, 1707, 69, 1703, 67, 1706, 63, 1705, 478, + 1704, 1702, 1659, 1615, 1528, 1504 }; YYSTATIC YYCONST yyr_t YYFARDATA YYR1[]={ @@ -1267,58 +1271,58 @@ YYSTATIC YYCONST yyr_t YYFARDATA YYR1[]={ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 3, 3, 3, 13, 13, 13, 13, 13, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 154, 115, - 115, 155, 155, 155, 155, 155, 155, 155, 155, 155, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 154, + 115, 115, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 158, 159, 156, 161, 161, - 160, 160, 160, 163, 162, 162, 162, 162, 166, 166, - 166, 169, 164, 167, 168, 165, 165, 165, 117, 170, - 170, 172, 172, 172, 171, 171, 173, 173, 14, 14, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 41, 41, 41, 41, 41, + 155, 155, 155, 155, 155, 155, 158, 159, 156, 161, + 161, 160, 160, 160, 163, 162, 162, 162, 162, 166, + 166, 166, 169, 164, 167, 168, 165, 165, 165, 117, + 170, 170, 172, 172, 172, 171, 171, 173, 173, 14, + 14, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 175, 31, 31, 32, 32, 39, - 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 175, 31, 31, 32, 32, + 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 42, 42, - 42, 43, 43, 43, 47, 47, 46, 46, 45, 45, - 44, 44, 48, 48, 49, 49, 49, 50, 50, 50, - 50, 51, 51, 149, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 157, 157, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 42, + 42, 42, 43, 43, 43, 47, 47, 46, 46, 45, + 45, 44, 44, 48, 48, 49, 49, 49, 50, 50, + 50, 50, 51, 51, 149, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 6, 6, 6, 6, 6, 53, 53, 54, 54, - 55, 55, 25, 25, 26, 26, 27, 27, 27, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 5, - 5, 71, 71, 71, 71, 33, 33, 33, 33, 33, + 157, 157, 6, 6, 6, 6, 6, 53, 53, 54, + 54, 55, 55, 25, 25, 26, 26, 27, 27, 27, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 5, 5, 71, 71, 71, 71, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 20, 20, 15, 15, 15, 15, 15, 15, 15, 15, + 33, 20, 20, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 15, 15, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 52, 52, 52, 52, 52, + 28, 28, 28, 28, 28, 28, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 30, 30, 29, 29, 29, 29, 29, - 131, 131, 131, 131, 131, 131, 64, 64, 64, 63, - 63, 87, 87, 84, 84, 85, 17, 17, 37, 37, - 37, 37, 37, 37, 37, 37, 86, 86, 86, 86, + 52, 52, 52, 52, 30, 30, 29, 29, 29, 29, + 29, 131, 131, 131, 131, 131, 131, 64, 64, 64, + 63, 63, 87, 87, 84, 84, 85, 17, 17, 37, + 37, 37, 37, 37, 37, 37, 37, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 176, 176, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 121, 121, 88, 88, 89, 89, - 177, 122, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 123, 123, 178, 178, 178, 66, 66, 179, - 179, 179, 179, 179, 179, 180, 182, 181, 124, 124, - 125, 125, 183, 183, 183, 183, 126, 148, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 127, 127, - 184, 184, 184, 184, 184, 184, 184, 128, 128, 92, - 92, 92, 129, 129, 185, 185, 185, 185 }; + 86, 86, 176, 176, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 121, 121, 88, 88, 89, + 89, 177, 122, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 123, 123, 178, 178, 178, 66, 66, + 179, 179, 179, 179, 179, 179, 180, 182, 181, 124, + 124, 125, 125, 183, 183, 183, 183, 126, 148, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 127, + 127, 184, 184, 184, 184, 184, 184, 184, 128, 128, + 92, 92, 92, 129, 129, 185, 185, 185, 185 }; YYSTATIC YYCONST yyr_t YYFARDATA YYR2[]={ 0, 0, 2, 4, 4, 3, 1, 1, 1, 1, @@ -1353,187 +1357,187 @@ YYSTATIC YYCONST yyr_t YYFARDATA YYR2[]={ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 5, 1, 1, 1, 0, 4, 4, 4, 4, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 5, 1, 0, - 2, 2, 1, 2, 4, 5, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 4, 6, 4, 4, - 11, 1, 5, 3, 5, 3, 1, 2, 2, 1, - 2, 4, 4, 1, 2, 2, 2, 2, 2, 2, - 2, 1, 2, 1, 1, 1, 4, 4, 2, 4, - 2, 0, 1, 1, 3, 1, 3, 1, 0, 3, - 5, 4, 3, 5, 5, 5, 5, 5, 5, 2, - 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, - 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, - 4, 4, 4, 3, 2, 0, 1, 1, 2, 1, - 1, 1, 1, 4, 4, 5, 4, 4, 4, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 0, 2, - 2, 0, 2, 2, 0, 2, 0, 2, 0, 2, - 0, 2, 0, 2, 0, 2, 2, 0, 2, 3, - 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, - 2, 2, 2, 2, 2, 3, 2, 2, 2, 5, - 3, 2, 2, 2, 2, 2, 5, 4, 6, 2, - 4, 0, 3, 3, 1, 1, 0, 3, 0, 1, - 1, 3, 0, 1, 1, 3, 1, 3, 4, 4, - 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 3, 4, 1, 0, 10, 6, 5, 6, + 2, 2, 2, 2, 2, 2, 2, 2, 5, 1, + 0, 2, 2, 1, 2, 4, 5, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 4, 6, 4, + 4, 11, 1, 5, 3, 5, 3, 1, 2, 2, + 1, 2, 4, 4, 1, 2, 2, 2, 2, 2, + 2, 2, 1, 2, 1, 1, 1, 4, 4, 2, + 4, 2, 0, 1, 1, 3, 1, 3, 1, 0, + 3, 5, 4, 3, 5, 5, 5, 5, 5, 5, + 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, + 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, + 4, 4, 4, 4, 3, 2, 0, 1, 1, 2, + 1, 1, 1, 1, 4, 4, 5, 4, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 7, 7, 7, 7, 7, 0, + 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, + 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, + 3, 2, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, + 5, 3, 2, 2, 2, 2, 2, 5, 4, 6, + 2, 4, 0, 3, 3, 1, 1, 0, 3, 0, + 1, 1, 3, 0, 1, 1, 3, 1, 3, 4, + 4, 4, 4, 5, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 3, 4, 1, 0, 10, 6, 5, + 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, + 1, 2, 3, 4, 6, 5, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 1, 2, 2, 4, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, + 1, 0, 5, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 3, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, - 2, 3, 4, 6, 5, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 1, 2, 2, 4, 1, 2, - 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, - 0, 5, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 3, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 2, 1, 3, 2, 3, 4, 2, 2, + 2, 5, 5, 7, 4, 3, 2, 3, 2, 1, + 1, 2, 3, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 3, 0, 1, 1, 3, + 2, 6, 7, 3, 3, 3, 6, 0, 1, 3, + 5, 6, 4, 4, 1, 3, 3, 1, 1, 1, + 1, 4, 1, 6, 6, 6, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 3, 2, 3, 4, 2, 2, 2, - 5, 5, 7, 4, 3, 2, 3, 2, 1, 1, - 2, 3, 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 3, 0, 1, 1, 3, 2, - 6, 7, 3, 3, 3, 6, 0, 1, 3, 5, - 6, 4, 4, 1, 3, 3, 1, 1, 1, 1, - 4, 1, 6, 6, 6, 4, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 2, 5, 4, 7, 6, 7, - 6, 9, 8, 3, 8, 4, 0, 2, 0, 1, - 3, 3, 0, 2, 2, 2, 3, 2, 2, 2, - 2, 2, 0, 2, 3, 1, 1, 1, 1, 3, - 8, 2, 3, 1, 1, 3, 3, 3, 4, 6, - 0, 2, 3, 1, 3, 1, 4, 3, 0, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 0, 2, - 2, 3, 3, 4, 2, 1, 1, 3, 5, 0, - 2, 2, 0, 2, 4, 3, 1, 1 }; + 1, 1, 1, 1, 3, 2, 5, 4, 7, 6, + 7, 6, 9, 8, 3, 8, 4, 0, 2, 0, + 1, 3, 3, 0, 2, 2, 2, 3, 2, 2, + 2, 2, 2, 0, 2, 3, 1, 1, 1, 1, + 3, 8, 2, 3, 1, 1, 3, 3, 3, 4, + 6, 0, 2, 3, 1, 3, 1, 4, 3, 0, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, + 2, 2, 3, 3, 4, 2, 1, 1, 3, 5, + 0, 2, 2, 0, 2, 4, 3, 1, 1 }; YYSTATIC YYCONST short YYFARDATA YYCHK[]={ -1000,-109,-110,-111,-113,-114,-116,-117,-118,-119, --120,-121,-122,-124,-126,-128,-130,-131,-132, 524, - 525, 459, 527, 528,-133,-134,-135, 531, 532,-139, - 408,-152, 410,-170,-137, 454,-176, 462, 407, 469, - 470, 429, -87, 430, -93, -94, 273, 448, 529, 533, - 534, 535, 536, 537, 538, 539, 59,-138, 409, 411, - 453, 446, 447, 449, -10, -11, 123, 123,-115, 123, - 123, 123, 123, -9, 264, -9, 526, -88, -24, 265, +-120,-121,-122,-124,-126,-128,-130,-131,-132, 525, + 526, 460, 528, 529,-133,-134,-135, 532, 533,-139, + 409,-152, 411,-170,-137, 455,-176, 463, 408, 470, + 471, 430, -87, 431, -93, -94, 273, 449, 530, 534, + 535, 536, 537, 538, 539, 540, 59,-138, 410, 412, + 454, 447, 448, 450, -10, -11, 123, 123,-115, 123, + 123, 123, 123, -9, 264, -9, 527, -88, -24, 265, 264, -24, 123,-140, 314, -1, -2, 261, 260, 263, -78, -16, 91,-171, 123,-174, 278, 38,-175, 286, 287, 284, 283, 282, 281, 288, -31, -32, 267, 91, - -9, -90, 468, 468, -92, -1, 468, -86, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, -31, -86, 263, -28, -70, -74, -93, + -9, -90, 469, 469, -92, -1, 469, -86, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, -31, -86, 263, -28, -70, -74, -93, -94, 306, 297, 322, 323,-149, 33, 307, 276, 324, - -52, 275, 91, -5, -76, 268, 412, 413, 414, 357, - 356, 278, 298, 277, 281, 282, 283, 284, 286, 287, + -52, 275, 91, -5, -76, 268, 413, 414, 415, 358, + 357, 278, 298, 277, 281, 282, 283, 284, 286, 287, 279, 290, 291, 292, 293, 271, -1, 296, -1, -1, - -1, -1, 262, -77,-172, 318, 378, 61, -73, 40, + -1, -1, 262, -77,-172, 318, 379, 61, -73, 40, -75, -7, -76, 269, 272, 325, 340, -8, 295, 300, - 302, 308, -31, -31,-112,-109, 125,-155, 415,-156, - 417,-154, 419, 420,-117,-157, -2,-131,-120,-133, --132,-135, 471, 457, 507,-158, 506,-160, 418, -95, + 302, 308, -31, -31,-112,-109, 125,-155, 416,-156, + 418,-154, 420, 421,-117,-157, -2,-131,-120,-133, +-132,-135, 472, 458, 508,-158, 507,-160, 419, -95, -96, -97, -98, -99,-108,-100,-101,-102,-103,-104, --105,-106,-107,-159,-163, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 123, 416, --123,-125,-127,-129, -9, -1, 460,-136, -70, -76, +-105,-106,-107,-159,-163, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 123, 417, +-123,-125,-127,-129, -9, -1, 461,-136, -70, -76, -141, 315, -71, -70, 91, -28,-149, 46, -7, 328, - 329, 330, 331, 332, 326, 346, 352, 337, 364, 365, - 366, 367, 368, 369, 370, 350, 377, 294, 371, -79, + 329, 330, 331, 332, 326, 346, 353, 337, 365, 366, + 367, 368, 369, 370, 371, 351, 378, 294, 372, -79, -9,-173,-174, 42, 40, -31, 40, -14, 91, 40, -14, 40, -14, 40, -14, 40, -14, 40, -14, 40, - 41, 267, -9, 263, 58, 44, 262, -1, 353, 354, - 355, 472, 378, 474, 475, 476, 477, -90, -91, -1, + 41, 267, -9, 263, 58, 44, 262, -1, 354, 355, + 356, 473, 379, 475, 476, 477, 478, -90, -91, -1, 329, 330, -1, -71, 41, -36, 61, 288, 262, 44, - 389, 91, 38, 42, 358, 359, 360, 60, 389, 389, - 389, 389, -70, 306, -70, -75, -7, 33, -9, -1, - 280, 279, 289, -28, -1, -76, 42, 470, 47, -28, + 390, 91, 38, 42, 359, 360, 361, 60, 390, 390, + 390, 390, -70, 306, -70, -75, -7, 33, -9, -1, + 280, 279, 289, -28, -1, -76, 42, 471, 47, -28, 270, 272, 281, 282, 283, 284, 40, -36, -1, 329, 330, 322, 345, 334, 335, 337, 338, 339, 340, 341, - 342, 343, 344, 361, 354, 336, 351, 326, 370, 294, + 342, 343, 344, 362, 355, 336, 352, 326, 371, 294, -2, 40, 61, -72, -71, -74, -28, -7, -7, 40, 301, 303, 304, 305, 41, 41, 125,-143,-114,-111, --144,-146,-116,-117,-131,-120,-132, 451, 452,-148, - 507,-133,-135, 506, 321, 421, 426, 471, 407, 125, - -9, -9, 40, 450, 58, 91, -9, -71, 356, 363, +-144,-146,-116,-117,-131,-120,-132, 452, 453,-148, + 508,-133,-135, 507, 321, 422, 427, 472, 408, 125, + -9, -9, 40, 451, 58, 91, -9, -71, 357, 364, 91,-161,-162,-164,-166,-167,-168, 311,-169, 309, 313, 312, -9, -2, -9, -24, 40, -23, -24, 266, 286, 287, -31, -9, -2, -75, -28, -76, 270, 272, -71, -36, 341,-175, -7, -72, 40,-115,-158, -2, - -9, 125,-178, 461,-131,-179,-180, 466, 467,-181, --132,-135, 463, 125,-183,-177,-179,-182, 338, 461, - 464, 125,-184, 459, 407, 462, 296,-132,-135, 125, --185, 459, 462,-132,-135, -89, 419, 125,-136,-142, - -71, -1, 470, -7, -1, -13, 40, 40, -28, 328, - 329, 330, 331, 376, 370, 326, 478, 364, 365, 366, - 367, 374, 375, 294, 93, 125, 44, 40, -2, 41, + -9, 125,-178, 462,-131,-179,-180, 467, 468,-181, +-132,-135, 464, 125,-183,-177,-179,-182, 338, 462, + 465, 125,-184, 460, 408, 463, 296,-132,-135, 125, +-185, 460, 463,-132,-135, -89, 420, 125,-136,-142, + -71, -1, 471, -7, -1, -13, 40, 40, -28, 328, + 329, 330, 331, 377, 371, 326, 479, 365, 366, 367, + 368, 375, 376, 294, 93, 125, 44, 40, -2, 41, -23, -9, -23, -24, -9, -9, -9, 93, -9, -9, - 473, -1, -1, 330, 329, 327, 336, 389, 40, 61, + 474, -1, -1, 330, 329, 327, 336, 390, 40, 61, 43, 123, 40, 40, 263, -1, 93, -30, -29, 275, -9, 40, 40, -54, -55, -28, -1, -1, -1, -1, -70, -28, -9, -1, 280, 93, 93, 93, -1, -1, - -71, -1, 91, -9, -69, 60, 329, 330, 331, 364, - 365, 366, 40, 61, -36, 123, 40, 41, -71, -3, - 372, 373, -1, -9,-115, 123, 123, 123, -9, -9, - 123, -71, 356, 363, 363, -81, -82, -91, -25, -26, + -71, -1, 91, -9, -69, 60, 329, 330, 331, 365, + 366, 367, 40, 61, -36, 123, 40, 41, -71, -3, + 373, 374, -1, -9,-115, 123, 123, 123, -9, -9, + 123, -71, 357, 364, 364, -81, -82, -91, -25, -26, -27, 275, -13, 40, -9, 58, 274, -7, 91, -1, -9,-161,-165,-158, 310,-165,-165,-165, -71,-158, -2, -9, 40, 40, 41, -71, -1, 40, -31, -28, - -6, -2, -9, 125, 316, 316, 465, -31, -66, -9, + -6, -2, -9, 125, 316, 316, 466, -31, -66, -9, 42, -36, 61, -31, 61, -31, -31, 61, 61, -1, - 468, -9, 468, 40, -1, 468,-177, 44, 93, -1, + 469, -9, 469, 40, -1, 469,-177, 44, 93, -1, -28, -28, 91, -9, -36, -83, -1, 40, 40,-173, -36, 41, 41, 93, 41, 41, 41, 41, 41, -12, - 263, 44, 58, 389, 329, 330, 331, 364, 365, 366, + 263, 44, 58, 390, 329, 330, 331, 365, 366, 367, -1, -84, -85, -36, 123, 262, -64, -63, -71, 306, 44, 93, 44, 275, -71, -71, 62, 44, 42, -5, -5, -5, 93, 274, 41, -68, -19, -18, 43, 45, - 306, 323, 372, -9, -59, -61, -73, 274, -53, -22, + 306, 323, 373, -9, -59, -61, -73, 274, -53, -22, 60, 41, 125,-112,-145,-147,-127, 274, -7, 91, - -1, -71, -71, -1, 370, 326, -7, 370, 326, -1, + -1, -71, -71, -1, 371, 326, -7, 371, 326, -1, 41, 44, -28, -25, 93, -9, -3, -1, -28, -9, 93, -2, -9, -9, -24, 274, -36, 41, 40, 41, 44, 44, -2, -9, -9, 41, 58, 40, 41, 40, 41, 41, 40, 40, -5, -1, -9, 317, -1, -31, - -71, 93, -38, 478, 503, 504, 505, -9, 41, 389, - -83, 41, 386, 341, 342, 343, 387, 388, 301, 303, - 304, 305, 390, 393, 294, -4, 317, -34, -33,-153, - 479, 481, 482, 483, 484, 276, 277, 281, 282, 283, - 284, 286, 287, 257, 279, 290, 291, 292, 293, 485, - 486, 487, 489, 490, 491, 492, 493, 494, 495, 334, - 496, 280, 289, 336, 497, 341, 488, 356, 389, 501, + -71, 93, -38, 479, 504, 505, 506, -9, 41, 390, + -83, 41, 387, 341, 342, 343, 388, 389, 301, 303, + 304, 305, 391, 394, 294, -4, 317, -34, -33,-153, + 480, 482, 483, 484, 485, 276, 277, 281, 282, 283, + 284, 286, 287, 257, 279, 290, 291, 292, 293, 486, + 487, 488, 490, 491, 492, 493, 494, 495, 496, 334, + 497, 280, 289, 336, 498, 341, 489, 357, 390, 502, 271, 123, -9, 41, -14, -14, -14, -14, -14, -14, - 317, 283, 284, 455, 456, 458, -9, -9, -1, 41, + 317, 283, 284, 456, 457, 459, -9, -9, -1, 41, 44, 61, -59, 125, 44, 61, 263, 263, -29, -9, 41, 41, -28, 40, -5, -1, 62, -58, -1, 40, - -19, 41, 125, -62, -40,-135, -41, 298, 363, 297, + -19, 41, 125, -62, -40,-135, -41, 298, 364, 297, 286, 287, 284, 283, 282, 281, 293, 292, 291, 290, 279, 278, 277,-175, 61, -3, 40, 40, 91, -54, - 125, 125,-150, 422, 423, 424, 425,-120,-132,-133, --135, 125,-151, 427, 428, 425,-132,-120,-133,-135, - 125, -3, -28, -9, -93, 449, -1, -28, -27, -38, - 41, 389, -71, 93, -35, 61, 316, 316, 41, 41, + 125, 125,-150, 423, 424, 425, 426,-120,-132,-133, +-135, 125,-151, 428, 429, 426,-132,-120,-133,-135, + 125, -3, -28, -9, -93, 450, -1, -28, -27, -38, + 41, 390, -71, 93, -35, 61, 316, 316, 41, 41, -1, 41, -25, -6, -6, -66, 41, -9, 41, -3, 40, 93, 93, 93, 93, -36, 41, 58, 58, 40, - -35, -2, 41, 42, 91, -32, 40, 480, 500, 277, + -35, -2, 41, 42, 91, -32, 40, 481, 501, 277, 281, 282, 283, 284, 280, -20, 40, -20, -20, -15, - 509, 482, 483, 276, 277, 281, 282, 283, 284, 286, - 287, 279, 290, 291, 292, 293, 42, 485, 486, 487, - 489, 490, 493, 494, 496, 280, 289, 257, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 495, 487, 499, 41, -2, 263, 263, 44, -84, + 510, 483, 484, 276, 277, 281, 282, 283, 284, 286, + 287, 279, 290, 291, 292, 293, 42, 486, 487, 488, + 490, 491, 494, 495, 497, 280, 289, 257, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 496, 488, 500, 41, -2, 263, 263, 44, -84, -37, -17, -9, 283, -36, -70, 319, 320, 125, -64, 123, 61, -25, -1, -67, 44, -56, -57, -71, -65, --135, 357, 362, 40, 91, 40, 91, 40, 91, 40, +-135, 358, 363, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 40, 91, 284, 283, 282, 281, 40, 91, 40, 91, -31, -36, 123, 40, -53, -22, -25, -25, -9, 62, -75, -75, -75, - -75, -75, -75, -75, 508, -71, 93, -1, -2, -2, + -75, -75, -75, -75, 509, -71, 93, -1, -2, -2, 274, -39, -41, -36, 299, 286, 287, 284, 283, 282, 281, 279, 293, 292, 291, 290, 278, 277, -2, -9, - 41, 58, -89, -69, -34, -83, 391, 392, 391, 392, - -9, 93, -9, 43, 125, -36, 91, 91, 502, 44, - 91, 523, 38, 281, 282, 283, 284, 280, -9, 40, + 41, 58, -89, -69, -34, -83, 392, 393, 392, 393, + -9, 93, -9, 43, 125, -36, 91, 91, 503, 44, + 91, 524, 38, 281, 282, 283, 284, 280, -9, 40, 40, -62, 123, 41, -67, -68, 41, 44, -60, -52, - 363, 297, 345, 299, 263, -9, 306, -70, 299, -9, + 364, 297, 345, 299, 263, -9, 306, -70, 299, -9, -40, -9, -23, -9, -9, -23, -24, -9, -24, -9, -9, -9, -9, -9, -9, -9, -24, -9, -9, -9, -9, -9, -9, -9, 40, 91, 40, 91, 40, 91, @@ -1559,170 +1563,170 @@ YYSTATIC YYCONST short YYFARDATA YYCHK[]={ 41, 299, 306, -70, 41, -40, 41, -23, -9, 41, -23, -24, 41, -24, 41, -9, 41, -9, 41, -9, 41, 41, 41, 41, -47, -46, -45, -44, 41, 41, - -17, -3, -25, 41, 123, 324, 378, 379, 380, 308, - 381, 382, 383, 384, 333, 347, 348, 349, 294, 44, - 263, 41, 41, 41, 41, 40, 41, 40, -36, -25, - 508, -9, 41, 41, 356, 41, -7, -28, -71, 274, - -3, -21, 40, -25, 41 }; + -17, -3, -25, 41, 123, 324, 379, 380, 381, 308, + 382, 383, 384, 385, 333, 347, 348, 349, 350, 294, + 44, 263, 41, 41, 41, 41, 40, 41, 40, -36, + -25, 509, -9, 41, 41, 357, 41, -7, -28, -71, + 274, -3, -21, 40, -25, 41 }; YYSTATIC YYCONST short YYFARDATA YYDEF[]={ - 1, -2, 2, 0, 0, 329, 6, 7, 8, 9, + 1, -2, 2, 0, 0, 330, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0, 16, 17, 18, 0, - 0, 766, 0, 0, 24, 25, 26, 0, 28, 135, - 0, 266, 204, 0, 425, 0, 0, 772, 105, 829, - 92, 0, 425, 0, 83, 84, 85, 0, 0, 0, - 0, 0, 0, 57, 58, 0, 60, 108, 259, 381, - 0, 751, 752, 217, 425, 425, 139, 1, 0, 782, - 800, 818, 832, 19, 41, 20, 0, 0, 22, 42, + 0, 767, 0, 0, 24, 25, 26, 0, 28, 135, + 0, 266, 204, 0, 426, 0, 0, 773, 105, 830, + 92, 0, 426, 0, 83, 84, 85, 0, 0, 0, + 0, 0, 0, 57, 58, 0, 60, 108, 259, 382, + 0, 752, 753, 217, 426, 426, 139, 1, 0, 783, + 801, 819, 833, 19, 41, 20, 0, 0, 22, 42, 43, 23, 29, 137, 0, 104, 38, 39, 36, 37, - 217, 184, 0, 378, 0, 385, 0, 0, 425, 388, - 388, 388, 388, 388, 388, 0, 0, 426, 427, 0, - 754, 0, 772, 808, 0, 93, 0, 0, 736, 737, - 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, - 748, 749, 750, 0, 0, 33, 0, 0, 0, 0, - 0, 0, 662, 0, 0, 217, 0, 678, 679, 0, - 683, 0, 0, 543, 230, 545, 546, 547, 548, 0, - 483, 685, 686, 687, 688, 689, 690, 691, 692, 693, - 0, 698, 699, 700, 701, 702, 549, 0, 52, 54, - 55, 56, 59, 0, 380, 382, 383, 0, 61, 0, + 217, 184, 0, 379, 0, 386, 0, 0, 426, 389, + 389, 389, 389, 389, 389, 0, 0, 427, 428, 0, + 755, 0, 773, 809, 0, 93, 0, 0, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 0, 0, 33, 0, 0, 0, 0, + 0, 0, 663, 0, 0, 217, 0, 679, 680, 0, + 684, 0, 0, 544, 230, 546, 547, 548, 549, 0, + 484, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 0, 699, 700, 701, 702, 703, 550, 0, 52, 54, + 55, 56, 59, 0, 381, 383, 384, 0, 61, 0, 71, 0, 210, 211, 212, 217, 217, 215, 0, 218, - 219, 0, 0, 0, 0, 0, 5, 330, 0, 332, - 0, 0, 336, 337, 338, 339, 0, 341, 342, 343, - 344, 345, 0, 0, 0, 351, 0, 0, 328, 498, - 0, 0, 0, 0, 425, 0, 217, 0, 0, 0, - 217, 0, 0, 329, 0, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 356, 363, - 0, 0, 0, 0, 21, 768, 767, 0, 29, 544, - 107, 0, 136, 551, 0, 554, 217, 0, 308, 267, + 219, 0, 0, 0, 0, 0, 5, 331, 0, 333, + 0, 0, 337, 338, 339, 340, 0, 342, 343, 344, + 345, 346, 0, 0, 0, 352, 0, 0, 329, 499, + 0, 0, 0, 0, 426, 0, 217, 0, 0, 0, + 217, 0, 0, 330, 0, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 357, 364, + 0, 0, 0, 0, 21, 769, 768, 0, 29, 545, + 107, 0, 136, 552, 0, 555, 217, 0, 308, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 0, 0, 0, - 0, 0, 387, 0, 0, 0, 0, 399, 0, 0, - 400, 0, 401, 0, 402, 0, 403, 0, 404, 424, - 102, 428, 0, 753, 0, 0, 763, 771, 773, 774, - 775, 0, 777, 778, 779, 780, 781, 0, 0, 827, - 830, 831, 94, 712, 713, 714, 0, 0, 31, 0, - 0, 705, 667, 668, 669, 0, 0, 528, 0, 0, - 0, 0, 661, 0, 664, 225, 0, 0, 675, 677, - 680, 0, 682, 684, 0, 0, 0, 0, 0, 0, - 228, 229, 694, 695, 696, 697, 0, 53, 147, 109, + 0, 0, 388, 0, 0, 0, 0, 400, 0, 0, + 401, 0, 402, 0, 403, 0, 404, 0, 405, 425, + 102, 429, 0, 754, 0, 0, 764, 772, 774, 775, + 776, 0, 778, 779, 780, 781, 782, 0, 0, 828, + 831, 832, 94, 713, 714, 715, 0, 0, 31, 0, + 0, 706, 668, 669, 670, 0, 0, 529, 0, 0, + 0, 0, 662, 0, 665, 225, 0, 0, 676, 678, + 681, 0, 683, 685, 0, 0, 0, 0, 0, 0, + 228, 229, 695, 696, 697, 698, 0, 53, 147, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, 131, 132, 133, 0, 0, 103, 0, 0, 72, 73, 0, 213, 214, 0, - 220, 221, 222, 223, 64, 68, 3, 140, 329, 0, + 220, 221, 222, 223, 64, 68, 3, 140, 330, 0, 0, 0, 168, 169, 170, 171, 172, 0, 0, 0, - 0, 178, 179, 0, 0, 233, 247, 808, 105, 4, - 331, 333, -2, 0, 340, 0, 0, 0, 217, 0, - 0, 357, 359, 0, 0, 0, 0, 0, 0, 373, - 374, 371, 499, 500, 501, 502, 497, 503, 504, 44, - 0, 0, 0, 506, 507, 508, 0, 511, 512, 513, - 514, 515, 0, 425, 0, 519, 521, 0, 360, 0, - 0, 12, 783, 0, 785, 786, 425, 0, 0, 425, - 793, 794, 0, 13, 801, 425, 803, 425, 805, 0, - 0, 14, 819, 0, 0, 0, 0, 825, 826, 15, - 833, 0, 0, 836, 837, 765, 769, 27, 30, 138, + 0, 178, 179, 0, 0, 233, 247, 809, 105, 4, + 332, 334, -2, 0, 341, 0, 0, 0, 217, 0, + 0, 358, 360, 0, 0, 0, 0, 0, 0, 374, + 375, 372, 500, 501, 502, 503, 498, 504, 505, 44, + 0, 0, 0, 507, 508, 509, 0, 512, 513, 514, + 515, 516, 0, 426, 0, 520, 522, 0, 361, 0, + 0, 12, 784, 0, 786, 787, 426, 0, 0, 426, + 794, 795, 0, 13, 802, 426, 804, 426, 806, 0, + 0, 14, 820, 0, 0, 0, 0, 826, 827, 15, + 834, 0, 0, 837, 838, 766, 770, 27, 30, 138, 142, 0, 0, 0, 40, 0, 0, 289, 0, 185, 186, 187, 188, 189, 190, 191, 0, 193, 194, 195, - 196, 197, 198, 0, 205, 384, 0, 0, 0, 392, - 0, 0, 0, 0, 0, 0, 0, 96, 756, 0, - 776, 798, 806, 809, 810, 811, 0, 0, 0, 0, - 0, 716, 721, 722, 34, 47, 665, 0, 703, 706, - 707, 0, 0, 0, 529, 530, 48, 49, 50, 51, - 663, 0, 674, 676, 681, 0, 0, 0, 0, 550, - 0, -2, 705, 0, 106, 154, 125, 126, 127, 128, - 129, 130, 0, 379, 62, 75, 69, 217, 0, 526, + 196, 197, 198, 0, 205, 385, 0, 0, 0, 393, + 0, 0, 0, 0, 0, 0, 0, 96, 757, 0, + 777, 799, 807, 810, 811, 812, 0, 0, 0, 0, + 0, 717, 722, 723, 34, 47, 666, 0, 704, 707, + 708, 0, 0, 0, 530, 531, 48, 49, 50, 51, + 664, 0, 675, 677, 682, 0, 0, 0, 0, 551, + 0, -2, 706, 0, 106, 154, 125, 126, 127, 128, + 129, 130, 0, 380, 62, 75, 69, 217, 0, 527, 305, 306, -2, 0, 0, 139, 236, 250, 173, 174, - 818, 0, 217, 0, 0, 0, 217, 0, 0, 533, - 534, 536, 0, -2, 0, 0, 0, 0, 0, 353, - 0, 358, 364, 375, 0, 365, 366, 367, 372, 368, - 369, 370, 0, 0, 505, 0, -2, 0, 0, 0, - 0, 524, 525, 355, 0, 0, 0, 0, 0, 787, - 788, 791, 0, 0, 0, 0, 0, 0, 0, 820, - 0, 824, 0, 0, 0, 0, 425, 0, 552, 0, - 0, 260, 0, 0, 289, 0, 200, 555, 0, 386, - 0, 391, 388, 389, 388, 388, 388, 388, 388, 0, - 755, 0, 0, 0, 812, 813, 814, 815, 816, 817, - 828, 0, 723, 0, 75, 32, 0, 717, 0, 0, - 0, 666, 705, 709, 0, 0, 673, 0, 668, 539, - 540, 541, 0, 0, 224, 0, 0, 154, 149, 150, + 819, 0, 217, 0, 0, 0, 217, 0, 0, 534, + 535, 537, 0, -2, 0, 0, 0, 0, 0, 354, + 0, 359, 365, 376, 0, 366, 367, 368, 373, 369, + 370, 371, 0, 0, 506, 0, -2, 0, 0, 0, + 0, 525, 526, 356, 0, 0, 0, 0, 0, 788, + 789, 792, 0, 0, 0, 0, 0, 0, 0, 821, + 0, 825, 0, 0, 0, 0, 426, 0, 553, 0, + 0, 260, 0, 0, 289, 0, 200, 556, 0, 387, + 0, 392, 389, 390, 389, 389, 389, 389, 389, 0, + 756, 0, 0, 0, 813, 814, 815, 816, 817, 818, + 829, 0, 724, 0, 75, 32, 0, 718, 0, 0, + 0, 667, 706, 710, 0, 0, 674, 0, 669, 540, + 541, 542, 0, 0, 224, 0, 0, 154, 149, 150, 151, 152, 153, 0, 0, 78, 65, 0, 0, 0, - 528, 216, 164, 0, 0, 0, 0, 0, 0, 0, - 181, 0, 0, -2, 234, 235, 0, 248, 249, 807, - 334, 308, 260, 0, 346, 348, 349, 307, 0, 0, - 202, 0, 0, 0, 0, 0, 0, 517, -2, 520, - 521, 521, 361, 362, 784, 789, 0, 797, 792, 795, - 802, 804, 770, 796, 821, 822, 0, 0, 835, 0, - 141, 553, 0, 0, 0, 0, 0, 0, 285, 0, + 529, 216, 164, 0, 0, 0, 0, 0, 0, 0, + 181, 0, 0, -2, 234, 235, 0, 248, 249, 808, + 335, 308, 260, 0, 347, 349, 350, 307, 0, 0, + 202, 0, 0, 0, 0, 0, 0, 518, -2, 521, + 522, 522, 362, 363, 785, 790, 0, 798, 793, 796, + 803, 805, 771, 797, 822, 823, 0, 0, 836, 0, + 141, 554, 0, 0, 0, 0, 0, 0, 285, 0, 0, 288, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 0, 0, 0, 202, 0, 0, 262, 0, - 0, 0, 560, 561, 562, 563, 564, 565, 566, 567, - 568, 569, 570, 571, 0, 576, 577, 578, 579, 585, - 586, 587, 588, 589, 590, 591, 610, 610, 594, 610, - 612, 598, 600, 0, 602, 0, 604, 606, 0, 608, - 609, 264, 0, 390, 393, 394, 395, 396, 397, 398, - 0, 97, 98, 99, 100, 101, 758, 760, 799, 710, - 0, 0, 0, 715, 716, 0, 37, 35, 704, 708, - 670, 671, 531, -2, 542, 226, 148, 0, 158, 143, - 155, 134, 63, 74, 76, 77, 432, 0, 0, 0, + 0, 0, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 0, 577, 578, 579, 580, 586, + 587, 588, 589, 590, 591, 592, 611, 611, 595, 611, + 613, 599, 601, 0, 603, 0, 605, 607, 0, 609, + 610, 264, 0, 391, 394, 395, 396, 397, 398, 399, + 0, 97, 98, 99, 100, 101, 759, 761, 800, 711, + 0, 0, 0, 716, 717, 0, 37, 35, 705, 709, + 671, 672, 532, -2, 543, 226, 148, 0, 158, 143, + 155, 134, 63, 74, 76, 77, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 425, 0, 526, -2, -2, 0, 0, + 0, 0, 0, 426, 0, 527, -2, -2, 0, 0, 165, 166, 237, 217, 217, 217, 217, 242, 243, 244, 245, 167, 251, 217, 217, 217, 255, 256, 257, 258, - 175, 0, 0, 0, 182, 217, 231, 0, 535, 537, - 335, 0, 0, 352, 354, 0, 0, 0, 45, 46, - 509, 516, 0, 522, 523, 0, 823, 834, 768, 147, - 555, 309, 310, 311, 312, 289, 287, 0, 0, 0, - 183, 201, 192, 580, 0, 0, 0, 0, 0, 605, - 572, 573, 574, 575, 599, 592, 0, 593, 595, 596, - 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, - 623, 0, 628, 629, 630, 631, 632, 636, 637, 638, - 639, 640, 641, 642, 643, 644, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, - 660, 601, 603, 607, 199, 95, 757, 759, 0, 724, - 725, 728, 729, 0, 731, 0, 726, 727, 711, 718, + 175, 0, 0, 0, 182, 217, 231, 0, 536, 538, + 336, 0, 0, 353, 355, 0, 0, 0, 45, 46, + 510, 517, 0, 523, 524, 0, 824, 835, 769, 147, + 556, 309, 310, 311, 312, 289, 287, 0, 0, 0, + 183, 201, 192, 581, 0, 0, 0, 0, 0, 606, + 573, 574, 575, 576, 600, 593, 0, 594, 596, 597, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 0, 629, 630, 631, 632, 633, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 602, 604, 608, 199, 95, 758, 760, 0, 725, + 726, 729, 730, 0, 732, 0, 727, 728, 712, 719, 78, 0, 0, 158, 157, 154, 0, 144, 145, 0, 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 75, - 70, 0, 0, 0, 0, 0, 527, 238, 239, 240, - 241, 252, 253, 254, 217, 0, 180, 0, 538, 347, - 0, 203, 429, 430, 431, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 376, 377, - 518, 0, 764, 0, 0, 0, 300, 301, 302, 303, - 0, 581, 0, 0, 263, 0, 0, 0, 0, 0, - 0, 634, 635, 624, 625, 626, 627, 645, 762, 0, - 0, 0, 78, 672, 156, 159, 160, 0, 0, 86, + 70, 0, 0, 0, 0, 0, 528, 238, 239, 240, + 241, 252, 253, 254, 217, 0, 180, 0, 539, 348, + 0, 203, 430, 431, 432, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 377, 378, + 519, 0, 765, 0, 0, 0, 300, 301, 302, 303, + 0, 582, 0, 0, 263, 0, 0, 0, 0, 0, + 0, 635, 636, 625, 626, 627, 628, 646, 763, 0, + 0, 0, 78, 673, 156, 159, 160, 0, 0, 86, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 423, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 424, 0, -2, -2, 208, 209, 0, 0, 0, -2, 161, 0, 0, 0, - 0, 0, -2, 261, 286, 304, 582, 0, 0, 0, - 0, 0, 0, 597, 633, 761, 0, 0, 0, 0, - 0, 719, 0, 146, 0, 0, 0, 90, 433, 434, - 0, 0, 436, 437, 0, 438, 0, 405, 407, 0, - 406, 408, 0, 409, 0, 410, 0, 411, 0, 412, - 0, 417, 0, 418, 0, 419, 0, 420, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 421, 0, 422, + 0, 0, -2, 261, 286, 304, 583, 0, 0, 0, + 0, 0, 0, 598, 634, 762, 0, 0, 0, 0, + 0, 720, 0, 146, 0, 0, 0, 90, 434, 435, + 0, 0, 437, 438, 0, 439, 0, 406, 408, 0, + 407, 409, 0, 410, 0, 411, 0, 412, 0, 413, + 0, 418, 0, 419, 0, 420, 0, 421, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 422, 0, 423, 0, 67, 0, 0, 163, 0, 161, 0, 0, 162, - 0, 0, 0, 0, 584, 0, 558, 555, 0, 730, - 0, 0, 0, 735, 720, 0, 91, 89, 474, 435, - 477, 481, 458, 461, 464, 466, 468, 470, 464, 466, - 468, 470, 413, 0, 414, 0, 415, 0, 416, 0, - 468, 472, 206, 207, 0, 0, 202, -2, 790, 313, - 583, 0, 557, 559, 611, 0, 0, 0, 79, 0, + 0, 0, 0, 0, 585, 0, 559, 556, 0, 731, + 0, 0, 0, 736, 721, 0, 91, 89, 475, 436, + 478, 482, 459, 462, 465, 467, 469, 471, 465, 467, + 469, 471, 414, 0, 415, 0, 416, 0, 417, 0, + 469, 473, 206, 207, 0, 0, 202, -2, 791, 313, + 584, 0, 558, 560, 612, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 464, 466, 468, 470, 0, 0, 0, -2, - 246, 0, 0, 0, 732, 733, 734, 455, 475, 476, - 456, 478, 0, 480, 457, 482, 439, 459, 460, 440, - 462, 463, 441, 465, 442, 467, 443, 469, 444, 471, - 445, 446, 447, 448, 0, 0, 0, 0, 453, 454, - 473, 0, 0, 350, 265, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 0, 0, - 479, 449, 450, 451, 452, -2, 0, 0, 0, 0, - 0, 0, 556, 176, 217, 327, 0, 0, 0, 0, - 161, 0, -2, 0, 177 }; + 0, 0, 465, 467, 469, 471, 0, 0, 0, -2, + 246, 0, 0, 0, 733, 734, 735, 456, 476, 477, + 457, 479, 0, 481, 458, 483, 440, 460, 461, 441, + 463, 464, 442, 466, 443, 468, 444, 470, 445, 472, + 446, 447, 448, 449, 0, 0, 0, 0, 454, 455, + 474, 0, 0, 351, 265, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, + 0, 480, 450, 451, 452, 453, -2, 0, 0, 0, + 0, 0, 0, 557, 176, 217, 328, 0, 0, 0, + 0, 161, 0, -2, 0, 177 }; #ifdef YYRECOVER YYSTATIC YYCONST short yyrecover[] = { -1000 @@ -1788,7 +1792,7 @@ YYSTATIC short yys[YYMAXDEPTH]; /* the parse stack */ #if ! defined(YYRECURSIVE) YYSTATIC YYAPI_TOKENTYPE YYAPI_TOKENNAME = YYAPI_TOKENNONE; #if defined(YYAPI_VALUETYPE) -// YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME; FIX +// YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME; FIX #endif YYSTATIC int yynerrs = 0; /* number of errors */ YYSTATIC short yyerrflag = 0; /* error recovery flag */ @@ -1827,7 +1831,7 @@ YYSTATIC char *yyscpy(register char*t, register char*f) YYSTATIC YYAPI_TOKENTYPE YYAPI_TOKENNAME = YYAPI_TOKENNONE; #if defined(YYAPI_VALUETYPE) - YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME; + YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME; #endif YYSTATIC int yynerrs = 0; /* number of errors */ YYSTATIC short yyerrflag = 0; /* error recovery flag */ @@ -3079,40 +3083,43 @@ case 326: { yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miNoOptimization); } break; case 327: #line 857 "asmparse.y" -{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].int32); } break; +{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miAggressiveOptimization); } break; case 328: -#line 860 "asmparse.y" +#line 858 "asmparse.y" +{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].int32); } break; +case 329: +#line 861 "asmparse.y" { PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = NULL;PASM->m_lastArgName = NULL; } break; -case 331: -#line 868 "asmparse.y" -{ PASM->EmitByte(yypvt[-0].int32); } break; case 332: #line 869 "asmparse.y" -{ delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); } break; +{ PASM->EmitByte(yypvt[-0].int32); } break; case 333: #line 870 "asmparse.y" -{ PASM->EmitMaxStack(yypvt[-0].int32); } break; +{ delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); } break; case 334: #line 871 "asmparse.y" +{ PASM->EmitMaxStack(yypvt[-0].int32); } break; +case 335: +#line 872 "asmparse.y" { PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr)); } break; -case 335: -#line 873 "asmparse.y" +case 336: +#line 874 "asmparse.y" { PASM->EmitZeroInit(); PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr)); } break; -case 336: -#line 876 "asmparse.y" -{ PASM->EmitEntryPoint(); } break; case 337: #line 877 "asmparse.y" +{ PASM->EmitEntryPoint(); } break; +case 338: +#line 878 "asmparse.y" { PASM->EmitZeroInit(); } break; -case 340: -#line 880 "asmparse.y" +case 341: +#line 881 "asmparse.y" { PASM->AddLabel(PASM->m_CurPC,yypvt[-1].string); /*PASM->EmitLabel($1);*/ } break; -case 346: -#line 886 "asmparse.y" +case 347: +#line 887 "asmparse.y" { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF) { PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-1].int32; @@ -3123,8 +3130,8 @@ case 346: else PASM->report->warn("Duplicate .export directive, ignored\n"); } break; -case 347: -#line 896 "asmparse.y" +case 348: +#line 897 "asmparse.y" { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF) { PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-3].int32; @@ -3135,38 +3142,38 @@ case 347: else PASM->report->warn("Duplicate .export directive, ignored\n"); } break; -case 348: -#line 906 "asmparse.y" +case 349: +#line 907 "asmparse.y" { PASM->m_pCurMethod->m_wVTEntry = (WORD)yypvt[-2].int32; PASM->m_pCurMethod->m_wVTSlot = (WORD)yypvt[-0].int32; } break; -case 349: -#line 909 "asmparse.y" -{ PASM->AddMethodImpl(yypvt[-2].token,yypvt[-0].string,NULL,NULL,NULL,NULL); } break; case 350: -#line 912 "asmparse.y" +#line 910 "asmparse.y" +{ PASM->AddMethodImpl(yypvt[-2].token,yypvt[-0].string,NULL,NULL,NULL,NULL); } break; +case 351: +#line 913 "asmparse.y" { PASM->AddMethodImpl(yypvt[-6].token,yypvt[-4].string, (yypvt[-3].int32==0 ? parser->MakeSig(yypvt[-8].int32,yypvt[-7].binstr,yypvt[-1].binstr) : parser->MakeSig(yypvt[-8].int32| IMAGE_CEE_CS_CALLCONV_GENERIC,yypvt[-7].binstr,yypvt[-1].binstr,yypvt[-3].int32)) ,NULL,NULL,NULL); PASM->ResetArgNameList(); } break; -case 352: -#line 919 "asmparse.y" +case 353: +#line 920 "asmparse.y" { if((yypvt[-1].int32 > 0) && (yypvt[-1].int32 <= (int)PASM->m_pCurMethod->m_NumTyPars)) PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[yypvt[-1].int32-1].CAList(); else PASM->report->error("Type parameter index out of range\n"); } break; -case 353: -#line 924 "asmparse.y" +case 354: +#line 925 "asmparse.y" { int n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string); if(n >= 0) PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[n].CAList(); else PASM->report->error("Type parameter '%s' undefined\n",yypvt[-0].string); } break; -case 354: -#line 931 "asmparse.y" +case 355: +#line 932 "asmparse.y" { if( yypvt[-2].int32 ) { ARG_NAME_LIST* pAN=PASM->findArg(PASM->m_pCurMethod->m_firstArgName, yypvt[-2].int32 - 1); if(pAN) @@ -3185,29 +3192,26 @@ case 354: } PASM->m_tkCurrentCVOwner = 0; } break; -case 355: -#line 951 "asmparse.y" -{ PASM->m_pCurMethod->CloseScope(); } break; case 356: -#line 954 "asmparse.y" +#line 952 "asmparse.y" +{ PASM->m_pCurMethod->CloseScope(); } break; +case 357: +#line 955 "asmparse.y" { PASM->m_pCurMethod->OpenScope(); } break; -case 360: -#line 965 "asmparse.y" -{ PASM->m_SEHD->tryTo = PASM->m_CurPC; } break; case 361: #line 966 "asmparse.y" -{ PASM->SetTryLabels(yypvt[-2].string, yypvt[-0].string); } break; +{ PASM->m_SEHD->tryTo = PASM->m_CurPC; } break; case 362: #line 967 "asmparse.y" +{ PASM->SetTryLabels(yypvt[-2].string, yypvt[-0].string); } break; +case 363: +#line 968 "asmparse.y" { if(PASM->m_SEHD) {PASM->m_SEHD->tryFrom = yypvt[-2].int32; PASM->m_SEHD->tryTo = yypvt[-0].int32;} } break; -case 363: -#line 971 "asmparse.y" +case 364: +#line 972 "asmparse.y" { PASM->NewSEHDescriptor(); PASM->m_SEHD->tryFrom = PASM->m_CurPC; } break; -case 364: -#line 976 "asmparse.y" -{ PASM->EmitTry(); } break; case 365: #line 977 "asmparse.y" { PASM->EmitTry(); } break; @@ -3218,106 +3222,109 @@ case 367: #line 979 "asmparse.y" { PASM->EmitTry(); } break; case 368: -#line 983 "asmparse.y" -{ PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; +#line 980 "asmparse.y" +{ PASM->EmitTry(); } break; case 369: #line 984 "asmparse.y" +{ PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; +case 370: +#line 985 "asmparse.y" { PASM->SetFilterLabel(yypvt[-0].string); PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; -case 370: -#line 986 "asmparse.y" +case 371: +#line 987 "asmparse.y" { PASM->m_SEHD->sehFilter = yypvt[-0].int32; PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; -case 371: -#line 990 "asmparse.y" +case 372: +#line 991 "asmparse.y" { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FILTER; PASM->m_SEHD->sehFilter = PASM->m_CurPC; } break; -case 372: -#line 994 "asmparse.y" +case 373: +#line 995 "asmparse.y" { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_NONE; PASM->SetCatchClass(yypvt[-0].token); PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; -case 373: -#line 999 "asmparse.y" +case 374: +#line 1000 "asmparse.y" { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FINALLY; PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; -case 374: -#line 1003 "asmparse.y" +case 375: +#line 1004 "asmparse.y" { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FAULT; PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break; -case 375: -#line 1007 "asmparse.y" -{ PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; } break; case 376: #line 1008 "asmparse.y" -{ PASM->SetHandlerLabels(yypvt[-2].string, yypvt[-0].string); } break; +{ PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; } break; case 377: #line 1009 "asmparse.y" +{ PASM->SetHandlerLabels(yypvt[-2].string, yypvt[-0].string); } break; +case 378: +#line 1010 "asmparse.y" { PASM->m_SEHD->sehHandler = yypvt[-2].int32; PASM->m_SEHD->sehHandlerTo = yypvt[-0].int32; } break; -case 379: -#line 1017 "asmparse.y" +case 380: +#line 1018 "asmparse.y" { PASM->EmitDataLabel(yypvt[-1].string); } break; -case 381: -#line 1021 "asmparse.y" -{ PASM->SetDataSection(); } break; case 382: #line 1022 "asmparse.y" -{ PASM->SetTLSSection(); } break; +{ PASM->SetDataSection(); } break; case 383: #line 1023 "asmparse.y" +{ PASM->SetTLSSection(); } break; +case 384: +#line 1024 "asmparse.y" { PASM->SetILSection(); } break; -case 388: -#line 1034 "asmparse.y" -{ yyval.int32 = 1; } break; case 389: #line 1035 "asmparse.y" +{ yyval.int32 = 1; } break; +case 390: +#line 1036 "asmparse.y" { yyval.int32 = yypvt[-1].int32; if(yypvt[-1].int32 <= 0) { PASM->report->error("Illegal item count: %d\n",yypvt[-1].int32); if(!PASM->OnErrGo) yyval.int32 = 1; }} break; -case 390: -#line 1040 "asmparse.y" -{ PASM->EmitDataString(yypvt[-1].binstr); } break; case 391: #line 1041 "asmparse.y" -{ PASM->EmitDD(yypvt[-1].string); } break; +{ PASM->EmitDataString(yypvt[-1].binstr); } break; case 392: #line 1042 "asmparse.y" -{ PASM->EmitData(yypvt[-1].binstr->ptr(),yypvt[-1].binstr->length()); } break; +{ PASM->EmitDD(yypvt[-1].string); } break; case 393: -#line 1044 "asmparse.y" +#line 1043 "asmparse.y" +{ PASM->EmitData(yypvt[-1].binstr->ptr(),yypvt[-1].binstr->length()); } break; +case 394: +#line 1045 "asmparse.y" { float f = (float) (*yypvt[-2].float64); float* p = new (nothrow) float[yypvt[-0].int32]; if(p != NULL) { for(int i=0; i < yypvt[-0].int32; i++) p[i] = f; PASM->EmitData(p, sizeof(float)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(float)*yypvt[-0].int32); } break; -case 394: -#line 1051 "asmparse.y" +case 395: +#line 1052 "asmparse.y" { double* p = new (nothrow) double[yypvt[-0].int32]; if(p != NULL) { for(int i=0; iEmitData(p, sizeof(double)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(double)*yypvt[-0].int32); } break; -case 395: -#line 1058 "asmparse.y" +case 396: +#line 1059 "asmparse.y" { __int64* p = new (nothrow) __int64[yypvt[-0].int32]; if(p != NULL) { for(int i=0; iEmitData(p, sizeof(__int64)*yypvt[-0].int32); delete yypvt[-2].int64; delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(__int64)*yypvt[-0].int32); } break; -case 396: -#line 1065 "asmparse.y" +case 397: +#line 1066 "asmparse.y" { __int32* p = new (nothrow) __int32[yypvt[-0].int32]; if(p != NULL) { for(int i=0; iEmitData(p, sizeof(__int32)*yypvt[-0].int32); delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(__int32)*yypvt[-0].int32); } break; -case 397: -#line 1072 "asmparse.y" +case 398: +#line 1073 "asmparse.y" { __int16 i = (__int16) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32)); __int16* p = new (nothrow) __int16[yypvt[-0].int32]; if(p != NULL) { @@ -3325,8 +3332,8 @@ case 397: PASM->EmitData(p, sizeof(__int16)*yypvt[-0].int32); delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(__int16)*yypvt[-0].int32); } break; -case 398: -#line 1080 "asmparse.y" +case 399: +#line 1081 "asmparse.y" { __int8 i = (__int8) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32)); __int8* p = new (nothrow) __int8[yypvt[-0].int32]; if(p != NULL) { @@ -3334,405 +3341,405 @@ case 398: PASM->EmitData(p, sizeof(__int8)*yypvt[-0].int32); delete [] p; } else PASM->report->error("Out of memory emitting data block %d bytes\n", sizeof(__int8)*yypvt[-0].int32); } break; -case 399: -#line 1087 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(float)*yypvt[-0].int32); } break; case 400: #line 1088 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(double)*yypvt[-0].int32); } break; +{ PASM->EmitData(NULL, sizeof(float)*yypvt[-0].int32); } break; case 401: #line 1089 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(__int64)*yypvt[-0].int32); } break; +{ PASM->EmitData(NULL, sizeof(double)*yypvt[-0].int32); } break; case 402: #line 1090 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(__int32)*yypvt[-0].int32); } break; +{ PASM->EmitData(NULL, sizeof(__int64)*yypvt[-0].int32); } break; case 403: #line 1091 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(__int16)*yypvt[-0].int32); } break; +{ PASM->EmitData(NULL, sizeof(__int32)*yypvt[-0].int32); } break; case 404: #line 1092 "asmparse.y" -{ PASM->EmitData(NULL, sizeof(__int8)*yypvt[-0].int32); } break; +{ PASM->EmitData(NULL, sizeof(__int16)*yypvt[-0].int32); } break; case 405: -#line 1096 "asmparse.y" +#line 1093 "asmparse.y" +{ PASM->EmitData(NULL, sizeof(__int8)*yypvt[-0].int32); } break; +case 406: +#line 1097 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); float f = (float)(*yypvt[-1].float64); yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-1].float64; } break; -case 406: -#line 1099 "asmparse.y" +case 407: +#line 1100 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); yyval.binstr->appendInt64((__int64 *)yypvt[-1].float64); delete yypvt[-1].float64; } break; -case 407: -#line 1101 "asmparse.y" +case 408: +#line 1102 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 408: -#line 1103 "asmparse.y" +case 409: +#line 1104 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break; -case 409: -#line 1105 "asmparse.y" +case 410: +#line 1106 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break; -case 410: -#line 1107 "asmparse.y" +case 411: +#line 1108 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 411: -#line 1109 "asmparse.y" +case 412: +#line 1110 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); yyval.binstr->appendInt16(yypvt[-1].int32); } break; -case 412: -#line 1111 "asmparse.y" +case 413: +#line 1112 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); yyval.binstr->appendInt8(yypvt[-1].int32); } break; -case 413: -#line 1113 "asmparse.y" +case 414: +#line 1114 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break; -case 414: -#line 1115 "asmparse.y" +case 415: +#line 1116 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 415: -#line 1117 "asmparse.y" +case 416: +#line 1118 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); yyval.binstr->appendInt16(yypvt[-1].int32); } break; -case 416: -#line 1119 "asmparse.y" +case 417: +#line 1120 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); yyval.binstr->appendInt8(yypvt[-1].int32); } break; -case 417: -#line 1121 "asmparse.y" +case 418: +#line 1122 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break; -case 418: -#line 1123 "asmparse.y" +case 419: +#line 1124 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 419: -#line 1125 "asmparse.y" +case 420: +#line 1126 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); yyval.binstr->appendInt16(yypvt[-1].int32); } break; -case 420: -#line 1127 "asmparse.y" +case 421: +#line 1128 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); yyval.binstr->appendInt8(yypvt[-1].int32); } break; -case 421: -#line 1129 "asmparse.y" +case 422: +#line 1130 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); yyval.binstr->appendInt16(yypvt[-1].int32); } break; -case 422: -#line 1131 "asmparse.y" +case 423: +#line 1132 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); yyval.binstr->appendInt8(yypvt[-1].int32);} break; -case 423: -#line 1133 "asmparse.y" +case 424: +#line 1134 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-1].binstr;} break; -case 424: -#line 1137 "asmparse.y" -{ bParsingByteArray = TRUE; } break; case 425: -#line 1140 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; +#line 1138 "asmparse.y" +{ bParsingByteArray = TRUE; } break; case 426: #line 1141 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +{ yyval.binstr = new BinStr(); } break; case 427: -#line 1144 "asmparse.y" -{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = new BinStr(); yyval.binstr->appendInt8(i); } break; +#line 1142 "asmparse.y" +{ yyval.binstr = yypvt[-0].binstr; } break; case 428: #line 1145 "asmparse.y" -{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(i); } break; +{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = new BinStr(); yyval.binstr->appendInt8(i); } break; case 429: -#line 1149 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +#line 1146 "asmparse.y" +{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(i); } break; case 430: #line 1150 "asmparse.y" -{ yyval.binstr = BinStrToUnicode(yypvt[-0].binstr,true); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);} break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 431: #line 1151 "asmparse.y" +{ yyval.binstr = BinStrToUnicode(yypvt[-0].binstr,true); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);} break; +case 432: +#line 1152 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CLASS); yyval.binstr->appendInt32(0); } break; -case 432: -#line 1156 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; case 433: #line 1157 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->appendInt8(0xFF); } break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 434: #line 1158 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->appendInt8(0xFF); } break; +case 435: +#line 1159 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break; -case 435: -#line 1160 "asmparse.y" +case 436: +#line 1161 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break; -case 436: -#line 1162 "asmparse.y" +case 437: +#line 1163 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-1].token));} break; -case 437: -#line 1164 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->appendInt8(0xFF); } break; case 438: #line 1165 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);} break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->appendInt8(0xFF); } break; case 439: -#line 1167 "asmparse.y" +#line 1166 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);} break; +case 440: +#line 1168 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_R4); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 440: -#line 1171 "asmparse.y" +case 441: +#line 1172 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_R8); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 441: -#line 1175 "asmparse.y" +case 442: +#line 1176 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_I8); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 442: -#line 1179 "asmparse.y" +case 443: +#line 1180 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_I4); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 443: -#line 1183 "asmparse.y" +case 444: +#line 1184 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_I2); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 444: -#line 1187 "asmparse.y" +case 445: +#line 1188 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_I1); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 445: -#line 1191 "asmparse.y" +case 446: +#line 1192 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U8); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 446: -#line 1195 "asmparse.y" +case 447: +#line 1196 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U4); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 447: -#line 1199 "asmparse.y" +case 448: +#line 1200 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U2); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 448: -#line 1203 "asmparse.y" +case 449: +#line 1204 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U1); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 449: -#line 1207 "asmparse.y" +case 450: +#line 1208 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U8); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 450: -#line 1211 "asmparse.y" +case 451: +#line 1212 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U4); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 451: -#line 1215 "asmparse.y" +case 452: +#line 1216 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U2); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 452: -#line 1219 "asmparse.y" +case 453: +#line 1220 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_U1); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 453: -#line 1223 "asmparse.y" +case 454: +#line 1224 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_CHAR); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 454: -#line 1227 "asmparse.y" +case 455: +#line 1228 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_BOOLEAN); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 455: -#line 1231 "asmparse.y" +case 456: +#line 1232 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 456: -#line 1235 "asmparse.y" +case 457: +#line 1236 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 457: -#line 1239 "asmparse.y" +case 458: +#line 1240 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32); yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT); yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; -case 458: -#line 1245 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 459: #line 1246 "asmparse.y" +{ yyval.binstr = new BinStr(); } break; +case 460: +#line 1247 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; float f = (float) (*yypvt[-0].float64); yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-0].float64; } break; -case 460: -#line 1248 "asmparse.y" +case 461: +#line 1249 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32); } break; -case 461: -#line 1252 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 462: #line 1253 "asmparse.y" +{ yyval.binstr = new BinStr(); } break; +case 463: +#line 1254 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt64((__int64 *)yypvt[-0].float64); delete yypvt[-0].float64; } break; -case 463: -#line 1255 "asmparse.y" +case 464: +#line 1256 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break; -case 464: -#line 1259 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 465: #line 1260 "asmparse.y" +{ yyval.binstr = new BinStr(); } break; +case 466: +#line 1261 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break; -case 466: -#line 1264 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 467: #line 1265 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32);} break; -case 468: -#line 1268 "asmparse.y" { yyval.binstr = new BinStr(); } break; +case 468: +#line 1266 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32);} break; case 469: #line 1269 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt16(yypvt[-0].int32);} break; -case 470: -#line 1272 "asmparse.y" { yyval.binstr = new BinStr(); } break; +case 470: +#line 1270 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt16(yypvt[-0].int32);} break; case 471: #line 1273 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32); } break; -case 472: -#line 1276 "asmparse.y" { yyval.binstr = new BinStr(); } break; +case 472: +#line 1274 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32); } break; case 473: #line 1277 "asmparse.y" +{ yyval.binstr = new BinStr(); } break; +case 474: +#line 1278 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32);} break; -case 474: -#line 1281 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 475: #line 1282 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break; +{ yyval.binstr = new BinStr(); } break; case 476: #line 1283 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break; +case 477: +#line 1284 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break; -case 477: -#line 1287 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 478: #line 1288 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break; +{ yyval.binstr = new BinStr(); } break; case 479: #line 1289 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break; +case 480: +#line 1290 "asmparse.y" { yyval.binstr = yypvt[-2].binstr; AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break; -case 480: -#line 1291 "asmparse.y" +case 481: +#line 1292 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-0].token));} break; -case 481: -#line 1295 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; case 482: #line 1296 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; +{ yyval.binstr = new BinStr(); } break; case 483: -#line 1300 "asmparse.y" +#line 1297 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; +case 484: +#line 1301 "asmparse.y" { parser->m_ANSFirst.PUSH(PASM->m_firstArgName); parser->m_ANSLast.PUSH(PASM->m_lastArgName); PASM->m_firstArgName = NULL; PASM->m_lastArgName = NULL; } break; -case 484: -#line 1306 "asmparse.y" -{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 485: -#line 1309 "asmparse.y" +#line 1307 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 486: -#line 1312 "asmparse.y" +#line 1310 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 487: -#line 1315 "asmparse.y" +#line 1313 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 488: -#line 1318 "asmparse.y" +#line 1316 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 489: -#line 1321 "asmparse.y" +#line 1319 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 490: -#line 1324 "asmparse.y" +#line 1322 "asmparse.y" +{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break; +case 491: +#line 1325 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); if((!PASM->OnErrGo)&& ((yypvt[-0].opcode == CEE_NEWOBJ)|| (yypvt[-0].opcode == CEE_CALLVIRT))) iCallConv = IMAGE_CEE_CS_CALLCONV_HASTHIS; } break; -case 491: -#line 1332 "asmparse.y" -{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 492: -#line 1335 "asmparse.y" +#line 1333 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 493: -#line 1338 "asmparse.y" +#line 1336 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 494: -#line 1341 "asmparse.y" +#line 1339 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 495: -#line 1344 "asmparse.y" -{ yyval.instr = SetupInstr(yypvt[-0].opcode); iOpcodeLen = PASM->OpcodeLen(yyval.instr); } break; -case 496: -#line 1347 "asmparse.y" +#line 1342 "asmparse.y" { yyval.instr = SetupInstr(yypvt[-0].opcode); } break; +case 496: +#line 1345 "asmparse.y" +{ yyval.instr = SetupInstr(yypvt[-0].opcode); iOpcodeLen = PASM->OpcodeLen(yyval.instr); } break; case 497: -#line 1350 "asmparse.y" -{ yyval.instr = yypvt[-1].instr; bParsingByteArray = TRUE; } break; +#line 1348 "asmparse.y" +{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break; case 498: -#line 1354 "asmparse.y" -{ PASM->EmitOpcode(yypvt[-0].instr); } break; +#line 1351 "asmparse.y" +{ yyval.instr = yypvt[-1].instr; bParsingByteArray = TRUE; } break; case 499: #line 1355 "asmparse.y" -{ PASM->EmitInstrVar(yypvt[-1].instr, yypvt[-0].int32); } break; +{ PASM->EmitOpcode(yypvt[-0].instr); } break; case 500: #line 1356 "asmparse.y" -{ PASM->EmitInstrVarByName(yypvt[-1].instr, yypvt[-0].string); } break; +{ PASM->EmitInstrVar(yypvt[-1].instr, yypvt[-0].int32); } break; case 501: #line 1357 "asmparse.y" -{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].int32); } break; +{ PASM->EmitInstrVarByName(yypvt[-1].instr, yypvt[-0].string); } break; case 502: #line 1358 "asmparse.y" -{ PASM->EmitInstrI8(yypvt[-1].instr, yypvt[-0].int64); } break; +{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].int32); } break; case 503: #line 1359 "asmparse.y" -{ PASM->EmitInstrR(yypvt[-1].instr, yypvt[-0].float64); delete (yypvt[-0].float64);} break; +{ PASM->EmitInstrI8(yypvt[-1].instr, yypvt[-0].int64); } break; case 504: #line 1360 "asmparse.y" -{ double f = (double) (*yypvt[-0].int64); PASM->EmitInstrR(yypvt[-1].instr, &f); } break; +{ PASM->EmitInstrR(yypvt[-1].instr, yypvt[-0].float64); delete (yypvt[-0].float64);} break; case 505: #line 1361 "asmparse.y" +{ double f = (double) (*yypvt[-0].int64); PASM->EmitInstrR(yypvt[-1].instr, &f); } break; +case 506: +#line 1362 "asmparse.y" { unsigned L = yypvt[-1].binstr->length(); FAIL_UNLESS(L >= sizeof(float), ("%d hexbytes, must be at least %d\n", L,sizeof(float))); @@ -3742,22 +3749,22 @@ case 505: : (double)(*(float *)(yypvt[-1].binstr->ptr())); PASM->EmitInstrR(yypvt[-2].instr,&f); } delete yypvt[-1].binstr; } break; -case 506: -#line 1370 "asmparse.y" -{ PASM->EmitInstrBrOffset(yypvt[-1].instr, yypvt[-0].int32); } break; case 507: #line 1371 "asmparse.y" -{ PASM->EmitInstrBrTarget(yypvt[-1].instr, yypvt[-0].string); } break; +{ PASM->EmitInstrBrOffset(yypvt[-1].instr, yypvt[-0].int32); } break; case 508: -#line 1373 "asmparse.y" +#line 1372 "asmparse.y" +{ PASM->EmitInstrBrTarget(yypvt[-1].instr, yypvt[-0].string); } break; +case 509: +#line 1374 "asmparse.y" { PASM->SetMemberRefFixup(yypvt[-0].token,PASM->OpcodeLen(yypvt[-1].instr)); PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token); PASM->m_tkCurrentCVOwner = yypvt[-0].token; PASM->m_pCustomDescrList = NULL; iCallConv = 0; } break; -case 509: -#line 1380 "asmparse.y" +case 510: +#line 1381 "asmparse.y" { yypvt[-3].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD); mdToken mr = PASM->MakeMemberRef(yypvt[-2].token, yypvt[-0].string, yypvt[-3].binstr); PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-4].instr)); @@ -3765,8 +3772,8 @@ case 509: PASM->m_tkCurrentCVOwner = mr; PASM->m_pCustomDescrList = NULL; } break; -case 510: -#line 1388 "asmparse.y" +case 511: +#line 1389 "asmparse.y" { yypvt[-1].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD); mdToken mr = PASM->MakeMemberRef(mdTokenNil, yypvt[-0].string, yypvt[-1].binstr); PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-2].instr)); @@ -3774,578 +3781,578 @@ case 510: PASM->m_tkCurrentCVOwner = mr; PASM->m_pCustomDescrList = NULL; } break; -case 511: -#line 1395 "asmparse.y" +case 512: +#line 1396 "asmparse.y" { mdToken mr = yypvt[-0].token; PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr)); PASM->EmitInstrI(yypvt[-1].instr,mr); PASM->m_tkCurrentCVOwner = mr; PASM->m_pCustomDescrList = NULL; } break; -case 512: -#line 1401 "asmparse.y" +case 513: +#line 1402 "asmparse.y" { mdToken mr = yypvt[-0].tdd->m_tkTypeSpec; PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr)); PASM->EmitInstrI(yypvt[-1].instr,mr); PASM->m_tkCurrentCVOwner = mr; PASM->m_pCustomDescrList = NULL; } break; -case 513: -#line 1407 "asmparse.y" +case 514: +#line 1408 "asmparse.y" { mdToken mr = yypvt[-0].tdd->m_tkTypeSpec; PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr)); PASM->EmitInstrI(yypvt[-1].instr,mr); PASM->m_tkCurrentCVOwner = mr; PASM->m_pCustomDescrList = NULL; } break; -case 514: -#line 1413 "asmparse.y" +case 515: +#line 1414 "asmparse.y" { PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].token); PASM->m_tkCurrentCVOwner = yypvt[-0].token; PASM->m_pCustomDescrList = NULL; } break; -case 515: -#line 1417 "asmparse.y" -{ PASM->EmitInstrStringLiteral(yypvt[-1].instr, yypvt[-0].binstr,TRUE); } break; case 516: -#line 1419 "asmparse.y" -{ PASM->EmitInstrStringLiteral(yypvt[-4].instr, yypvt[-1].binstr,FALSE); } break; +#line 1418 "asmparse.y" +{ PASM->EmitInstrStringLiteral(yypvt[-1].instr, yypvt[-0].binstr,TRUE); } break; case 517: -#line 1421 "asmparse.y" -{ PASM->EmitInstrStringLiteral(yypvt[-3].instr, yypvt[-1].binstr,FALSE,TRUE); } break; +#line 1420 "asmparse.y" +{ PASM->EmitInstrStringLiteral(yypvt[-4].instr, yypvt[-1].binstr,FALSE); } break; case 518: -#line 1423 "asmparse.y" +#line 1422 "asmparse.y" +{ PASM->EmitInstrStringLiteral(yypvt[-3].instr, yypvt[-1].binstr,FALSE,TRUE); } break; +case 519: +#line 1424 "asmparse.y" { PASM->EmitInstrSig(yypvt[-5].instr, parser->MakeSig(yypvt[-4].int32, yypvt[-3].binstr, yypvt[-1].binstr)); PASM->ResetArgNameList(); } break; -case 519: -#line 1427 "asmparse.y" +case 520: +#line 1428 "asmparse.y" { PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token); PASM->m_tkCurrentCVOwner = yypvt[-0].token; PASM->m_pCustomDescrList = NULL; iOpcodeLen = 0; } break; -case 520: -#line 1432 "asmparse.y" -{ PASM->EmitInstrSwitch(yypvt[-3].instr, yypvt[-1].labels); } break; case 521: -#line 1435 "asmparse.y" -{ yyval.labels = 0; } break; +#line 1433 "asmparse.y" +{ PASM->EmitInstrSwitch(yypvt[-3].instr, yypvt[-1].labels); } break; case 522: #line 1436 "asmparse.y" -{ yyval.labels = new Labels(yypvt[-2].string, yypvt[-0].labels, TRUE); } break; +{ yyval.labels = 0; } break; case 523: #line 1437 "asmparse.y" -{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-2].int32, yypvt[-0].labels, FALSE); } break; +{ yyval.labels = new Labels(yypvt[-2].string, yypvt[-0].labels, TRUE); } break; case 524: #line 1438 "asmparse.y" -{ yyval.labels = new Labels(yypvt[-0].string, NULL, TRUE); } break; +{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-2].int32, yypvt[-0].labels, FALSE); } break; case 525: #line 1439 "asmparse.y" -{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-0].int32, NULL, FALSE); } break; +{ yyval.labels = new Labels(yypvt[-0].string, NULL, TRUE); } break; case 526: -#line 1443 "asmparse.y" -{ yyval.binstr = NULL; } break; +#line 1440 "asmparse.y" +{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-0].int32, NULL, FALSE); } break; case 527: #line 1444 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; } break; -case 528: -#line 1447 "asmparse.y" { yyval.binstr = NULL; } break; +case 528: +#line 1445 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; } break; case 529: #line 1448 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +{ yyval.binstr = NULL; } break; case 530: -#line 1451 "asmparse.y" +#line 1449 "asmparse.y" { yyval.binstr = yypvt[-0].binstr; } break; case 531: #line 1452 "asmparse.y" -{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 532: -#line 1456 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; +#line 1453 "asmparse.y" +{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; case 533: #line 1457 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr;} break; +{ yyval.binstr = new BinStr(); } break; case 534: -#line 1460 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +#line 1458 "asmparse.y" +{ yyval.binstr = yypvt[-0].binstr;} break; case 535: #line 1461 "asmparse.y" -{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 536: -#line 1464 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_SENTINEL); } break; +#line 1462 "asmparse.y" +{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; case 537: #line 1465 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-1].binstr); PASM->addArgName(NULL, yypvt[-1].binstr, yypvt[-0].binstr, yypvt[-2].int32); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_SENTINEL); } break; case 538: #line 1466 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-2].binstr); PASM->addArgName(yypvt[-0].string, yypvt[-2].binstr, yypvt[-1].binstr, yypvt[-3].int32);} break; +{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-1].binstr); PASM->addArgName(NULL, yypvt[-1].binstr, yypvt[-0].binstr, yypvt[-2].int32); } break; case 539: -#line 1470 "asmparse.y" -{ yyval.token = PASM->ResolveClassRef(PASM->GetAsmRef(yypvt[-2].string), yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break; +#line 1467 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-2].binstr); PASM->addArgName(yypvt[-0].string, yypvt[-2].binstr, yypvt[-1].binstr, yypvt[-3].int32);} break; case 540: #line 1471 "asmparse.y" -{ yyval.token = PASM->ResolveClassRef(yypvt[-2].token, yypvt[-0].string, NULL); } break; +{ yyval.token = PASM->ResolveClassRef(PASM->GetAsmRef(yypvt[-2].string), yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break; case 541: #line 1472 "asmparse.y" -{ yyval.token = PASM->ResolveClassRef(mdTokenNil, yypvt[-0].string, NULL); } break; +{ yyval.token = PASM->ResolveClassRef(yypvt[-2].token, yypvt[-0].string, NULL); } break; case 542: #line 1473 "asmparse.y" -{ yyval.token = PASM->ResolveClassRef(PASM->GetModRef(yypvt[-2].string),yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break; +{ yyval.token = PASM->ResolveClassRef(mdTokenNil, yypvt[-0].string, NULL); } break; case 543: #line 1474 "asmparse.y" -{ yyval.token = PASM->ResolveClassRef(1,yypvt[-0].string,NULL); } break; +{ yyval.token = PASM->ResolveClassRef(PASM->GetModRef(yypvt[-2].string),yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break; case 544: #line 1475 "asmparse.y" -{ yyval.token = yypvt[-0].token; } break; +{ yyval.token = PASM->ResolveClassRef(1,yypvt[-0].string,NULL); } break; case 545: #line 1476 "asmparse.y" -{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break; +{ yyval.token = yypvt[-0].token; } break; case 546: #line 1477 "asmparse.y" +{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break; +case 547: +#line 1478 "asmparse.y" { if(PASM->m_pCurClass != NULL) yyval.token = PASM->m_pCurClass->m_cl; else { yyval.token = 0; PASM->report->error(".this outside class scope\n"); } } break; -case 547: -#line 1480 "asmparse.y" +case 548: +#line 1481 "asmparse.y" { if(PASM->m_pCurClass != NULL) { yyval.token = PASM->m_pCurClass->m_crExtends; if(RidFromToken(yyval.token) == 0) PASM->report->error(".base undefined\n"); } else { yyval.token = 0; PASM->report->error(".base outside class scope\n"); } } break; -case 548: -#line 1486 "asmparse.y" +case 549: +#line 1487 "asmparse.y" { if(PASM->m_pCurClass != NULL) { if(PASM->m_pCurClass->m_pEncloser != NULL) yyval.token = PASM->m_pCurClass->m_pEncloser->m_cl; else { yyval.token = 0; PASM->report->error(".nester undefined\n"); } } else { yyval.token = 0; PASM->report->error(".nester outside class scope\n"); } } break; -case 549: -#line 1493 "asmparse.y" -{ yyval.string = yypvt[-0].string; } break; case 550: #line 1494 "asmparse.y" -{ yyval.string = newStringWDel(yypvt[-2].string, NESTING_SEP, yypvt[-0].string); } break; +{ yyval.string = yypvt[-0].string; } break; case 551: -#line 1497 "asmparse.y" -{ yyval.token = yypvt[-0].token;} break; +#line 1495 "asmparse.y" +{ yyval.string = newStringWDel(yypvt[-2].string, NESTING_SEP, yypvt[-0].string); } break; case 552: #line 1498 "asmparse.y" -{ yyval.token = PASM->GetAsmRef(yypvt[-1].string); delete[] yypvt[-1].string;} break; +{ yyval.token = yypvt[-0].token;} break; case 553: #line 1499 "asmparse.y" -{ yyval.token = PASM->GetModRef(yypvt[-1].string); delete[] yypvt[-1].string;} break; +{ yyval.token = PASM->GetAsmRef(yypvt[-1].string); delete[] yypvt[-1].string;} break; case 554: #line 1500 "asmparse.y" -{ yyval.token = PASM->ResolveTypeSpec(yypvt[-0].binstr); } break; +{ yyval.token = PASM->GetModRef(yypvt[-1].string); delete[] yypvt[-1].string;} break; case 555: -#line 1504 "asmparse.y" -{ yyval.binstr = new BinStr(); } break; +#line 1501 "asmparse.y" +{ yyval.token = PASM->ResolveTypeSpec(yypvt[-0].binstr); } break; case 556: -#line 1506 "asmparse.y" +#line 1505 "asmparse.y" +{ yyval.binstr = new BinStr(); } break; +case 557: +#line 1507 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER); corEmitInt(yyval.binstr,yypvt[-7].binstr->length()); yyval.binstr->append(yypvt[-7].binstr); corEmitInt(yyval.binstr,yypvt[-5].binstr->length()); yyval.binstr->append(yypvt[-5].binstr); corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr); corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr); PASM->report->warn("Deprecated 4-string form of custom marshaler, first two strings ignored\n");} break; -case 557: -#line 1513 "asmparse.y" +case 558: +#line 1514 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER); corEmitInt(yyval.binstr,0); corEmitInt(yyval.binstr,0); corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr); corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr); } break; -case 558: -#line 1518 "asmparse.y" +case 559: +#line 1519 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDSYSSTRING); corEmitInt(yyval.binstr,yypvt[-1].int32); } break; -case 559: -#line 1521 "asmparse.y" +case 560: +#line 1522 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDARRAY); corEmitInt(yyval.binstr,yypvt[-2].int32); yyval.binstr->append(yypvt[-0].binstr); } break; -case 560: -#line 1523 "asmparse.y" +case 561: +#line 1524 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANT); PASM->report->warn("Deprecated native type 'variant'\n"); } break; -case 561: -#line 1525 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CURRENCY); } break; case 562: #line 1526 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CURRENCY); } break; +case 563: +#line 1527 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SYSCHAR); PASM->report->warn("Deprecated native type 'syschar'\n"); } break; -case 563: -#line 1528 "asmparse.y" +case 564: +#line 1529 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VOID); PASM->report->warn("Deprecated native type 'void'\n"); } break; -case 564: -#line 1530 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BOOLEAN); } break; case 565: #line 1531 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BOOLEAN); } break; case 566: #line 1532 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I1); } break; case 567: #line 1533 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I2); } break; case 568: #line 1534 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I4); } break; case 569: #line 1535 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I8); } break; case 570: #line 1536 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R4); } break; case 571: #line 1537 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ERROR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R8); } break; case 572: #line 1538 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ERROR); } break; case 573: #line 1539 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break; case 574: #line 1540 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break; case 575: #line 1541 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break; case 576: #line 1542 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break; case 577: #line 1543 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break; case 578: #line 1544 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break; case 579: #line 1545 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break; case 580: #line 1546 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break; +case 581: +#line 1547 "asmparse.y" { yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(NATIVE_TYPE_PTR); PASM->report->warn("Deprecated native type '*'\n"); } break; -case 581: -#line 1548 "asmparse.y" +case 582: +#line 1549 "asmparse.y" { yyval.binstr = yypvt[-2].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); } break; -case 582: -#line 1550 "asmparse.y" +case 583: +#line 1551 "asmparse.y" { yyval.binstr = yypvt[-3].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); corEmitInt(yyval.binstr,0); corEmitInt(yyval.binstr,yypvt[-1].int32); corEmitInt(yyval.binstr,0); } break; -case 583: -#line 1555 "asmparse.y" +case 584: +#line 1556 "asmparse.y" { yyval.binstr = yypvt[-5].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); corEmitInt(yyval.binstr,yypvt[-1].int32); corEmitInt(yyval.binstr,yypvt[-3].int32); corEmitInt(yyval.binstr,ntaSizeParamIndexSpecified); } break; -case 584: -#line 1560 "asmparse.y" +case 585: +#line 1561 "asmparse.y" { yyval.binstr = yypvt[-4].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX); yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); corEmitInt(yyval.binstr,yypvt[-1].int32); } break; -case 585: -#line 1563 "asmparse.y" +case 586: +#line 1564 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DECIMAL); PASM->report->warn("Deprecated native type 'decimal'\n"); } break; -case 586: -#line 1565 "asmparse.y" +case 587: +#line 1566 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DATE); PASM->report->warn("Deprecated native type 'date'\n"); } break; -case 587: -#line 1567 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BSTR); } break; case 588: #line 1568 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BSTR); } break; case 589: #line 1569 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPWSTR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTR); } break; case 590: #line 1570 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPTSTR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPWSTR); } break; case 591: #line 1571 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPTSTR); } break; +case 592: +#line 1572 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_OBJECTREF); PASM->report->warn("Deprecated native type 'objectref'\n"); } break; -case 592: -#line 1573 "asmparse.y" +case 593: +#line 1574 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IUNKNOWN); if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break; -case 593: -#line 1575 "asmparse.y" +case 594: +#line 1576 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IDISPATCH); if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break; -case 594: -#line 1577 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_STRUCT); } break; case 595: #line 1578 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_STRUCT); } break; +case 596: +#line 1579 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INTF); if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break; -case 596: -#line 1580 "asmparse.y" +case 597: +#line 1581 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY); corEmitInt(yyval.binstr,yypvt[-0].int32); corEmitInt(yyval.binstr,0);} break; -case 597: -#line 1583 "asmparse.y" +case 598: +#line 1584 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY); corEmitInt(yyval.binstr,yypvt[-2].int32); corEmitInt(yyval.binstr,yypvt[-0].binstr->length()); yyval.binstr->append(yypvt[-0].binstr); } break; -case 598: -#line 1587 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INT); } break; case 599: #line 1588 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INT); } break; case 600: #line 1589 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break; case 601: #line 1590 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break; +case 602: +#line 1591 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_NESTEDSTRUCT); PASM->report->warn("Deprecated native type 'nested struct'\n"); } break; -case 602: -#line 1592 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BYVALSTR); } break; case 603: #line 1593 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ANSIBSTR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BYVALSTR); } break; case 604: #line 1594 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_TBSTR); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ANSIBSTR); } break; case 605: #line 1595 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANTBOOL); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_TBSTR); } break; case 606: #line 1596 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FUNC); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANTBOOL); } break; case 607: #line 1597 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ASANY); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FUNC); } break; case 608: #line 1598 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTRUCT); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ASANY); } break; case 609: #line 1599 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTRUCT); } break; case 610: -#line 1602 "asmparse.y" -{ yyval.int32 = -1; } break; +#line 1600 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break; case 611: #line 1603 "asmparse.y" -{ yyval.int32 = yypvt[-1].int32; } break; +{ yyval.int32 = -1; } break; case 612: -#line 1606 "asmparse.y" -{ yyval.int32 = VT_EMPTY; } break; +#line 1604 "asmparse.y" +{ yyval.int32 = yypvt[-1].int32; } break; case 613: #line 1607 "asmparse.y" -{ yyval.int32 = VT_NULL; } break; +{ yyval.int32 = VT_EMPTY; } break; case 614: #line 1608 "asmparse.y" -{ yyval.int32 = VT_VARIANT; } break; +{ yyval.int32 = VT_NULL; } break; case 615: #line 1609 "asmparse.y" -{ yyval.int32 = VT_CY; } break; +{ yyval.int32 = VT_VARIANT; } break; case 616: #line 1610 "asmparse.y" -{ yyval.int32 = VT_VOID; } break; +{ yyval.int32 = VT_CY; } break; case 617: #line 1611 "asmparse.y" -{ yyval.int32 = VT_BOOL; } break; +{ yyval.int32 = VT_VOID; } break; case 618: #line 1612 "asmparse.y" -{ yyval.int32 = VT_I1; } break; +{ yyval.int32 = VT_BOOL; } break; case 619: #line 1613 "asmparse.y" -{ yyval.int32 = VT_I2; } break; +{ yyval.int32 = VT_I1; } break; case 620: #line 1614 "asmparse.y" -{ yyval.int32 = VT_I4; } break; +{ yyval.int32 = VT_I2; } break; case 621: #line 1615 "asmparse.y" -{ yyval.int32 = VT_I8; } break; +{ yyval.int32 = VT_I4; } break; case 622: #line 1616 "asmparse.y" -{ yyval.int32 = VT_R4; } break; +{ yyval.int32 = VT_I8; } break; case 623: #line 1617 "asmparse.y" -{ yyval.int32 = VT_R8; } break; +{ yyval.int32 = VT_R4; } break; case 624: #line 1618 "asmparse.y" -{ yyval.int32 = VT_UI1; } break; +{ yyval.int32 = VT_R8; } break; case 625: #line 1619 "asmparse.y" -{ yyval.int32 = VT_UI2; } break; +{ yyval.int32 = VT_UI1; } break; case 626: #line 1620 "asmparse.y" -{ yyval.int32 = VT_UI4; } break; +{ yyval.int32 = VT_UI2; } break; case 627: #line 1621 "asmparse.y" -{ yyval.int32 = VT_UI8; } break; +{ yyval.int32 = VT_UI4; } break; case 628: #line 1622 "asmparse.y" -{ yyval.int32 = VT_UI1; } break; +{ yyval.int32 = VT_UI8; } break; case 629: #line 1623 "asmparse.y" -{ yyval.int32 = VT_UI2; } break; +{ yyval.int32 = VT_UI1; } break; case 630: #line 1624 "asmparse.y" -{ yyval.int32 = VT_UI4; } break; +{ yyval.int32 = VT_UI2; } break; case 631: #line 1625 "asmparse.y" -{ yyval.int32 = VT_UI8; } break; +{ yyval.int32 = VT_UI4; } break; case 632: #line 1626 "asmparse.y" -{ yyval.int32 = VT_PTR; } break; +{ yyval.int32 = VT_UI8; } break; case 633: #line 1627 "asmparse.y" -{ yyval.int32 = yypvt[-2].int32 | VT_ARRAY; } break; +{ yyval.int32 = VT_PTR; } break; case 634: #line 1628 "asmparse.y" -{ yyval.int32 = yypvt[-1].int32 | VT_VECTOR; } break; +{ yyval.int32 = yypvt[-2].int32 | VT_ARRAY; } break; case 635: #line 1629 "asmparse.y" -{ yyval.int32 = yypvt[-1].int32 | VT_BYREF; } break; +{ yyval.int32 = yypvt[-1].int32 | VT_VECTOR; } break; case 636: #line 1630 "asmparse.y" -{ yyval.int32 = VT_DECIMAL; } break; +{ yyval.int32 = yypvt[-1].int32 | VT_BYREF; } break; case 637: #line 1631 "asmparse.y" -{ yyval.int32 = VT_DATE; } break; +{ yyval.int32 = VT_DECIMAL; } break; case 638: #line 1632 "asmparse.y" -{ yyval.int32 = VT_BSTR; } break; +{ yyval.int32 = VT_DATE; } break; case 639: #line 1633 "asmparse.y" -{ yyval.int32 = VT_LPSTR; } break; +{ yyval.int32 = VT_BSTR; } break; case 640: #line 1634 "asmparse.y" -{ yyval.int32 = VT_LPWSTR; } break; +{ yyval.int32 = VT_LPSTR; } break; case 641: #line 1635 "asmparse.y" -{ yyval.int32 = VT_UNKNOWN; } break; +{ yyval.int32 = VT_LPWSTR; } break; case 642: #line 1636 "asmparse.y" -{ yyval.int32 = VT_DISPATCH; } break; +{ yyval.int32 = VT_UNKNOWN; } break; case 643: #line 1637 "asmparse.y" -{ yyval.int32 = VT_SAFEARRAY; } break; +{ yyval.int32 = VT_DISPATCH; } break; case 644: #line 1638 "asmparse.y" -{ yyval.int32 = VT_INT; } break; +{ yyval.int32 = VT_SAFEARRAY; } break; case 645: #line 1639 "asmparse.y" -{ yyval.int32 = VT_UINT; } break; +{ yyval.int32 = VT_INT; } break; case 646: #line 1640 "asmparse.y" { yyval.int32 = VT_UINT; } break; case 647: #line 1641 "asmparse.y" -{ yyval.int32 = VT_ERROR; } break; +{ yyval.int32 = VT_UINT; } break; case 648: #line 1642 "asmparse.y" -{ yyval.int32 = VT_HRESULT; } break; +{ yyval.int32 = VT_ERROR; } break; case 649: #line 1643 "asmparse.y" -{ yyval.int32 = VT_CARRAY; } break; +{ yyval.int32 = VT_HRESULT; } break; case 650: #line 1644 "asmparse.y" -{ yyval.int32 = VT_USERDEFINED; } break; +{ yyval.int32 = VT_CARRAY; } break; case 651: #line 1645 "asmparse.y" -{ yyval.int32 = VT_RECORD; } break; +{ yyval.int32 = VT_USERDEFINED; } break; case 652: #line 1646 "asmparse.y" -{ yyval.int32 = VT_FILETIME; } break; +{ yyval.int32 = VT_RECORD; } break; case 653: #line 1647 "asmparse.y" -{ yyval.int32 = VT_BLOB; } break; +{ yyval.int32 = VT_FILETIME; } break; case 654: #line 1648 "asmparse.y" -{ yyval.int32 = VT_STREAM; } break; +{ yyval.int32 = VT_BLOB; } break; case 655: #line 1649 "asmparse.y" -{ yyval.int32 = VT_STORAGE; } break; +{ yyval.int32 = VT_STREAM; } break; case 656: #line 1650 "asmparse.y" -{ yyval.int32 = VT_STREAMED_OBJECT; } break; +{ yyval.int32 = VT_STORAGE; } break; case 657: #line 1651 "asmparse.y" -{ yyval.int32 = VT_STORED_OBJECT; } break; +{ yyval.int32 = VT_STREAMED_OBJECT; } break; case 658: #line 1652 "asmparse.y" -{ yyval.int32 = VT_BLOB_OBJECT; } break; +{ yyval.int32 = VT_STORED_OBJECT; } break; case 659: #line 1653 "asmparse.y" -{ yyval.int32 = VT_CF; } break; +{ yyval.int32 = VT_BLOB_OBJECT; } break; case 660: #line 1654 "asmparse.y" -{ yyval.int32 = VT_CLSID; } break; +{ yyval.int32 = VT_CF; } break; case 661: -#line 1658 "asmparse.y" +#line 1655 "asmparse.y" +{ yyval.int32 = VT_CLSID; } break; +case 662: +#line 1659 "asmparse.y" { if(yypvt[-0].token == PASM->m_tkSysString) { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } else if(yypvt[-0].token == PASM->m_tkSysObject) { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } else yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CLASS, yypvt[-0].token); } break; -case 662: -#line 1664 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } break; case 663: #line 1665 "asmparse.y" -{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } break; case 664: #line 1666 "asmparse.y" { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break; case 665: #line 1667 "asmparse.y" -{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; +{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break; case 666: #line 1668 "asmparse.y" -{ yyval.binstr = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, yypvt[-3].binstr, yypvt[-1].binstr); } break; +{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break; case 667: #line 1669 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_BYREF); } break; +{ yyval.binstr = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, yypvt[-3].binstr, yypvt[-1].binstr); } break; case 668: #line 1670 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PTR); } break; +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_BYREF); } break; case 669: #line 1671 "asmparse.y" -{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PINNED); } break; +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PTR); } break; case 670: #line 1672 "asmparse.y" +{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PINNED); } break; +case 671: +#line 1673 "asmparse.y" { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_REQD, yypvt[-1].token); yyval.binstr->append(yypvt[-4].binstr); } break; -case 671: -#line 1674 "asmparse.y" +case 672: +#line 1675 "asmparse.y" { yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_OPT, yypvt[-1].token); yyval.binstr->append(yypvt[-4].binstr); } break; -case 672: -#line 1677 "asmparse.y" +case 673: +#line 1678 "asmparse.y" { yyval.binstr = parser->MakeSig(yypvt[-5].int32, yypvt[-4].binstr, yypvt[-1].binstr); yyval.binstr->insertInt8(ELEMENT_TYPE_FNPTR); PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = parser->m_ANSFirst.POP(); PASM->m_lastArgName = parser->m_ANSLast.POP(); } break; -case 673: -#line 1683 "asmparse.y" +case 674: +#line 1684 "asmparse.y" { if(yypvt[-1].binstr == NULL) yyval.binstr = yypvt[-3].binstr; else { yyval.binstr = new BinStr(); @@ -4353,24 +4360,24 @@ case 673: yyval.binstr->append(yypvt[-3].binstr); corEmitInt(yyval.binstr, corCountArgs(yypvt[-1].binstr)); yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-3].binstr; delete yypvt[-1].binstr; }} break; -case 674: -#line 1690 "asmparse.y" +case 675: +#line 1691 "asmparse.y" { //if(PASM->m_pCurMethod) { // if(($3 < 0)||((DWORD)$3 >= PASM->m_pCurMethod->m_NumTyPars)) // PASM->report->error("Invalid method type parameter '%d'\n",$3); yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_MVAR); corEmitInt(yyval.binstr, yypvt[-0].int32); //} else PASM->report->error("Method type parameter '%d' outside method scope\n",$3); } break; -case 675: -#line 1696 "asmparse.y" +case 676: +#line 1697 "asmparse.y" { //if(PASM->m_pCurClass) { // if(($2 < 0)||((DWORD)$2 >= PASM->m_pCurClass->m_NumTyPars)) // PASM->report->error("Invalid type parameter '%d'\n",$2); yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VAR); corEmitInt(yyval.binstr, yypvt[-0].int32); //} else PASM->report->error("Type parameter '%d' outside class scope\n",$2); } break; -case 676: -#line 1702 "asmparse.y" +case 677: +#line 1703 "asmparse.y" { int eltype = ELEMENT_TYPE_MVAR; int n=-1; if(PASM->m_pCurMethod) n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string); @@ -4386,8 +4393,8 @@ case 676: n = 0x1FFFFFFF; } yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n); } break; -case 677: -#line 1717 "asmparse.y" +case 678: +#line 1718 "asmparse.y" { int eltype = ELEMENT_TYPE_VAR; int n=-1; if(PASM->m_pCurClass && !newclass) n = PASM->m_pCurClass->FindTyPar(yypvt[-0].string); @@ -4403,491 +4410,491 @@ case 677: n = 0x1FFFFFFF; } yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n); } break; -case 678: -#line 1732 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_TYPEDBYREF); } break; case 679: #line 1733 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VOID); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_TYPEDBYREF); } break; case 680: #line 1734 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VOID); } break; case 681: #line 1735 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I); } break; case 682: #line 1736 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break; case 683: #line 1737 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break; case 684: #line 1738 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SENTINEL); } break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 685: -#line 1741 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); } break; +#line 1739 "asmparse.y" +{ yyval.binstr = yypvt[-0].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SENTINEL); } break; case 686: #line 1742 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); } break; case 687: #line 1743 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } break; case 688: #line 1744 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); } break; case 689: #line 1745 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); } break; case 690: #line 1746 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); } break; case 691: #line 1747 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); } break; case 692: #line 1748 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); } break; case 693: #line 1749 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); } break; case 694: #line 1750 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); } break; case 695: #line 1751 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break; case 696: #line 1752 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break; case 697: #line 1753 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break; case 698: #line 1754 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break; case 699: #line 1755 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break; case 700: #line 1756 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break; case 701: #line 1757 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break; case 702: #line 1758 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break; case 703: -#line 1761 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; } break; +#line 1759 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break; case 704: #line 1762 "asmparse.y" -{ yyval.binstr = yypvt[-2].binstr; yypvt[-2].binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; +{ yyval.binstr = yypvt[-0].binstr; } break; case 705: -#line 1765 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF); } break; +#line 1763 "asmparse.y" +{ yyval.binstr = yypvt[-2].binstr; yypvt[-2].binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break; case 706: #line 1766 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF); } break; case 707: #line 1767 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0); yyval.binstr->appendInt32(yypvt[-0].int32); } break; +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF); } break; case 708: #line 1768 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0); yyval.binstr->appendInt32(yypvt[-0].int32); } break; +case 709: +#line 1769 "asmparse.y" { FAIL_UNLESS(yypvt[-2].int32 <= yypvt[-0].int32, ("lower bound %d must be <= upper bound %d\n", yypvt[-2].int32, yypvt[-0].int32)); if (yypvt[-2].int32 > yypvt[-0].int32) { YYERROR; }; yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-2].int32); yyval.binstr->appendInt32(yypvt[-0].int32-yypvt[-2].int32+1); } break; -case 709: -#line 1771 "asmparse.y" -{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-1].int32); yyval.binstr->appendInt32(0x7FFFFFFF); } break; case 710: -#line 1776 "asmparse.y" -{ PASM->AddPermissionDecl(yypvt[-4].secAct, yypvt[-3].token, yypvt[-1].pair); } break; +#line 1772 "asmparse.y" +{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-1].int32); yyval.binstr->appendInt32(0x7FFFFFFF); } break; case 711: -#line 1778 "asmparse.y" -{ PASM->AddPermissionDecl(yypvt[-5].secAct, yypvt[-4].token, yypvt[-1].binstr); } break; +#line 1777 "asmparse.y" +{ PASM->AddPermissionDecl(yypvt[-4].secAct, yypvt[-3].token, yypvt[-1].pair); } break; case 712: #line 1779 "asmparse.y" -{ PASM->AddPermissionDecl(yypvt[-1].secAct, yypvt[-0].token, (NVPair *)NULL); } break; +{ PASM->AddPermissionDecl(yypvt[-5].secAct, yypvt[-4].token, yypvt[-1].binstr); } break; case 713: #line 1780 "asmparse.y" -{ PASM->AddPermissionSetDecl(yypvt[-2].secAct, yypvt[-1].binstr); } break; +{ PASM->AddPermissionDecl(yypvt[-1].secAct, yypvt[-0].token, (NVPair *)NULL); } break; case 714: -#line 1782 "asmparse.y" -{ PASM->AddPermissionSetDecl(yypvt[-1].secAct,BinStrToUnicode(yypvt[-0].binstr,true));} break; +#line 1781 "asmparse.y" +{ PASM->AddPermissionSetDecl(yypvt[-2].secAct, yypvt[-1].binstr); } break; case 715: -#line 1784 "asmparse.y" +#line 1783 "asmparse.y" +{ PASM->AddPermissionSetDecl(yypvt[-1].secAct,BinStrToUnicode(yypvt[-0].binstr,true));} break; +case 716: +#line 1785 "asmparse.y" { BinStr* ret = new BinStr(); ret->insertInt8('.'); corEmitInt(ret, nSecAttrBlobs); ret->append(yypvt[-1].binstr); PASM->AddPermissionSetDecl(yypvt[-4].secAct,ret); nSecAttrBlobs = 0; } break; -case 716: -#line 1792 "asmparse.y" -{ yyval.binstr = new BinStr(); nSecAttrBlobs = 0;} break; case 717: #line 1793 "asmparse.y" -{ yyval.binstr = yypvt[-0].binstr; nSecAttrBlobs = 1; } break; +{ yyval.binstr = new BinStr(); nSecAttrBlobs = 0;} break; case 718: #line 1794 "asmparse.y" -{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); nSecAttrBlobs++; } break; +{ yyval.binstr = yypvt[-0].binstr; nSecAttrBlobs = 1; } break; case 719: -#line 1798 "asmparse.y" +#line 1795 "asmparse.y" +{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); nSecAttrBlobs++; } break; +case 720: +#line 1799 "asmparse.y" { yyval.binstr = PASM->EncodeSecAttr(PASM->ReflectionNotation(yypvt[-4].token),yypvt[-1].binstr,nCustomBlobNVPairs); nCustomBlobNVPairs = 0; } break; -case 720: -#line 1801 "asmparse.y" +case 721: +#line 1802 "asmparse.y" { yyval.binstr = PASM->EncodeSecAttr(yypvt[-4].string,yypvt[-1].binstr,nCustomBlobNVPairs); nCustomBlobNVPairs = 0; } break; -case 721: -#line 1805 "asmparse.y" -{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break; case 722: -#line 1807 "asmparse.y" +#line 1806 "asmparse.y" { yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break; case 723: -#line 1810 "asmparse.y" -{ yyval.pair = yypvt[-0].pair; } break; +#line 1808 "asmparse.y" +{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break; case 724: #line 1811 "asmparse.y" -{ yyval.pair = yypvt[-2].pair->Concat(yypvt[-0].pair); } break; +{ yyval.pair = yypvt[-0].pair; } break; case 725: -#line 1814 "asmparse.y" -{ yypvt[-2].binstr->appendInt8(0); yyval.pair = new NVPair(yypvt[-2].binstr, yypvt[-0].binstr); } break; +#line 1812 "asmparse.y" +{ yyval.pair = yypvt[-2].pair->Concat(yypvt[-0].pair); } break; case 726: -#line 1817 "asmparse.y" -{ yyval.int32 = 1; } break; +#line 1815 "asmparse.y" +{ yypvt[-2].binstr->appendInt8(0); yyval.pair = new NVPair(yypvt[-2].binstr, yypvt[-0].binstr); } break; case 727: #line 1818 "asmparse.y" -{ yyval.int32 = 0; } break; +{ yyval.int32 = 1; } break; case 728: -#line 1821 "asmparse.y" +#line 1819 "asmparse.y" +{ yyval.int32 = 0; } break; +case 729: +#line 1822 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_BOOLEAN); yyval.binstr->appendInt8(yypvt[-0].int32); } break; -case 729: -#line 1824 "asmparse.y" +case 730: +#line 1825 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4); yyval.binstr->appendInt32(yypvt[-0].int32); } break; -case 730: -#line 1827 "asmparse.y" +case 731: +#line 1828 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 731: -#line 1830 "asmparse.y" +case 732: +#line 1831 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_STRING); yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; yyval.binstr->appendInt8(0); } break; -case 732: -#line 1834 "asmparse.y" +case 733: +#line 1835 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM); char* sz = PASM->ReflectionNotation(yypvt[-5].token); strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz); yyval.binstr->appendInt8(1); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 733: -#line 1840 "asmparse.y" +case 734: +#line 1841 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM); char* sz = PASM->ReflectionNotation(yypvt[-5].token); strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz); yyval.binstr->appendInt8(2); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 734: -#line 1846 "asmparse.y" +case 735: +#line 1847 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM); char* sz = PASM->ReflectionNotation(yypvt[-5].token); strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz); yyval.binstr->appendInt8(4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 735: -#line 1852 "asmparse.y" +case 736: +#line 1853 "asmparse.y" { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM); char* sz = PASM->ReflectionNotation(yypvt[-3].token); strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz); yyval.binstr->appendInt8(4); yyval.binstr->appendInt32(yypvt[-1].int32); } break; -case 736: -#line 1860 "asmparse.y" -{ yyval.secAct = dclRequest; } break; case 737: #line 1861 "asmparse.y" -{ yyval.secAct = dclDemand; } break; +{ yyval.secAct = dclRequest; } break; case 738: #line 1862 "asmparse.y" -{ yyval.secAct = dclAssert; } break; +{ yyval.secAct = dclDemand; } break; case 739: #line 1863 "asmparse.y" -{ yyval.secAct = dclDeny; } break; +{ yyval.secAct = dclAssert; } break; case 740: #line 1864 "asmparse.y" -{ yyval.secAct = dclPermitOnly; } break; +{ yyval.secAct = dclDeny; } break; case 741: #line 1865 "asmparse.y" -{ yyval.secAct = dclLinktimeCheck; } break; +{ yyval.secAct = dclPermitOnly; } break; case 742: #line 1866 "asmparse.y" -{ yyval.secAct = dclInheritanceCheck; } break; +{ yyval.secAct = dclLinktimeCheck; } break; case 743: #line 1867 "asmparse.y" -{ yyval.secAct = dclRequestMinimum; } break; +{ yyval.secAct = dclInheritanceCheck; } break; case 744: #line 1868 "asmparse.y" -{ yyval.secAct = dclRequestOptional; } break; +{ yyval.secAct = dclRequestMinimum; } break; case 745: #line 1869 "asmparse.y" -{ yyval.secAct = dclRequestRefuse; } break; +{ yyval.secAct = dclRequestOptional; } break; case 746: #line 1870 "asmparse.y" -{ yyval.secAct = dclPrejitGrant; } break; +{ yyval.secAct = dclRequestRefuse; } break; case 747: #line 1871 "asmparse.y" -{ yyval.secAct = dclPrejitDenied; } break; +{ yyval.secAct = dclPrejitGrant; } break; case 748: #line 1872 "asmparse.y" -{ yyval.secAct = dclNonCasDemand; } break; +{ yyval.secAct = dclPrejitDenied; } break; case 749: #line 1873 "asmparse.y" -{ yyval.secAct = dclNonCasLinkDemand; } break; +{ yyval.secAct = dclNonCasDemand; } break; case 750: #line 1874 "asmparse.y" -{ yyval.secAct = dclNonCasInheritance; } break; +{ yyval.secAct = dclNonCasLinkDemand; } break; case 751: -#line 1878 "asmparse.y" -{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; } break; +#line 1875 "asmparse.y" +{ yyval.secAct = dclNonCasInheritance; } break; case 752: #line 1879 "asmparse.y" -{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; } break; +{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; } break; case 753: -#line 1882 "asmparse.y" +#line 1880 "asmparse.y" +{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; } break; +case 754: +#line 1883 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32; PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1); PASM->SetSourceFileName(yypvt[-0].string);} break; -case 754: -#line 1885 "asmparse.y" +case 755: +#line 1886 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-0].int32; PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1); } break; -case 755: -#line 1887 "asmparse.y" +case 756: +#line 1888 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-3].int32; PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast(-1); PASM->SetSourceFileName(yypvt[-0].string);} break; -case 756: -#line 1890 "asmparse.y" +case 757: +#line 1891 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-2].int32; PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast(-1);} break; -case 757: -#line 1893 "asmparse.y" +case 758: +#line 1894 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-5].int32; PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32; PASM->SetSourceFileName(yypvt[-0].string);} break; -case 758: -#line 1897 "asmparse.y" +case 759: +#line 1898 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-4].int32; PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break; -case 759: -#line 1900 "asmparse.y" +case 760: +#line 1901 "asmparse.y" { PENV->nExtLine = yypvt[-5].int32; PENV->nExtLineEnd = yypvt[-3].int32; PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast(-1); PASM->SetSourceFileName(yypvt[-0].string);} break; -case 760: -#line 1904 "asmparse.y" +case 761: +#line 1905 "asmparse.y" { PENV->nExtLine = yypvt[-4].int32; PENV->nExtLineEnd = yypvt[-2].int32; PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast(-1); } break; -case 761: -#line 1907 "asmparse.y" +case 762: +#line 1908 "asmparse.y" { PENV->nExtLine = yypvt[-7].int32; PENV->nExtLineEnd = yypvt[-5].int32; PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32; PASM->SetSourceFileName(yypvt[-0].string);} break; -case 762: -#line 1911 "asmparse.y" +case 763: +#line 1912 "asmparse.y" { PENV->nExtLine = yypvt[-6].int32; PENV->nExtLineEnd = yypvt[-4].int32; PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break; -case 763: -#line 1913 "asmparse.y" +case 764: +#line 1914 "asmparse.y" { PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32 - 1; PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1); PASM->SetSourceFileName(yypvt[-0].binstr);} break; -case 764: -#line 1920 "asmparse.y" -{ PASMM->AddFile(yypvt[-5].string, yypvt[-6].fileAttr|yypvt[-4].fileAttr|yypvt[-0].fileAttr, yypvt[-2].binstr); } break; case 765: #line 1921 "asmparse.y" -{ PASMM->AddFile(yypvt[-1].string, yypvt[-2].fileAttr|yypvt[-0].fileAttr, NULL); } break; +{ PASMM->AddFile(yypvt[-5].string, yypvt[-6].fileAttr|yypvt[-4].fileAttr|yypvt[-0].fileAttr, yypvt[-2].binstr); } break; case 766: -#line 1924 "asmparse.y" -{ yyval.fileAttr = (CorFileFlags) 0; } break; +#line 1922 "asmparse.y" +{ PASMM->AddFile(yypvt[-1].string, yypvt[-2].fileAttr|yypvt[-0].fileAttr, NULL); } break; case 767: #line 1925 "asmparse.y" -{ yyval.fileAttr = (CorFileFlags) (yypvt[-1].fileAttr | ffContainsNoMetaData); } break; -case 768: -#line 1928 "asmparse.y" { yyval.fileAttr = (CorFileFlags) 0; } break; +case 768: +#line 1926 "asmparse.y" +{ yyval.fileAttr = (CorFileFlags) (yypvt[-1].fileAttr | ffContainsNoMetaData); } break; case 769: #line 1929 "asmparse.y" -{ yyval.fileAttr = (CorFileFlags) 0x80000000; } break; +{ yyval.fileAttr = (CorFileFlags) 0; } break; case 770: -#line 1932 "asmparse.y" -{ bParsingByteArray = TRUE; } break; +#line 1930 "asmparse.y" +{ yyval.fileAttr = (CorFileFlags) 0x80000000; } break; case 771: -#line 1935 "asmparse.y" -{ PASMM->StartAssembly(yypvt[-0].string, NULL, (DWORD)yypvt[-1].asmAttr, FALSE); } break; +#line 1933 "asmparse.y" +{ bParsingByteArray = TRUE; } break; case 772: -#line 1938 "asmparse.y" -{ yyval.asmAttr = (CorAssemblyFlags) 0; } break; +#line 1936 "asmparse.y" +{ PASMM->StartAssembly(yypvt[-0].string, NULL, (DWORD)yypvt[-1].asmAttr, FALSE); } break; case 773: #line 1939 "asmparse.y" -{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afRetargetable); } break; +{ yyval.asmAttr = (CorAssemblyFlags) 0; } break; case 774: #line 1940 "asmparse.y" -{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afContentType_WindowsRuntime); } break; +{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afRetargetable); } break; case 775: #line 1941 "asmparse.y" -{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afPA_NoPlatform); } break; +{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afContentType_WindowsRuntime); } break; case 776: #line 1942 "asmparse.y" -{ yyval.asmAttr = yypvt[-2].asmAttr; } break; +{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afPA_NoPlatform); } break; case 777: #line 1943 "asmparse.y" -{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_MSIL); } break; +{ yyval.asmAttr = yypvt[-2].asmAttr; } break; case 778: #line 1944 "asmparse.y" -{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_x86); } break; +{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_MSIL); } break; case 779: #line 1945 "asmparse.y" -{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_IA64); } break; +{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_x86); } break; case 780: #line 1946 "asmparse.y" -{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_AMD64); } break; +{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_IA64); } break; case 781: #line 1947 "asmparse.y" +{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_AMD64); } break; +case 782: +#line 1948 "asmparse.y" { SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_ARM); } break; -case 784: -#line 1954 "asmparse.y" +case 785: +#line 1955 "asmparse.y" { PASMM->SetAssemblyHashAlg(yypvt[-0].int32); } break; -case 787: -#line 1959 "asmparse.y" -{ yyval.int32 = yypvt[-0].int32; } break; case 788: #line 1960 "asmparse.y" -{ yyval.int32 = 0xFFFF; } break; +{ yyval.int32 = yypvt[-0].int32; } break; case 789: -#line 1963 "asmparse.y" -{ PASMM->SetAssemblyPublicKey(yypvt[-1].binstr); } break; +#line 1961 "asmparse.y" +{ yyval.int32 = 0xFFFF; } break; case 790: -#line 1965 "asmparse.y" -{ PASMM->SetAssemblyVer((USHORT)yypvt[-6].int32, (USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, (USHORT)yypvt[-0].int32); } break; +#line 1964 "asmparse.y" +{ PASMM->SetAssemblyPublicKey(yypvt[-1].binstr); } break; case 791: #line 1966 "asmparse.y" -{ yypvt[-0].binstr->appendInt8(0); PASMM->SetAssemblyLocale(yypvt[-0].binstr,TRUE); } break; +{ PASMM->SetAssemblyVer((USHORT)yypvt[-6].int32, (USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, (USHORT)yypvt[-0].int32); } break; case 792: #line 1967 "asmparse.y" +{ yypvt[-0].binstr->appendInt8(0); PASMM->SetAssemblyLocale(yypvt[-0].binstr,TRUE); } break; +case 793: +#line 1968 "asmparse.y" { PASMM->SetAssemblyLocale(yypvt[-1].binstr,FALSE); } break; -case 795: -#line 1972 "asmparse.y" -{ bParsingByteArray = TRUE; } break; case 796: -#line 1975 "asmparse.y" +#line 1973 "asmparse.y" { bParsingByteArray = TRUE; } break; case 797: -#line 1978 "asmparse.y" +#line 1976 "asmparse.y" { bParsingByteArray = TRUE; } break; case 798: -#line 1982 "asmparse.y" -{ PASMM->StartAssembly(yypvt[-0].string, NULL, yypvt[-1].asmAttr, TRUE); } break; +#line 1979 "asmparse.y" +{ bParsingByteArray = TRUE; } break; case 799: -#line 1984 "asmparse.y" +#line 1983 "asmparse.y" +{ PASMM->StartAssembly(yypvt[-0].string, NULL, yypvt[-1].asmAttr, TRUE); } break; +case 800: +#line 1985 "asmparse.y" { PASMM->StartAssembly(yypvt[-2].string, yypvt[-0].string, yypvt[-3].asmAttr, TRUE); } break; -case 802: -#line 1991 "asmparse.y" +case 803: +#line 1992 "asmparse.y" { PASMM->SetAssemblyHashBlob(yypvt[-1].binstr); } break; -case 804: -#line 1993 "asmparse.y" -{ PASMM->SetAssemblyPublicKeyToken(yypvt[-1].binstr); } break; case 805: #line 1994 "asmparse.y" -{ PASMM->SetAssemblyAutodetect(); } break; +{ PASMM->SetAssemblyPublicKeyToken(yypvt[-1].binstr); } break; case 806: -#line 1997 "asmparse.y" -{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr);} break; +#line 1995 "asmparse.y" +{ PASMM->SetAssemblyAutodetect(); } break; case 807: -#line 2000 "asmparse.y" -{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr); } break; +#line 1998 "asmparse.y" +{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr);} break; case 808: -#line 2003 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) 0; } break; +#line 2001 "asmparse.y" +{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr); } break; case 809: #line 2004 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdNotPublic); } break; +{ yyval.exptAttr = (CorTypeAttr) 0; } break; case 810: #line 2005 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdPublic); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdNotPublic); } break; case 811: #line 2006 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdForwarder); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdPublic); } break; case 812: #line 2007 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPublic); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdForwarder); } break; case 813: #line 2008 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPrivate); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPublic); } break; case 814: #line 2009 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamily); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPrivate); } break; case 815: #line 2010 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedAssembly); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamily); } break; case 816: #line 2011 "asmparse.y" -{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamANDAssem); } break; +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedAssembly); } break; case 817: #line 2012 "asmparse.y" +{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamANDAssem); } break; +case 818: +#line 2013 "asmparse.y" { yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamORAssem); } break; -case 820: -#line 2019 "asmparse.y" -{ PASMM->SetComTypeFile(yypvt[-0].string); } break; case 821: #line 2020 "asmparse.y" -{ PASMM->SetComTypeComType(yypvt[-0].string); } break; +{ PASMM->SetComTypeFile(yypvt[-0].string); } break; case 822: #line 2021 "asmparse.y" -{ PASMM->SetComTypeAsmRef(yypvt[-0].string); } break; +{ PASMM->SetComTypeComType(yypvt[-0].string); } break; case 823: #line 2022 "asmparse.y" +{ PASMM->SetComTypeAsmRef(yypvt[-0].string); } break; +case 824: +#line 2023 "asmparse.y" { if(!PASMM->SetComTypeImplementationTok(yypvt[-1].int32)) PASM->report->error("Invalid implementation of exported type\n"); } break; -case 824: -#line 2024 "asmparse.y" +case 825: +#line 2025 "asmparse.y" { if(!PASMM->SetComTypeClassTok(yypvt[-0].int32)) PASM->report->error("Invalid TypeDefID of exported type\n"); } break; -case 827: -#line 2030 "asmparse.y" -{ PASMM->StartManifestRes(yypvt[-0].string, yypvt[-0].string, yypvt[-1].manresAttr); } break; case 828: -#line 2032 "asmparse.y" -{ PASMM->StartManifestRes(yypvt[-2].string, yypvt[-0].string, yypvt[-3].manresAttr); } break; +#line 2031 "asmparse.y" +{ PASMM->StartManifestRes(yypvt[-0].string, yypvt[-0].string, yypvt[-1].manresAttr); } break; case 829: -#line 2035 "asmparse.y" -{ yyval.manresAttr = (CorManifestResourceFlags) 0; } break; +#line 2033 "asmparse.y" +{ PASMM->StartManifestRes(yypvt[-2].string, yypvt[-0].string, yypvt[-3].manresAttr); } break; case 830: #line 2036 "asmparse.y" -{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPublic); } break; +{ yyval.manresAttr = (CorManifestResourceFlags) 0; } break; case 831: #line 2037 "asmparse.y" +{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPublic); } break; +case 832: +#line 2038 "asmparse.y" { yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPrivate); } break; -case 834: -#line 2044 "asmparse.y" -{ PASMM->SetManifestResFile(yypvt[-2].string, (ULONG)yypvt[-0].int32); } break; case 835: #line 2045 "asmparse.y" +{ PASMM->SetManifestResFile(yypvt[-2].string, (ULONG)yypvt[-0].int32); } break; +case 836: +#line 2046 "asmparse.y" { PASMM->SetManifestResAsmRef(yypvt[-0].string); } break;/* End of actions */ #line 329 "O:\\tfs\\cgm\\src\\Tools\\devdiv\\amd64\\yypars.c" } diff --git a/src/ildasm/dasm.cpp b/src/ildasm/dasm.cpp index 414ebba8768b..f0796c461229 100644 --- a/src/ildasm/dasm.cpp +++ b/src/ildasm/dasm.cpp @@ -3647,6 +3647,7 @@ lDone: ; if(IsMiNoInlining(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," noinlining"); if(IsMiAggressiveInlining(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," aggressiveinlining"); if(IsMiNoOptimization(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," nooptimization"); + if(IsMiAggressiveOptimization(dwImplAttrs)) szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," aggressiveoptimization"); szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr),KEYWORD((char*)-1)); printLine(GUICookie, szString); VDELETE(buff); diff --git a/src/inc/corhdr.h b/src/inc/corhdr.h index df54ab41bcc9..a91dc9ce0b18 100644 --- a/src/inc/corhdr.h +++ b/src/inc/corhdr.h @@ -644,6 +644,7 @@ typedef enum CorMethodImpl miNoInlining = 0x0008, // Method may not be inlined. miAggressiveInlining = 0x0100, // Method should be inlined if possible. miNoOptimization = 0x0040, // Method may not be optimized. + miAggressiveOptimization = 0x0200, // Method may contain hot code and should be aggressively optimized. // These are the flags that are allowed in MethodImplAttribute's Value // property. This should include everything above except the code impl @@ -651,7 +652,7 @@ typedef enum CorMethodImpl miUserMask = miManagedMask | miForwardRef | miPreserveSig | miInternalCall | miSynchronized | miNoInlining | miAggressiveInlining | - miNoOptimization, + miNoOptimization | miAggressiveOptimization, miMaxMethodImplVal = 0xffff, // Range check value } CorMethodImpl; @@ -674,6 +675,7 @@ typedef enum CorMethodImpl #define IsMiNoInlining(x) ((x) & miNoInlining) #define IsMiAggressiveInlining(x) ((x) & miAggressiveInlining) #define IsMiNoOptimization(x) ((x) & miNoOptimization) +#define IsMiAggressiveOptimization(x) (((x) & (miAggressiveOptimization | miNoOptimization)) == miAggressiveOptimization) // PinvokeMap attr bits, used by DefinePinvokeMap. typedef enum CorPinvokeMap diff --git a/src/inc/corjitflags.h b/src/inc/corjitflags.h index 84fb42f08306..ff8bcb18d158 100644 --- a/src/inc/corjitflags.h +++ b/src/inc/corjitflags.h @@ -52,7 +52,7 @@ class CORJIT_FLAGS #endif // !defined(_TARGET_X86_) - CORJIT_FLAG_UNUSED6 = 13, + CORJIT_FLAG_AGGRESSIVE_OPT = 13, #if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) diff --git a/src/inc/il_kywd.h b/src/inc/il_kywd.h index e16d7c7b9d7e..47ffb8aea00f 100644 --- a/src/inc/il_kywd.h +++ b/src/inc/il_kywd.h @@ -108,6 +108,7 @@ KYWD( "internalcall", INTERNALCALL_, NO_VALUE ) KYWD( "noinlining", NOINLINING_, NO_VALUE ) KYWD( "nooptimization", NOOPTIMIZATION_, NO_VALUE ) + KYWD( "aggressiveoptimization", AGGRESSIVEOPTIMIZATION_, NO_VALUE ) KYWD( "nomangle", NOMANGLE_, NO_VALUE ) KYWD( "lasterr", LASTERR_, NO_VALUE ) KYWD( "winapi", WINAPI_, NO_VALUE ) diff --git a/src/vm/codeversion.cpp b/src/vm/codeversion.cpp index 86e855811267..ac99d64bf28c 100644 --- a/src/vm/codeversion.cpp +++ b/src/vm/codeversion.cpp @@ -56,7 +56,12 @@ NativeCodeVersionNode::NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* m_parentId(parentId), m_pNextMethodDescSibling(NULL), m_id(id), - m_optTier(NativeCodeVersion::OptimizationTier0), +#ifdef FEATURE_TIERED_COMPILATION + m_optTier( + pMethodDesc->RequestedAggressiveOptimization() + ? NativeCodeVersion::OptimizationTier1 + : NativeCodeVersion::OptimizationTier0), +#endif m_flags(0) {} #endif @@ -336,7 +341,10 @@ NativeCodeVersion::OptimizationTier NativeCodeVersion::GetOptimizationTier() con } else { - return NativeCodeVersion::OptimizationTier0; + return + GetMethodDesc()->RequestedAggressiveOptimization() + ? NativeCodeVersion::OptimizationTier1 + : NativeCodeVersion::OptimizationTier0; } } diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 2140d34bdef0..c359f0931925 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -12440,6 +12440,10 @@ CorJitResult CallCompileMethodWithSEHWrapper(EEJitManager *jitMgr, { flags.Set(CORJIT_FLAGS::CORJIT_FLAG_MIN_OPT); } + else if (IsMiAggressiveOptimization(dwImplFlags)) + { + flags.Set(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT); + } // Always emit frames for methods marked no-inline (see #define ETW_EBP_FRAMED in the JIT) if (IsMiNoInlining(dwImplFlags)) diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 5ed68692225a..44202b91f6e5 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -1267,12 +1267,15 @@ class MethodDesc } #endif - // Returns a code version that represents the first (default) - // code body that this method would have. - NativeCodeVersion GetInitialCodeVersion() + bool RequestedAggressiveOptimization() { - LIMITED_METHOD_DAC_CONTRACT; - return NativeCodeVersion(dac_cast(this)); + WRAPPER_NO_CONTRACT; + + DWORD dwImplFlags = 0; + return + !IsNoMetadata() && + SUCCEEDED(GetMDImport()->GetMethodImplProps(GetMemberDef(), NULL, &dwImplFlags)) && + IsMiAggressiveOptimization(dwImplFlags); } // Does this method force the NativeCodeSlot to stay fixed after it diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 378dc2e120e9..09939bc07153 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -334,7 +334,7 @@ PCODE MethodDesc::GetPrecompiledCode(PrepareCodeConfig* pConfig) #endif #ifdef FEATURE_READYTORUN - if (pCode == NULL) + if (pCode == NULL && !RequestedAggressiveOptimization()) { pCode = GetPrecompiledR2RCode(pConfig); if (pCode != NULL) @@ -1752,9 +1752,15 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT) BOOL fWasPromotedToTier1 = FALSE; if (fEligibleForTieredCompilation) { - fEligibleForCallCounting = g_pConfig->TieredCompilation_CallCounting(); - if (fEligibleForCallCounting) + if (RequestedAggressiveOptimization()) + { + fEligibleForCallCounting = FALSE; + fWasPromotedToTier1 = TRUE; + } + else if (g_pConfig->TieredCompilation_CallCounting()) { + fEligibleForCallCounting = TRUE; + pTieredCompilationManager = GetAppDomain()->GetTieredCompilationManager(); CallCounter * pCallCounter = GetCallCounter(); pCallCounter->OnMethodCalled(this, pTieredCompilationManager, &fCanBackpatchPrestub, &fWasPromotedToTier1); diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp index 7320729decce..7efdaba949e2 100644 --- a/src/zap/zapinfo.cpp +++ b/src/zap/zapinfo.cpp @@ -440,6 +440,12 @@ void ZapInfo::CompileMethod() #ifdef FEATURE_READYTORUN_COMPILER if (IsReadyToRunCompilation()) { + if (m_jitFlags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT)) + { + // Skip methods marked with MethodImplOptions.AggressiveOptimization, they will be jitted instead + return; + } + // READYTORUN: FUTURE: Producedure spliting m_jitFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROCSPLIT); diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs new file mode 100644 index 000000000000..3793ed3238b0 --- /dev/null +++ b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs @@ -0,0 +1,152 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; + +public static class MethodImplOptionsTests +{ + private const int UnexpectedTimeoutMs = 30_000; + + public static int Main() + { + const int Pass = 100; + const int Fail = 101; + + string coreRoot = Environment.GetEnvironmentVariable("CORE_ROOT"); + if (string.IsNullOrWhiteSpace(coreRoot)) + { + Console.WriteLine("Environment variable is not set: 'CORE_ROOT'"); + return Fail; + } + if (!Directory.Exists(coreRoot)) + { + Console.WriteLine($"Did not find CORE_ROOT directory: {coreRoot}"); + return Fail; + } + + var nativeExeExtensions = new string[] { string.Empty, ".exe" }; + bool found = false; + string ilasmFile = null; + string ildasmFile = null; + foreach (string nativeExeExtension in nativeExeExtensions) + { + ilasmFile = Path.Combine(coreRoot, $"ilasm{nativeExeExtension}"); + ildasmFile = Path.Combine(coreRoot, $"ildasm{nativeExeExtension}"); + if (File.Exists(ilasmFile) && File.Exists(ildasmFile)) + { + found = true; + break; + } + } + if (!found) + { + Console.WriteLine($"Did not find ilasm or ildasm in CORE_ROOT directory: {coreRoot}"); + return Fail; + } + + bool allPassed = true; + allPassed &= + RunMethodImplOptionsTest( + ilasmFile, + ildasmFile, + "AggressiveOptimizationTest", + "MiAggressiveOptimization.il", + "aggressiveoptimization"); + return allPassed ? Pass : Fail; + } + + private static bool RunMethodImplOptionsTest( + string ilasmFile, + string ildasmFile, + string testName, + string ilFileName, + string ilDisasmAttributeKeyword) + { + Console.WriteLine(testName); + + try + { + string disasmIlFileName; + ProcessStartInfo ilasmPsi, ildasmPsi; + GetIlasmProcessStartInfos(ilasmFile, ildasmFile, ilFileName, out disasmIlFileName, out ilasmPsi, out ildasmPsi); + + Process ilasmProcess = Process.Start(ilasmPsi); + if (!ilasmProcess.WaitForExit(UnexpectedTimeoutMs)) + { + Console.WriteLine("Timed out waiting for ilasm to exit"); + return false; + } + if (ilasmProcess.ExitCode != 0) + { + Console.WriteLine($"ilasm failed with exit code: {ilasmProcess.ExitCode}"); + return false; + } + + Process ildasmProcess = Process.Start(ildasmPsi); + if (!ildasmProcess.WaitForExit(UnexpectedTimeoutMs)) + { + Console.WriteLine("Timed out waiting for ildasm to exit"); + return false; + } + if (ildasmProcess.ExitCode != 0) + { + Console.WriteLine($"ildasm failed with exit code: {ildasmProcess.ExitCode}"); + return false; + } + + string disasmIl = File.ReadAllText(disasmIlFileName); + var findMainAttributeRegex = + new Regex( + @"\bvoid\s+Main\s*\(\s*\).*?\b" + ilDisasmAttributeKeyword + @"\b", + RegexOptions.Compiled | RegexOptions.Multiline); + Match match = findMainAttributeRegex.Match(disasmIl); + if (!match.Success) + { + Console.WriteLine($"Attribute '{ilDisasmAttributeKeyword}' did not round-trip through ilasm and ildasm"); + return false; + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + return false; + } + return true; + } + + private static void GetIlasmProcessStartInfos( + string ilasmFile, + string ildasmFile, + string ilFileName, + out string disasmIlFileName, + out ProcessStartInfo ilasmPsi, + out ProcessStartInfo ildasmPsi) + { + if (!File.Exists(ilFileName)) + { + throw new FileNotFoundException( + $"Did not find '{ilFileName}' in working directory '{Environment.CurrentDirectory}'"); + } + + string currentDirectory = Environment.CurrentDirectory; + + ilasmPsi = new ProcessStartInfo(); + ilasmPsi.UseShellExecute = false; + ilasmPsi.WorkingDirectory = currentDirectory; + ilasmPsi.FileName = ilasmFile; + string asmDllFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}.dll"; + ilasmPsi.Arguments = + $"/nologo /dll /optimize /output={asmDllFileName} {ilFileName}"; + + ildasmPsi = new ProcessStartInfo(); + ildasmPsi.UseShellExecute = false; + ildasmPsi.WorkingDirectory = currentDirectory; + ildasmPsi.FileName = ildasmFile; + disasmIlFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}_dis{Path.GetExtension(ilFileName)}"; + ildasmPsi.Arguments = $"/out={disasmIlFileName} {asmDllFileName}"; + } +} diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj new file mode 100644 index 000000000000..1d23bc3f4edd --- /dev/null +++ b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.csproj @@ -0,0 +1,24 @@ + + + + + Debug + AnyCPU + {1AFDD005-7AB9-48E0-B6D4-4DE0560C936D} + Exe + + + + + + + + + + + + Always + + + + diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il b/tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il new file mode 100644 index 000000000000..077bdf9a9dbc --- /dev/null +++ b/tests/src/ilasm/System/Runtime/CompilerServices/MiAggressiveOptimization.il @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +.assembly extern System.Runtime {} +.assembly MiAggressiveOptimization {} +.module MiAggressiveOptimization.dll +// MVID: {B5A4E68E-19B7-4FA3-9BE2-2A0B7265233B} + +.class public abstract auto ansi sealed beforefieldinit Program + extends [System.Runtime]System.Object +{ + .method public hidebysig static void Main() cil managed aggressiveoptimization + { + .entrypoint + // Code size 1 (0x1) + .maxstack 8 + IL_0000: ret + } // end of method Program::Main + +} // end of class Program From e33595bae66a47949fd353ab8fed0c5c6008076b Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Mon, 17 Sep 2018 13:42:48 -0700 Subject: [PATCH 2/8] Fix switches --- .../System/Runtime/CompilerServices/MethodImplOptionsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs index 3793ed3238b0..30fbd5e7ab40 100644 --- a/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs +++ b/tests/src/ilasm/System/Runtime/CompilerServices/MethodImplOptionsTests.cs @@ -140,13 +140,13 @@ private static void GetIlasmProcessStartInfos( ilasmPsi.FileName = ilasmFile; string asmDllFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}.dll"; ilasmPsi.Arguments = - $"/nologo /dll /optimize /output={asmDllFileName} {ilFileName}"; + $"-nologo -dll -optimize -output={asmDllFileName} {ilFileName}"; ildasmPsi = new ProcessStartInfo(); ildasmPsi.UseShellExecute = false; ildasmPsi.WorkingDirectory = currentDirectory; ildasmPsi.FileName = ildasmFile; disasmIlFileName = $"{Path.GetFileNameWithoutExtension(ilFileName)}_dis{Path.GetExtension(ilFileName)}"; - ildasmPsi.Arguments = $"/out={disasmIlFileName} {asmDllFileName}"; + ildasmPsi.Arguments = $"-out={disasmIlFileName} {asmDllFileName}"; } } From 5ef7cd1ce14b5ce1db9f21c659e9ad5bf03dea96 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Tue, 18 Sep 2018 10:53:44 -0700 Subject: [PATCH 3/8] If pregenerated r2r code is available, assume it is optimized as requested --- src/vm/prestub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 09939bc07153..6ca05f146118 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -334,7 +334,7 @@ PCODE MethodDesc::GetPrecompiledCode(PrepareCodeConfig* pConfig) #endif #ifdef FEATURE_READYTORUN - if (pCode == NULL && !RequestedAggressiveOptimization()) + if (pCode == NULL) { pCode = GetPrecompiledR2RCode(pConfig); if (pCode != NULL) From 62dd5972cc6284c7321655c3d4d0fea1a87528e9 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Tue, 18 Sep 2018 16:37:35 -0700 Subject: [PATCH 4/8] Specify tier when adding a native code version --- src/vm/codeversion.cpp | 33 +++++++++++++++++++++++---------- src/vm/codeversion.h | 8 ++++---- src/vm/prestub.cpp | 1 - src/vm/tieredcompilation.cpp | 3 +-- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/vm/codeversion.cpp b/src/vm/codeversion.cpp index ac99d64bf28c..d0231a867dc6 100644 --- a/src/vm/codeversion.cpp +++ b/src/vm/codeversion.cpp @@ -50,17 +50,19 @@ bool NativeCodeVersion::operator!=(const NativeCodeVersion & rhs) const { return #define CORPROF_E_RUNTIME_SUSPEND_REQUIRED 0x80131381 #ifndef DACCESS_COMPILE -NativeCodeVersionNode::NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethodDesc, ReJITID parentId) : +NativeCodeVersionNode::NativeCodeVersionNode( + NativeCodeVersionId id, + MethodDesc* pMethodDesc, + ReJITID parentId, + NativeCodeVersion::OptimizationTier optimizationTier) + : m_pNativeCode(NULL), m_pMethodDesc(pMethodDesc), m_parentId(parentId), m_pNextMethodDescSibling(NULL), m_id(id), #ifdef FEATURE_TIERED_COMPILATION - m_optTier( - pMethodDesc->RequestedAggressiveOptimization() - ? NativeCodeVersion::OptimizationTier1 - : NativeCodeVersion::OptimizationTier0), + m_optTier(optimizationTier), #endif m_flags(0) {} @@ -889,11 +891,14 @@ void ILCodeVersion::SetInstrumentedILMap(SIZE_T cMap, COR_IL_MAP * rgMap) AsNode()->SetInstrumentedILMap(cMap, rgMap); } -HRESULT ILCodeVersion::AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion) +HRESULT ILCodeVersion::AddNativeCodeVersion( + MethodDesc* pClosedMethodDesc, + NativeCodeVersion::OptimizationTier optimizationTier, + NativeCodeVersion* pNativeCodeVersion) { LIMITED_METHOD_CONTRACT; CodeVersionManager* pManager = GetModule()->GetCodeVersionManager(); - HRESULT hr = pManager->AddNativeCodeVersion(*this, pClosedMethodDesc, pNativeCodeVersion); + HRESULT hr = pManager->AddNativeCodeVersion(*this, pClosedMethodDesc, optimizationTier, pNativeCodeVersion); if (FAILED(hr)) { _ASSERTE(hr == E_OUTOFMEMORY); @@ -909,7 +914,11 @@ HRESULT ILCodeVersion::GetOrCreateActiveNativeCodeVersion(MethodDesc* pClosedMet NativeCodeVersion activeNativeChild = GetActiveNativeCodeVersion(pClosedMethodDesc); if (activeNativeChild.IsNull()) { - if (FAILED(hr = AddNativeCodeVersion(pClosedMethodDesc, &activeNativeChild))) + NativeCodeVersion::OptimizationTier optimizationTier = + pClosedMethodDesc->RequestedAggressiveOptimization() + ? NativeCodeVersion::OptimizationTier1 + : NativeCodeVersion::OptimizationTier0; + if (FAILED(hr = AddNativeCodeVersion(pClosedMethodDesc, optimizationTier, &activeNativeChild))) { _ASSERTE(hr == E_OUTOFMEMORY); return hr; @@ -2106,7 +2115,11 @@ HRESULT CodeVersionManager::SetActiveILCodeVersions(ILCodeVersion* pActiveVersio return S_OK; } -HRESULT CodeVersionManager::AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion) +HRESULT CodeVersionManager::AddNativeCodeVersion( + ILCodeVersion ilCodeVersion, + MethodDesc* pClosedMethodDesc, + NativeCodeVersion::OptimizationTier optimizationTier, + NativeCodeVersion* pNativeCodeVersion) { LIMITED_METHOD_CONTRACT; _ASSERTE(LockOwnedByCurrentThread()); @@ -2120,7 +2133,7 @@ HRESULT CodeVersionManager::AddNativeCodeVersion(ILCodeVersion ilCodeVersion, Me } NativeCodeVersionId newId = pMethodVersioningState->AllocateVersionId(); - NativeCodeVersionNode* pNativeCodeVersionNode = new (nothrow) NativeCodeVersionNode(newId, pClosedMethodDesc, ilCodeVersion.GetVersionId()); + NativeCodeVersionNode* pNativeCodeVersionNode = new (nothrow) NativeCodeVersionNode(newId, pClosedMethodDesc, ilCodeVersion.GetVersionId(), optimizationTier); if (pNativeCodeVersionNode == NULL) { return E_OUTOFMEMORY; diff --git a/src/vm/codeversion.h b/src/vm/codeversion.h index b9004a583feb..4a8745b13b63 100644 --- a/src/vm/codeversion.h +++ b/src/vm/codeversion.h @@ -64,12 +64,12 @@ class NativeCodeVersion #ifndef DACCESS_COMPILE BOOL SetNativeCodeInterlocked(PCODE pCode, PCODE pExpected = NULL); #endif -#ifdef FEATURE_TIERED_COMPILATION enum OptimizationTier { OptimizationTier0, OptimizationTier1 }; +#ifdef FEATURE_TIERED_COMPILATION OptimizationTier GetOptimizationTier() const; #ifndef DACCESS_COMPILE void SetOptimizationTier(OptimizationTier tier); @@ -152,7 +152,7 @@ class ILCodeVersion void SetIL(COR_ILMETHOD* pIL); void SetJitFlags(DWORD flags); void SetInstrumentedILMap(SIZE_T cMap, COR_IL_MAP * rgMap); - HRESULT AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion); + HRESULT AddNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion::OptimizationTier optimizationTier, NativeCodeVersion* pNativeCodeVersion); HRESULT GetOrCreateActiveNativeCodeVersion(MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion); HRESULT SetActiveNativeCodeVersion(NativeCodeVersion activeNativeCodeVersion, BOOL fEESuspended); #endif //DACCESS_COMPILE @@ -223,7 +223,7 @@ class NativeCodeVersionNode friend ILCodeVersionNode; public: #ifndef DACCESS_COMPILE - NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethod, ReJITID parentId); + NativeCodeVersionNode(NativeCodeVersionId id, MethodDesc* pMethod, ReJITID parentId, NativeCodeVersion::OptimizationTier optimizationTier); #endif #ifdef DEBUG BOOL LockOwnedByCurrentThread() const; @@ -609,7 +609,7 @@ class CodeVersionManager }; HRESULT AddILCodeVersion(Module* pModule, mdMethodDef methodDef, ReJITID rejitId, ILCodeVersion* pILCodeVersion); - HRESULT AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion* pNativeCodeVersion); + HRESULT AddNativeCodeVersion(ILCodeVersion ilCodeVersion, MethodDesc* pClosedMethodDesc, NativeCodeVersion::OptimizationTier optimizationTier, NativeCodeVersion* pNativeCodeVersion); HRESULT DoJumpStampIfNecessary(MethodDesc* pMD, PCODE pCode); PCODE PublishVersionableCodeIfNecessary(MethodDesc* pMethodDesc, BOOL fCanBackpatchPrestub); HRESULT PublishNativeCodeVersion(MethodDesc* pMethodDesc, NativeCodeVersion nativeCodeVersion, BOOL fEESuspended); diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 6ca05f146118..420bcaa26dd4 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -1754,7 +1754,6 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT) { if (RequestedAggressiveOptimization()) { - fEligibleForCallCounting = FALSE; fWasPromotedToTier1 = TRUE; } else if (g_pConfig->TieredCompilation_CallCounting()) diff --git a/src/vm/tieredcompilation.cpp b/src/vm/tieredcompilation.cpp index 9c9e76de18e3..be8b56ea80a0 100644 --- a/src/vm/tieredcompilation.cpp +++ b/src/vm/tieredcompilation.cpp @@ -213,7 +213,7 @@ void TieredCompilationManager::AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc } HRESULT hr = S_OK; - if (FAILED(hr = ilVersion.AddNativeCodeVersion(pMethodDesc, &t1NativeCodeVersion))) + if (FAILED(hr = ilVersion.AddNativeCodeVersion(pMethodDesc, NativeCodeVersion::OptimizationTier1, &t1NativeCodeVersion))) { // optimization didn't work for some reason (presumably OOM) // just give up and continue on @@ -222,7 +222,6 @@ void TieredCompilationManager::AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc hr, pMethodDesc); return; } - t1NativeCodeVersion.SetOptimizationTier(NativeCodeVersion::OptimizationTier1); } // Insert the method into the optimization queue and trigger a thread to service From eca77d2a76a2aeebeb16524a9682c614ebf3a287 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Wed, 19 Sep 2018 04:51:54 -0700 Subject: [PATCH 5/8] Refactor some things --- src/vm/CMakeLists.txt | 2 +- src/vm/codeversion.cpp | 33 +++------------------------------ src/vm/codeversion.h | 8 +------- src/vm/prestub.cpp | 27 ++++++++++----------------- src/vm/tieredcompilation.cpp | 36 ++++++++++++++++++++++++++++++++++-- src/vm/tieredcompilation.h | 14 +++++++++++--- src/zap/zapinfo.cpp | 14 ++++++++------ 7 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt index 54c73cce4434..58de64694ecb 100644 --- a/src/vm/CMakeLists.txt +++ b/src/vm/CMakeLists.txt @@ -111,6 +111,7 @@ set(VM_SOURCES_DAC_AND_WKS_COMMON threadpoolrequest.cpp threads.cpp threadstatics.cpp + tieredcompilation.cpp typectxt.cpp typedesc.cpp typehandle.cpp @@ -381,7 +382,6 @@ set(VM_SOURCES_WKS synch.cpp synchronizationcontextnative.cpp testhookmgr.cpp - tieredcompilation.cpp threaddebugblockinginfo.cpp threadsuspend.cpp typeparse.cpp diff --git a/src/vm/codeversion.cpp b/src/vm/codeversion.cpp index d0231a867dc6..5f7ef16f7b6a 100644 --- a/src/vm/codeversion.cpp +++ b/src/vm/codeversion.cpp @@ -150,15 +150,8 @@ void NativeCodeVersionNode::SetActiveChildFlag(BOOL isActive) NativeCodeVersion::OptimizationTier NativeCodeVersionNode::GetOptimizationTier() const { LIMITED_METHOD_DAC_CONTRACT; - return m_optTier.Load(); + return m_optTier; } -#ifndef DACCESS_COMPILE -void NativeCodeVersionNode::SetOptimizationTier(NativeCodeVersion::OptimizationTier tier) -{ - LIMITED_METHOD_DAC_CONTRACT; - m_optTier.Store(tier); -} -#endif #endif // FEATURE_TIERED_COMPILATION NativeCodeVersion::NativeCodeVersion() : @@ -343,27 +336,9 @@ NativeCodeVersion::OptimizationTier NativeCodeVersion::GetOptimizationTier() con } else { - return - GetMethodDesc()->RequestedAggressiveOptimization() - ? NativeCodeVersion::OptimizationTier1 - : NativeCodeVersion::OptimizationTier0; + return TieredCompilationManager::GetInitialOptimizationTier(GetMethodDesc()); } } - -#ifndef DACCESS_COMPILE -void NativeCodeVersion::SetOptimizationTier(NativeCodeVersion::OptimizationTier tier) -{ - LIMITED_METHOD_CONTRACT; - if (m_storageKind == StorageKind::Explicit) - { - AsNode()->SetOptimizationTier(tier); - } - else - { - _ASSERTE(!"Do not call SetOptimizationTier on default code versions - these versions are immutable"); - } -} -#endif #endif PTR_NativeCodeVersionNode NativeCodeVersion::AsNode() const @@ -915,9 +890,7 @@ HRESULT ILCodeVersion::GetOrCreateActiveNativeCodeVersion(MethodDesc* pClosedMet if (activeNativeChild.IsNull()) { NativeCodeVersion::OptimizationTier optimizationTier = - pClosedMethodDesc->RequestedAggressiveOptimization() - ? NativeCodeVersion::OptimizationTier1 - : NativeCodeVersion::OptimizationTier0; + TieredCompilationManager::GetInitialOptimizationTier(pClosedMethodDesc); if (FAILED(hr = AddNativeCodeVersion(pClosedMethodDesc, optimizationTier, &activeNativeChild))) { _ASSERTE(hr == E_OUTOFMEMORY); diff --git a/src/vm/codeversion.h b/src/vm/codeversion.h index 4a8745b13b63..6dddacc69d30 100644 --- a/src/vm/codeversion.h +++ b/src/vm/codeversion.h @@ -71,9 +71,6 @@ class NativeCodeVersion }; #ifdef FEATURE_TIERED_COMPILATION OptimizationTier GetOptimizationTier() const; -#ifndef DACCESS_COMPILE - void SetOptimizationTier(OptimizationTier tier); -#endif #endif // FEATURE_TIERED_COMPILATION bool operator==(const NativeCodeVersion & rhs) const; bool operator!=(const NativeCodeVersion & rhs) const; @@ -240,9 +237,6 @@ class NativeCodeVersionNode #endif #ifdef FEATURE_TIERED_COMPILATION NativeCodeVersion::OptimizationTier GetOptimizationTier() const; -#ifndef DACCESS_COMPILE - void SetOptimizationTier(NativeCodeVersion::OptimizationTier tier); -#endif #endif private: @@ -256,7 +250,7 @@ class NativeCodeVersionNode PTR_NativeCodeVersionNode m_pNextMethodDescSibling; NativeCodeVersionId m_id; #ifdef FEATURE_TIERED_COMPILATION - Volatile m_optTier; + NativeCodeVersion::OptimizationTier m_optTier; #endif enum NativeCodeVersionNodeFlags diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 420bcaa26dd4..1893cf6c23de 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -1745,25 +1745,16 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT) // When the TieredCompilationManager has received enough call notifications // for this method only then do we back-patch it. BOOL fCanBackpatchPrestub = TRUE; - BOOL fEligibleForCallCounting = FALSE; #ifdef FEATURE_TIERED_COMPILATION + BOOL fNeedsCallCounting = FALSE; TieredCompilationManager* pTieredCompilationManager = nullptr; - BOOL fEligibleForTieredCompilation = IsEligibleForTieredCompilation(); - BOOL fWasPromotedToTier1 = FALSE; - if (fEligibleForTieredCompilation) + if (IsEligibleForTieredCompilation() && TieredCompilationManager::RequiresCallCounting(this)) { - if (RequestedAggressiveOptimization()) - { - fWasPromotedToTier1 = TRUE; - } - else if (g_pConfig->TieredCompilation_CallCounting()) - { - fEligibleForCallCounting = TRUE; - - pTieredCompilationManager = GetAppDomain()->GetTieredCompilationManager(); - CallCounter * pCallCounter = GetCallCounter(); - pCallCounter->OnMethodCalled(this, pTieredCompilationManager, &fCanBackpatchPrestub, &fWasPromotedToTier1); - } + pTieredCompilationManager = GetAppDomain()->GetTieredCompilationManager(); + CallCounter * pCallCounter = GetCallCounter(); + BOOL fWasPromotedToTier1 = FALSE; + pCallCounter->OnMethodCalled(this, pTieredCompilationManager, &fCanBackpatchPrestub, &fWasPromotedToTier1); + fNeedsCallCounting = !fWasPromotedToTier1; } #endif @@ -1776,10 +1767,12 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT) { pCode = GetCodeVersionManager()->PublishVersionableCodeIfNecessary(this, fCanBackpatchPrestub); - if (pTieredCompilationManager != nullptr && fEligibleForCallCounting && fCanBackpatchPrestub && pCode != NULL && !fWasPromotedToTier1) +#ifdef FEATURE_TIERED_COMPILATION + if (pTieredCompilationManager != nullptr && fNeedsCallCounting && fCanBackpatchPrestub && pCode != NULL) { pTieredCompilationManager->OnMethodCallCountingStoppedWithoutTier1Promotion(this); } +#endif fIsPointingToPrestub = IsPointingToPrestub(); } diff --git a/src/vm/tieredcompilation.cpp b/src/vm/tieredcompilation.cpp index be8b56ea80a0..2c24618bd8ff 100644 --- a/src/vm/tieredcompilation.cpp +++ b/src/vm/tieredcompilation.cpp @@ -58,7 +58,7 @@ // errors are limited to OS resource exhaustion or poorly behaved managed code // (for example within an AssemblyResolve event or static constructor triggered by the JIT). -#ifdef FEATURE_TIERED_COMPILATION +#if defined(FEATURE_TIERED_COMPILATION) && !defined(DACCESS_COMPILE) // Called at AppDomain construction TieredCompilationManager::TieredCompilationManager() : @@ -91,6 +91,38 @@ void TieredCompilationManager::Init(ADID appDomainId) m_callCountOptimizationThreshhold = g_pConfig->TieredCompilation_Tier1CallCountThreshold(); } +#endif // FEATURE_TIERED_COMPILATION && !DACCESS_COMPILE + +NativeCodeVersion::OptimizationTier TieredCompilationManager::GetInitialOptimizationTier(PTR_MethodDesc pMethodDesc) +{ + WRAPPER_NO_CONTRACT; + _ASSERTE(pMethodDesc != NULL); + +#ifdef FEATURE_TIERED_COMPILATION + if (pMethodDesc->RequestedAggressiveOptimization()) + { + // Methods flagged with MethodImplOptions.AggressiveOptimization begin at tier 1, as a workaround to cold methods with + // hot loops performing poorly (https://github.com/dotnet/coreclr/issues/19751) + return NativeCodeVersion::OptimizationTier1; + } +#endif // FEATURE_TIERED_COMPILATION + + return NativeCodeVersion::OptimizationTier0; +} + +#if defined(FEATURE_TIERED_COMPILATION) && !defined(DACCESS_COMPILE) + +bool TieredCompilationManager::RequiresCallCounting(MethodDesc* pMethodDesc) +{ + WRAPPER_NO_CONTRACT; + _ASSERTE(pMethodDesc != NULL); + _ASSERTE(pMethodDesc->IsEligibleForTieredCompilation()); + + return + g_pConfig->TieredCompilation_CallCounting() && + GetInitialOptimizationTier(pMethodDesc) == NativeCodeVersion::OptimizationTier0; +} + // Called each time code in this AppDomain has been run. This is our sole entrypoint to begin // tiered compilation for now. Returns TRUE if no more notifications are necessary, but // more notifications may come anyways. @@ -790,4 +822,4 @@ CORJIT_FLAGS TieredCompilationManager::GetJitFlags(NativeCodeVersion nativeCodeV return flags; } -#endif // FEATURE_TIERED_COMPILATION +#endif // FEATURE_TIERED_COMPILATION && !DACCESS_COMPILE diff --git a/src/vm/tieredcompilation.h b/src/vm/tieredcompilation.h index b208f26256e0..072f8e16c4aa 100644 --- a/src/vm/tieredcompilation.h +++ b/src/vm/tieredcompilation.h @@ -10,13 +10,13 @@ #ifndef TIERED_COMPILATION_H #define TIERED_COMPILATION_H -#ifdef FEATURE_TIERED_COMPILATION - // TieredCompilationManager determines which methods should be recompiled and // how they should be recompiled to best optimize the running code. It then // handles logistics of getting new code created and installed. class TieredCompilationManager { +#ifdef FEATURE_TIERED_COMPILATION + public: #if defined(DACCESS_COMPILE) || defined(CROSSGEN_COMPILE) TieredCompilationManager() {} @@ -26,7 +26,15 @@ class TieredCompilationManager void Init(ADID appDomainId); +#endif // FEATURE_TIERED_COMPILATION + public: + static NativeCodeVersion::OptimizationTier GetInitialOptimizationTier(PTR_MethodDesc pMethodDesc); + +#ifdef FEATURE_TIERED_COMPILATION + +public: + static bool RequiresCallCounting(MethodDesc* pMethodDesc); void OnMethodCalled(MethodDesc* pMethodDesc, DWORD currentCallCount, BOOL* shouldStopCountingCallsRef, BOOL* wasPromotedToTier1Ref); void OnMethodCallCountingStoppedWithoutTier1Promotion(MethodDesc* pMethodDesc); void AsyncPromoteMethodToTier1(MethodDesc* pMethodDesc); @@ -68,8 +76,8 @@ class TieredCompilationManager bool m_tier1CallCountingCandidateMethodRecentlyRecorded; CLREvent m_asyncWorkDoneEvent; -}; #endif // FEATURE_TIERED_COMPILATION +}; #endif // TIERED_COMPILATION_H diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp index 7efdaba949e2..0a78210b93eb 100644 --- a/src/zap/zapinfo.cpp +++ b/src/zap/zapinfo.cpp @@ -437,15 +437,17 @@ void ZapInfo::CompileMethod() m_jitFlags = ComputeJitFlags(m_currentMethodHandle); + if (m_jitFlags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT)) + { + // Skip methods marked with MethodImplOptions.AggressiveOptimization, they will be jitted instead. In the future, + // consider letting the JIT determine whether aggressively optimized code can/should be pregenerated for the method + // instead of this check. + return; + } + #ifdef FEATURE_READYTORUN_COMPILER if (IsReadyToRunCompilation()) { - if (m_jitFlags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT)) - { - // Skip methods marked with MethodImplOptions.AggressiveOptimization, they will be jitted instead - return; - } - // READYTORUN: FUTURE: Producedure spliting m_jitFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROCSPLIT); From 380321a653087ea7ca9126466b3a63baded48962 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Mon, 1 Oct 2018 11:16:36 -0700 Subject: [PATCH 6/8] Use CORINFO_FLG instead of CORJIT_FLAG --- src/inc/corinfo.h | 2 +- src/inc/corjitflags.h | 2 +- src/vm/jitinterface.cpp | 17 ++++++++++++----- src/vm/method.hpp | 2 +- src/zap/zapinfo.cpp | 8 ++++---- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/inc/corinfo.h b/src/inc/corinfo.h index 97f3be9cee10..88f8c1b8c2b7 100644 --- a/src/inc/corinfo.h +++ b/src/inc/corinfo.h @@ -824,7 +824,7 @@ enum CorInfoFlag CORINFO_FLG_NOGCCHECK = 0x00200000, // This method is FCALL that has no GC check. Don't put alone in loops CORINFO_FLG_INTRINSIC = 0x00400000, // This method MAY have an intrinsic ID CORINFO_FLG_CONSTRUCTOR = 0x00800000, // This method is an instance or type initializer -// CORINFO_FLG_UNUSED = 0x01000000, + CORINFO_FLG_AGGRESSIVE_OPT = 0x01000000, // The method may contain hot code and should be aggressively optimized if possible // CORINFO_FLG_UNUSED = 0x02000000, CORINFO_FLG_NOSECURITYWRAP = 0x04000000, // The method requires no security checks CORINFO_FLG_DONT_INLINE = 0x10000000, // The method should not be inlined diff --git a/src/inc/corjitflags.h b/src/inc/corjitflags.h index ff8bcb18d158..84fb42f08306 100644 --- a/src/inc/corjitflags.h +++ b/src/inc/corjitflags.h @@ -52,7 +52,7 @@ class CORJIT_FLAGS #endif // !defined(_TARGET_X86_) - CORJIT_FLAG_AGGRESSIVE_OPT = 13, + CORJIT_FLAG_UNUSED6 = 13, #if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index c359f0931925..28e17e9e3e1a 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -6776,6 +6776,17 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn) result |= CORINFO_FLG_DONT_INLINE_CALLER; } + // Check for the aggressive optimization directive. AggressiveOptimization only makes sense for IL methods. + DWORD ilMethodImplAttribs = 0; + if (pMD->IsIL()) + { + ilMethodImplAttribs = pMD->GetImplAttrs(); + if (IsMiAggressiveOptimization(ilMethodImplAttribs)) + { + result |= CORINFO_FLG_AGGRESSIVE_OPT; + } + } + // Check for an inlining directive. if (pMD->IsNotInline()) { @@ -6783,7 +6794,7 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn) result |= CORINFO_FLG_DONT_INLINE; } // AggressiveInlining only makes sense for IL methods. - else if (pMD->IsIL() && IsMiAggressiveInlining(pMD->GetImplAttrs())) + else if (pMD->IsIL() && IsMiAggressiveInlining(ilMethodImplAttribs)) { result |= CORINFO_FLG_FORCEINLINE; } @@ -12440,10 +12451,6 @@ CorJitResult CallCompileMethodWithSEHWrapper(EEJitManager *jitMgr, { flags.Set(CORJIT_FLAGS::CORJIT_FLAG_MIN_OPT); } - else if (IsMiAggressiveOptimization(dwImplFlags)) - { - flags.Set(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT); - } // Always emit frames for methods marked no-inline (see #define ETW_EBP_FRAMED in the JIT) if (IsMiNoInlining(dwImplFlags)) diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 44202b91f6e5..3d5201a3614e 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -1273,7 +1273,7 @@ class MethodDesc DWORD dwImplFlags = 0; return - !IsNoMetadata() && + IsIL() && // only makes sense for IL methods, and this implies !IsNoMetadata() SUCCEEDED(GetMDImport()->GetMethodImplProps(GetMemberDef(), NULL, &dwImplFlags)) && IsMiAggressiveOptimization(dwImplFlags); } diff --git a/src/zap/zapinfo.cpp b/src/zap/zapinfo.cpp index 0a78210b93eb..341e0d82afee 100644 --- a/src/zap/zapinfo.cpp +++ b/src/zap/zapinfo.cpp @@ -435,9 +435,8 @@ void ZapInfo::CompileMethod() // this they can add the hint and reduce the perf cost at runtime. m_pImage->m_pPreloader->PrePrepareMethodIfNecessary(m_currentMethodHandle); - m_jitFlags = ComputeJitFlags(m_currentMethodHandle); - - if (m_jitFlags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_AGGRESSIVE_OPT)) + DWORD methodAttribs = getMethodAttribs(m_currentMethodHandle); + if (methodAttribs & CORINFO_FLG_AGGRESSIVE_OPT) { // Skip methods marked with MethodImplOptions.AggressiveOptimization, they will be jitted instead. In the future, // consider letting the JIT determine whether aggressively optimized code can/should be pregenerated for the method @@ -445,13 +444,14 @@ void ZapInfo::CompileMethod() return; } + m_jitFlags = ComputeJitFlags(m_currentMethodHandle); + #ifdef FEATURE_READYTORUN_COMPILER if (IsReadyToRunCompilation()) { // READYTORUN: FUTURE: Producedure spliting m_jitFlags.Clear(CORJIT_FLAGS::CORJIT_FLAG_PROCSPLIT); - DWORD methodAttribs = getMethodAttribs(m_currentMethodHandle); if (!(methodAttribs & CORINFO_FLG_NOSECURITYWRAP) || (methodAttribs & CORINFO_FLG_SECURITYCHECK)) { m_zapper->Warning(W("ReadyToRun: Methods with security checks not supported\n")); From de595c47b75112759c6d9b46a786fa653eb6db0d Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Tue, 2 Oct 2018 13:48:00 -0700 Subject: [PATCH 7/8] Use GetImplAttrs instead --- src/vm/method.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 3d5201a3614e..967571ec6c06 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -1274,8 +1274,7 @@ class MethodDesc DWORD dwImplFlags = 0; return IsIL() && // only makes sense for IL methods, and this implies !IsNoMetadata() - SUCCEEDED(GetMDImport()->GetMethodImplProps(GetMemberDef(), NULL, &dwImplFlags)) && - IsMiAggressiveOptimization(dwImplFlags); + IsMiAggressiveOptimization(GetImplAttrs()); } // Does this method force the NativeCodeSlot to stay fixed after it From f5e46d472d254ef14d46979996b2bdc5955f07e5 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Wed, 3 Oct 2018 05:48:59 -0700 Subject: [PATCH 8/8] Fix build --- src/vm/method.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 967571ec6c06..57561ef89996 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -1271,7 +1271,6 @@ class MethodDesc { WRAPPER_NO_CONTRACT; - DWORD dwImplFlags = 0; return IsIL() && // only makes sense for IL methods, and this implies !IsNoMetadata() IsMiAggressiveOptimization(GetImplAttrs());