3 // Licensed to the .NET Foundation under one or more agreements.
4 // The .NET Foundation licenses this file to you under the MIT license.
5 // See the LICENSE file in the project root for more information.
12 #include "grammar_before.cpp"
17 CorRegTypeAttr classAttr;
18 CorMethodAttr methAttr;
19 CorFieldAttr fieldAttr;
20 CorMethodImpl implAttr;
21 CorEventAttr eventAttr;
22 CorPropertyAttr propAttr;
23 CorPinvokeMap pinvAttr;
24 CorDeclSecurity secAct;
25 CorFileFlags fileAttr;
26 CorAssemblyFlags asmAttr;
27 CorAssemblyFlags asmRefAttr;
29 CorManifestResourceFlags manresAttr;
36 Instr* instr; // instruction opcode
42 unsigned short opcode;
45 /* These are returned by the LEXER and have values */
46 %token ERROR_ BAD_COMMENT_ BAD_LITERAL_ /* bad strings, */
47 %token <string> ID /* testing343 */
48 %token <string> DOTTEDNAME /* System.Object */
49 %token <binstr> QSTRING /* "Hello World\n" */
50 %token <string> SQSTRING /* 'Hello World\n' */
51 %token <int32> INT32 /* 3425 0x34FA 0352 */
52 %token <int64> INT64 /* 342534523534534 0x34FA434644554 */
53 %token <float64> FLOAT64 /* -334234 24E-34 */
54 %token <int32> HEXBYTE /* 05 1A FA */
55 %token <tdd> TYPEDEF_T
56 %token <tdd> TYPEDEF_M
57 %token <tdd> TYPEDEF_F
58 %token <tdd> TYPEDEF_TS
59 %token <tdd> TYPEDEF_MR
60 %token <tdd> TYPEDEF_CA
63 /* multi-character punctuation */
64 %token DCOLON /* :: */
65 %token ELIPSIS /* ... */
67 /* Keywords Note the undersores are to avoid collisions as these are common names */
68 %token VOID_ BOOL_ CHAR_ UNSIGNED_ INT_ INT8_ INT16_ INT32_ INT64_ FLOAT_ FLOAT32_ FLOAT64_ BYTEARRAY_
69 %token UINT_ UINT8_ UINT16_ UINT32_ UINT64_ FLAGS_ CALLCONV_ MDTOKEN_
70 %token OBJECT_ STRING_ NULLREF_
72 %token DEFAULT_ CDECL_ VARARG_ STDCALL_ THISCALL_ FASTCALL_ CLASS_
73 %token TYPEDREF_ UNMANAGED_ FINALLY_ HANDLER_ CATCH_ FILTER_ FAULT_
74 %token EXTENDS_ IMPLEMENTS_ TO_ AT_ TLS_ TRUE_ FALSE_ _INTERFACEIMPL
76 /* class, method, field attributes */
78 %token VALUE_ VALUETYPE_ NATIVE_ INSTANCE_ SPECIALNAME_ FORWARDER_
79 %token STATIC_ PUBLIC_ PRIVATE_ FAMILY_ FINAL_ SYNCHRONIZED_ INTERFACE_ SEALED_ NESTED_
80 %token ABSTRACT_ AUTO_ SEQUENTIAL_ EXPLICIT_ ANSI_ UNICODE_ AUTOCHAR_ IMPORT_ ENUM_
81 %token VIRTUAL_ NOINLINING_ AGGRESSIVEINLINING_ NOOPTIMIZATION_ AGGRESSIVEOPTIMIZATION_ UNMANAGEDEXP_ BEFOREFIELDINIT_
82 %token STRICT_ RETARGETABLE_ WINDOWSRUNTIME_ NOPLATFORM_
83 %token METHOD_ FIELD_ PINNED_ MODREQ_ MODOPT_ SERIALIZABLE_ PROPERTY_ TYPE_
84 %token ASSEMBLY_ FAMANDASSEM_ FAMORASSEM_ PRIVATESCOPE_ HIDEBYSIG_ NEWSLOT_ RTSPECIALNAME_ PINVOKEIMPL_
85 %token _CTOR _CCTOR LITERAL_ NOTSERIALIZED_ INITONLY_ REQSECOBJ_
86 /* method implementation attributes: NATIVE_ and UNMANAGED_ listed above */
87 %token CIL_ OPTIL_ MANAGED_ FORWARDREF_ PRESERVESIG_ RUNTIME_ INTERNALCALL_
88 /* PInvoke-specific keywords */
89 %token _IMPORT NOMANGLE_ LASTERR_ WINAPI_ AS_ BESTFIT_ ON_ OFF_ CHARMAPERROR_
91 /* intruction tokens (actually instruction groupings) */
92 %token <opcode> INSTR_NONE INSTR_VAR INSTR_I INSTR_I8 INSTR_R INSTR_BRTARGET INSTR_METHOD INSTR_FIELD
93 %token <opcode> INSTR_TYPE INSTR_STRING INSTR_SIG INSTR_TOK
94 %token <opcode> INSTR_SWITCH
96 /* assember directives */
97 %token _CLASS _NAMESPACE _METHOD _FIELD _DATA _THIS _BASE _NESTER
98 %token _EMITBYTE _TRY _MAXSTACK _LOCALS _ENTRYPOINT _ZEROINIT
99 %token _EVENT _ADDON _REMOVEON _FIRE _OTHER
100 %token _PROPERTY _SET _GET DEFAULT_
101 %token _PERMISSION _PERMISSIONSET
103 /* security actions */
104 %token REQUEST_ DEMAND_ ASSERT_ DENY_ PERMITONLY_ LINKCHECK_ INHERITCHECK_
105 %token REQMIN_ REQOPT_ REQREFUSE_ PREJITGRANT_ PREJITDENY_ NONCASDEMAND_
106 %token NONCASLINKDEMAND_ NONCASINHERITANCE_
108 /* extern debug info specifier (to be used by precompilers only) */
109 %token _LINE P_LINE _LANGUAGE
110 /* custom value specifier */
112 /* local vars zeroinit specifier */
116 %token _VTABLE _VTFIXUP FROMUNMANAGED_ CALLMOSTDERIVED_ _VTENTRY RETAINAPPDOMAIN_
118 %token _FILE NOMETADATA_ _HASH _ASSEMBLY _PUBLICKEY _PUBLICKEYTOKEN ALGORITHM_ _VER _LOCALE EXTERN_
120 %token _MODULE _EXPORT
121 %token LEGACY_ LIBRARY_ X86_ AMD64_ ARM_ ARM64_
122 /* field marshaling */
123 %token MARSHAL_ CUSTOM_ SYSSTRING_ FIXED_ VARIANT_ CURRENCY_ SYSCHAR_ DECIMAL_ DATE_ BSTR_ TBSTR_ LPSTR_
124 %token LPWSTR_ LPTSTR_ OBJECTREF_ IUNKNOWN_ IDISPATCH_ STRUCT_ SAFEARRAY_ BYVALSTR_ LPVOID_ ANY_ ARRAY_ LPSTRUCT_
126 /* parameter attributes */
127 %token IN_ OUT_ OPT_ PARAM_
128 /* method implementations */
129 %token _OVERRIDE WITH_
130 /* variant type specifics */
131 %token NULL_ ERROR_ HRESULT_ CARRAY_ USERDEFINED_ RECORD_ FILETIME_ BLOB_ STREAM_ STORAGE_
132 %token STREAMED_OBJECT_ STORED_OBJECT_ BLOB_OBJECT_ CF_ CLSID_ VECTOR_
134 %token _SUBSYSTEM _CORFLAGS ALIGNMENT_ _IMAGEBASE _STACKRESERVE
136 /* syntactic sugar */
137 %token _TYPEDEF _TEMPLATE _TYPELIST _MSCORLIB
139 /* compilation control directives */
140 %token P_DEFINE P_UNDEF P_IFDEF P_IFNDEF P_ELSE P_ENDIF P_INCLUDE
143 %type <string> dottedName id methodName atOpt slashedName
144 %type <labels> labels
145 %type <int32> callConv callKind int32 customHead customHeadWithOwner vtfixupAttr paramAttr ddItemCount variantType repeatOpt truefalse typarAttrib typarAttribs
146 %type <int32> iidParamIndex genArity genArityNotEmpty
147 %type <float64> float64
149 %type <binstr> sigArgs0 sigArgs1 sigArg type bound bounds1 bytes hexbytes nativeType marshalBlob initOpt compQstring caValue
150 %type <binstr> marshalClause
151 %type <binstr> fieldInit serInit fieldSerInit
152 %type <binstr> f32seq f64seq i8seq i16seq i32seq i64seq boolSeq sqstringSeq classSeq objSeq
153 %type <binstr> simpleType
154 %type <binstr> tyArgs0 tyArgs1 tyArgs2 typeList typeListNotEmpty tyBound
155 %type <binstr> customBlobDescr serializType customBlobArgs customBlobNVPairs
156 %type <binstr> secAttrBlob secAttrSetBlob
157 %type <int32> fieldOrProp intOrWildcard
158 %type <typarlist> typarsRest typars typarsClause
159 %type <token> className typeSpec ownerType customType memberRef methodRef mdtoken
160 %type <classAttr> classAttr
161 %type <methAttr> methAttr
162 %type <fieldAttr> fieldAttr
163 %type <implAttr> implAttr
164 %type <eventAttr> eventAttr
165 %type <propAttr> propAttr
166 %type <pinvAttr> pinvAttr
167 %type <pair> nameValPairs nameValPair
168 %type <secAct> secAction
169 %type <secAct> psetHead
170 %type <fileAttr> fileAttr
171 %type <fileAttr> fileEntry
172 %type <asmAttr> asmAttr
173 %type <exptAttr> exptAttr
174 %type <manresAttr> manresAttr
175 %type <cad> customDescr customDescrWithOwner
176 %type <instr> instr_none instr_var instr_i instr_i8 instr_r instr_brtarget instr_method instr_field
177 %type <instr> instr_type instr_string instr_sig instr_tok instr_switch
178 %type <instr> instr_r_head
182 /**************************************************************************/
188 /* Module-level declarations */
189 decl : classHead '{' classDecls '}' { PASM->EndClass(); }
190 | nameSpaceHead '{' decls '}' { PASM->EndNameSpace(); }
191 | methodHead methodDecls '}' { if(PASM->m_pCurMethod->m_ulLines[1] ==0)
192 { PASM->m_pCurMethod->m_ulLines[1] = PASM->m_ulCurLine;
193 PASM->m_pCurMethod->m_ulColumns[1]=PASM->m_ulCurColumn;}
201 | assemblyHead '{' assemblyDecls '}' { PASMM->EndAssembly(); }
202 | assemblyRefHead '{' assemblyRefDecls '}' { PASMM->EndAssembly(); }
203 | exptypeHead '{' exptypeDecls '}' { PASMM->EndComType(); }
204 | manifestResHead '{' manifestResDecls '}' { PASMM->EndManifestRes(); }
210 #pragma warning(push)
211 #pragma warning(disable:22011) // Suppress PREFast warning about integer overflow/underflow
213 PASM->m_dwSubsystem = $2;
218 | _CORFLAGS int32 { PASM->m_dwComImageFlags = $2; }
219 | _FILE ALIGNMENT_ int32 { PASM->m_dwFileAlignment = $3;
220 if(($3 & ($3 - 1))||($3 < 0x200)||($3 > 0x10000))
221 PASM->report->error("Invalid file alignment, must be power of 2 from 0x200 to 0x10000\n");}
222 | _IMAGEBASE int64 { PASM->m_stBaseAddress = (ULONGLONG)(*($2)); delete $2;
223 if(PASM->m_stBaseAddress & 0xFFFF)
224 PASM->report->error("Invalid image base, must be 0x10000-aligned\n");}
225 | _STACKRESERVE int64 { PASM->m_stSizeOfStackReserve = (size_t)(*($2)); delete $2; }
229 | _TYPELIST '{' classNameSeq '}'
230 | _MSCORLIB { PASM->m_fIsMscorlib = TRUE; }
233 classNameSeq : /* EMPTY */
234 | className classNameSeq
237 compQstring : QSTRING { $$ = $1; }
238 | compQstring '+' QSTRING { $$ = $1; $$->append($3); delete $3; }
241 languageDecl : _LANGUAGE SQSTRING { LPCSTRToGuid($2,&(PASM->m_guidLang)); }
242 | _LANGUAGE SQSTRING ',' SQSTRING { LPCSTRToGuid($2,&(PASM->m_guidLang));
243 LPCSTRToGuid($4,&(PASM->m_guidLangVendor));}
244 | _LANGUAGE SQSTRING ',' SQSTRING ',' SQSTRING { LPCSTRToGuid($2,&(PASM->m_guidLang));
245 LPCSTRToGuid($4,&(PASM->m_guidLangVendor));
246 LPCSTRToGuid($4,&(PASM->m_guidDoc));}
250 | SQSTRING { $$ = $1; }
253 dottedName : id { $$ = $1; }
254 | DOTTEDNAME { $$ = $1; }
255 | dottedName '.' dottedName { $$ = newStringWDel($1, '.', $3); }
258 int32 : INT32 { $$ = $1; }
261 int64 : INT64 { $$ = $1; }
262 | INT32 { $$ = neg ? new __int64($1) : new __int64((unsigned)$1); }
265 float64 : FLOAT64 { $$ = $1; }
266 | FLOAT32_ '(' int32 ')' { float f; *((__int32*) (&f)) = $3; $$ = new double(f); }
267 | FLOAT64_ '(' int64 ')' { $$ = (double*) $3; }
270 /* Aliasing of types, type specs, methods, fields and custom attributes */
271 typedefDecl : _TYPEDEF type AS_ dottedName { PASM->AddTypeDef($2,$4); }
272 | _TYPEDEF className AS_ dottedName { PASM->AddTypeDef($2,$4); }
273 | _TYPEDEF memberRef AS_ dottedName { PASM->AddTypeDef($2,$4); }
274 | _TYPEDEF customDescr AS_ dottedName { $2->tkOwner = 0; PASM->AddTypeDef($2,$4); }
275 | _TYPEDEF customDescrWithOwner AS_ dottedName { PASM->AddTypeDef($2,$4); }
278 /* Compilation control directives are processed within yylex(),
279 displayed here just for grammar completeness */
280 compControl : P_DEFINE dottedName { DefineVar($2, NULL); }
281 | P_DEFINE dottedName compQstring { DefineVar($2, $3); }
282 | P_UNDEF dottedName { UndefVar($2); }
283 | P_IFDEF dottedName { SkipToken = !IsVarDefined($2);
286 | P_IFNDEF dottedName { SkipToken = IsVarDefined($2);
289 | P_ELSE { if(IfEndif == 1) SkipToken = !SkipToken;}
290 | P_ENDIF { if(IfEndif == 0)
291 PASM->report->error("Unmatched #endif\n");
294 | P_INCLUDE QSTRING { _ASSERTE(!"yylex should have dealt with this"); }
298 /* Custom attribute declarations */
299 customDescr : _CUSTOM customType { $$ = new CustomDescr(PASM->m_tkCurrentCVOwner, $2, NULL); }
300 | _CUSTOM customType '=' compQstring { $$ = new CustomDescr(PASM->m_tkCurrentCVOwner, $2, $4); }
301 | _CUSTOM customType '=' '{' customBlobDescr '}' { $$ = new CustomDescr(PASM->m_tkCurrentCVOwner, $2, $5); }
302 | customHead bytes ')' { $$ = new CustomDescr(PASM->m_tkCurrentCVOwner, $1, $2); }
305 customDescrWithOwner : _CUSTOM '(' ownerType ')' customType { $$ = new CustomDescr($3, $5, NULL); }
306 | _CUSTOM '(' ownerType ')' customType '=' compQstring { $$ = new CustomDescr($3, $5, $7); }
307 | _CUSTOM '(' ownerType ')' customType '=' '{' customBlobDescr '}'
308 { $$ = new CustomDescr($3, $5, $8); }
309 | customHeadWithOwner bytes ')' { $$ = new CustomDescr(PASM->m_tkCurrentCVOwner, $1, $2); }
312 customHead : _CUSTOM customType '=' '(' { $$ = $2; bParsingByteArray = TRUE; }
315 customHeadWithOwner : _CUSTOM '(' ownerType ')' customType '=' '('
316 { PASM->m_pCustomDescrList = NULL;
317 PASM->m_tkCurrentCVOwner = $3;
318 $$ = $5; bParsingByteArray = TRUE; }
321 customType : methodRef { $$ = $1; }
324 ownerType : typeSpec { $$ = $1; }
325 | memberRef { $$ = $1; }
328 /* Verbal description of custom attribute initialization blob */
329 customBlobDescr : customBlobArgs customBlobNVPairs { $$ = $1;
330 $$->appendInt16(nCustomBlobNVPairs);
332 nCustomBlobNVPairs = 0; }
335 customBlobArgs : /* EMPTY */ { $$ = new BinStr(); $$->appendInt16(VAL16(0x0001)); }
336 | customBlobArgs serInit { $$ = $1;
337 $$->appendFrom($2, (*($2->ptr()) == ELEMENT_TYPE_SZARRAY) ? 2 : 1); }
338 | customBlobArgs compControl { $$ = $1; }
341 customBlobNVPairs : /* EMPTY */ { $$ = new BinStr(); }
342 | customBlobNVPairs fieldOrProp serializType dottedName '=' serInit
343 { $$ = $1; $$->appendInt8($2);
345 AppendStringWithLength($$,$4);
346 $$->appendFrom($6, (*($6->ptr()) == ELEMENT_TYPE_SZARRAY) ? 2 : 1);
347 nCustomBlobNVPairs++; }
348 | customBlobNVPairs compControl { $$ = $1; }
351 fieldOrProp : FIELD_ { $$ = SERIALIZATION_TYPE_FIELD; }
352 | PROPERTY_ { $$ = SERIALIZATION_TYPE_PROPERTY; }
355 customAttrDecl : customDescr { if($1->tkOwner && !$1->tkInterfacePair)
357 else if(PASM->m_pCustomDescrList)
358 PASM->m_pCustomDescrList->PUSH($1); }
359 | customDescrWithOwner { PASM->DefineCV($1); }
360 | TYPEDEF_CA { CustomDescr* pNew = new CustomDescr($1->m_pCA);
361 if(pNew->tkOwner == 0) pNew->tkOwner = PASM->m_tkCurrentCVOwner;
363 PASM->DefineCV(pNew);
364 else if(PASM->m_pCustomDescrList)
365 PASM->m_pCustomDescrList->PUSH(pNew); }
368 serializType : simpleType { $$ = $1; }
369 | TYPE_ { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_TYPE); }
370 | OBJECT_ { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_TAGGED_OBJECT); }
371 | ENUM_ CLASS_ SQSTRING { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_ENUM);
372 AppendStringWithLength($$,$3); }
373 | ENUM_ className { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_ENUM);
374 AppendStringWithLength($$,PASM->ReflectionNotation($2)); }
375 | serializType '[' ']' { $$ = $1; $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
379 /* Module declaration */
380 moduleHead : _MODULE { PASMM->SetModuleName(NULL); PASM->m_tkCurrentCVOwner=1; }
381 | _MODULE dottedName { PASMM->SetModuleName($2); PASM->m_tkCurrentCVOwner=1; }
382 | _MODULE EXTERN_ dottedName { BinStr* pbs = new BinStr();
383 unsigned L = (unsigned)strlen($3);
384 memcpy((char*)(pbs->getBuff(L)),$3,L);
385 PASM->EmitImport(pbs); delete pbs;}
388 /* VTable Fixup table declaration */
389 vtfixupDecl : _VTFIXUP '[' int32 ']' vtfixupAttr AT_ id { /*PASM->SetDataSection(); PASM->EmitDataLabel($7);*/
390 PASM->m_VTFList.PUSH(new VTFEntry((USHORT)$3, (USHORT)$5, $7)); }
393 vtfixupAttr : /* EMPTY */ { $$ = 0; }
394 | vtfixupAttr INT32_ { $$ = $1 | COR_VTABLE_32BIT; }
395 | vtfixupAttr INT64_ { $$ = $1 | COR_VTABLE_64BIT; }
396 | vtfixupAttr FROMUNMANAGED_ { $$ = $1 | COR_VTABLE_FROM_UNMANAGED; }
397 | vtfixupAttr CALLMOSTDERIVED_ { $$ = $1 | COR_VTABLE_CALL_MOST_DERIVED; }
398 | vtfixupAttr RETAINAPPDOMAIN_ { $$ = $1 | COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN; }
401 vtableDecl : vtableHead bytes ')' /* deprecated */ { PASM->m_pVTable = $2; }
404 vtableHead : _VTABLE '=' '(' /* deprecated */ { bParsingByteArray = TRUE; }
407 /* Namespace and class declaration */
408 nameSpaceHead : _NAMESPACE dottedName { PASM->StartNameSpace($2); }
411 _class : _CLASS { newclass = TRUE; }
414 classHeadBegin : _class classAttr dottedName typarsClause { if($4) FixupConstraints();
415 PASM->StartClass($3, $2, $4);
416 TyParFixupList.RESET(false);
420 classHead : classHeadBegin extendsClause implClause { PASM->AddClass(); }
423 classAttr : /* EMPTY */ { $$ = (CorRegTypeAttr) 0; }
424 | classAttr PUBLIC_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdPublic); }
425 | classAttr PRIVATE_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNotPublic); }
426 | classAttr VALUE_ { $$ = (CorRegTypeAttr) ($1 | 0x80000000 | tdSealed); }
427 | classAttr ENUM_ { $$ = (CorRegTypeAttr) ($1 | 0x40000000); }
428 | classAttr INTERFACE_ { $$ = (CorRegTypeAttr) ($1 | tdInterface | tdAbstract); }
429 | classAttr SEALED_ { $$ = (CorRegTypeAttr) ($1 | tdSealed); }
430 | classAttr ABSTRACT_ { $$ = (CorRegTypeAttr) ($1 | tdAbstract); }
431 | classAttr AUTO_ { $$ = (CorRegTypeAttr) (($1 & ~tdLayoutMask) | tdAutoLayout); }
432 | classAttr SEQUENTIAL_ { $$ = (CorRegTypeAttr) (($1 & ~tdLayoutMask) | tdSequentialLayout); }
433 | classAttr EXPLICIT_ { $$ = (CorRegTypeAttr) (($1 & ~tdLayoutMask) | tdExplicitLayout); }
434 | classAttr ANSI_ { $$ = (CorRegTypeAttr) (($1 & ~tdStringFormatMask) | tdAnsiClass); }
435 | classAttr UNICODE_ { $$ = (CorRegTypeAttr) (($1 & ~tdStringFormatMask) | tdUnicodeClass); }
436 | classAttr AUTOCHAR_ { $$ = (CorRegTypeAttr) (($1 & ~tdStringFormatMask) | tdAutoClass); }
437 | classAttr IMPORT_ { $$ = (CorRegTypeAttr) ($1 | tdImport); }
438 | classAttr SERIALIZABLE_ { $$ = (CorRegTypeAttr) ($1 | tdSerializable); }
439 | classAttr WINDOWSRUNTIME_ { $$ = (CorRegTypeAttr) ($1 | tdWindowsRuntime); }
440 | classAttr NESTED_ PUBLIC_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedPublic); }
441 | classAttr NESTED_ PRIVATE_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedPrivate); }
442 | classAttr NESTED_ FAMILY_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedFamily); }
443 | classAttr NESTED_ ASSEMBLY_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedAssembly); }
444 | classAttr NESTED_ FAMANDASSEM_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedFamANDAssem); }
445 | classAttr NESTED_ FAMORASSEM_ { $$ = (CorRegTypeAttr) (($1 & ~tdVisibilityMask) | tdNestedFamORAssem); }
446 | classAttr BEFOREFIELDINIT_ { $$ = (CorRegTypeAttr) ($1 | tdBeforeFieldInit); }
447 | classAttr SPECIALNAME_ { $$ = (CorRegTypeAttr) ($1 | tdSpecialName); }
448 | classAttr RTSPECIALNAME_ { $$ = (CorRegTypeAttr) ($1); }
449 | classAttr FLAGS_ '(' int32 ')' { $$ = (CorRegTypeAttr) ($4); }
452 extendsClause : /* EMPTY */
453 | EXTENDS_ typeSpec { PASM->m_crExtends = $2; }
456 implClause : /* EMPTY */
457 | IMPLEMENTS_ implList
460 classDecls : /* EMPTY */
461 | classDecls classDecl
464 implList : implList ',' typeSpec { PASM->AddToImplList($3); }
465 | typeSpec { PASM->AddToImplList($1); }
468 /* Generic type parameters declaration */
469 typeList : /* EMPTY */ { $$ = new BinStr(); }
470 | typeListNotEmpty { $$ = $1; }
473 typeListNotEmpty : typeSpec { $$ = new BinStr(); $$->appendInt32($1); }
474 | typeListNotEmpty ',' typeSpec { $$ = $1; $$->appendInt32($3); }
477 typarsClause : /* EMPTY */ { $$ = NULL; PASM->m_TyParList = NULL;}
478 | '<' typars '>' { $$ = $2; PASM->m_TyParList = $2;}
481 typarAttrib : '+' { $$ = gpCovariant; }
482 | '-' { $$ = gpContravariant; }
483 | CLASS_ { $$ = gpReferenceTypeConstraint; }
484 | VALUETYPE_ { $$ = gpNotNullableValueTypeConstraint; }
485 | _CTOR { $$ = gpDefaultConstructorConstraint; }
488 typarAttribs : /* EMPTY */ { $$ = 0; }
489 | typarAttrib typarAttribs { $$ = $1 | $2; }
492 typars : typarAttribs tyBound dottedName typarsRest {$$ = new TyParList($1, $2, $3, $4);}
493 | typarAttribs dottedName typarsRest {$$ = new TyParList($1, NULL, $2, $3);}
496 typarsRest : /* EMPTY */ { $$ = NULL; }
497 | ',' typars { $$ = $2; }
500 tyBound : '(' typeList ')' { $$ = $2; }
503 genArity : /* EMPTY */ { $$= 0; }
504 | genArityNotEmpty { $$ = $1; }
507 genArityNotEmpty : '<' '[' int32 ']' '>' { $$ = $3; }
510 /* Class body declarations */
511 classDecl : methodHead methodDecls '}' { if(PASM->m_pCurMethod->m_ulLines[1] ==0)
512 { PASM->m_pCurMethod->m_ulLines[1] = PASM->m_ulCurLine;
513 PASM->m_pCurMethod->m_ulColumns[1]=PASM->m_ulCurColumn;}
515 | classHead '{' classDecls '}' { PASM->EndClass(); }
516 | eventHead '{' eventDecls '}' { PASM->EndEvent(); }
517 | propHead '{' propDecls '}' { PASM->EndProp(); }
523 | _SIZE int32 { PASM->m_pCurClass->m_ulSize = $2; }
524 | _PACK int32 { PASM->m_pCurClass->m_ulPack = $2; }
525 | exportHead '{' exptypeDecls '}' { PASMM->EndComType(); }
526 | _OVERRIDE typeSpec DCOLON methodName WITH_ callConv type typeSpec DCOLON methodName '(' sigArgs0 ')'
527 { BinStr *sig1 = parser->MakeSig($6, $7, $12);
528 BinStr *sig2 = new BinStr(); sig2->append(sig1);
529 PASM->AddMethodImpl($2,$4,sig1,$8,$10,sig2);
530 PASM->ResetArgNameList();
532 | _OVERRIDE METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')' WITH_ METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')'
533 { PASM->AddMethodImpl($5,$7,
534 ($8==0 ? parser->MakeSig($3,$4,$10) :
535 parser->MakeSig($3| IMAGE_CEE_CS_CALLCONV_GENERIC,$4,$10,$8)),
537 ($19==0 ? parser->MakeSig($14,$15,$21) :
538 parser->MakeSig($14| IMAGE_CEE_CS_CALLCONV_GENERIC,$15,$21,$19)));
539 PASM->ResetArgNameList();
543 | PARAM_ TYPE_ '[' int32 ']' { if(($4 > 0) && ($4 <= (int)PASM->m_pCurClass->m_NumTyPars))
544 PASM->m_pCustomDescrList = PASM->m_pCurClass->m_TyPars[$4-1].CAList();
546 PASM->report->error("Type parameter index out of range\n");
548 | PARAM_ TYPE_ dottedName { int n = PASM->m_pCurClass->FindTyPar($3);
550 PASM->m_pCustomDescrList = PASM->m_pCurClass->m_TyPars[n].CAList();
552 PASM->report->error("Type parameter '%s' undefined\n",$3);
554 | _INTERFACEIMPL TYPE_ typeSpec customDescr { $4->tkInterfacePair = $3;
555 if(PASM->m_pCustomDescrList)
556 PASM->m_pCustomDescrList->PUSH($4);
560 /* Field declaration */
561 fieldDecl : _FIELD repeatOpt fieldAttr type dottedName atOpt initOpt
562 { $4->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
563 PASM->AddField($5, $4, $3, $6, $7, $2); }
566 fieldAttr : /* EMPTY */ { $$ = (CorFieldAttr) 0; }
567 | fieldAttr STATIC_ { $$ = (CorFieldAttr) ($1 | fdStatic); }
568 | fieldAttr PUBLIC_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdPublic); }
569 | fieldAttr PRIVATE_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdPrivate); }
570 | fieldAttr FAMILY_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdFamily); }
571 | fieldAttr INITONLY_ { $$ = (CorFieldAttr) ($1 | fdInitOnly); }
572 | fieldAttr RTSPECIALNAME_ { $$ = $1; } /*{ $$ = (CorFieldAttr) ($1 | fdRTSpecialName); }*/
573 | fieldAttr SPECIALNAME_ { $$ = (CorFieldAttr) ($1 | fdSpecialName); }
574 /* <STRIP>commented out because PInvoke for fields is not supported by EE
575 | fieldAttr PINVOKEIMPL_ '(' compQstring AS_ compQstring pinvAttr ')'
576 { $$ = (CorFieldAttr) ($1 | fdPinvokeImpl);
577 PASM->SetPinvoke($4,0,$6,$7); }
578 | fieldAttr PINVOKEIMPL_ '(' compQstring pinvAttr ')'
579 { $$ = (CorFieldAttr) ($1 | fdPinvokeImpl);
580 PASM->SetPinvoke($4,0,NULL,$5); }
581 | fieldAttr PINVOKEIMPL_ '(' pinvAttr ')'
582 { PASM->SetPinvoke(new BinStr(),0,NULL,$4);
583 $$ = (CorFieldAttr) ($1 | fdPinvokeImpl); }
585 | fieldAttr MARSHAL_ '(' marshalBlob ')'
586 { PASM->m_pMarshal = $4; }
587 | fieldAttr ASSEMBLY_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdAssembly); }
588 | fieldAttr FAMANDASSEM_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdFamANDAssem); }
589 | fieldAttr FAMORASSEM_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdFamORAssem); }
590 | fieldAttr PRIVATESCOPE_ { $$ = (CorFieldAttr) (($1 & ~mdMemberAccessMask) | fdPrivateScope); }
591 | fieldAttr LITERAL_ { $$ = (CorFieldAttr) ($1 | fdLiteral); }
592 | fieldAttr NOTSERIALIZED_ { $$ = (CorFieldAttr) ($1 | fdNotSerialized); }
593 | fieldAttr FLAGS_ '(' int32 ')' { $$ = (CorFieldAttr) ($4); }
596 atOpt : /* EMPTY */ { $$ = 0; }
597 | AT_ id { $$ = $2; }
600 initOpt : /* EMPTY */ { $$ = NULL; }
601 | '=' fieldInit { $$ = $2; }
604 repeatOpt : /* EMPTY */ { $$ = 0xFFFFFFFF; }
605 | '[' int32 ']' { $$ = $2; }
608 /* Method referencing */
609 methodRef : callConv type typeSpec DCOLON methodName tyArgs0 '(' sigArgs0 ')'
610 { PASM->ResetArgNameList();
613 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
614 $$ = PASM->MakeMemberRef($3, $5, parser->MakeSig($1|iCallConv, $2, $8));
619 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
620 mr = PASM->MakeMemberRef($3, $5,
621 parser->MakeSig($1 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, $2, $8, corCountArgs($6)));
622 $$ = PASM->MakeMethodSpec(mr,
623 parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, $6));
626 | callConv type typeSpec DCOLON methodName genArityNotEmpty '(' sigArgs0 ')'
627 { PASM->ResetArgNameList();
628 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
629 $$ = PASM->MakeMemberRef($3, $5,
630 parser->MakeSig($1 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, $2, $8, $6));
632 | callConv type methodName tyArgs0 '(' sigArgs0 ')'
633 { PASM->ResetArgNameList();
636 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
637 $$ = PASM->MakeMemberRef(mdTokenNil, $3, parser->MakeSig($1|iCallConv, $2, $6));
642 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
643 mr = PASM->MakeMemberRef(mdTokenNil, $3, parser->MakeSig($1 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, $2, $6, corCountArgs($4)));
644 $$ = PASM->MakeMethodSpec(mr,
645 parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, $4));
648 | callConv type methodName genArityNotEmpty '(' sigArgs0 ')'
649 { PASM->ResetArgNameList();
650 if((iCallConv)&&(($1 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
651 $$ = PASM->MakeMemberRef(mdTokenNil, $3, parser->MakeSig($1 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, $2, $6, $4));
653 | mdtoken { $$ = $1; }
654 | TYPEDEF_M { $$ = $1->m_tkTypeSpec; }
655 | TYPEDEF_MR { $$ = $1->m_tkTypeSpec; }
658 callConv : INSTANCE_ callConv { $$ = ($2 | IMAGE_CEE_CS_CALLCONV_HASTHIS); }
659 | EXPLICIT_ callConv { $$ = ($2 | IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS); }
660 | callKind { $$ = $1; }
661 | CALLCONV_ '(' int32 ')' { $$ = $3; }
664 callKind : /* EMPTY */ { $$ = IMAGE_CEE_CS_CALLCONV_DEFAULT; }
665 | DEFAULT_ { $$ = IMAGE_CEE_CS_CALLCONV_DEFAULT; }
666 | VARARG_ { $$ = IMAGE_CEE_CS_CALLCONV_VARARG; }
667 | UNMANAGED_ CDECL_ { $$ = IMAGE_CEE_CS_CALLCONV_C; }
668 | UNMANAGED_ STDCALL_ { $$ = IMAGE_CEE_CS_CALLCONV_STDCALL; }
669 | UNMANAGED_ THISCALL_ { $$ = IMAGE_CEE_CS_CALLCONV_THISCALL; }
670 | UNMANAGED_ FASTCALL_ { $$ = IMAGE_CEE_CS_CALLCONV_FASTCALL; }
673 mdtoken : MDTOKEN_ '(' int32 ')' { $$ = $3; }
676 memberRef : methodSpec methodRef { $$ = $2;
677 PASM->delArgNameList(PASM->m_firstArgName);
678 PASM->m_firstArgName = parser->m_ANSFirst.POP();
679 PASM->m_lastArgName = parser->m_ANSLast.POP();
680 PASM->SetMemberRefFixup($2,iOpcodeLen); }
681 | FIELD_ type typeSpec DCOLON dottedName
682 { $2->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
683 $$ = PASM->MakeMemberRef($3, $5, $2);
684 PASM->SetMemberRefFixup($$,iOpcodeLen); }
685 | FIELD_ type dottedName
686 { $2->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
687 $$ = PASM->MakeMemberRef(NULL, $3, $2);
688 PASM->SetMemberRefFixup($$,iOpcodeLen); }
689 | FIELD_ TYPEDEF_F { $$ = $2->m_tkTypeSpec;
690 PASM->SetMemberRefFixup($$,iOpcodeLen); }
691 | FIELD_ TYPEDEF_MR { $$ = $2->m_tkTypeSpec;
692 PASM->SetMemberRefFixup($$,iOpcodeLen); }
694 PASM->SetMemberRefFixup($$,iOpcodeLen); }
697 /* Event declaration */
698 eventHead : _EVENT eventAttr typeSpec dottedName { PASM->ResetEvent($4, $3, $2); }
699 | _EVENT eventAttr dottedName { PASM->ResetEvent($3, mdTypeRefNil, $2); }
703 eventAttr : /* EMPTY */ { $$ = (CorEventAttr) 0; }
704 | eventAttr RTSPECIALNAME_ { $$ = $1; }/*{ $$ = (CorEventAttr) ($1 | evRTSpecialName); }*/
705 | eventAttr SPECIALNAME_ { $$ = (CorEventAttr) ($1 | evSpecialName); }
708 eventDecls : /* EMPTY */
709 | eventDecls eventDecl
712 eventDecl : _ADDON methodRef { PASM->SetEventMethod(0, $2); }
713 | _REMOVEON methodRef { PASM->SetEventMethod(1, $2); }
714 | _FIRE methodRef { PASM->SetEventMethod(2, $2); }
715 | _OTHER methodRef { PASM->SetEventMethod(3, $2); }
722 /* Property declaration */
723 propHead : _PROPERTY propAttr callConv type dottedName '(' sigArgs0 ')' initOpt
724 { PASM->ResetProp($5,
725 parser->MakeSig((IMAGE_CEE_CS_CALLCONV_PROPERTY |
726 ($3 & IMAGE_CEE_CS_CALLCONV_HASTHIS)),$4,$7), $2, $9);}
729 propAttr : /* EMPTY */ { $$ = (CorPropertyAttr) 0; }
730 | propAttr RTSPECIALNAME_ { $$ = $1; }/*{ $$ = (CorPropertyAttr) ($1 | prRTSpecialName); }*/
731 | propAttr SPECIALNAME_ { $$ = (CorPropertyAttr) ($1 | prSpecialName); }
734 propDecls : /* EMPTY */
739 propDecl : _SET methodRef { PASM->SetPropMethod(0, $2); }
740 | _GET methodRef { PASM->SetPropMethod(1, $2); }
741 | _OTHER methodRef { PASM->SetPropMethod(2, $2); }
748 /* Method declaration */
749 methodHeadPart1 : _METHOD { PASM->ResetForNextMethod();
750 uMethodBeginLine = PASM->m_ulCurLine;
751 uMethodBeginColumn=PASM->m_ulCurColumn;
755 marshalClause : /* EMPTY */ { $$ = NULL; }
756 | MARSHAL_ '(' marshalBlob ')' { $$ = $3; }
759 marshalBlob : nativeType { $$ = $1; }
760 | marshalBlobHead hexbytes '}' { $$ = $2; }
763 marshalBlobHead : '{' { bParsingByteArray = TRUE; }
766 methodHead : methodHeadPart1 methAttr callConv paramAttr type marshalClause methodName typarsClause'(' sigArgs0 ')' implAttr '{'
768 if ($8 == NULL) sig = parser->MakeSig($3, $5, $10);
771 sig = parser->MakeSig($3 | IMAGE_CEE_CS_CALLCONV_GENERIC, $5, $10, $8->Count());
774 PASM->StartMethod($7, sig, $2, $6, $4, $8);
775 TyParFixupList.RESET(false);
776 PASM->SetImplAttr((USHORT)$12);
777 PASM->m_pCurMethod->m_ulLines[0] = uMethodBeginLine;
778 PASM->m_pCurMethod->m_ulColumns[0]=uMethodBeginColumn;
782 methAttr : /* EMPTY */ { $$ = (CorMethodAttr) 0; }
783 | methAttr STATIC_ { $$ = (CorMethodAttr) ($1 | mdStatic); }
784 | methAttr PUBLIC_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdPublic); }
785 | methAttr PRIVATE_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdPrivate); }
786 | methAttr FAMILY_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdFamily); }
787 | methAttr FINAL_ { $$ = (CorMethodAttr) ($1 | mdFinal); }
788 | methAttr SPECIALNAME_ { $$ = (CorMethodAttr) ($1 | mdSpecialName); }
789 | methAttr VIRTUAL_ { $$ = (CorMethodAttr) ($1 | mdVirtual); }
790 | methAttr STRICT_ { $$ = (CorMethodAttr) ($1 | mdCheckAccessOnOverride); }
791 | methAttr ABSTRACT_ { $$ = (CorMethodAttr) ($1 | mdAbstract); }
792 | methAttr ASSEMBLY_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdAssem); }
793 | methAttr FAMANDASSEM_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdFamANDAssem); }
794 | methAttr FAMORASSEM_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdFamORAssem); }
795 | methAttr PRIVATESCOPE_ { $$ = (CorMethodAttr) (($1 & ~mdMemberAccessMask) | mdPrivateScope); }
796 | methAttr HIDEBYSIG_ { $$ = (CorMethodAttr) ($1 | mdHideBySig); }
797 | methAttr NEWSLOT_ { $$ = (CorMethodAttr) ($1 | mdNewSlot); }
798 | methAttr RTSPECIALNAME_ { $$ = $1; }/*{ $$ = (CorMethodAttr) ($1 | mdRTSpecialName); }*/
799 | methAttr UNMANAGEDEXP_ { $$ = (CorMethodAttr) ($1 | mdUnmanagedExport); }
800 | methAttr REQSECOBJ_ { $$ = (CorMethodAttr) ($1 | mdRequireSecObject); }
801 | methAttr FLAGS_ '(' int32 ')' { $$ = (CorMethodAttr) ($4); }
802 | methAttr PINVOKEIMPL_ '(' compQstring AS_ compQstring pinvAttr ')'
803 { PASM->SetPinvoke($4,0,$6,$7);
804 $$ = (CorMethodAttr) ($1 | mdPinvokeImpl); }
805 | methAttr PINVOKEIMPL_ '(' compQstring pinvAttr ')'
806 { PASM->SetPinvoke($4,0,NULL,$5);
807 $$ = (CorMethodAttr) ($1 | mdPinvokeImpl); }
808 | methAttr PINVOKEIMPL_ '(' pinvAttr ')'
809 { PASM->SetPinvoke(new BinStr(),0,NULL,$4);
810 $$ = (CorMethodAttr) ($1 | mdPinvokeImpl); }
813 pinvAttr : /* EMPTY */ { $$ = (CorPinvokeMap) 0; }
814 | pinvAttr NOMANGLE_ { $$ = (CorPinvokeMap) ($1 | pmNoMangle); }
815 | pinvAttr ANSI_ { $$ = (CorPinvokeMap) ($1 | pmCharSetAnsi); }
816 | pinvAttr UNICODE_ { $$ = (CorPinvokeMap) ($1 | pmCharSetUnicode); }
817 | pinvAttr AUTOCHAR_ { $$ = (CorPinvokeMap) ($1 | pmCharSetAuto); }
818 | pinvAttr LASTERR_ { $$ = (CorPinvokeMap) ($1 | pmSupportsLastError); }
819 | pinvAttr WINAPI_ { $$ = (CorPinvokeMap) ($1 | pmCallConvWinapi); }
820 | pinvAttr CDECL_ { $$ = (CorPinvokeMap) ($1 | pmCallConvCdecl); }
821 | pinvAttr STDCALL_ { $$ = (CorPinvokeMap) ($1 | pmCallConvStdcall); }
822 | pinvAttr THISCALL_ { $$ = (CorPinvokeMap) ($1 | pmCallConvThiscall); }
823 | pinvAttr FASTCALL_ { $$ = (CorPinvokeMap) ($1 | pmCallConvFastcall); }
824 | pinvAttr BESTFIT_ ':' ON_ { $$ = (CorPinvokeMap) ($1 | pmBestFitEnabled); }
825 | pinvAttr BESTFIT_ ':' OFF_ { $$ = (CorPinvokeMap) ($1 | pmBestFitDisabled); }
826 | pinvAttr CHARMAPERROR_ ':' ON_ { $$ = (CorPinvokeMap) ($1 | pmThrowOnUnmappableCharEnabled); }
827 | pinvAttr CHARMAPERROR_ ':' OFF_ { $$ = (CorPinvokeMap) ($1 | pmThrowOnUnmappableCharDisabled); }
828 | pinvAttr FLAGS_ '(' int32 ')' { $$ = (CorPinvokeMap) ($4); }
831 methodName : _CTOR { $$ = newString(COR_CTOR_METHOD_NAME); }
832 | _CCTOR { $$ = newString(COR_CCTOR_METHOD_NAME); }
833 | dottedName { $$ = $1; }
836 paramAttr : /* EMPTY */ { $$ = 0; }
837 | paramAttr '[' IN_ ']' { $$ = $1 | pdIn; }
838 | paramAttr '[' OUT_ ']' { $$ = $1 | pdOut; }
839 | paramAttr '[' OPT_ ']' { $$ = $1 | pdOptional; }
840 | paramAttr '[' int32 ']' { $$ = $3 + 1; }
843 implAttr : /* EMPTY */ { $$ = (CorMethodImpl) (miIL | miManaged); }
844 | implAttr NATIVE_ { $$ = (CorMethodImpl) (($1 & 0xFFF4) | miNative); }
845 | implAttr CIL_ { $$ = (CorMethodImpl) (($1 & 0xFFF4) | miIL); }
846 | implAttr OPTIL_ { $$ = (CorMethodImpl) (($1 & 0xFFF4) | miOPTIL); }
847 | implAttr MANAGED_ { $$ = (CorMethodImpl) (($1 & 0xFFFB) | miManaged); }
848 | implAttr UNMANAGED_ { $$ = (CorMethodImpl) (($1 & 0xFFFB) | miUnmanaged); }
849 | implAttr FORWARDREF_ { $$ = (CorMethodImpl) ($1 | miForwardRef); }
850 | implAttr PRESERVESIG_ { $$ = (CorMethodImpl) ($1 | miPreserveSig); }
851 | implAttr RUNTIME_ { $$ = (CorMethodImpl) ($1 | miRuntime); }
852 | implAttr INTERNALCALL_ { $$ = (CorMethodImpl) ($1 | miInternalCall); }
853 | implAttr SYNCHRONIZED_ { $$ = (CorMethodImpl) ($1 | miSynchronized); }
854 | implAttr NOINLINING_ { $$ = (CorMethodImpl) ($1 | miNoInlining); }
855 | implAttr AGGRESSIVEINLINING_ { $$ = (CorMethodImpl) ($1 | miAggressiveInlining); }
856 | implAttr NOOPTIMIZATION_ { $$ = (CorMethodImpl) ($1 | miNoOptimization); }
857 | implAttr AGGRESSIVEOPTIMIZATION_ { $$ = (CorMethodImpl) ($1 | miAggressiveOptimization); }
858 | implAttr FLAGS_ '(' int32 ')' { $$ = (CorMethodImpl) ($4); }
861 localsHead : _LOCALS { PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = NULL;PASM->m_lastArgName = NULL;
865 methodDecls : /* EMPTY */
866 | methodDecls methodDecl
869 methodDecl : _EMITBYTE int32 { PASM->EmitByte($2); }
870 | sehBlock { delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); }
871 | _MAXSTACK int32 { PASM->EmitMaxStack($2); }
872 | localsHead '(' sigArgs0 ')' { PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, $3));
874 | localsHead INIT_ '(' sigArgs0 ')' { PASM->EmitZeroInit();
875 PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, $4));
877 | _ENTRYPOINT { PASM->EmitEntryPoint(); }
878 | _ZEROINIT { PASM->EmitZeroInit(); }
881 | id ':' { PASM->AddLabel(PASM->m_CurPC,$1); /*PASM->EmitLabel($1);*/ }
887 | _EXPORT '[' int32 ']' { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
889 PASM->m_pCurMethod->m_dwExportOrdinal = $3;
890 PASM->m_pCurMethod->m_szExportAlias = NULL;
891 if(PASM->m_pCurMethod->m_wVTEntry == 0) PASM->m_pCurMethod->m_wVTEntry = 1;
892 if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = $3 + 0x8000;
895 PASM->report->warn("Duplicate .export directive, ignored\n");
897 | _EXPORT '[' int32 ']' AS_ id { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
899 PASM->m_pCurMethod->m_dwExportOrdinal = $3;
900 PASM->m_pCurMethod->m_szExportAlias = $6;
901 if(PASM->m_pCurMethod->m_wVTEntry == 0) PASM->m_pCurMethod->m_wVTEntry = 1;
902 if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = $3 + 0x8000;
905 PASM->report->warn("Duplicate .export directive, ignored\n");
907 | _VTENTRY int32 ':' int32 { PASM->m_pCurMethod->m_wVTEntry = (WORD)$2;
908 PASM->m_pCurMethod->m_wVTSlot = (WORD)$4; }
909 | _OVERRIDE typeSpec DCOLON methodName
910 { PASM->AddMethodImpl($2,$4,NULL,NULL,NULL,NULL); }
912 | _OVERRIDE METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')'
913 { PASM->AddMethodImpl($5,$7,
914 ($8==0 ? parser->MakeSig($3,$4,$10) :
915 parser->MakeSig($3| IMAGE_CEE_CS_CALLCONV_GENERIC,$4,$10,$8))
917 PASM->ResetArgNameList();
920 | PARAM_ TYPE_ '[' int32 ']' { if(($4 > 0) && ($4 <= (int)PASM->m_pCurMethod->m_NumTyPars))
921 PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[$4-1].CAList();
923 PASM->report->error("Type parameter index out of range\n");
925 | PARAM_ TYPE_ dottedName { int n = PASM->m_pCurMethod->FindTyPar($3);
927 PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[n].CAList();
929 PASM->report->error("Type parameter '%s' undefined\n",$3);
931 | PARAM_ '[' int32 ']' initOpt
933 ARG_NAME_LIST* pAN=PASM->findArg(PASM->m_pCurMethod->m_firstArgName, $3 - 1);
936 PASM->m_pCustomDescrList = &(pAN->CustDList);
941 PASM->m_pCustomDescrList = NULL;
945 PASM->m_pCustomDescrList = &(PASM->m_pCurMethod->m_RetCustDList);
946 PASM->m_pCurMethod->m_pRetValue = $5;
948 PASM->m_tkCurrentCVOwner = 0;
952 scopeBlock : scopeOpen methodDecls '}' { PASM->m_pCurMethod->CloseScope(); }
955 scopeOpen : '{' { PASM->m_pCurMethod->OpenScope(); }
958 /* Structured exception handling directives */
959 sehBlock : tryBlock sehClauses
962 sehClauses : sehClause sehClauses
966 tryBlock : tryHead scopeBlock { PASM->m_SEHD->tryTo = PASM->m_CurPC; }
967 | tryHead id TO_ id { PASM->SetTryLabels($2, $4); }
968 | tryHead int32 TO_ int32 { if(PASM->m_SEHD) {PASM->m_SEHD->tryFrom = $2;
969 PASM->m_SEHD->tryTo = $4;} }
972 tryHead : _TRY { PASM->NewSEHDescriptor();
973 PASM->m_SEHD->tryFrom = PASM->m_CurPC; }
977 sehClause : catchClause handlerBlock { PASM->EmitTry(); }
978 | filterClause handlerBlock { PASM->EmitTry(); }
979 | finallyClause handlerBlock { PASM->EmitTry(); }
980 | faultClause handlerBlock { PASM->EmitTry(); }
984 filterClause : filterHead scopeBlock { PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
985 | filterHead id { PASM->SetFilterLabel($2);
986 PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
987 | filterHead int32 { PASM->m_SEHD->sehFilter = $2;
988 PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
991 filterHead : FILTER_ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FILTER;
992 PASM->m_SEHD->sehFilter = PASM->m_CurPC; }
995 catchClause : CATCH_ typeSpec { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_NONE;
996 PASM->SetCatchClass($2);
997 PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
1000 finallyClause : FINALLY_ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FINALLY;
1001 PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
1004 faultClause : FAULT_ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FAULT;
1005 PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
1008 handlerBlock : scopeBlock { PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; }
1009 | HANDLER_ id TO_ id { PASM->SetHandlerLabels($2, $4); }
1010 | HANDLER_ int32 TO_ int32 { PASM->m_SEHD->sehHandler = $2;
1011 PASM->m_SEHD->sehHandlerTo = $4; }
1014 /* Data declaration */
1015 dataDecl : ddHead ddBody
1018 ddHead : _DATA tls id '=' { PASM->EmitDataLabel($3); }
1022 tls : /* EMPTY */ { PASM->SetDataSection(); }
1023 | TLS_ { PASM->SetTLSSection(); }
1024 | CIL_ { PASM->SetILSection(); }
1027 ddBody : '{' ddItemList '}'
1031 ddItemList : ddItem ',' ddItemList
1035 ddItemCount : /* EMPTY */ { $$ = 1; }
1036 | '[' int32 ']' { $$ = $2;
1037 if($2 <= 0) { PASM->report->error("Illegal item count: %d\n",$2);
1038 if(!PASM->OnErrGo) $$ = 1; }}
1041 ddItem : CHAR_ '*' '(' compQstring ')' { PASM->EmitDataString($4); }
1042 | '&' '(' id ')' { PASM->EmitDD($3); }
1043 | bytearrayhead bytes ')' { PASM->EmitData($2->ptr(),$2->length()); }
1044 | FLOAT32_ '(' float64 ')' ddItemCount
1045 { float f = (float) (*$3); float* p = new (nothrow) float[$5];
1047 for(int i=0; i < $5; i++) p[i] = f;
1048 PASM->EmitData(p, sizeof(float)*$5); delete $3; delete [] p;
1049 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1050 sizeof(float)*$5); }
1051 | FLOAT64_ '(' float64 ')' ddItemCount
1052 { double* p = new (nothrow) double[$5];
1054 for(int i=0; i<$5; i++) p[i] = *($3);
1055 PASM->EmitData(p, sizeof(double)*$5); delete $3; delete [] p;
1056 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1057 sizeof(double)*$5); }
1058 | INT64_ '(' int64 ')' ddItemCount
1059 { __int64* p = new (nothrow) __int64[$5];
1061 for(int i=0; i<$5; i++) p[i] = *($3);
1062 PASM->EmitData(p, sizeof(__int64)*$5); delete $3; delete [] p;
1063 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1064 sizeof(__int64)*$5); }
1065 | INT32_ '(' int32 ')' ddItemCount
1066 { __int32* p = new (nothrow) __int32[$5];
1068 for(int i=0; i<$5; i++) p[i] = $3;
1069 PASM->EmitData(p, sizeof(__int32)*$5); delete [] p;
1070 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1071 sizeof(__int32)*$5); }
1072 | INT16_ '(' int32 ')' ddItemCount
1073 { __int16 i = (__int16) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
1074 __int16* p = new (nothrow) __int16[$5];
1076 for(int j=0; j<$5; j++) p[j] = i;
1077 PASM->EmitData(p, sizeof(__int16)*$5); delete [] p;
1078 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1079 sizeof(__int16)*$5); }
1080 | INT8_ '(' int32 ')' ddItemCount
1081 { __int8 i = (__int8) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
1082 __int8* p = new (nothrow) __int8[$5];
1084 for(int j=0; j<$5; j++) p[j] = i;
1085 PASM->EmitData(p, sizeof(__int8)*$5); delete [] p;
1086 } else PASM->report->error("Out of memory emitting data block %d bytes\n",
1087 sizeof(__int8)*$5); }
1088 | FLOAT32_ ddItemCount { PASM->EmitData(NULL, sizeof(float)*$2); }
1089 | FLOAT64_ ddItemCount { PASM->EmitData(NULL, sizeof(double)*$2); }
1090 | INT64_ ddItemCount { PASM->EmitData(NULL, sizeof(__int64)*$2); }
1091 | INT32_ ddItemCount { PASM->EmitData(NULL, sizeof(__int32)*$2); }
1092 | INT16_ ddItemCount { PASM->EmitData(NULL, sizeof(__int16)*$2); }
1093 | INT8_ ddItemCount { PASM->EmitData(NULL, sizeof(__int8)*$2); }
1096 /* Default values declaration for fields, parameters and verbal form of CA blob description */
1097 fieldSerInit : FLOAT32_ '(' float64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R4);
1098 float f = (float)(*$3);
1099 $$->appendInt32(*((__int32*)&f)); delete $3; }
1100 | FLOAT64_ '(' float64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R8);
1101 $$->appendInt64((__int64 *)$3); delete $3; }
1102 | FLOAT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R4);
1103 $$->appendInt32($3); }
1104 | FLOAT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R8);
1105 $$->appendInt64((__int64 *)$3); delete $3; }
1106 | INT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I8);
1107 $$->appendInt64((__int64 *)$3); delete $3; }
1108 | INT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I4);
1109 $$->appendInt32($3); }
1110 | INT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I2);
1111 $$->appendInt16($3); }
1112 | INT8_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I1);
1113 $$->appendInt8($3); }
1114 | UNSIGNED_ INT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8);
1115 $$->appendInt64((__int64 *)$4); delete $4; }
1116 | UNSIGNED_ INT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4);
1117 $$->appendInt32($4); }
1118 | UNSIGNED_ INT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2);
1119 $$->appendInt16($4); }
1120 | UNSIGNED_ INT8_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U1);
1121 $$->appendInt8($4); }
1122 | UINT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8);
1123 $$->appendInt64((__int64 *)$3); delete $3; }
1124 | UINT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4);
1125 $$->appendInt32($3); }
1126 | UINT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2);
1127 $$->appendInt16($3); }
1128 | UINT8_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U1);
1129 $$->appendInt8($3); }
1130 | CHAR_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_CHAR);
1131 $$->appendInt16($3); }
1132 | BOOL_ '(' truefalse ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_BOOLEAN);
1133 $$->appendInt8($3);}
1134 | bytearrayhead bytes ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_STRING);
1135 $$->append($2); delete $2;}
1138 bytearrayhead : BYTEARRAY_ '(' { bParsingByteArray = TRUE; }
1141 bytes : /* EMPTY */ { $$ = new BinStr(); }
1142 | hexbytes { $$ = $1; }
1145 hexbytes : HEXBYTE { __int8 i = (__int8) $1; $$ = new BinStr(); $$->appendInt8(i); }
1146 | hexbytes HEXBYTE { __int8 i = (__int8) $2; $$ = $1; $$->appendInt8(i); }
1149 /* Field/parameter initialization */
1150 fieldInit : fieldSerInit { $$ = $1; }
1151 | compQstring { $$ = BinStrToUnicode($1,true); $$->insertInt8(ELEMENT_TYPE_STRING);}
1152 | NULLREF_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_CLASS);
1153 $$->appendInt32(0); }
1156 /* Values for verbal form of CA blob description */
1157 serInit : fieldSerInit { $$ = $1; }
1158 | STRING_ '(' NULLREF_ ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_STRING); $$->appendInt8(0xFF); }
1159 | STRING_ '(' SQSTRING ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_STRING);
1160 AppendStringWithLength($$,$3); delete [] $3;}
1161 | TYPE_ '(' CLASS_ SQSTRING ')' { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_TYPE);
1162 AppendStringWithLength($$,$4); delete [] $4;}
1163 | TYPE_ '(' className ')' { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_TYPE);
1164 AppendStringWithLength($$,PASM->ReflectionNotation($3));}
1165 | TYPE_ '(' NULLREF_ ')' { $$ = new BinStr(); $$->appendInt8(SERIALIZATION_TYPE_TYPE); $$->appendInt8(0xFF); }
1166 | OBJECT_ '(' serInit ')' { $$ = $3; $$->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);}
1167 | FLOAT32_ '[' int32 ']' '(' f32seq ')'
1168 { $$ = $6; $$->insertInt32($3);
1169 $$->insertInt8(ELEMENT_TYPE_R4);
1170 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1171 | FLOAT64_ '[' int32 ']' '(' f64seq ')'
1172 { $$ = $6; $$->insertInt32($3);
1173 $$->insertInt8(ELEMENT_TYPE_R8);
1174 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1175 | INT64_ '[' int32 ']' '(' i64seq ')'
1176 { $$ = $6; $$->insertInt32($3);
1177 $$->insertInt8(ELEMENT_TYPE_I8);
1178 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1179 | INT32_ '[' int32 ']' '(' i32seq ')'
1180 { $$ = $6; $$->insertInt32($3);
1181 $$->insertInt8(ELEMENT_TYPE_I4);
1182 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1183 | INT16_ '[' int32 ']' '(' i16seq ')'
1184 { $$ = $6; $$->insertInt32($3);
1185 $$->insertInt8(ELEMENT_TYPE_I2);
1186 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1187 | INT8_ '[' int32 ']' '(' i8seq ')'
1188 { $$ = $6; $$->insertInt32($3);
1189 $$->insertInt8(ELEMENT_TYPE_I1);
1190 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1191 | UINT64_ '[' int32 ']' '(' i64seq ')'
1192 { $$ = $6; $$->insertInt32($3);
1193 $$->insertInt8(ELEMENT_TYPE_U8);
1194 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1195 | UINT32_ '[' int32 ']' '(' i32seq ')'
1196 { $$ = $6; $$->insertInt32($3);
1197 $$->insertInt8(ELEMENT_TYPE_U4);
1198 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1199 | UINT16_ '[' int32 ']' '(' i16seq ')'
1200 { $$ = $6; $$->insertInt32($3);
1201 $$->insertInt8(ELEMENT_TYPE_U2);
1202 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1203 | UINT8_ '[' int32 ']' '(' i8seq ')'
1204 { $$ = $6; $$->insertInt32($3);
1205 $$->insertInt8(ELEMENT_TYPE_U1);
1206 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1207 | UNSIGNED_ INT64_ '[' int32 ']' '(' i64seq ')'
1208 { $$ = $7; $$->insertInt32($4);
1209 $$->insertInt8(ELEMENT_TYPE_U8);
1210 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1211 | UNSIGNED_ INT32_ '[' int32 ']' '(' i32seq ')'
1212 { $$ = $7; $$->insertInt32($4);
1213 $$->insertInt8(ELEMENT_TYPE_U4);
1214 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1215 | UNSIGNED_ INT16_ '[' int32 ']' '(' i16seq ')'
1216 { $$ = $7; $$->insertInt32($4);
1217 $$->insertInt8(ELEMENT_TYPE_U2);
1218 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1219 | UNSIGNED_ INT8_ '[' int32 ']' '(' i8seq ')'
1220 { $$ = $7; $$->insertInt32($4);
1221 $$->insertInt8(ELEMENT_TYPE_U1);
1222 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1223 | CHAR_ '[' int32 ']' '(' i16seq ')'
1224 { $$ = $6; $$->insertInt32($3);
1225 $$->insertInt8(ELEMENT_TYPE_CHAR);
1226 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1227 | BOOL_ '[' int32 ']' '(' boolSeq ')'
1228 { $$ = $6; $$->insertInt32($3);
1229 $$->insertInt8(ELEMENT_TYPE_BOOLEAN);
1230 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1231 | STRING_ '[' int32 ']' '(' sqstringSeq ')'
1232 { $$ = $6; $$->insertInt32($3);
1233 $$->insertInt8(ELEMENT_TYPE_STRING);
1234 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1235 | TYPE_ '[' int32 ']' '(' classSeq ')'
1236 { $$ = $6; $$->insertInt32($3);
1237 $$->insertInt8(SERIALIZATION_TYPE_TYPE);
1238 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1239 | OBJECT_ '[' int32 ']' '(' objSeq ')'
1240 { $$ = $6; $$->insertInt32($3);
1241 $$->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);
1242 $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1246 f32seq : /* EMPTY */ { $$ = new BinStr(); }
1247 | f32seq float64 { $$ = $1;
1248 float f = (float) (*$2); $$->appendInt32(*((__int32*)&f)); delete $2; }
1249 | f32seq int32 { $$ = $1;
1250 $$->appendInt32($2); }
1253 f64seq : /* EMPTY */ { $$ = new BinStr(); }
1254 | f64seq float64 { $$ = $1;
1255 $$->appendInt64((__int64 *)$2); delete $2; }
1256 | f64seq int64 { $$ = $1;
1257 $$->appendInt64((__int64 *)$2); delete $2; }
1260 i64seq : /* EMPTY */ { $$ = new BinStr(); }
1261 | i64seq int64 { $$ = $1;
1262 $$->appendInt64((__int64 *)$2); delete $2; }
1265 i32seq : /* EMPTY */ { $$ = new BinStr(); }
1266 | i32seq int32 { $$ = $1; $$->appendInt32($2);}
1269 i16seq : /* EMPTY */ { $$ = new BinStr(); }
1270 | i16seq int32 { $$ = $1; $$->appendInt16($2);}
1273 i8seq : /* EMPTY */ { $$ = new BinStr(); }
1274 | i8seq int32 { $$ = $1; $$->appendInt8($2); }
1277 boolSeq : /* EMPTY */ { $$ = new BinStr(); }
1278 | boolSeq truefalse { $$ = $1;
1279 $$->appendInt8($2);}
1282 sqstringSeq : /* EMPTY */ { $$ = new BinStr(); }
1283 | sqstringSeq NULLREF_ { $$ = $1; $$->appendInt8(0xFF); }
1284 | sqstringSeq SQSTRING { $$ = $1;
1285 AppendStringWithLength($$,$2); delete [] $2;}
1288 classSeq : /* EMPTY */ { $$ = new BinStr(); }
1289 | classSeq NULLREF_ { $$ = $1; $$->appendInt8(0xFF); }
1290 | classSeq CLASS_ SQSTRING { $$ = $1;
1291 AppendStringWithLength($$,$3); delete [] $3;}
1292 | classSeq className { $$ = $1;
1293 AppendStringWithLength($$,PASM->ReflectionNotation($2));}
1296 objSeq : /* EMPTY */ { $$ = new BinStr(); }
1297 | objSeq serInit { $$ = $1; $$->append($2); delete $2; }
1300 /* IL instructions and associated definitions */
1301 methodSpec : METHOD_ { parser->m_ANSFirst.PUSH(PASM->m_firstArgName);
1302 parser->m_ANSLast.PUSH(PASM->m_lastArgName);
1303 PASM->m_firstArgName = NULL;
1304 PASM->m_lastArgName = NULL; }
1307 instr_none : INSTR_NONE { $$ = SetupInstr($1); }
1310 instr_var : INSTR_VAR { $$ = SetupInstr($1); }
1313 instr_i : INSTR_I { $$ = SetupInstr($1); }
1316 instr_i8 : INSTR_I8 { $$ = SetupInstr($1); }
1319 instr_r : INSTR_R { $$ = SetupInstr($1); }
1322 instr_brtarget : INSTR_BRTARGET { $$ = SetupInstr($1); }
1325 instr_method : INSTR_METHOD { $$ = SetupInstr($1);
1326 if((!PASM->OnErrGo)&&
1327 (($1 == CEE_NEWOBJ)||
1328 ($1 == CEE_CALLVIRT)))
1329 iCallConv = IMAGE_CEE_CS_CALLCONV_HASTHIS;
1333 instr_field : INSTR_FIELD { $$ = SetupInstr($1); }
1336 instr_type : INSTR_TYPE { $$ = SetupInstr($1); }
1339 instr_string : INSTR_STRING { $$ = SetupInstr($1); }
1342 instr_sig : INSTR_SIG { $$ = SetupInstr($1); }
1345 instr_tok : INSTR_TOK { $$ = SetupInstr($1); iOpcodeLen = PASM->OpcodeLen($$); }
1348 instr_switch : INSTR_SWITCH { $$ = SetupInstr($1); }
1351 instr_r_head : instr_r '(' { $$ = $1; bParsingByteArray = TRUE; }
1355 instr : instr_none { PASM->EmitOpcode($1); }
1356 | instr_var int32 { PASM->EmitInstrVar($1, $2); }
1357 | instr_var id { PASM->EmitInstrVarByName($1, $2); }
1358 | instr_i int32 { PASM->EmitInstrI($1, $2); }
1359 | instr_i8 int64 { PASM->EmitInstrI8($1, $2); }
1360 | instr_r float64 { PASM->EmitInstrR($1, $2); delete ($2);}
1361 | instr_r int64 { double f = (double) (*$2); PASM->EmitInstrR($1, &f); }
1362 | instr_r_head bytes ')' { unsigned L = $2->length();
1363 FAIL_UNLESS(L >= sizeof(float), ("%d hexbytes, must be at least %d\n",
1365 if(L < sizeof(float)) {YYERROR; }
1367 double f = (L >= sizeof(double)) ? *((double *)($2->ptr()))
1368 : (double)(*(float *)($2->ptr()));
1369 PASM->EmitInstrR($1,&f); }
1371 | instr_brtarget int32 { PASM->EmitInstrBrOffset($1, $2); }
1372 | instr_brtarget id { PASM->EmitInstrBrTarget($1, $2); }
1373 | instr_method methodRef
1374 { PASM->SetMemberRefFixup($2,PASM->OpcodeLen($1));
1375 PASM->EmitInstrI($1,$2);
1376 PASM->m_tkCurrentCVOwner = $2;
1377 PASM->m_pCustomDescrList = NULL;
1380 | instr_field type typeSpec DCOLON dottedName
1381 { $2->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
1382 mdToken mr = PASM->MakeMemberRef($3, $5, $2);
1383 PASM->SetMemberRefFixup(mr, PASM->OpcodeLen($1));
1384 PASM->EmitInstrI($1,mr);
1385 PASM->m_tkCurrentCVOwner = mr;
1386 PASM->m_pCustomDescrList = NULL;
1388 | instr_field type dottedName
1389 { $2->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
1390 mdToken mr = PASM->MakeMemberRef(mdTokenNil, $3, $2);
1391 PASM->SetMemberRefFixup(mr, PASM->OpcodeLen($1));
1392 PASM->EmitInstrI($1,mr);
1393 PASM->m_tkCurrentCVOwner = mr;
1394 PASM->m_pCustomDescrList = NULL;
1396 | instr_field mdtoken { mdToken mr = $2;
1397 PASM->SetMemberRefFixup(mr, PASM->OpcodeLen($1));
1398 PASM->EmitInstrI($1,mr);
1399 PASM->m_tkCurrentCVOwner = mr;
1400 PASM->m_pCustomDescrList = NULL;
1402 | instr_field TYPEDEF_F { mdToken mr = $2->m_tkTypeSpec;
1403 PASM->SetMemberRefFixup(mr, PASM->OpcodeLen($1));
1404 PASM->EmitInstrI($1,mr);
1405 PASM->m_tkCurrentCVOwner = mr;
1406 PASM->m_pCustomDescrList = NULL;
1408 | instr_field TYPEDEF_MR { mdToken mr = $2->m_tkTypeSpec;
1409 PASM->SetMemberRefFixup(mr, PASM->OpcodeLen($1));
1410 PASM->EmitInstrI($1,mr);
1411 PASM->m_tkCurrentCVOwner = mr;
1412 PASM->m_pCustomDescrList = NULL;
1414 | instr_type typeSpec { PASM->EmitInstrI($1, $2);
1415 PASM->m_tkCurrentCVOwner = $2;
1416 PASM->m_pCustomDescrList = NULL;
1418 | instr_string compQstring { PASM->EmitInstrStringLiteral($1, $2,TRUE); }
1419 | instr_string ANSI_ '(' compQstring ')'
1420 { PASM->EmitInstrStringLiteral($1, $4,FALSE); }
1421 | instr_string bytearrayhead bytes ')'
1422 { PASM->EmitInstrStringLiteral($1, $3,FALSE,TRUE); }
1423 | instr_sig callConv type '(' sigArgs0 ')'
1424 { PASM->EmitInstrSig($1, parser->MakeSig($2, $3, $5));
1425 PASM->ResetArgNameList();
1427 | instr_tok ownerType /* ownerType ::= memberRef | typeSpec */
1428 { PASM->EmitInstrI($1,$2);
1429 PASM->m_tkCurrentCVOwner = $2;
1430 PASM->m_pCustomDescrList = NULL;
1433 | instr_switch '(' labels ')' { PASM->EmitInstrSwitch($1, $3); }
1436 labels : /* empty */ { $$ = 0; }
1437 | id ',' labels { $$ = new Labels($1, $3, TRUE); }
1438 | int32 ',' labels { $$ = new Labels((char *)(UINT_PTR)$1, $3, FALSE); }
1439 | id { $$ = new Labels($1, NULL, TRUE); }
1440 | int32 { $$ = new Labels((char *)(UINT_PTR)$1, NULL, FALSE); }
1444 tyArgs0 : /* EMPTY */ { $$ = NULL; }
1445 | '<' tyArgs1 '>' { $$ = $2; }
1448 tyArgs1 : /* EMPTY */ { $$ = NULL; }
1449 | tyArgs2 { $$ = $1; }
1452 tyArgs2 : type { $$ = $1; }
1453 | tyArgs2 ',' type { $$ = $1; $$->append($3); delete $3; }
1457 sigArgs0 : /* EMPTY */ { $$ = new BinStr(); }
1458 | sigArgs1 { $$ = $1;}
1461 sigArgs1 : sigArg { $$ = $1; }
1462 | sigArgs1 ',' sigArg { $$ = $1; $$->append($3); delete $3; }
1465 sigArg : ELIPSIS { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_SENTINEL); }
1466 | paramAttr type marshalClause { $$ = new BinStr(); $$->append($2); PASM->addArgName(NULL, $2, $3, $1); }
1467 | paramAttr type marshalClause id { $$ = new BinStr(); $$->append($2); PASM->addArgName($4, $2, $3, $1);}
1470 /* Class referencing */
1471 className : '[' dottedName ']' slashedName { $$ = PASM->ResolveClassRef(PASM->GetAsmRef($2), $4, NULL); delete[] $2;}
1472 | '[' mdtoken ']' slashedName { $$ = PASM->ResolveClassRef($2, $4, NULL); }
1473 | '[' '*' ']' slashedName { $$ = PASM->ResolveClassRef(mdTokenNil, $4, NULL); }
1474 | '[' _MODULE dottedName ']' slashedName { $$ = PASM->ResolveClassRef(PASM->GetModRef($3),$5, NULL); delete[] $3;}
1475 | slashedName { $$ = PASM->ResolveClassRef(1,$1,NULL); }
1476 | mdtoken { $$ = $1; }
1477 | TYPEDEF_T { $$ = $1->m_tkTypeSpec; }
1478 | _THIS { if(PASM->m_pCurClass != NULL) $$ = PASM->m_pCurClass->m_cl;
1479 else { $$ = 0; PASM->report->error(".this outside class scope\n"); }
1481 | _BASE { if(PASM->m_pCurClass != NULL) {
1482 $$ = PASM->m_pCurClass->m_crExtends;
1483 if(RidFromToken($$) == 0)
1484 PASM->report->error(".base undefined\n");
1485 } else { $$ = 0; PASM->report->error(".base outside class scope\n"); }
1487 | _NESTER { if(PASM->m_pCurClass != NULL) {
1488 if(PASM->m_pCurClass->m_pEncloser != NULL) $$ = PASM->m_pCurClass->m_pEncloser->m_cl;
1489 else { $$ = 0; PASM->report->error(".nester undefined\n"); }
1490 } else { $$ = 0; PASM->report->error(".nester outside class scope\n"); }
1494 slashedName : dottedName { $$ = $1; }
1495 | slashedName '/' dottedName { $$ = newStringWDel($1, NESTING_SEP, $3); }
1498 typeSpec : className { $$ = $1;}
1499 | '[' dottedName ']' { $$ = PASM->GetAsmRef($2); delete[] $2;}
1500 | '[' _MODULE dottedName ']' { $$ = PASM->GetModRef($3); delete[] $3;}
1501 | type { $$ = PASM->ResolveTypeSpec($1); }
1504 /* Native types for marshaling signatures */
1505 nativeType : /* EMPTY */ { $$ = new BinStr(); }
1506 | CUSTOM_ '(' compQstring ',' compQstring ',' compQstring ',' compQstring ')'
1507 { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
1508 corEmitInt($$,$3->length()); $$->append($3);
1509 corEmitInt($$,$5->length()); $$->append($5);
1510 corEmitInt($$,$7->length()); $$->append($7);
1511 corEmitInt($$,$9->length()); $$->append($9);
1512 PASM->report->warn("Deprecated 4-string form of custom marshaler, first two strings ignored\n");}
1513 | CUSTOM_ '(' compQstring ',' compQstring ')'
1514 { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
1517 corEmitInt($$,$3->length()); $$->append($3);
1518 corEmitInt($$,$5->length()); $$->append($5); }
1519 | FIXED_ SYSSTRING_ '[' int32 ']' { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_FIXEDSYSSTRING);
1520 corEmitInt($$,$4); }
1521 | FIXED_ ARRAY_ '[' int32 ']' nativeType
1522 { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_FIXEDARRAY);
1523 corEmitInt($$,$4); $$->append($6); }
1524 | VARIANT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_VARIANT);
1525 PASM->report->warn("Deprecated native type 'variant'\n"); }
1526 | CURRENCY_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_CURRENCY); }
1527 | SYSCHAR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_SYSCHAR);
1528 PASM->report->warn("Deprecated native type 'syschar'\n"); }
1529 | VOID_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_VOID);
1530 PASM->report->warn("Deprecated native type 'void'\n"); }
1531 | BOOL_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_BOOLEAN); }
1532 | INT8_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_I1); }
1533 | INT16_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_I2); }
1534 | INT32_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_I4); }
1535 | INT64_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_I8); }
1536 | FLOAT32_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_R4); }
1537 | FLOAT64_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_R8); }
1538 | ERROR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_ERROR); }
1539 | UNSIGNED_ INT8_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U1); }
1540 | UNSIGNED_ INT16_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U2); }
1541 | UNSIGNED_ INT32_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U4); }
1542 | UNSIGNED_ INT64_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U8); }
1543 | UINT8_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U1); }
1544 | UINT16_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U2); }
1545 | UINT32_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U4); }
1546 | UINT64_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_U8); }
1547 | nativeType '*' { $$ = $1; $$->insertInt8(NATIVE_TYPE_PTR);
1548 PASM->report->warn("Deprecated native type '*'\n"); }
1549 | nativeType '[' ']' { $$ = $1; if($$->length()==0) $$->appendInt8(NATIVE_TYPE_MAX);
1550 $$->insertInt8(NATIVE_TYPE_ARRAY); }
1551 | nativeType '[' int32 ']' { $$ = $1; if($$->length()==0) $$->appendInt8(NATIVE_TYPE_MAX);
1552 $$->insertInt8(NATIVE_TYPE_ARRAY);
1556 | nativeType '[' int32 '+' int32 ']' { $$ = $1; if($$->length()==0) $$->appendInt8(NATIVE_TYPE_MAX);
1557 $$->insertInt8(NATIVE_TYPE_ARRAY);
1560 corEmitInt($$,ntaSizeParamIndexSpecified); }
1561 | nativeType '[' '+' int32 ']' { $$ = $1; if($$->length()==0) $$->appendInt8(NATIVE_TYPE_MAX);
1562 $$->insertInt8(NATIVE_TYPE_ARRAY);
1563 corEmitInt($$,$4); }
1564 | DECIMAL_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_DECIMAL);
1565 PASM->report->warn("Deprecated native type 'decimal'\n"); }
1566 | DATE_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_DATE);
1567 PASM->report->warn("Deprecated native type 'date'\n"); }
1568 | BSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_BSTR); }
1569 | LPSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_LPSTR); }
1570 | LPWSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_LPWSTR); }
1571 | LPTSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_LPTSTR); }
1572 | OBJECTREF_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_OBJECTREF);
1573 PASM->report->warn("Deprecated native type 'objectref'\n"); }
1574 | IUNKNOWN_ iidParamIndex { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_IUNKNOWN);
1575 if($2 != -1) corEmitInt($$,$2); }
1576 | IDISPATCH_ iidParamIndex { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_IDISPATCH);
1577 if($2 != -1) corEmitInt($$,$2); }
1578 | STRUCT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_STRUCT); }
1579 | INTERFACE_ iidParamIndex { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_INTF);
1580 if($2 != -1) corEmitInt($$,$2); }
1581 | SAFEARRAY_ variantType { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_SAFEARRAY);
1584 | SAFEARRAY_ variantType ',' compQstring { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_SAFEARRAY);
1586 corEmitInt($$,$4->length()); $$->append($4); }
1588 | INT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_INT); }
1589 | UNSIGNED_ INT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_UINT); }
1590 | UINT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_UINT); }
1591 | NESTED_ STRUCT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_NESTEDSTRUCT);
1592 PASM->report->warn("Deprecated native type 'nested struct'\n"); }
1593 | BYVALSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_BYVALSTR); }
1594 | ANSI_ BSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_ANSIBSTR); }
1595 | TBSTR_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_TBSTR); }
1596 | VARIANT_ BOOL_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_VARIANTBOOL); }
1597 | METHOD_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_FUNC); }
1598 | AS_ ANY_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_ASANY); }
1599 | LPSTRUCT_ { $$ = new BinStr(); $$->appendInt8(NATIVE_TYPE_LPSTRUCT); }
1600 | TYPEDEF_TS { $$ = new BinStr(); $$->append($1->m_pbsTypeSpec); }
1603 iidParamIndex : /* EMPTY */ { $$ = -1; }
1604 | '(' IIDPARAM_ '=' int32 ')' { $$ = $4; }
1607 variantType : /* EMPTY */ { $$ = VT_EMPTY; }
1608 | NULL_ { $$ = VT_NULL; }
1609 | VARIANT_ { $$ = VT_VARIANT; }
1610 | CURRENCY_ { $$ = VT_CY; }
1611 | VOID_ { $$ = VT_VOID; }
1612 | BOOL_ { $$ = VT_BOOL; }
1613 | INT8_ { $$ = VT_I1; }
1614 | INT16_ { $$ = VT_I2; }
1615 | INT32_ { $$ = VT_I4; }
1616 | INT64_ { $$ = VT_I8; }
1617 | FLOAT32_ { $$ = VT_R4; }
1618 | FLOAT64_ { $$ = VT_R8; }
1619 | UNSIGNED_ INT8_ { $$ = VT_UI1; }
1620 | UNSIGNED_ INT16_ { $$ = VT_UI2; }
1621 | UNSIGNED_ INT32_ { $$ = VT_UI4; }
1622 | UNSIGNED_ INT64_ { $$ = VT_UI8; }
1623 | UINT8_ { $$ = VT_UI1; }
1624 | UINT16_ { $$ = VT_UI2; }
1625 | UINT32_ { $$ = VT_UI4; }
1626 | UINT64_ { $$ = VT_UI8; }
1627 | '*' { $$ = VT_PTR; }
1628 | variantType '[' ']' { $$ = $1 | VT_ARRAY; }
1629 | variantType VECTOR_ { $$ = $1 | VT_VECTOR; }
1630 | variantType '&' { $$ = $1 | VT_BYREF; }
1631 | DECIMAL_ { $$ = VT_DECIMAL; }
1632 | DATE_ { $$ = VT_DATE; }
1633 | BSTR_ { $$ = VT_BSTR; }
1634 | LPSTR_ { $$ = VT_LPSTR; }
1635 | LPWSTR_ { $$ = VT_LPWSTR; }
1636 | IUNKNOWN_ { $$ = VT_UNKNOWN; }
1637 | IDISPATCH_ { $$ = VT_DISPATCH; }
1638 | SAFEARRAY_ { $$ = VT_SAFEARRAY; }
1639 | INT_ { $$ = VT_INT; }
1640 | UNSIGNED_ INT_ { $$ = VT_UINT; }
1641 | UINT_ { $$ = VT_UINT; }
1642 | ERROR_ { $$ = VT_ERROR; }
1643 | HRESULT_ { $$ = VT_HRESULT; }
1644 | CARRAY_ { $$ = VT_CARRAY; }
1645 | USERDEFINED_ { $$ = VT_USERDEFINED; }
1646 | RECORD_ { $$ = VT_RECORD; }
1647 | FILETIME_ { $$ = VT_FILETIME; }
1648 | BLOB_ { $$ = VT_BLOB; }
1649 | STREAM_ { $$ = VT_STREAM; }
1650 | STORAGE_ { $$ = VT_STORAGE; }
1651 | STREAMED_OBJECT_ { $$ = VT_STREAMED_OBJECT; }
1652 | STORED_OBJECT_ { $$ = VT_STORED_OBJECT; }
1653 | BLOB_OBJECT_ { $$ = VT_BLOB_OBJECT; }
1654 | CF_ { $$ = VT_CF; }
1655 | CLSID_ { $$ = VT_CLSID; }
1658 /* Managed types for signatures */
1659 type : CLASS_ className { if($2 == PASM->m_tkSysString)
1660 { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_STRING); }
1661 else if($2 == PASM->m_tkSysObject)
1662 { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_OBJECT); }
1664 $$ = parser->MakeTypeClass(ELEMENT_TYPE_CLASS, $2); }
1665 | OBJECT_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_OBJECT); }
1666 | VALUE_ CLASS_ className { $$ = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, $3); }
1667 | VALUETYPE_ className { $$ = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, $2); }
1668 | type '[' ']' { $$ = $1; $$->insertInt8(ELEMENT_TYPE_SZARRAY); }
1669 | type '[' bounds1 ']' { $$ = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, $1, $3); }
1670 | type '&' { $$ = $1; $$->insertInt8(ELEMENT_TYPE_BYREF); }
1671 | type '*' { $$ = $1; $$->insertInt8(ELEMENT_TYPE_PTR); }
1672 | type PINNED_ { $$ = $1; $$->insertInt8(ELEMENT_TYPE_PINNED); }
1673 | type MODREQ_ '(' typeSpec ')' { $$ = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_REQD, $4);
1675 | type MODOPT_ '(' typeSpec ')' { $$ = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_OPT, $4);
1677 | methodSpec callConv type '*' '(' sigArgs0 ')'
1678 { $$ = parser->MakeSig($2, $3, $6);
1679 $$->insertInt8(ELEMENT_TYPE_FNPTR);
1680 PASM->delArgNameList(PASM->m_firstArgName);
1681 PASM->m_firstArgName = parser->m_ANSFirst.POP();
1682 PASM->m_lastArgName = parser->m_ANSLast.POP();
1684 | type '<' tyArgs1 '>' { if($3 == NULL) $$ = $1;
1687 $$->appendInt8(ELEMENT_TYPE_GENERICINST);
1689 corEmitInt($$, corCountArgs($3));
1690 $$->append($3); delete $1; delete $3; }}
1691 | '!' '!' int32 { //if(PASM->m_pCurMethod) {
1692 // if(($3 < 0)||((DWORD)$3 >= PASM->m_pCurMethod->m_NumTyPars))
1693 // PASM->report->error("Invalid method type parameter '%d'\n",$3);
1694 $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_MVAR); corEmitInt($$, $3);
1695 //} else PASM->report->error("Method type parameter '%d' outside method scope\n",$3);
1697 | '!' int32 { //if(PASM->m_pCurClass) {
1698 // if(($2 < 0)||((DWORD)$2 >= PASM->m_pCurClass->m_NumTyPars))
1699 // PASM->report->error("Invalid type parameter '%d'\n",$2);
1700 $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_VAR); corEmitInt($$, $2);
1701 //} else PASM->report->error("Type parameter '%d' outside class scope\n",$2);
1703 | '!' '!' dottedName { int eltype = ELEMENT_TYPE_MVAR;
1705 if(PASM->m_pCurMethod) n = PASM->m_pCurMethod->FindTyPar($3);
1707 if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf($3);
1709 { n = TyParFixupList.COUNT();
1710 TyParFixupList.PUSH($3);
1711 eltype = ELEMENT_TYPE_MVARFIXUP;
1714 if(n == -1) { PASM->report->error("Invalid method type parameter '%s'\n",$3);
1716 $$ = new BinStr(); $$->appendInt8(eltype); corEmitInt($$,n);
1718 | '!' dottedName { int eltype = ELEMENT_TYPE_VAR;
1720 if(PASM->m_pCurClass && !newclass) n = PASM->m_pCurClass->FindTyPar($2);
1722 if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf($2);
1724 { n = TyParFixupList.COUNT();
1725 TyParFixupList.PUSH($2);
1726 eltype = ELEMENT_TYPE_VARFIXUP;
1729 if(n == -1) { PASM->report->error("Invalid type parameter '%s'\n",$2);
1731 $$ = new BinStr(); $$->appendInt8(eltype); corEmitInt($$,n);
1733 | TYPEDREF_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_TYPEDBYREF); }
1734 | VOID_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_VOID); }
1735 | NATIVE_ INT_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I); }
1736 | NATIVE_ UNSIGNED_ INT_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U); }
1737 | NATIVE_ UINT_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U); }
1738 | simpleType { $$ = $1; }
1739 | ELIPSIS type { $$ = $2; $$->insertInt8(ELEMENT_TYPE_SENTINEL); }
1742 simpleType : CHAR_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_CHAR); }
1743 | STRING_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_STRING); }
1744 | BOOL_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_BOOLEAN); }
1745 | INT8_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I1); }
1746 | INT16_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I2); }
1747 | INT32_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I4); }
1748 | INT64_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I8); }
1749 | FLOAT32_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R4); }
1750 | FLOAT64_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R8); }
1751 | UNSIGNED_ INT8_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U1); }
1752 | UNSIGNED_ INT16_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2); }
1753 | UNSIGNED_ INT32_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4); }
1754 | UNSIGNED_ INT64_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8); }
1755 | UINT8_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U1); }
1756 | UINT16_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2); }
1757 | UINT32_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4); }
1758 | UINT64_ { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8); }
1759 | TYPEDEF_TS { $$ = new BinStr(); $$->append($1->m_pbsTypeSpec); }
1762 bounds1 : bound { $$ = $1; }
1763 | bounds1 ',' bound { $$ = $1; $1->append($3); delete $3; }
1766 bound : /* EMPTY */ { $$ = new BinStr(); $$->appendInt32(0x7FFFFFFF); $$->appendInt32(0x7FFFFFFF); }
1767 | ELIPSIS { $$ = new BinStr(); $$->appendInt32(0x7FFFFFFF); $$->appendInt32(0x7FFFFFFF); }
1768 | int32 { $$ = new BinStr(); $$->appendInt32(0); $$->appendInt32($1); }
1769 | int32 ELIPSIS int32 { FAIL_UNLESS($1 <= $3, ("lower bound %d must be <= upper bound %d\n", $1, $3));
1770 if ($1 > $3) { YYERROR; };
1771 $$ = new BinStr(); $$->appendInt32($1); $$->appendInt32($3-$1+1); }
1772 | int32 ELIPSIS { $$ = new BinStr(); $$->appendInt32($1); $$->appendInt32(0x7FFFFFFF); }
1775 /* Security declarations */
1776 secDecl : _PERMISSION secAction typeSpec '(' nameValPairs ')'
1777 { PASM->AddPermissionDecl($2, $3, $5); }
1778 | _PERMISSION secAction typeSpec '=' '{' customBlobDescr '}'
1779 { PASM->AddPermissionDecl($2, $3, $6); }
1780 | _PERMISSION secAction typeSpec { PASM->AddPermissionDecl($2, $3, (NVPair *)NULL); }
1781 | psetHead bytes ')' { PASM->AddPermissionSetDecl($1, $2); }
1782 | _PERMISSIONSET secAction compQstring
1783 { PASM->AddPermissionSetDecl($2,BinStrToUnicode($3,true));}
1784 | _PERMISSIONSET secAction '=' '{' secAttrSetBlob '}'
1785 { BinStr* ret = new BinStr();
1786 ret->insertInt8('.');
1787 corEmitInt(ret, nSecAttrBlobs);
1789 PASM->AddPermissionSetDecl($2,ret);
1790 nSecAttrBlobs = 0; }
1793 secAttrSetBlob : /* EMPTY */ { $$ = new BinStr(); nSecAttrBlobs = 0;}
1794 | secAttrBlob { $$ = $1; nSecAttrBlobs = 1; }
1795 | secAttrBlob ',' secAttrSetBlob { $$ = $1; $$->append($3); nSecAttrBlobs++; }
1798 secAttrBlob : typeSpec '=' '{' customBlobNVPairs '}'
1799 { $$ = PASM->EncodeSecAttr(PASM->ReflectionNotation($1),$4,nCustomBlobNVPairs);
1800 nCustomBlobNVPairs = 0; }
1801 | CLASS_ SQSTRING '=' '{' customBlobNVPairs '}'
1802 { $$ = PASM->EncodeSecAttr($2,$5,nCustomBlobNVPairs);
1803 nCustomBlobNVPairs = 0; }
1806 psetHead : _PERMISSIONSET secAction '=' '(' { $$ = $2; bParsingByteArray = TRUE; }
1807 | _PERMISSIONSET secAction BYTEARRAY_ '('
1808 { $$ = $2; bParsingByteArray = TRUE; }
1811 nameValPairs : nameValPair { $$ = $1; }
1812 | nameValPair ',' nameValPairs { $$ = $1->Concat($3); }
1815 nameValPair : compQstring '=' caValue { $1->appendInt8(0); $$ = new NVPair($1, $3); }
1818 truefalse : TRUE_ { $$ = 1; }
1819 | FALSE_ { $$ = 0; }
1822 caValue : truefalse { $$ = new BinStr();
1823 $$->appendInt8(SERIALIZATION_TYPE_BOOLEAN);
1824 $$->appendInt8($1); }
1825 | int32 { $$ = new BinStr();
1826 $$->appendInt8(SERIALIZATION_TYPE_I4);
1827 $$->appendInt32($1); }
1828 | INT32_ '(' int32 ')' { $$ = new BinStr();
1829 $$->appendInt8(SERIALIZATION_TYPE_I4);
1830 $$->appendInt32($3); }
1831 | compQstring { $$ = new BinStr();
1832 $$->appendInt8(SERIALIZATION_TYPE_STRING);
1833 $$->append($1); delete $1;
1834 $$->appendInt8(0); }
1835 | className '(' INT8_ ':' int32 ')' { $$ = new BinStr();
1836 $$->appendInt8(SERIALIZATION_TYPE_ENUM);
1837 char* sz = PASM->ReflectionNotation($1);
1838 strcpy_s((char *)$$->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
1840 $$->appendInt32($5); }
1841 | className '(' INT16_ ':' int32 ')' { $$ = new BinStr();
1842 $$->appendInt8(SERIALIZATION_TYPE_ENUM);
1843 char* sz = PASM->ReflectionNotation($1);
1844 strcpy_s((char *)$$->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
1846 $$->appendInt32($5); }
1847 | className '(' INT32_ ':' int32 ')' { $$ = new BinStr();
1848 $$->appendInt8(SERIALIZATION_TYPE_ENUM);
1849 char* sz = PASM->ReflectionNotation($1);
1850 strcpy_s((char *)$$->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
1852 $$->appendInt32($5); }
1853 | className '(' int32 ')' { $$ = new BinStr();
1854 $$->appendInt8(SERIALIZATION_TYPE_ENUM);
1855 char* sz = PASM->ReflectionNotation($1);
1856 strcpy_s((char *)$$->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
1858 $$->appendInt32($3); }
1861 secAction : REQUEST_ { $$ = dclRequest; }
1862 | DEMAND_ { $$ = dclDemand; }
1863 | ASSERT_ { $$ = dclAssert; }
1864 | DENY_ { $$ = dclDeny; }
1865 | PERMITONLY_ { $$ = dclPermitOnly; }
1866 | LINKCHECK_ { $$ = dclLinktimeCheck; }
1867 | INHERITCHECK_ { $$ = dclInheritanceCheck; }
1868 | REQMIN_ { $$ = dclRequestMinimum; }
1869 | REQOPT_ { $$ = dclRequestOptional; }
1870 | REQREFUSE_ { $$ = dclRequestRefuse; }
1871 | PREJITGRANT_ { $$ = dclPrejitGrant; }
1872 | PREJITDENY_ { $$ = dclPrejitDenied; }
1873 | NONCASDEMAND_ { $$ = dclNonCasDemand; }
1874 | NONCASLINKDEMAND_ { $$ = dclNonCasLinkDemand; }
1875 | NONCASINHERITANCE_ { $$ = dclNonCasInheritance; }
1878 /* External source declarations */
1879 esHead : _LINE { PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; }
1880 | P_LINE { PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; }
1883 extSourceSpec : esHead int32 SQSTRING { PENV->nExtLine = PENV->nExtLineEnd = $2;
1884 PENV->nExtCol = 0; PENV->nExtColEnd = static_cast<unsigned>(-1);
1885 PASM->SetSourceFileName($3);}
1886 | esHead int32 { PENV->nExtLine = PENV->nExtLineEnd = $2;
1887 PENV->nExtCol = 0; PENV->nExtColEnd = static_cast<unsigned>(-1); }
1888 | esHead int32 ':' int32 SQSTRING { PENV->nExtLine = PENV->nExtLineEnd = $2;
1889 PENV->nExtCol=$4; PENV->nExtColEnd = static_cast<unsigned>(-1);
1890 PASM->SetSourceFileName($5);}
1891 | esHead int32 ':' int32 { PENV->nExtLine = PENV->nExtLineEnd = $2;
1892 PENV->nExtCol=$4; PENV->nExtColEnd = static_cast<unsigned>(-1);}
1893 | esHead int32 ':' int32 ',' int32 SQSTRING
1894 { PENV->nExtLine = PENV->nExtLineEnd = $2;
1895 PENV->nExtCol=$4; PENV->nExtColEnd = $6;
1896 PASM->SetSourceFileName($7);}
1897 | esHead int32 ':' int32 ',' int32
1898 { PENV->nExtLine = PENV->nExtLineEnd = $2;
1899 PENV->nExtCol=$4; PENV->nExtColEnd = $6; }
1900 | esHead int32 ',' int32 ':' int32 SQSTRING
1901 { PENV->nExtLine = $2; PENV->nExtLineEnd = $4;
1902 PENV->nExtCol=$6; PENV->nExtColEnd = static_cast<unsigned>(-1);
1903 PASM->SetSourceFileName($7);}
1904 | esHead int32 ',' int32 ':' int32
1905 { PENV->nExtLine = $2; PENV->nExtLineEnd = $4;
1906 PENV->nExtCol=$6; PENV->nExtColEnd = static_cast<unsigned>(-1); }
1907 | esHead int32 ',' int32 ':' int32 ',' int32 SQSTRING
1908 { PENV->nExtLine = $2; PENV->nExtLineEnd = $4;
1909 PENV->nExtCol=$6; PENV->nExtColEnd = $8;
1910 PASM->SetSourceFileName($9);}
1911 | esHead int32 ',' int32 ':' int32 ',' int32
1912 { PENV->nExtLine = $2; PENV->nExtLineEnd = $4;
1913 PENV->nExtCol=$6; PENV->nExtColEnd = $8; }
1914 | esHead int32 QSTRING { PENV->nExtLine = PENV->nExtLineEnd = $2 - 1;
1915 PENV->nExtCol = 0; PENV->nExtColEnd = static_cast<unsigned>(-1);
1916 PASM->SetSourceFileName($3);}
1919 /* Manifest declarations */
1920 fileDecl : _FILE fileAttr dottedName fileEntry hashHead bytes ')' fileEntry
1921 { PASMM->AddFile($3, $2|$4|$8, $6); }
1922 | _FILE fileAttr dottedName fileEntry { PASMM->AddFile($3, $2|$4, NULL); }
1925 fileAttr : /* EMPTY */ { $$ = (CorFileFlags) 0; }
1926 | fileAttr NOMETADATA_ { $$ = (CorFileFlags) ($1 | ffContainsNoMetaData); }
1929 fileEntry : /* EMPTY */ { $$ = (CorFileFlags) 0; }
1930 | _ENTRYPOINT { $$ = (CorFileFlags) 0x80000000; }
1933 hashHead : _HASH '=' '(' { bParsingByteArray = TRUE; }
1936 assemblyHead : _ASSEMBLY asmAttr dottedName { PASMM->StartAssembly($3, NULL, (DWORD)$2, FALSE); }
1939 asmAttr : /* EMPTY */ { $$ = (CorAssemblyFlags) 0; }
1940 | asmAttr RETARGETABLE_ { $$ = (CorAssemblyFlags) ($1 | afRetargetable); }
1941 | asmAttr WINDOWSRUNTIME_ { $$ = (CorAssemblyFlags) ($1 | afContentType_WindowsRuntime); }
1942 | asmAttr NOPLATFORM_ { $$ = (CorAssemblyFlags) ($1 | afPA_NoPlatform); }
1943 | asmAttr LEGACY_ LIBRARY_ { $$ = $1; }
1944 | asmAttr CIL_ { SET_PA($$,$1,afPA_MSIL); }
1945 | asmAttr X86_ { SET_PA($$,$1,afPA_x86); }
1946 | asmAttr AMD64_ { SET_PA($$,$1,afPA_AMD64); }
1947 | asmAttr ARM_ { SET_PA($$,$1,afPA_ARM); }
1948 | asmAttr ARM64_ { SET_PA($$,$1,afPA_ARM64); }
1951 assemblyDecls : /* EMPTY */
1952 | assemblyDecls assemblyDecl
1955 assemblyDecl : _HASH ALGORITHM_ int32 { PASMM->SetAssemblyHashAlg($3); }
1960 intOrWildcard : int32 { $$ = $1; }
1961 | '*' { $$ = 0xFFFF; }
1964 asmOrRefDecl : publicKeyHead bytes ')' { PASMM->SetAssemblyPublicKey($2); }
1965 | _VER intOrWildcard ':' intOrWildcard ':' intOrWildcard ':' intOrWildcard
1966 { PASMM->SetAssemblyVer((USHORT)$2, (USHORT)$4, (USHORT)$6, (USHORT)$8); }
1967 | _LOCALE compQstring { $2->appendInt8(0); PASMM->SetAssemblyLocale($2,TRUE); }
1968 | localeHead bytes ')' { PASMM->SetAssemblyLocale($2,FALSE); }
1973 publicKeyHead : _PUBLICKEY '=' '(' { bParsingByteArray = TRUE; }
1976 publicKeyTokenHead : _PUBLICKEYTOKEN '=' '(' { bParsingByteArray = TRUE; }
1979 localeHead : _LOCALE '=' '(' { bParsingByteArray = TRUE; }
1982 assemblyRefHead : _ASSEMBLY EXTERN_ asmAttr dottedName
1983 { PASMM->StartAssembly($4, NULL, $3, TRUE); }
1984 | _ASSEMBLY EXTERN_ asmAttr dottedName AS_ dottedName
1985 { PASMM->StartAssembly($4, $6, $3, TRUE); }
1988 assemblyRefDecls : /* EMPTY */
1989 | assemblyRefDecls assemblyRefDecl
1992 assemblyRefDecl : hashHead bytes ')' { PASMM->SetAssemblyHashBlob($2); }
1994 | publicKeyTokenHead bytes ')' { PASMM->SetAssemblyPublicKeyToken($2); }
1995 | AUTO_ { PASMM->SetAssemblyAutodetect(); }
1998 exptypeHead : _CLASS EXTERN_ exptAttr dottedName { PASMM->StartComType($4, $3);}
2001 exportHead : _EXPORT exptAttr dottedName /* deprecated */ { PASMM->StartComType($3, $2); }
2004 exptAttr : /* EMPTY */ { $$ = (CorTypeAttr) 0; }
2005 | exptAttr PRIVATE_ { $$ = (CorTypeAttr) ($1 | tdNotPublic); }
2006 | exptAttr PUBLIC_ { $$ = (CorTypeAttr) ($1 | tdPublic); }
2007 | exptAttr FORWARDER_ { $$ = (CorTypeAttr) ($1 | tdForwarder); }
2008 | exptAttr NESTED_ PUBLIC_ { $$ = (CorTypeAttr) ($1 | tdNestedPublic); }
2009 | exptAttr NESTED_ PRIVATE_ { $$ = (CorTypeAttr) ($1 | tdNestedPrivate); }
2010 | exptAttr NESTED_ FAMILY_ { $$ = (CorTypeAttr) ($1 | tdNestedFamily); }
2011 | exptAttr NESTED_ ASSEMBLY_ { $$ = (CorTypeAttr) ($1 | tdNestedAssembly); }
2012 | exptAttr NESTED_ FAMANDASSEM_ { $$ = (CorTypeAttr) ($1 | tdNestedFamANDAssem); }
2013 | exptAttr NESTED_ FAMORASSEM_ { $$ = (CorTypeAttr) ($1 | tdNestedFamORAssem); }
2016 exptypeDecls : /* EMPTY */
2017 | exptypeDecls exptypeDecl
2020 exptypeDecl : _FILE dottedName { PASMM->SetComTypeFile($2); }
2021 | _CLASS EXTERN_ slashedName { PASMM->SetComTypeComType($3); }
2022 | _ASSEMBLY EXTERN_ dottedName { PASMM->SetComTypeAsmRef($3); }
2023 | MDTOKEN_ '(' int32 ')' { if(!PASMM->SetComTypeImplementationTok($3))
2024 PASM->report->error("Invalid implementation of exported type\n"); }
2025 | _CLASS int32 { if(!PASMM->SetComTypeClassTok($2))
2026 PASM->report->error("Invalid TypeDefID of exported type\n"); }
2031 manifestResHead : _MRESOURCE manresAttr dottedName { PASMM->StartManifestRes($3, $3, $2); }
2032 | _MRESOURCE manresAttr dottedName AS_ dottedName
2033 { PASMM->StartManifestRes($3, $5, $2); }
2036 manresAttr : /* EMPTY */ { $$ = (CorManifestResourceFlags) 0; }
2037 | manresAttr PUBLIC_ { $$ = (CorManifestResourceFlags) ($1 | mrPublic); }
2038 | manresAttr PRIVATE_ { $$ = (CorManifestResourceFlags) ($1 | mrPrivate); }
2041 manifestResDecls : /* EMPTY */
2042 | manifestResDecls manifestResDecl
2045 manifestResDecl : _FILE dottedName AT_ int32 { PASMM->SetManifestResFile($2, (ULONG)$4); }
2046 | _ASSEMBLY EXTERN_ dottedName { PASMM->SetManifestResAsmRef($3); }
2054 #include "grammar_after.cpp"