3 // Mono::ILASM::ILParser
\r
5 // (C) Sergey Chaban (serge@wildwestsoftware.com)
\r
6 // (C) 2003 Jackson Harper, All rights reserved
\r
12 using System.Collections;
\r
13 using System.Collections.Generic;
\r
14 using System.Globalization;
\r
15 using System.Reflection;
\r
16 using System.Security;
\r
17 using System.Security.Permissions;
\r
19 using MIPermission = Mono.ILASM.Permission;
\r
20 using MIPermissionSet = Mono.ILASM.PermissionSet;
\r
22 namespace Mono.ILASM {
\r
24 public class ILParser {
\r
26 private CodeGen codegen;
\r
28 private bool is_value_class;
\r
29 private bool is_enum_class;
\r
30 private bool pinvoke_info;
\r
31 private string pinvoke_mod;
\r
32 private string pinvoke_meth;
\r
33 private PEAPI.PInvokeAttr pinvoke_attr;
\r
34 private ILTokenizer tokenizer;
\r
35 const int yacc_verbose_flag = 0;
\r
36 KeyValuePair<string, TypeAttr> current_extern;
\r
38 class NameValuePair {
\r
40 public object Value;
\r
42 public NameValuePair (string name, object value)
\r
50 public PEAPI.SecurityAction sec_action;
\r
53 public PermPair (PEAPI.SecurityAction sec_action, object perm)
\r
55 this.sec_action = sec_action;
\r
60 public bool CheckSecurityActionValidity (System.Security.Permissions.SecurityAction action, bool for_assembly)
\r
62 #pragma warning disable 618
\r
63 if ((action == System.Security.Permissions.SecurityAction.RequestMinimum ||
\r
64 action == System.Security.Permissions.SecurityAction.RequestOptional ||
\r
65 action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {
\r
66 Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));
\r
69 #pragma warning restore 618
\r
73 public void AddSecDecl (object perm, bool for_assembly)
\r
75 PermPair pp = perm as PermPair;
\r
78 MIPermissionSet ps_20 = (MIPermissionSet) perm;
\r
79 codegen.AddPermission (ps_20.SecurityAction, ps_20);
\r
83 if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) pp.sec_action, for_assembly))
\r
84 Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));
\r
86 codegen.AddPermission (pp.sec_action, pp.perm);
\r
89 public object ClassRefToObject (object class_ref, object val)
\r
91 ExternTypeRef etr = class_ref as ExternTypeRef;
\r
93 /* FIXME: report error? can be PrimitiveTypeRef or TypeRef */
\r
96 System.Type t = etr.GetReflectedType ();
\r
97 return (t.IsEnum ? Enum.Parse (t, String.Format ("{0}", val)) : val);
\r
100 /* Converts a type_spec to a corresponding PermPair */
\r
101 PermPair TypeSpecToPermPair (object action, object type_spec, ArrayList pairs)
\r
103 ExternTypeRef etr = type_spec as ExternTypeRef;
\r
105 /* FIXME: could be PrimitiveTypeRef or TypeRef
\r
106 Report what error? */
\r
109 System.Type t = etr.GetReflectedType ();
\r
110 object obj = Activator.CreateInstance (t,
\r
111 new object [] {(System.Security.Permissions.SecurityAction) (short) action});
\r
114 foreach (NameValuePair pair in pairs) {
\r
115 PropertyInfo pi = t.GetProperty (pair.Name);
\r
116 pi.SetValue (obj, pair.Value, null);
\r
119 IPermission iper = (IPermission) t.GetMethod ("CreatePermission").Invoke (obj, null);
\r
120 return new PermPair ((PEAPI.SecurityAction) action, iper);
\r
123 public ILParser (CodeGen codegen, ILTokenizer tokenizer)
\r
125 this.codegen = codegen;
\r
126 this.tokenizer = tokenizer;
\r
129 public CodeGen CodeGen {
\r
130 get { return codegen; }
\r
133 private BaseTypeRef GetTypeRef (BaseTypeRef b)
\r
135 //FIXME: Caching required..
\r
143 /* ID - alpha-numeric identifier */
\r
146 /* QSTRING - quoted string */
\r
149 /* SQSTRING - single quoted string */
\r
152 /* COMP_NAME - A name with dots */
\r
155 /* INT32 - 32 bit integer */
\r
158 /* INT64 - 64 bit integer */
\r
161 /* FLOAT64 - floating point number */
\r
164 /* HEXBYTE - two digit hex number */
\r
170 %token OPEN_BRACE "{"
\r
171 %token CLOSE_BRACE "}"
\r
172 %token OPEN_BRACKET "["
\r
173 %token CLOSE_BRACKET "]"
\r
174 %token OPEN_PARENS "("
\r
175 %token CLOSE_PARENS ")"
\r
178 %token DOUBLE_COLON "::"
\r
179 %token SEMICOLON ";"
\r
182 %token AMPERSAND "&"
\r
186 %token ELLIPSIS "..."
\r
188 %token OPEN_ANGLE_BRACKET "<"
\r
189 %token CLOSE_ANGLE_BRACKET ">"
\r
196 /* INSTR_* instruction types */
\r
202 %token INSTR_BRTARGET
\r
203 %token INSTR_METHOD
\r
204 %token INSTR_NEWOBJ
\r
207 %token INSTR_STRING
\r
211 %token INSTR_SWITCH
\r
220 /* Mechanically generated - DO NOT EDIT! */
\r
229 %token D_CAPABILITY
\r
240 %token D_ENTRYPOINT
\r
249 %token D_IMPLICITCOM
\r
255 %token D_MANIFESTRES
\r
262 %token D_ORIGINATOR
\r
268 %token D_PERMISSION
\r
269 %token D_PERMISSIONSET
\r
273 %token D_PUBLICKEYTOKEN
\r
277 %token D_STACKRESERVE
\r
291 %token K_AGGRESSIVEINLINING
\r
292 %token K_IMPLICITCOM
\r
293 %token K_IMPLICITRES
\r
294 %token K_NOAPPDOMAIN
\r
318 %token K_RTSPECIALNAME
\r
320 %token K_SPECIALNAME
\r
322 %token K_FAMANDASSEM
\r
323 %token K_FAMORASSEM
\r
324 %token K_PRIVATESCOPE
\r
326 %token K_NOTSERIALIZED
\r
328 %token K_NOT_IN_GC_HEAP
\r
333 %token K_SEQUENTIAL
\r
339 %token K_SERIALIZABLE
\r
343 %token K_IMPLEMENTS
\r
348 %token K_UNMANAGEDEXP
\r
349 %token K_PINVOKEIMPL
\r
359 %token K_FORWARDREF
\r
361 %token K_INTERNALCALL
\r
362 %token K_SYNCHRONIZED
\r
363 %token K_NOINLINING
\r
364 %token K_NOOPTIMIZATION
\r
410 %token K_USERDEFINED
\r
416 %token K_STREAMED_OBJECT
\r
417 %token K_STORED_OBJECT
\r
418 %token K_BLOB_OBJECT
\r
430 %token K_FROMUNMANAGED
\r
431 %token K_CALLMOSTDERIVED
\r
448 %token K_PERMITONLY
\r
450 %token K_INHERITCHECK
\r
454 %token K_PREJITGRANT
\r
455 %token K_PREJITDENY
\r
456 %token K_NONCASDEMAND
\r
457 %token K_NONCASLINKDEMAND
\r
458 %token K_NONCASINHERITANCE
\r
460 %token K_NOMETADATA
\r
462 %token K_FULLORIGIN
\r
465 // %token K_PUBLICKEY
\r
466 %token K_ENABLEJITTRACKING
\r
467 %token K_DISABLEJITOPTIMIZER
\r
468 %token K_RETARGETABLE
\r
469 %token K_PRESERVESIG
\r
470 %token K_BEFOREFIELDINIT
\r
474 %token K_COMPILERCONTROLLED
\r
485 %token K_CHARMAPERROR
\r
490 /* end generated */
\r
503 decls : /* EMPTY */
\r
522 if (codegen.CurrentCustomAttrTarget != null)
\r
523 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
525 | D_SUBSYSTEM int32
\r
527 codegen.SetSubSystem ((int) $2);
\r
531 codegen.SetCorFlags ((int) $2);
\r
533 | D_FILE K_ALIGNMENT int32
\r
534 | D_IMAGEBASE int64
\r
536 codegen.SetImageBase ((long) $2);
\r
538 | D_STACKRESERVE int64
\r
540 codegen.SetStackReserve ((long) $2);
\r
546 extsource_spec : D_LINE int32 SQSTRING
\r
548 | D_LINE int32 COLON int32 SQSTRING
\r
549 | D_LINE int32 COLON int32
\r
552 language_decl : D_LANGUAGE SQSTRING
\r
553 | D_LANGUAGE SQSTRING COMMA SQSTRING
\r
554 | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING
\r
558 vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET
\r
559 vtfixup_attr K_AT id
\r
562 vtfixup_attr : /* EMPTY */
\r
563 | vtfixup_attr K_INT32
\r
564 | vtfixup_attr K_INT64
\r
565 | vtfixup_attr K_FROMUNMANAGED
\r
566 | vtfixup_attr K_CALLMOSTDERIVED
\r
569 namespace_all : namespace_head OPEN_BRACE decls CLOSE_BRACE
\r
571 codegen.CurrentNameSpace = null;
\r
575 namespace_head : D_NAMESPACE comp_name
\r
577 codegen.CurrentNameSpace = (string) $2;
\r
581 class_all : class_head OPEN_BRACE class_decls CLOSE_BRACE
\r
583 codegen.EndTypeDef ();
\r
587 class_head : D_CLASS class_attr comp_name formal_typars_clause extends_clause
\r
590 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3,
\r
591 $5 as BaseClassRef, $6 as ArrayList, null, (GenericParameters) $4);
\r
593 if (is_value_class)
\r
594 codegen.CurrentTypeDef.MakeValueClass ();
\r
596 codegen.CurrentTypeDef.MakeEnumClass ();
\r
600 class_attr : /* EMPTY */
\r
602 // Reset some flags
\r
603 is_value_class = false;
\r
604 is_enum_class = false;
\r
605 $$ = new TypeAttr ();
\r
607 | class_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }
\r
608 | class_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }
\r
609 | class_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }
\r
610 | class_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }
\r
611 | class_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }
\r
612 | class_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}
\r
613 | class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }
\r
614 | class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }
\r
615 | class_attr K_VALUE { is_value_class = true; }
\r
616 | class_attr K_ENUM { is_enum_class = true; }
\r
617 | class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }
\r
618 | class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }
\r
619 | class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }
\r
620 | class_attr K_AUTO { }
\r
621 | class_attr K_SEQUENTIAL { $$ = (TypeAttr)$1 | TypeAttr.SequentialLayout; }
\r
622 | class_attr K_EXPLICIT { $$ = (TypeAttr)$1 | TypeAttr.ExplicitLayout; }
\r
623 | class_attr K_ANSI { }
\r
624 | class_attr K_UNICODE { $$ = (TypeAttr)$1 | TypeAttr.UnicodeClass; }
\r
625 | class_attr K_AUTOCHAR { $$ = (TypeAttr)$1 | TypeAttr.AutoClass; }
\r
626 | class_attr K_IMPORT { $$ = (TypeAttr)$1 | TypeAttr.Import; }
\r
627 | class_attr K_SERIALIZABLE { $$ = (TypeAttr)$1 | TypeAttr.Serializable; }
\r
628 | class_attr K_BEFOREFIELDINIT { $$ = (TypeAttr)$1 | TypeAttr.BeforeFieldInit; }
\r
629 | class_attr K_SPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.SpecialName; }
\r
630 | class_attr K_RTSPECIALNAME { $$ = (TypeAttr)$1 | TypeAttr.RTSpecialName; }
\r
633 extends_clause : /* EMPTY */
\r
634 | K_EXTENDS generic_class_ref
\r
640 impl_clause : /* EMPTY */
\r
644 impl_class_refs : K_IMPLEMENTS generic_class_ref
\r
646 ArrayList al = new ArrayList ();
\r
650 | impl_class_refs COMMA generic_class_ref
\r
652 ArrayList al = (ArrayList) $1;
\r
659 formal_typars_clause : /* EMPTY */
\r
660 | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET
\r
666 typars_clause : /* EMPTY */
\r
667 | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET
\r
675 GenericArguments ga = new GenericArguments ();
\r
676 ga.Add ((BaseTypeRef) $1);
\r
679 | typars COMMA type
\r
681 ((GenericArguments) $1).Add ((BaseTypeRef) $3);
\r
686 constraints_clause : /* EMTPY */
\r
687 | OPEN_PARENS constraints CLOSE_PARENS
\r
696 ArrayList al = new ArrayList ();
\r
700 | constraints COMMA type
\r
702 ArrayList al = (ArrayList) $1;
\r
708 generic_class_ref : class_ref
\r
714 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");
\r
716 | K_CLASS class_ref typars_clause
\r
719 $$ = ((BaseClassRef) $2).GetGenericTypeInst ((GenericArguments) $3);
\r
725 GenParam gpar = new GenParam ((int) $2, "", GenParamType.Var);
\r
726 $$ = new GenericParamRef (gpar, $2.ToString ());
\r
730 GenParam gpar = new GenParam ((int) $3, "", GenParamType.MVar);
\r
731 $$ = new GenericParamRef (gpar, $3.ToString ());
\r
736 string name = (string) $2;
\r
737 if (codegen.CurrentTypeDef != null)
\r
738 num = codegen.CurrentTypeDef.GetGenericParamNum (name);
\r
739 GenParam gpar = new GenParam (num, name, GenParamType.Var);
\r
740 $$ = new GenericParamRef (gpar, name);
\r
745 string name = (string) $3;
\r
746 if (codegen.CurrentMethodDef != null)
\r
747 num = codegen.CurrentMethodDef.GetGenericParamNum (name);
\r
748 GenParam gpar = new GenParam (num, name, GenParamType.MVar);
\r
749 $$ = new GenericParamRef (gpar, name);
\r
753 formal_typars : formal_typar_attr constraints_clause formal_typar
\r
755 GenericParameter gp = new GenericParameter ((string) $3, (PEAPI.GenericParamAttributes) $1, (ArrayList) $2);
\r
757 GenericParameters colln = new GenericParameters ();
\r
761 | formal_typars COMMA formal_typar_attr constraints_clause formal_typar
\r
763 GenericParameters colln = (GenericParameters) $1;
\r
764 colln.Add (new GenericParameter ((string) $5, (PEAPI.GenericParamAttributes) $3, (ArrayList) $4));
\r
769 formal_typar_attr : /* EMPTY */
\r
771 $$ = new PEAPI.GenericParamAttributes ();
\r
773 | formal_typar_attr PLUS
\r
775 $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Covariant;
\r
777 | formal_typar_attr DASH
\r
779 $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Contravariant;
\r
781 | formal_typar_attr D_CTOR
\r
783 $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.DefaultConstructorConstrait;
\r
785 | formal_typar_attr K_VALUETYPE
\r
787 $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.NotNullableValueTypeConstraint;
\r
789 | formal_typar_attr K_CLASS
\r
791 $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.ReferenceTypeConstraint;
\r
801 param_type_decl : D_PARAM K_TYPE id
\r
803 if (codegen.CurrentMethodDef != null)
\r
804 codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam ((string) $3);
\r
806 codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam ((string) $3);
\r
807 if (codegen.CurrentCustomAttrTarget == null)
\r
808 Report.Error (String.Format ("Type parameter '{0}' undefined.", (string) $3));
\r
810 | D_PARAM K_TYPE OPEN_BRACKET int32 CLOSE_BRACKET
\r
812 int index = ((int) $4);
\r
813 if (codegen.CurrentMethodDef != null)
\r
814 codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam (index - 1);
\r
816 codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam (index - 1);
\r
817 if (codegen.CurrentCustomAttrTarget == null)
\r
818 Report.Error (String.Format ("Type parameter '{0}' index out of range.", index));
\r
822 class_refs : class_ref
\r
824 ArrayList class_list = new ArrayList ();
\r
825 class_list.Add ($1);
\r
828 | class_refs COMMA class_ref
\r
830 ArrayList class_list = (ArrayList) $1;
\r
831 class_list.Add ($3);
\r
835 slashed_name : comp_name
\r
836 | slashed_name SLASH comp_name
\r
838 $$ = String.Format ("{0}/{1}", $1, $3);
\r
842 class_ref : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name
\r
844 if (codegen.IsThisAssembly ((string) $2)) {
\r
845 $$ = codegen.GetTypeRef ((string) $4);
\r
847 $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);
\r
850 | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name
\r
852 if (codegen.IsThisModule ((string) $3)) {
\r
853 $$ = codegen.GetTypeRef ((string) $5);
\r
855 $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);
\r
860 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);
\r
862 if (prim != null && !codegen.IsThisAssembly ("mscorlib"))
\r
865 $$ = codegen.GetTypeRef ((string) $1);
\r
870 class_decls : /* EMPTY */
\r
871 | class_decls class_decl
\r
874 class_decl : method_all
\r
882 AddSecDecl ($1, false);
\r
887 if (codegen.CurrentCustomAttrTarget != null)
\r
888 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
893 codegen.CurrentTypeDef.SetSize ((int) $2);
\r
897 codegen.CurrentTypeDef.SetPack ((int) $2);
\r
899 | D_OVERRIDE type_spec DOUBLE_COLON method_name K_WITH call_conv type
\r
900 type_spec DOUBLE_COLON method_name type_list
\r
903 // My copy of the spec didn't have a type_list but
\r
904 // it seems pretty crucial
\r
906 BaseTypeRef owner = (BaseTypeRef) $2;
\r
907 ArrayList arg_list = (ArrayList) $11;
\r
908 BaseTypeRef[] param_list;
\r
909 BaseMethodRef decl;
\r
911 if (arg_list != null)
\r
912 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
914 param_list = new BaseTypeRef[0];
\r
916 decl = owner.GetMethodRef ((BaseTypeRef) $7,
\r
917 (CallConv) $6, (string) $4, param_list, 0);
\r
919 // NOTICE: `owner' here might be wrong
\r
920 string sig = MethodDef.CreateSignature (owner, (CallConv) $6, (string) $10,
\r
921 param_list, 0, false);
\r
922 codegen.CurrentTypeDef.AddOverride (sig, decl);
\r
924 OPEN_PARENS sig_args CLOSE_PARENS
\r
928 type : generic_class_ref
\r
930 $$ = GetTypeRef ((BaseTypeRef) $1);
\r
932 | K_VALUE K_CLASS class_ref
\r
934 BaseClassRef class_ref = (BaseClassRef) $3;
\r
935 class_ref.MakeValueClass ();
\r
936 $$ = GetTypeRef (class_ref);
\r
938 | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause
\r
940 ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, true);
\r
942 $$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);
\r
944 $$ = GetTypeRef (ext_ref);
\r
946 | K_VALUETYPE slashed_name typars_clause
\r
948 TypeRef t_ref = codegen.GetTypeRef ((string) $2);
\r
949 t_ref.MakeValueClass ();
\r
951 $$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);
\r
953 $$ = GetTypeRef (t_ref);
\r
955 | type OPEN_BRACKET CLOSE_BRACKET
\r
957 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
958 base_type.MakeArray ();
\r
961 | type OPEN_BRACKET bounds CLOSE_BRACKET
\r
963 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
964 ArrayList bound_list = (ArrayList) $3;
\r
965 base_type.MakeBoundArray (bound_list);
\r
970 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
971 base_type.MakeManagedPointer ();
\r
976 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
977 base_type.MakeUnmanagedPointer ();
\r
982 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
983 base_type.MakePinned ();
\r
986 | type K_MODREQ OPEN_PARENS custom_modifier_type CLOSE_PARENS
\r
988 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
989 BaseTypeRef class_ref = (BaseTypeRef) $4;
\r
990 base_type.MakeCustomModified (codegen,
\r
991 CustomModifier.modreq, class_ref);
\r
994 | type K_MODOPT OPEN_PARENS custom_modifier_type CLOSE_PARENS
\r
996 BaseTypeRef base_type = (BaseTypeRef) $1;
\r
997 BaseTypeRef class_ref = (BaseTypeRef) $4;
\r
998 base_type.MakeCustomModified (codegen,
\r
999 CustomModifier.modopt, class_ref);
\r
1002 | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS
\r
1004 $$ = new MethodPointerTypeRef ((CallConv) $2, (BaseTypeRef) $3, (ArrayList) $6);
\r
1009 primitive_type : K_INT8
\r
1011 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");
\r
1015 $$ = new PrimitiveTypeRef (PrimitiveType.Int16, "System.Int16");
\r
1019 $$ = new PrimitiveTypeRef (PrimitiveType.Int32, "System.Int32");
\r
1023 $$ = new PrimitiveTypeRef (PrimitiveType.Int64, "System.Int64");
\r
1027 $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Single");
\r
1031 $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Double");
\r
1033 | K_UNSIGNED K_INT8
\r
1035 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");
\r
1039 $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");
\r
1041 | K_UNSIGNED K_INT16
\r
1043 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");
\r
1047 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");
\r
1049 | K_UNSIGNED K_INT32
\r
1051 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");
\r
1055 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");
\r
1057 | K_UNSIGNED K_INT64
\r
1059 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");
\r
1063 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");
\r
1067 // TODO: Is this the proper full name
\r
1068 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");
\r
1070 | K_NATIVE K_UNSIGNED K_INT
\r
1072 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");
\r
1076 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");
\r
1080 $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,
\r
1081 "System.TypedReference");
\r
1085 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");
\r
1089 $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");
\r
1093 $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");
\r
1097 $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");
\r
1101 $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");
\r
1107 ArrayList bound_list = new ArrayList ();
\r
1108 bound_list.Add ($1);
\r
1111 | bounds COMMA bound
\r
1113 ArrayList bound_list = (ArrayList) $1;
\r
1114 bound_list.Add ($3);
\r
1118 bound : /* EMPTY */
\r
1120 // This is shortref for no lowerbound or size
\r
1121 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);
\r
1125 // No lower bound or size
\r
1126 $$ = new DictionaryEntry (TypeRef.Ellipsis, TypeRef.Ellipsis);
\r
1130 /* Only size specified */
\r
1131 int size = (int) $1;
\r
1133 /* size cannot be < 0, so emit as (0, ...)
\r
1134 ilasm.net emits it like this */
\r
1135 $$ = new DictionaryEntry (0, TypeRef.Ellipsis);
\r
1137 $$ = new DictionaryEntry (TypeRef.Ellipsis, size);
\r
1139 | int32 ELLIPSIS int32
\r
1141 // lower and upper bound
\r
1142 int lower = (int) $1;
\r
1143 int upper = (int) $3;
\r
1144 if (lower > upper)
\r
1145 Report.Error ("Lower bound " + lower + " must be <= upper bound " + upper);
\r
1147 $$ = new DictionaryEntry ($1, $3);
\r
1151 // Just lower bound
\r
1152 $$ = new DictionaryEntry ($1, TypeRef.Ellipsis);
\r
1156 call_conv : K_INSTANCE call_conv
\r
1158 $$ = (CallConv) $2 | CallConv.Instance;
\r
1160 | K_EXPLICIT call_conv
\r
1162 $$ = (CallConv) $2 | CallConv.InstanceExplicit;
\r
1167 call_kind : /* EMPTY */
\r
1169 $$ = new CallConv ();
\r
1173 $$ = CallConv.Default;
\r
1177 $$ = CallConv.Vararg;
\r
1179 | K_UNMANAGED K_CDECL
\r
1181 $$ = CallConv.Cdecl;
\r
1183 | K_UNMANAGED K_STDCALL
\r
1185 $$ = CallConv.Stdcall;
\r
1187 | K_UNMANAGED K_THISCALL
\r
1189 $$ = CallConv.Thiscall;
\r
1191 | K_UNMANAGED K_FASTCALL
\r
1193 $$ = CallConv.Fastcall;
\r
1197 native_type : /* EMPTY */
\r
1198 | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS
\r
1200 $$ = new CustomMarshaller ((string) $3, (string) $5);
\r
1202 | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET
\r
1204 $$ = new FixedSysString ((uint) (int)$4);
\r
1206 | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET
\r
1208 $$ = new FixedArray ((int) $4);
\r
1213 $$ = NativeType.Currency;
\r
1218 $$ = NativeType.Void;
\r
1222 $$ = NativeType.Boolean;
\r
1226 $$ = NativeType.Int8;
\r
1230 $$ = NativeType.Int16;
\r
1234 $$ = NativeType.Int32;
\r
1238 $$ = NativeType.Int64;
\r
1242 $$ = NativeType.Float32;
\r
1246 $$ = NativeType.Float64;
\r
1250 $$ = NativeType.Error;
\r
1252 | K_UNSIGNED K_INT8
\r
1254 $$ = NativeType.UInt8;
\r
1258 $$ = NativeType.UInt8;
\r
1260 | K_UNSIGNED K_INT16
\r
1262 $$ = NativeType.UInt16;
\r
1266 $$ = NativeType.UInt16;
\r
1268 | K_UNSIGNED K_INT32
\r
1270 $$ = NativeType.UInt32;
\r
1274 $$ = NativeType.UInt32;
\r
1276 | K_UNSIGNED K_INT64
\r
1278 $$ = NativeType.UInt64;
\r
1282 $$ = NativeType.UInt64;
\r
1284 | native_type STAR
\r
1285 | native_type OPEN_BRACKET CLOSE_BRACKET
\r
1287 $$ = new NativeArray ((NativeType) $1);
\r
1289 | native_type OPEN_BRACKET int32 CLOSE_BRACKET
\r
1291 $$ = new NativeArray ((NativeType) $1, (int) $3, 0, 0);
\r
1293 | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET
\r
1295 //FIXME: Allowed only for methods, !fields
\r
1296 $$ = new NativeArray ((NativeType) $1, (int) $3, (int) $5);
\r
1298 | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET
\r
1300 //FIXME: Allowed only for methods, !fields
\r
1301 $$ = new NativeArray ((NativeType) $1, -1, (int) $4);
\r
1307 $$ = NativeType.BStr;
\r
1311 $$ = NativeType.LPStr;
\r
1315 $$ = NativeType.LPWStr;
\r
1319 $$ = NativeType.LPTStr;
\r
1324 $$ = NativeType.IUnknown;
\r
1328 $$ = NativeType.IDispatch;
\r
1332 $$ = NativeType.Struct;
\r
1336 $$ = NativeType.Interface;
\r
1338 | K_SAFEARRAY variant_type
\r
1341 $$ = new SafeArray ();
\r
1343 $$ = new SafeArray ((SafeArrayType) $2);
\r
1345 | K_SAFEARRAY variant_type COMMA comp_qstring
\r
1348 $$ = NativeType.Int;
\r
1350 | K_UNSIGNED K_INT
\r
1352 $$ = NativeType.UInt;
\r
1354 | K_NESTED K_STRUCT
\r
1357 $$ = NativeType.ByValStr;
\r
1361 $$ = NativeType.AnsiBStr;
\r
1365 $$ = NativeType.TBstr;
\r
1367 | K_VARIANT K_BOOL
\r
1369 $$ = NativeType.VariantBool;
\r
1373 $$ = NativeType.FuncPtr;
\r
1377 $$ = NativeType.AsAny;
\r
1381 $$ = NativeType.LPStruct;
\r
1385 variant_type : /* EMPTY */
\r
1389 $$ = SafeArrayType.variant;
\r
1393 $$ = SafeArrayType.currency;
\r
1398 $$ = SafeArrayType.boolean;
\r
1402 $$ = SafeArrayType.int8;
\r
1406 $$ = SafeArrayType.int16;
\r
1410 $$ = SafeArrayType.int32;
\r
1415 $$ = SafeArrayType.float32;
\r
1419 $$ = SafeArrayType.float64;
\r
1421 | K_UNSIGNED K_INT8
\r
1423 $$ = SafeArrayType.uint8;
\r
1425 | K_UNSIGNED K_INT16
\r
1427 $$ = SafeArrayType.uint16;
\r
1429 | K_UNSIGNED K_INT32
\r
1431 $$ = SafeArrayType.uint32;
\r
1433 | K_UNSIGNED K_INT64
\r
1435 | variant_type OPEN_BRACKET CLOSE_BRACKET
\r
1436 | variant_type K_VECTOR
\r
1437 | variant_type AMPERSAND
\r
1440 $$ = SafeArrayType.Decimal;
\r
1444 $$ = SafeArrayType.date;
\r
1448 $$ = SafeArrayType.bstr;
\r
1454 $$ = SafeArrayType.unknown;
\r
1458 $$ = SafeArrayType.unknown;
\r
1463 $$ = SafeArrayType.Int;
\r
1465 | K_UNSIGNED K_INT
\r
1467 $$ = SafeArrayType.UInt;
\r
1471 $$ = SafeArrayType.error;
\r
1481 | K_STREAMED_OBJECT
\r
1488 custom_modifier_type
\r
1493 field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt semicolon_opt
\r
1495 FieldDef field_def = new FieldDef((FieldAttr) $3,
\r
1496 (string) $5, (BaseTypeRef) $4);
\r
1497 codegen.AddFieldDef (field_def);
\r
1498 codegen.CurrentCustomAttrTarget = field_def;
\r
1501 field_def.SetOffset ((uint) (int)$2);
\r
1505 field_def.AddDataValue ((string) $6);
\r
1509 field_def.SetValue ((Constant) $7);
\r
1514 repeat_opt : /* EMPTY */
\r
1515 | OPEN_BRACKET int32 CLOSE_BRACKET
\r
1521 field_attr : /* EMPTY */
\r
1523 $$ = new FieldAttr ();
\r
1525 | field_attr K_PUBLIC
\r
1527 $$ = (FieldAttr) $1 | FieldAttr.Public;
\r
1529 | field_attr K_PRIVATE
\r
1531 $$ = (FieldAttr) $1 | FieldAttr.Private;
\r
1533 | field_attr K_FAMILY
\r
1535 $$ = (FieldAttr) $1 | FieldAttr.Family;
\r
1537 | field_attr K_ASSEMBLY
\r
1539 $$ = (FieldAttr) $1 | FieldAttr.Assembly;
\r
1541 | field_attr K_FAMANDASSEM
\r
1543 $$ = (FieldAttr) $1 | FieldAttr.FamAndAssem;
\r
1545 | field_attr K_FAMORASSEM
\r
1547 $$ = (FieldAttr) $1 | FieldAttr.FamOrAssem;
\r
1549 | field_attr K_PRIVATESCOPE
\r
1551 // This is just 0x0000
\r
1553 | field_attr K_STATIC
\r
1555 $$ = (FieldAttr) $1 | FieldAttr.Static;
\r
1557 | field_attr K_INITONLY
\r
1559 $$ = (FieldAttr) $1 | FieldAttr.Initonly;
\r
1561 | field_attr K_RTSPECIALNAME
\r
1563 $$ = (FieldAttr) $1 | FieldAttr.RTSpecialName;
\r
1565 | field_attr K_SPECIALNAME
\r
1567 $$ = (FieldAttr) $1 | FieldAttr.SpecialName;
\r
1569 | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
1571 codegen.AddFieldMarshalInfo ((NativeType) $4);
\r
1572 $$ = (FieldAttr) $1 | FieldAttr.HasFieldMarshal;
\r
1574 | field_attr K_LITERAL
\r
1576 $$ = (FieldAttr) $1 | FieldAttr.Literal;
\r
1578 | field_attr K_NOTSERIALIZED
\r
1580 $$ = (FieldAttr) $1 | FieldAttr.Notserialized;
\r
1584 at_opt : /* EMPTY */
\r
1591 init_opt : /* EMPTY */
\r
1592 | ASSIGN field_init
\r
1598 field_init_primitive : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
\r
1600 $$ = new FloatConst (Convert.ToSingle ($3));
\r
1602 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS
\r
1604 $$ = new DoubleConst (Convert.ToDouble ($3));
\r
1606 | K_FLOAT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1608 $$ = new FloatConst (BitConverter.ToSingle (BitConverter.GetBytes ((long)$3), BitConverter.IsLittleEndian ? 0 : 4));
\r
1610 | K_FLOAT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1612 $$ = new DoubleConst (BitConverter.Int64BitsToDouble ((long)$3));
\r
1614 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1616 $$ = new IntConst (Convert.ToInt64 ($3));
\r
1618 | K_UINT64 OPEN_PARENS int64 CLOSE_PARENS
\r
1620 $$ = new UIntConst (Convert.ToUInt64 ((ulong)(long) $3));
\r
1622 | K_INT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1624 $$ = new IntConst ((int)((long)$3));
\r
1626 | K_UINT32 OPEN_PARENS int64 CLOSE_PARENS
\r
1628 $$ = new UIntConst ((uint)((long)$3));
\r
1630 | K_INT16 OPEN_PARENS int64 CLOSE_PARENS
\r
1632 $$ = new IntConst ((short)((long) $3));
\r
1634 | K_UINT16 OPEN_PARENS int64 CLOSE_PARENS
\r
1636 $$ = new UIntConst ((ushort)((long) $3));
\r
1638 | K_CHAR OPEN_PARENS int64 CLOSE_PARENS
\r
1640 $$ = new CharConst (Convert.ToChar ($3));
\r
1642 | K_WCHAR OPEN_PARENS int64 CLOSE_PARENS
\r
1644 $$ = new CharConst (Convert.ToChar ($3));
\r
1646 | K_INT8 OPEN_PARENS int64 CLOSE_PARENS
\r
1648 $$ = new IntConst ((sbyte)((long) ($3)));
\r
1650 | K_UINT8 OPEN_PARENS int64 CLOSE_PARENS
\r
1652 $$ = new UIntConst ((byte)((long) ($3)));
\r
1654 | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS
\r
1656 $$ = new BoolConst ((bool) $3);
\r
1660 field_init_full : field_init_primitive
\r
1661 | K_BYTEARRAY bytes_list
\r
1663 $$ = new ByteArrConst ((byte[]) $2);
\r
1667 field_init : field_init_full
\r
1670 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //
\r
1671 $$ = new StringConst ((string) $1);
\r
1675 $$ = new NullConst ();
\r
1679 member_init : field_init_full
\r
1680 | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS
\r
1682 $$ = new StringConst ((string) $3);
\r
1686 opt_truefalse_list
\r
1693 $$ = new List<BoolConst> () { new BoolConst ((bool) $1) };
\r
1695 | truefalse_list truefalse
\r
1697 var l = (List<BoolConst>) $1;
\r
1698 l.Add (new BoolConst ((bool) $2));
\r
1703 data_decl : data_head data_body
\r
1705 DataDef datadef = (DataDef) $1;
\r
1707 if ($2 is ArrayList) {
\r
1708 ArrayList const_list = (ArrayList) $2;
\r
1709 DataConstant[] const_arr = new DataConstant[const_list.Count];
\r
1711 for (int i=0; i<const_arr.Length; i++)
\r
1712 const_arr[i] = (DataConstant) const_list[i];
\r
1714 datadef.PeapiConstant = new ArrayConstant (const_arr);
\r
1716 datadef.PeapiConstant = (PEAPI.Constant) $2;
\r
1718 codegen.AddDataDef (datadef);
\r
1722 data_head : D_DATA data_attr id ASSIGN
\r
1724 $$ = new DataDef ((string) $3, (DataSegment) $2);
\r
1726 | D_DATA data_attr
\r
1728 $$ = new DataDef (String.Empty, (DataSegment) $2);
\r
1732 data_attr : /* EMPTY */ { $$ = DataSegment.Data; }
\r
1733 | K_TLS { $$ = DataSegment.TLS; }
\r
1734 | K_CIL { $$ = DataSegment.CIL; }
\r
1737 data_body : OPEN_BRACE dataitem_list CLOSE_BRACE
\r
1744 dataitem_list : dataitem
\r
1746 ArrayList dataitem_list = new ArrayList ();
\r
1747 dataitem_list.Add ($1);
\r
1748 $$ = dataitem_list;
\r
1750 | dataitem_list COMMA dataitem
\r
1752 ArrayList list = (ArrayList) $1;
\r
1757 dataitem : K_CHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
1759 $$ = new StringConst ((string) $4);
\r
1761 | K_WCHAR STAR OPEN_PARENS comp_qstring CLOSE_PARENS
\r
1763 $$ = new StringConst ((string) $4);
\r
1765 | AMPERSAND OPEN_PARENS id CLOSE_PARENS
\r
1767 // DataDef def = codegen.CurrentTypeDef.GetDataDef ((string) $3);
\r
1768 // $$ = new AddressConstant ((DataConstant) def.PeapiConstant);
\r
1770 | K_BYTEARRAY ASSIGN bytes_list
\r
1772 $$ = new ByteArrConst ((byte[]) $3);
\r
1774 | K_BYTEARRAY bytes_list
\r
1776 // ******** THIS IS NOT IN THE SPECIFICATION ******** //
\r
1777 $$ = new ByteArrConst ((byte[]) $2);
\r
1779 | K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1781 double d = (double) $3;
\r
1782 FloatConst float_const = new FloatConst ((float) d);
\r
1785 $$ = new RepeatedConstant (float_const, (int) $5);
\r
1789 | K_FLOAT64 OPEN_PARENS float64 CLOSE_PARENS repeat_opt
\r
1791 DoubleConst double_const = new DoubleConst ((double) $3);
\r
1794 $$ = new RepeatedConstant (double_const, (int) $5);
\r
1796 $$ = double_const;
\r
1798 | K_INT64 OPEN_PARENS int64 CLOSE_PARENS repeat_opt
\r
1800 IntConst int_const = new IntConst ((long) $3);
\r
1803 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1807 | K_INT32 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1809 IntConst int_const = new IntConst ((int) $3);
\r
1812 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1816 | K_INT16 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1819 IntConst int_const = new IntConst ((short) i);
\r
1822 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1826 | K_INT8 OPEN_PARENS int32 CLOSE_PARENS repeat_opt
\r
1829 IntConst int_const = new IntConst ((sbyte) i);
\r
1832 $$ = new RepeatedConstant (int_const, (int) $5);
\r
1836 | K_FLOAT32 repeat_opt
\r
1838 FloatConst float_const = new FloatConst (0F);
\r
1841 $$ = new RepeatedConstant (float_const, (int) $2);
\r
1845 | K_FLOAT64 repeat_opt
\r
1847 DoubleConst double_const = new DoubleConst (0);
\r
1850 $$ = new RepeatedConstant (double_const, (int) $2);
\r
1852 $$ = double_const;
\r
1854 | K_INT64 repeat_opt
\r
1856 IntConst int_const = new IntConst ((long) 0);
\r
1859 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1863 | K_INT32 repeat_opt
\r
1865 IntConst int_const = new IntConst ((int) 0);
\r
1868 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1872 | K_INT16 repeat_opt
\r
1874 IntConst int_const = new IntConst ((short) 0);
\r
1877 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1881 | K_INT8 repeat_opt
\r
1883 IntConst int_const = new IntConst ((sbyte) 0);
\r
1886 $$ = new RepeatedConstant (int_const, (int) $2);
\r
1892 method_all : method_head OPEN_BRACE method_decls CLOSE_BRACE
\r
1894 codegen.EndMethodDef (tokenizer.Location);
\r
1898 method_head : D_METHOD meth_attr call_conv param_attr type method_name
\r
1899 formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1901 CallConv cc = (CallConv) $3;
\r
1903 cc |= CallConv.Generic;
\r
1905 MethodDef methdef = new MethodDef (
\r
1906 codegen, (MethAttr) $2, cc,
\r
1907 (ImplAttr) $11, (string) $6, (BaseTypeRef) $5,
\r
1908 (ArrayList) $9, tokenizer.Reader.Location, (GenericParameters) $7, codegen.CurrentTypeDef);
\r
1909 if (pinvoke_info) {
\r
1910 ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);
\r
1911 methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);
\r
1912 pinvoke_info = false;
\r
1915 | D_METHOD meth_attr call_conv param_attr type
\r
1916 K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name
\r
1917 OPEN_PARENS sig_args CLOSE_PARENS impl_attr
\r
1919 MethodDef methdef = new MethodDef (
\r
1920 codegen, (MethAttr) $2, (CallConv) $3,
\r
1921 (ImplAttr) $14, (string) $10, (BaseTypeRef) $5,
\r
1922 (ArrayList) $12, tokenizer.Reader.Location, null, codegen.CurrentTypeDef);
\r
1924 if (pinvoke_info) {
\r
1925 ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);
\r
1926 methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);
\r
1927 pinvoke_info = false;
\r
1930 methdef.AddRetTypeMarshalInfo ((NativeType) $8);
\r
1934 meth_attr : /* EMPTY */ { $$ = new MethAttr (); }
\r
1935 | meth_attr K_STATIC { $$ = (MethAttr) $1 | MethAttr.Static; }
\r
1936 | meth_attr K_PUBLIC { $$ = (MethAttr) $1 | MethAttr.Public; }
\r
1937 | meth_attr K_PRIVATE { $$ = (MethAttr) $1 | MethAttr.Private; }
\r
1938 | meth_attr K_FAMILY { $$ = (MethAttr) $1 | MethAttr.Family; }
\r
1939 | meth_attr K_ASSEMBLY { $$ = (MethAttr) $1 | MethAttr.Assembly; }
\r
1940 | meth_attr K_FAMANDASSEM { $$ = (MethAttr) $1 | MethAttr.FamAndAssem; }
\r
1941 | meth_attr K_FAMORASSEM { $$ = (MethAttr) $1 | MethAttr.FamOrAssem; }
\r
1942 | meth_attr K_PRIVATESCOPE { /* CHECK HEADERS */ }
\r
1943 | meth_attr K_FINAL { $$ = (MethAttr) $1 | MethAttr.Final; }
\r
1944 | meth_attr K_VIRTUAL { $$ = (MethAttr) $1 | MethAttr.Virtual; }
\r
1945 | meth_attr K_ABSTRACT { $$ = (MethAttr) $1 | MethAttr.Abstract; }
\r
1946 | meth_attr K_HIDEBYSIG { $$ = (MethAttr) $1 | MethAttr.HideBySig; }
\r
1947 | meth_attr K_NEWSLOT { $$ = (MethAttr) $1 | MethAttr.NewSlot; }
\r
1948 | meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }
\r
1949 | meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }
\r
1950 | meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }
\r
1951 | meth_attr K_STRICT { $$ = (MethAttr) $1 | MethAttr.Strict; }
\r
1952 | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }
\r
1953 | meth_attr K_UNMANAGEDEXP
\r
1954 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS
\r
1955 comp_qstring pinv_attr CLOSE_PARENS
\r
1957 pinvoke_info = true;
\r
1958 pinvoke_mod = (string) $4;
\r
1959 pinvoke_meth = (string) $6;
\r
1960 pinvoke_attr = (PInvokeAttr) $7;
\r
1962 | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring pinv_attr CLOSE_PARENS
\r
1964 pinvoke_info = true;
\r
1965 pinvoke_mod = (string) $4;
\r
1966 pinvoke_meth = null;
\r
1967 pinvoke_attr = (PInvokeAttr) $5;
\r
1969 | meth_attr K_PINVOKEIMPL OPEN_PARENS pinv_attr CLOSE_PARENS
\r
1971 pinvoke_info = true;
\r
1972 pinvoke_mod = null;
\r
1973 pinvoke_meth = null;
\r
1974 pinvoke_attr = (PInvokeAttr) $4;
\r
1978 pinv_attr : /* EMPTY */ { $$ = new PInvokeAttr (); }
\r
1979 | pinv_attr K_NOMANGLE { $$ = (PInvokeAttr) $1 | PInvokeAttr.nomangle; }
\r
1980 | pinv_attr K_ANSI { $$ = (PInvokeAttr) $1 | PInvokeAttr.ansi; }
\r
1981 | pinv_attr K_UNICODE { $$ = (PInvokeAttr) $1 | PInvokeAttr.unicode; }
\r
1982 | pinv_attr K_AUTOCHAR { $$ = (PInvokeAttr) $1 | PInvokeAttr.autochar; }
\r
1983 | pinv_attr K_LASTERR { $$ = (PInvokeAttr) $1 | PInvokeAttr.lasterr; }
\r
1984 | pinv_attr K_WINAPI { $$ = (PInvokeAttr) $1 | PInvokeAttr.winapi; }
\r
1985 | pinv_attr K_CDECL { $$ = (PInvokeAttr) $1 | PInvokeAttr.cdecl; }
\r
1986 | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }
\r
1987 | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }
\r
1988 | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }
\r
1989 | pinv_attr K_BESTFIT COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_on; }
\r
1990 | pinv_attr K_BESTFIT COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_off; }
\r
1991 | pinv_attr K_CHARMAPERROR COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_on; }
\r
1992 | pinv_attr K_CHARMAPERROR COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_off; }
\r
1995 method_name : D_CTOR
\r
2000 param_attr : /* EMPTY */ { $$ = new ParamAttr (); }
\r
2001 | param_attr OPEN_BRACKET K_IN CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.In; }
\r
2002 | param_attr OPEN_BRACKET K_OUT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Out; }
\r
2003 | param_attr OPEN_BRACKET K_OPT CLOSE_BRACKET { $$ = (ParamAttr) $1 | ParamAttr.Opt; }
\r
2006 impl_attr : /* EMPTY */ { $$ = new ImplAttr (); }
\r
2007 | impl_attr K_NATIVE { $$ = (ImplAttr) $1 | ImplAttr.Native; }
\r
2008 | impl_attr K_CIL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
2009 | impl_attr K_IL { $$ = (ImplAttr) $1 | ImplAttr.IL; }
\r
2010 | impl_attr K_OPTIL { $$ = (ImplAttr) $1 | ImplAttr.Optil; }
\r
2011 | impl_attr K_MANAGED { /* should this reset? */ }
\r
2012 | impl_attr K_UNMANAGED { $$ = (ImplAttr) $1 | ImplAttr.Unmanaged; }
\r
2013 | impl_attr K_FORWARDREF { $$ = (ImplAttr) $1 | ImplAttr.ForwardRef; }
\r
2014 | impl_attr K_PRESERVESIG { $$ = (ImplAttr) $1 | ImplAttr.PreserveSig; }
\r
2015 | impl_attr K_RUNTIME { $$ = (ImplAttr) $1 | ImplAttr.Runtime; }
\r
2016 | impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }
\r
2017 | impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }
\r
2018 | impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }
\r
2019 | impl_attr K_NOOPTIMIZATION { $$ = (ImplAttr) $1 | ImplAttr.NoOptimization; }
\r
2020 | impl_attr K_AGGRESSIVEINLINING{ $$ = (ImplAttr) $1 | ImplAttr.AggressiveInlining; }
\r
2023 sig_args : /* EMPTY */
\r
2027 sig_arg_list : sig_arg
\r
2029 ArrayList sig_list = new ArrayList ();
\r
2030 sig_list.Add ($1);
\r
2033 | sig_arg_list COMMA sig_arg
\r
2035 ArrayList sig_list = (ArrayList) $1;
\r
2036 sig_list.Add ($3);
\r
2041 sig_arg : param_attr type
\r
2043 $$ = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);
\r
2045 | param_attr type id
\r
2047 $$ = new ParamDef ((ParamAttr) $1, (string) $3, (BaseTypeRef) $2);
\r
2051 $$ = new ParamDef ((ParamAttr) 0, "...", new SentinelTypeRef ());
\r
2052 // $$ = ParamDef.Ellipsis;
\r
2054 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS
\r
2056 ParamDef param_def = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);
\r
2057 param_def.AddMarshalInfo ((PEAPI.NativeType) $5);
\r
2061 | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id
\r
2063 ParamDef param_def = new ParamDef ((ParamAttr) $1, (string) $7, (BaseTypeRef) $2);
\r
2064 param_def.AddMarshalInfo ((PEAPI.NativeType) $5);
\r
2070 type_list : /* EMPTY */
\r
2072 $$ = new ArrayList (0);
\r
2076 ArrayList type_list = new ArrayList ();
\r
2077 // type_list.Add (TypeRef.Ellipsis);
\r
2078 type_list.Add (new SentinelTypeRef ());
\r
2081 | type_list COMMA ELLIPSIS
\r
2083 ArrayList type_list = (ArrayList) $1;
\r
2084 // type_list.Add (TypeRef.Ellipsis);
\r
2085 type_list.Add (new SentinelTypeRef ());
\r
2088 | param_attr type opt_id
\r
2090 ArrayList type_list = new ArrayList ();
\r
2091 type_list.Add ($2);
\r
2094 | type_list COMMA param_attr type opt_id
\r
2096 ArrayList type_list = (ArrayList) $1;
\r
2097 type_list.Add ($4);
\r
2101 opt_id : /* EMPTY */
\r
2105 method_decls : /* EMPTY */
\r
2106 | method_decls method_decl
\r
2109 method_decl : D_EMITBYTE int32
\r
2111 codegen.CurrentMethodDef.AddInstr (new
\r
2112 EmitByteInstr ((int) $2, tokenizer.Location));
\r
2115 | D_MAXSTACK int32
\r
2117 codegen.CurrentMethodDef.SetMaxStack ((int) $2);
\r
2119 | D_LOCALS OPEN_PARENS local_list CLOSE_PARENS
\r
2122 codegen.CurrentMethodDef.AddLocals (
\r
2126 | D_LOCALS K_INIT OPEN_PARENS local_list CLOSE_PARENS
\r
2129 codegen.CurrentMethodDef.AddLocals (
\r
2131 codegen.CurrentMethodDef.InitLocals ();
\r
2136 codegen.CurrentMethodDef.EntryPoint ();
\r
2137 codegen.HasEntryPoint = true;
\r
2141 codegen.CurrentMethodDef.ZeroInit ();
\r
2143 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET
\r
2144 | D_EXPORT OPEN_BRACKET int32 CLOSE_BRACKET K_AS id
\r
2145 | D_VTENTRY int32 COLON int32
\r
2146 | D_OVERRIDE type_spec DOUBLE_COLON method_name
\r
2148 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,
\r
2149 (BaseTypeRef) $2, (string) $4);
\r
2152 | D_OVERRIDE K_METHOD method_ref
\r
2154 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,
\r
2155 (BaseMethodRef) $3);
\r
2157 | D_OVERRIDE K_METHOD call_conv type type_spec DOUBLE_COLON method_name
\r
2158 OPEN_ANGLE_BRACKET OPEN_BRACKET int32 CLOSE_BRACKET CLOSE_ANGLE_BRACKET
\r
2159 OPEN_PARENS type_list CLOSE_PARENS
\r
2161 BaseTypeRef owner = (BaseTypeRef) $5;
\r
2162 ArrayList arg_list = (ArrayList) $14;
\r
2163 BaseTypeRef[] param_list;
\r
2164 BaseMethodRef methref;
\r
2166 if (arg_list != null)
\r
2167 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2169 param_list = new BaseTypeRef[0];
\r
2171 if (owner.UseTypeSpec) {
\r
2172 methref = new TypeSpecMethodRef (owner, (CallConv) $3, (BaseTypeRef) $4,
\r
2173 (string) $7, param_list, (int) $10);
\r
2175 methref = owner.GetMethodRef ((BaseTypeRef) $4,
\r
2176 (CallConv) $3, (string) $7, param_list, (int) $10);
\r
2179 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,
\r
2183 | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt
\r
2185 int index = (int) $3;
\r
2186 ParamDef param = codegen.CurrentMethodDef.GetParam (index);
\r
2187 codegen.CurrentCustomAttrTarget = param;
\r
2189 if (param == null) {
\r
2190 Report.Warning (tokenizer.Location, String.Format ("invalid param index ({0}) with .param", index));
\r
2191 } else if ($5 != null)
\r
2192 param.AddDefaultValue ((Constant) $5);
\r
2197 codegen.CurrentMethodDef.AddLabel ((string) $1);
\r
2203 AddSecDecl ($1, false);
\r
2209 if (codegen.CurrentCustomAttrTarget != null)
\r
2210 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
2215 local_list : /* EMPTY */
\r
2218 ArrayList local_list = new ArrayList ();
\r
2219 local_list.Add ($1);
\r
2222 | local_list COMMA local
\r
2224 ArrayList local_list = (ArrayList) $1;
\r
2225 local_list.Add ($3);
\r
2231 $$ = new Local (-1, (BaseTypeRef) $1);
\r
2235 $$ = new Local (-1, (string) $2, (BaseTypeRef) $1);
\r
2239 $$ = new Local ((int) $1, (BaseTypeRef) $2);
\r
2241 | slot_num type id
\r
2243 $$ = new Local ((int) $1, (string) $3, (BaseTypeRef) $2);
\r
2247 slot_num : OPEN_BRACKET int32 CLOSE_BRACKET
\r
2253 type_spec : OPEN_BRACKET slashed_name CLOSE_BRACKET
\r
2255 // This is a reference to a global method in another
\r
2256 // assembly. This is not supported in the MS version of ilasm
\r
2258 | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET
\r
2260 string module = (string) $3;
\r
2262 if (codegen.IsThisModule (module)) {
\r
2263 // This is not handled yet.
\r
2265 $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, "<Module>", false);
\r
2272 scope_block : scope_block_begin method_decls CLOSE_BRACE
\r
2274 $$ = new HandlerBlock ((LabelInfo) $1,
\r
2275 codegen.CurrentMethodDef.AddLabel ());
\r
2276 codegen.CurrentMethodDef.EndLocalsScope ();
\r
2280 scope_block_begin : OPEN_BRACE
\r
2282 $$ = codegen.CurrentMethodDef.AddLabel ();
\r
2283 codegen.CurrentMethodDef.BeginLocalsScope ();
\r
2288 seh_block : try_block seh_clauses
\r
2290 TryBlock try_block = (TryBlock) $1;
\r
2292 ArrayList clause_list = (ArrayList) $2;
\r
2293 foreach (object clause in clause_list)
\r
2294 try_block.AddSehClause ((ISehClause) clause);
\r
2296 codegen.CurrentMethodDef.AddInstr (try_block);
\r
2300 try_block : D_TRY scope_block
\r
2302 $$ = new TryBlock ((HandlerBlock) $2, tokenizer.Location);
\r
2304 | D_TRY id K_TO id
\r
2306 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
2307 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);
\r
2309 $$ = new TryBlock (new HandlerBlock (from, to), tokenizer.Location);
\r
2311 | D_TRY int32 K_TO int32
\r
2313 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
2314 LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);
\r
2316 $$ = new TryBlock (new HandlerBlock (from, to), tokenizer.Location);
\r
2320 seh_clauses : seh_clause
\r
2322 ArrayList clause_list = new ArrayList ();
\r
2323 clause_list.Add ($1);
\r
2326 | seh_clauses seh_clause
\r
2328 ArrayList clause_list = (ArrayList) $1;
\r
2329 clause_list.Add ($2);
\r
2333 seh_clause : K_CATCH type handler_block
\r
2335 if ($2.GetType () == typeof (PrimitiveTypeRef))
\r
2336 Report.Error ("Exception not be of a primitive type.");
\r
2338 BaseTypeRef type = (BaseTypeRef) $2;
\r
2339 CatchBlock cb = new CatchBlock (type);
\r
2340 cb.SetHandlerBlock ((HandlerBlock) $3);
\r
2343 | K_FINALLY handler_block
\r
2345 FinallyBlock fb = new FinallyBlock ();
\r
2346 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
2349 | K_FAULT handler_block
\r
2351 FaultBlock fb = new FaultBlock ();
\r
2352 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
2355 | filter_clause handler_block
\r
2357 FilterBlock fb = (FilterBlock) $1;
\r
2358 fb.SetHandlerBlock ((HandlerBlock) $2);
\r
2362 filter_clause : K_FILTER scope_block
\r
2364 HandlerBlock block = (HandlerBlock) $2;
\r
2365 FilterBlock fb = new FilterBlock (block);
\r
2370 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
2371 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));
\r
2376 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
2377 FilterBlock fb = new FilterBlock (new HandlerBlock (from, null));
\r
2382 handler_block : scope_block
\r
2386 | K_HANDLER id K_TO id
\r
2388 LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
2389 LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);
\r
2391 $$ = new HandlerBlock (from, to);
\r
2393 | K_HANDLER int32 K_TO int32
\r
2395 LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
2396 LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);
\r
2398 $$ = new HandlerBlock (from, to);
\r
2402 instr : INSTR_NONE
\r
2404 codegen.CurrentMethodDef.AddInstr (
\r
2405 new SimpInstr ((Op) $1, tokenizer.Location));
\r
2407 | INSTR_LOCAL int32
\r
2409 codegen.CurrentMethodDef.AddInstr (
\r
2410 new IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));
\r
2414 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
2416 Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));
\r
2417 codegen.CurrentMethodDef.AddInstr (
\r
2418 new IntInstr ((IntOp) $1, slot, tokenizer.Location));
\r
2420 | INSTR_PARAM int32
\r
2422 codegen.CurrentMethodDef.AddInstr (
\r
2423 new IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));
\r
2427 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);
\r
2429 Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));
\r
2431 codegen.CurrentMethodDef.AddInstr (
\r
2432 new IntInstr ((IntOp) $1, pos, tokenizer.Location));
\r
2436 codegen.CurrentMethodDef.AddInstr (new
\r
2437 IntInstr ((IntOp) $1, (int) $2, tokenizer.Location));
\r
2441 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);
\r
2443 Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));
\r
2444 codegen.CurrentMethodDef.AddInstr (new
\r
2445 IntInstr ((IntOp) $1, slot, tokenizer.Location));
\r
2449 if ($1 is MiscInstr) {
\r
2450 switch ((MiscInstr) $1) {
\r
2451 case MiscInstr.ldc_i8:
\r
2452 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1,
\r
2453 (long) $2, tokenizer.Location));
\r
2460 switch ((MiscInstr) $1) {
\r
2461 case MiscInstr.ldc_r4:
\r
2462 case MiscInstr.ldc_r8:
\r
2463 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) $2, tokenizer.Location));
\r
2469 long l = (long) $2;
\r
2471 switch ((MiscInstr) $1) {
\r
2472 case MiscInstr.ldc_r4:
\r
2473 case MiscInstr.ldc_r8:
\r
2474 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, (double) l, tokenizer.Location));
\r
2478 | INSTR_R bytes_list
\r
2481 switch ((MiscInstr) $1) {
\r
2482 case MiscInstr.ldc_r4:
\r
2483 fpdata = (byte []) $2;
\r
2484 if (!BitConverter.IsLittleEndian) {
\r
2485 System.Array.Reverse (fpdata, 0, 4);
\r
2487 float s = BitConverter.ToSingle (fpdata, 0);
\r
2488 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, s, tokenizer.Location));
\r
2490 case MiscInstr.ldc_r8:
\r
2491 fpdata = (byte []) $2;
\r
2492 if (!BitConverter.IsLittleEndian) {
\r
2493 System.Array.Reverse (fpdata, 0, 8);
\r
2495 double d = BitConverter.ToDouble (fpdata, 0);
\r
2496 codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, d, tokenizer.Location));
\r
2500 | INSTR_BRTARGET int32
\r
2502 LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);
\r
2503 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,
\r
2504 target, tokenizer.Location));
\r
2506 | INSTR_BRTARGET id
\r
2508 LabelInfo target = codegen.CurrentMethodDef.AddLabelRef ((string) $2);
\r
2509 codegen.CurrentMethodDef.AddInstr (new BranchInstr ((BranchOp) $1,
\r
2510 target, tokenizer.Location));
\r
2512 | INSTR_METHOD method_ref
\r
2514 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,
\r
2515 (BaseMethodRef) $2, tokenizer.Location));
\r
2517 | INSTR_FIELD type type_spec DOUBLE_COLON id
\r
2520 BaseTypeRef owner = (BaseTypeRef) $3;
\r
2521 GenericParamRef gpr = $2 as GenericParamRef;
\r
2522 if (gpr != null && codegen.CurrentMethodDef != null)
\r
2523 codegen.CurrentMethodDef.ResolveGenParam ((PEAPI.GenParam) gpr.PeapiType);
\r
2524 IFieldRef fieldref = owner.GetFieldRef (
\r
2525 (BaseTypeRef) $2, (string) $5);
\r
2527 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));
\r
2529 | INSTR_FIELD type id
\r
2531 GlobalFieldRef fieldref = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);
\r
2533 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));
\r
2535 | INSTR_TYPE type_spec
\r
2537 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,
\r
2538 (BaseTypeRef) $2, tokenizer.Location));
\r
2540 | INSTR_STRING comp_qstring
\r
2542 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2543 codegen.CurrentMethodDef.AddInstr (new LdstrInstr ((string) $2, tokenizer.Location));
\r
2545 | INSTR_STRING K_BYTEARRAY ASSIGN bytes_list
\r
2547 byte[] bs = (byte[]) $4;
\r
2548 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2549 codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs, tokenizer.Location));
\r
2551 | INSTR_STRING K_BYTEARRAY bytes_list
\r
2553 byte[] bs = (byte[]) $3;
\r
2554 if ((MiscInstr) $1 == MiscInstr.ldstr)
\r
2555 codegen.CurrentMethodDef.AddInstr (new LdstrInstr (bs, tokenizer.Location));
\r
2557 | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS
\r
2559 ArrayList arg_list = (ArrayList) $5;
\r
2560 BaseTypeRef[] arg_array = null;
\r
2562 if (arg_list != null)
\r
2563 arg_array = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2565 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,
\r
2566 (BaseTypeRef) $3, arg_array, tokenizer.Location));
\r
2568 | INSTR_TOK owner_type
\r
2570 if ((MiscInstr) $1 == MiscInstr.ldtoken) {
\r
2571 if ($2 is BaseMethodRef)
\r
2572 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseMethodRef) $2, tokenizer.Location));
\r
2573 else if ($2 is IFieldRef)
\r
2574 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2, tokenizer.Location));
\r
2576 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseTypeRef) $2, tokenizer.Location));
\r
2580 | INSTR_SWITCH OPEN_PARENS labels CLOSE_PARENS
\r
2582 codegen.CurrentMethodDef.AddInstr (new SwitchInstr ((ArrayList) $3, tokenizer.Location));
\r
2586 method_ref : call_conv type method_name typars_clause
\r
2587 OPEN_PARENS type_list CLOSE_PARENS
\r
2589 ArrayList arg_list = (ArrayList) $6;
\r
2590 GenericArguments ga = (GenericArguments) $4;
\r
2591 BaseTypeRef[] param_list;
\r
2593 if (arg_list != null)
\r
2594 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2596 param_list = new BaseTypeRef[0];
\r
2598 BaseMethodRef methref = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,
\r
2599 (string) $3, param_list, (ga != null ? ga.Count : 0));
\r
2602 methref = methref.GetGenericMethodRef (ga);
\r
2606 | call_conv type type_spec DOUBLE_COLON method_name
\r
2607 typars_clause OPEN_PARENS type_list CLOSE_PARENS
\r
2609 BaseTypeRef owner = (BaseTypeRef) $3;
\r
2610 ArrayList arg_list = (ArrayList) $8;
\r
2611 GenericArguments ga = (GenericArguments) $6;
\r
2612 BaseTypeRef[] param_list;
\r
2613 BaseMethodRef methref;
\r
2615 if (arg_list != null)
\r
2616 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2618 param_list = new BaseTypeRef[0];
\r
2620 if (codegen.IsThisAssembly ("mscorlib")) {
\r
2621 PrimitiveTypeRef prim = owner as PrimitiveTypeRef;
\r
2622 if (prim != null && prim.SigMod == "")
\r
2623 owner = codegen.GetTypeRef (prim.Name);
\r
2626 if (owner.UseTypeSpec) {
\r
2627 methref = new TypeSpecMethodRef (owner, (CallConv) $1, (BaseTypeRef) $2,
\r
2628 (string) $5, param_list, (ga != null ? ga.Count : 0));
\r
2630 methref = owner.GetMethodRef ((BaseTypeRef) $2,
\r
2631 (CallConv) $1, (string) $5, param_list, (ga != null ? ga.Count : 0));
\r
2635 methref = methref.GetGenericMethodRef (ga);
\r
2641 labels : /* EMPTY */
\r
2644 ArrayList label_list = new ArrayList ();
\r
2645 label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $1));
\r
2650 ArrayList label_list = new ArrayList ();
\r
2651 label_list.Add ($1);
\r
2656 ArrayList label_list = (ArrayList) $1;
\r
2657 label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $3));
\r
2659 | labels COMMA int32
\r
2661 ArrayList label_list = (ArrayList) $1;
\r
2662 label_list.Add ($3);
\r
2666 owner_type : type_spec
\r
2670 member_ref : K_METHOD method_ref
\r
2674 | K_FIELD type type_spec DOUBLE_COLON id
\r
2676 BaseTypeRef owner = (BaseTypeRef) $3;
\r
2678 $$ = owner.GetFieldRef (
\r
2679 (BaseTypeRef) $2, (string) $5);
\r
2683 $$ = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);
\r
2687 event_all : event_head OPEN_BRACE event_decls CLOSE_BRACE
\r
2689 codegen.CurrentTypeDef.EndEventDef ();
\r
2693 event_head : D_EVENT event_attr type_spec comp_name
\r
2695 EventDef event_def = new EventDef ((FeatureAttr) $2,
\r
2696 (BaseTypeRef) $3, (string) $4);
\r
2697 codegen.CurrentTypeDef.BeginEventDef (event_def);
\r
2698 codegen.CurrentCustomAttrTarget = event_def;
\r
2700 | D_EVENT event_attr id
\r
2703 event_attr : /* EMPTY */
\r
2705 $$ = new FeatureAttr ();
\r
2707 | event_attr K_RTSPECIALNAME
\r
2709 $$ = (FeatureAttr) $1 & FeatureAttr.Rtspecialname;
\r
2711 | event_attr K_SPECIALNAME
\r
2713 $$ = (FeatureAttr) $1 & FeatureAttr.Specialname;
\r
2717 event_decls : /* EMPTY */
\r
2718 | event_decls event_decl
\r
2721 event_decl : D_ADDON method_ref semicolon_opt
\r
2723 codegen.CurrentTypeDef.CurrentEvent.AddAddon (
\r
2726 | D_REMOVEON method_ref semicolon_opt
\r
2728 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (
\r
2731 | D_FIRE method_ref semicolon_opt
\r
2733 codegen.CurrentTypeDef.CurrentEvent.AddFire (
\r
2736 | D_OTHER method_ref semicolon_opt
\r
2738 codegen.CurrentTypeDef.CurrentEvent.AddOther (
\r
2743 if (codegen.CurrentCustomAttrTarget != null)
\r
2744 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
2750 prop_all : prop_head OPEN_BRACE prop_decls CLOSE_BRACE
\r
2752 codegen.CurrentTypeDef.EndPropertyDef ();
\r
2756 prop_head : D_PROPERTY prop_attr type comp_name OPEN_PARENS type_list CLOSE_PARENS init_opt
\r
2758 PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (BaseTypeRef) $3,
\r
2759 (string) $4, (ArrayList) $6);
\r
2760 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);
\r
2761 codegen.CurrentCustomAttrTarget = prop_def;
\r
2764 prop_def.AddInitValue ((Constant) $8);
\r
2769 prop_attr : /* EMPTY */
\r
2771 $$ = new FeatureAttr ();
\r
2773 | prop_attr K_RTSPECIALNAME
\r
2775 $$ = (FeatureAttr) $1 | FeatureAttr.Rtspecialname;
\r
2777 | prop_attr K_SPECIALNAME
\r
2779 $$ = (FeatureAttr) $1 | FeatureAttr.Specialname;
\r
2781 | prop_attr K_INSTANCE
\r
2783 $$ = (FeatureAttr) $1 | FeatureAttr.Instance;
\r
2787 prop_decls : /* EMPTY */
\r
2788 | prop_decls prop_decl
\r
2791 prop_decl : D_SET method_ref
\r
2793 codegen.CurrentTypeDef.CurrentProperty.AddSet ((MethodRef) $2);
\r
2795 | D_GET method_ref
\r
2797 codegen.CurrentTypeDef.CurrentProperty.AddGet ((MethodRef) $2);
\r
2799 | D_OTHER method_ref
\r
2801 codegen.CurrentTypeDef.CurrentProperty.AddOther ((MethodRef) $2);
\r
2805 if (codegen.CurrentCustomAttrTarget != null)
\r
2806 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
2813 : D_CUSTOM customattr_owner_type_opt custom_type
\r
2815 $$ = new CustomAttr ((BaseMethodRef) $3, null);
\r
2817 | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN comp_qstring
\r
2818 | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN bytes_list
\r
2820 $$ = new CustomAttr ((BaseMethodRef) $3, new ByteArrConst ((byte[]) $5));
\r
2822 | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN OPEN_BRACE customattr_values CLOSE_BRACE
\r
2824 $$ = new CustomAttr ((BaseMethodRef) $3, (PEAPI.Constant) $6);
\r
2828 // TODO: unused for now
\r
2829 customattr_owner_type_opt
\r
2831 | OPEN_PARENS type CLOSE_PARENS
\r
2836 | K_BOOL OPEN_BRACKET int32 CLOSE_BRACKET OPEN_PARENS opt_truefalse_list CLOSE_PARENS
\r
2838 var l = (List<BoolConst>) $6;
\r
2839 $$ = new ArrayConstant (l?.ToArray ()) {
\r
2840 ExplicitSize = (int) $3
\r
2843 | K_BYTEARRAY bytes_list
\r
2845 $$ = new ByteArrConst ((byte[]) $2);
\r
2847 | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS
\r
2849 $$ = new StringConst ((string) $3);
\r
2851 | customattr_ctor_args
\r
2853 var c = $1 as Constant;
\r
2854 $$ = c ?? new ArrayConstant (((List<DataConstant>) $1).ToArray ());
\r
2858 customattr_ctor_args
\r
2859 : customattr_ctor_arg
\r
2860 | customattr_ctor_args customattr_ctor_arg
\r
2862 var l = $1 as List<DataConstant>;
\r
2864 l = new List<DataConstant> () {
\r
2869 l.Add ((DataConstant) $2);
\r
2874 customattr_ctor_arg
\r
2875 : field_init_primitive
\r
2876 | K_TYPE OPEN_PARENS type CLOSE_PARENS
\r
2878 $$ = new StringConst (((TypeRef) $3).FullName);
\r
2883 custom_type : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS
\r
2885 BaseTypeRef owner = (BaseTypeRef) $3;
\r
2886 ArrayList arg_list = (ArrayList) $7;
\r
2887 BaseTypeRef[] param_list;
\r
2889 if (arg_list != null)
\r
2890 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2892 param_list = new BaseTypeRef[0];
\r
2894 $$ = owner.GetMethodRef ((BaseTypeRef) $2,
\r
2895 (CallConv) $1, (string) $5, param_list, 0);
\r
2897 | call_conv type method_name OPEN_PARENS type_list CLOSE_PARENS
\r
2899 ArrayList arg_list = (ArrayList) $5;
\r
2900 BaseTypeRef[] param_list;
\r
2902 if (arg_list != null)
\r
2903 param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));
\r
2905 param_list = new BaseTypeRef[0];
\r
2907 $$ = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,
\r
2908 (string) $3, param_list, 0);
\r
2912 sec_decl : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS
\r
2914 $$ = TypeSpecToPermPair ($2, $3, (ArrayList) $5);
\r
2916 | D_PERMISSION sec_action type_spec
\r
2918 $$ = TypeSpecToPermPair ($2, $3, null);
\r
2920 | D_PERMISSIONSET sec_action ASSIGN bytes_list
\r
2922 System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding ();
\r
2923 PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);
\r
2924 psa.XML = ue.GetString ((byte []) $4);
\r
2925 $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());
\r
2927 | D_PERMISSIONSET sec_action comp_qstring
\r
2929 PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);
\r
2930 psa.XML = (string) $3;
\r
2931 $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());
\r
2933 | D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE
\r
2935 $$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);
\r
2939 permissions : permission
\r
2941 ArrayList list = new ArrayList ();
\r
2945 | permissions COMMA permission
\r
2947 ArrayList list = (ArrayList) $1;
\r
2953 permission : class_ref ASSIGN OPEN_BRACE permission_members CLOSE_BRACE
\r
2955 $$ = new MIPermission ((BaseTypeRef) $1, (ArrayList) $4);
\r
2959 permission_members : permission_member
\r
2961 ArrayList list = new ArrayList ();
\r
2965 | permission_members permission_member
\r
2967 ArrayList list = (ArrayList) $1;
\r
2973 permission_member : prop_or_field primitive_type perm_mbr_nameval_pair
\r
2975 NameValuePair pair = (NameValuePair) $3;
\r
2976 $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $2, pair.Name, pair.Value);
\r
2978 | prop_or_field K_ENUM class_ref perm_mbr_nameval_pair
\r
2980 NameValuePair pair = (NameValuePair) $4;
\r
2981 $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $3, pair.Name, pair.Value);
\r
2985 perm_mbr_nameval_pair : SQSTRING ASSIGN member_init
\r
2987 $$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);
\r
2991 prop_or_field : K_PROPERTY
\r
2993 $$ = MemberTypes.Property;
\r
2997 $$ = MemberTypes.Field;
\r
3001 nameval_pairs : nameval_pair
\r
3003 ArrayList pairs = new ArrayList ();
\r
3007 | nameval_pairs COMMA nameval_pair
\r
3009 ArrayList pairs = (ArrayList) $1;
\r
3015 nameval_pair : comp_qstring ASSIGN cavalue
\r
3017 $$ = new NameValuePair ((string) $1, $3);
\r
3021 cavalue : truefalse
\r
3023 | int32 OPEN_PARENS int32 CLOSE_PARENS
\r
3028 | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS
\r
3030 $$ = ClassRefToObject ($1, (byte) (int) $5);
\r
3032 | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS
\r
3034 $$ = ClassRefToObject ($1, (short) (int) $5);
\r
3036 | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS
\r
3038 $$ = ClassRefToObject ($1, (int) $5);
\r
3040 | class_ref OPEN_PARENS int32 CLOSE_PARENS
\r
3042 $$ = ClassRefToObject ($1, (int) $3);
\r
3046 sec_action : K_REQUEST
\r
3048 $$ = PEAPI.SecurityAction.Request;
\r
3052 $$ = PEAPI.SecurityAction.Demand;
\r
3056 $$ = PEAPI.SecurityAction.Assert;
\r
3060 $$ = PEAPI.SecurityAction.Deny;
\r
3064 $$ = PEAPI.SecurityAction.PermitOnly;
\r
3068 $$ = PEAPI.SecurityAction.LinkDemand;
\r
3072 $$ = PEAPI.SecurityAction.InheritDemand;
\r
3076 $$ = PEAPI.SecurityAction.RequestMinimum;
\r
3080 $$ = PEAPI.SecurityAction.RequestOptional;
\r
3084 $$ = PEAPI.SecurityAction.RequestRefuse;
\r
3088 $$ = PEAPI.SecurityAction.PreJitGrant;
\r
3092 $$ = PEAPI.SecurityAction.PreJitDeny;
\r
3096 $$ = PEAPI.SecurityAction.NonCasDemand;
\r
3098 | K_NONCASLINKDEMAND
\r
3100 $$ = PEAPI.SecurityAction.NonCasLinkDemand;
\r
3102 | K_NONCASINHERITANCE
\r
3104 $$ = PEAPI.SecurityAction.NonCasInheritance;
\r
3106 /* FIXME: Should we have LinkDemandChoice, InheritDemandChoice and DemandChoice ? */
\r
3109 module_head : D_MODULE
\r
3112 | D_MODULE comp_name
\r
3114 codegen.SetModuleName ((string) $2);
\r
3116 | D_MODULE K_EXTERN comp_name
\r
3118 codegen.ExternTable.AddModule ((string) $3);
\r
3122 file_decl : D_FILE file_attr comp_name file_entry D_HASH ASSIGN
\r
3123 bytes_list file_entry
\r
3125 codegen.SetFileRef (new FileRef ((string) $3, (byte []) $7, (bool) $2, (bool) $8));
\r
3127 | D_FILE file_attr comp_name file_entry
\r
3129 // We need to compute the hash ourselves. :-(
\r
3130 // AssemblyName an = AssemblyName.GetName ((string) $3);
\r
3134 file_attr : /* EMPTY */
\r
3138 | file_attr K_NOMETADATA
\r
3144 file_entry : /* EMPTY */
\r
3154 assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
\r
3156 codegen.CurrentCustomAttrTarget = null;
\r
3157 codegen.CurrentDeclSecurityTarget = null;
\r
3161 assembly_head : D_ASSEMBLY legacylibrary_opt asm_attr slashed_name
\r
3163 codegen.SetThisAssembly ((string) $4, (PEAPI.AssemAttr) $3);
\r
3164 codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;
\r
3165 codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;
\r
3169 asm_attr : /* EMPTY */
\r
3171 $$ = new PEAPI.AssemAttr ();
\r
3173 /*| asm_attr K_NOAPPDOMAIN
\r
3174 | asm_attr K_NOPROCESS
\r
3175 | asm_attr K_NOMACHINE*/
\r
3176 | asm_attr K_RETARGETABLE
\r
3178 $$ = ((PEAPI.AssemAttr) $1) | PEAPI.AssemAttr.Retargetable;
\r
3182 assembly_decls : /* EMPTY */
\r
3183 | assembly_decls assembly_decl
\r
3186 assembly_decl : D_PUBLICKEY ASSIGN bytes_list
\r
3188 codegen.ThisAssembly.SetPublicKey ((byte []) $3);
\r
3190 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
3192 codegen.ThisAssembly.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);
\r
3194 | D_LOCALE comp_qstring
\r
3196 codegen.ThisAssembly.SetLocale ((string) $2);
\r
3198 | D_LOCALE ASSIGN bytes_list
\r
3199 | D_HASH K_ALGORITHM int32
\r
3201 codegen.ThisAssembly.SetHashAlgorithm ((int) $3);
\r
3205 codegen.ThisAssembly.AddCustomAttribute ((CustomAttr) $1);
\r
3209 AddSecDecl ($1, true);
\r
3213 asm_or_ref_decl : D_PUBLICKEY ASSIGN bytes_list
\r
3214 | D_VER int32 COLON int32 COLON int32 COLON int32
\r
3215 | D_LOCALE comp_qstring
\r
3216 | D_LOCALE ASSIGN bytes_list
\r
3220 assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE
\r
3223 assemblyref_head : D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name
\r
3225 System.Reflection.AssemblyName asmb_name =
\r
3226 new System.Reflection.AssemblyName ();
\r
3227 asmb_name.Name = (string) $5;
\r
3228 codegen.BeginAssemblyRef ((string) $5, asmb_name, (PEAPI.AssemAttr) $4);
\r
3230 | D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name K_AS slashed_name
\r
3232 System.Reflection.AssemblyName asmb_name =
\r
3233 new System.Reflection.AssemblyName ();
\r
3234 asmb_name.Name = (string) $5;
\r
3235 codegen.BeginAssemblyRef ((string) $7, asmb_name, (PEAPI.AssemAttr) $4);
\r
3239 assemblyref_decls : /* EMPTY */
\r
3240 | assemblyref_decls assemblyref_decl
\r
3243 assemblyref_decl : D_VER int32 COLON int32 COLON int32 COLON int32
\r
3245 codegen.CurrentAssemblyRef.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);
\r
3247 | D_PUBLICKEY ASSIGN bytes_list
\r
3249 codegen.CurrentAssemblyRef.SetPublicKey ((byte []) $3);
\r
3251 | D_PUBLICKEYTOKEN ASSIGN bytes_list
\r
3253 codegen.CurrentAssemblyRef.SetPublicKeyToken ((byte []) $3);
\r
3255 | D_LOCALE comp_qstring
\r
3257 codegen.CurrentAssemblyRef.SetLocale ((string) $2);
\r
3259 | D_LOCALE ASSIGN bytes_list
\r
3261 | D_HASH ASSIGN bytes_list
\r
3263 codegen.CurrentAssemblyRef.SetHash ((byte []) $3);
\r
3267 if (codegen.CurrentCustomAttrTarget != null)
\r
3268 codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);
\r
3270 | K_AUTO /* MS ilasm uses this keyword to lookup the specified assembly in the GAC and embeds its attributes, we just ignore it */
\r
3273 exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE
\r
3276 exptype_head : D_CLASS K_EXTERN expt_attr comp_name
\r
3278 current_extern = new KeyValuePair<string, TypeAttr> ((string) $4, (TypeAttr) $3);
\r
3282 expt_attr : { $$ = 0; } /* EMPTY */
\r
3283 | expt_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }
\r
3284 | expt_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }
\r
3285 | expt_attr K_FORWARDER { $$ = (TypeAttr)$1 | TypeAttr.Forwarder; }
\r
3286 | expt_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }
\r
3287 | expt_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }
\r
3288 | expt_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }
\r
3289 | expt_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}
\r
3290 | expt_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }
\r
3291 | expt_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }
\r
3294 exptype_decls : /* EMPTY */
\r
3295 | exptype_decls exptype_decl
\r
3298 exptype_decl : D_FILE comp_name
\r
3299 | D_CLASS K_EXTERN comp_name
\r
3301 | D_ASSEMBLY K_EXTERN comp_name
\r
3303 codegen.ExternTable.AddClass (current_extern.Key, current_extern.Value, (string) $3);
\r
3307 manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE
\r
3310 manifestres_head : D_MRESOURCE manres_attr comp_name
\r
3312 FileStream s = new FileStream ((string) $3, FileMode.Open, FileAccess.Read);
\r
3313 byte [] buff = new byte [s.Length];
\r
3314 s.Read (buff, 0, (int) s.Length);
\r
3317 codegen.AddManifestResource (new ManifestResource ((string) $3, buff, ($2 == null) ? 0 : (uint) $2));
\r
3321 manres_attr : /* EMPTY */
\r
3322 | manres_attr K_PUBLIC { $$ = ManifestResource.PublicResource; }
\r
3323 | manres_attr K_PRIVATE { $$ = ManifestResource.PrivateResource; }
\r
3326 manifestres_decls : /* EMPTY */
\r
3327 | manifestres_decls manifestres_decl
\r
3330 manifestres_decl : D_FILE comp_name K_AT int32
\r
3331 | D_ASSEMBLY K_EXTERN slashed_name
\r
3335 comp_qstring : QSTRING
\r
3336 | comp_qstring PLUS QSTRING { $$ = String.Format ("{0}{1}", $1, $3); }
\r
3341 long l = (long) $1;
\r
3342 byte[] intb = BitConverter.GetBytes (l);
\r
3343 $$ = BitConverter.ToInt32 (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
3351 | K_FLOAT32 OPEN_PARENS INT32 CLOSE_PARENS
\r
3354 byte[] intb = BitConverter.GetBytes (i);
\r
3355 $$ = (double) BitConverter.ToSingle (intb, 0);
\r
3357 | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS
\r
3359 long l = (long) $3;
\r
3360 byte[] intb = BitConverter.GetBytes (l);
\r
3361 $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);
\r
3363 | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS
\r
3365 byte[] intb = BitConverter.GetBytes ((long) $3);
\r
3366 $$ = BitConverter.ToDouble (intb, 0);
\r
3368 | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS
\r
3370 byte[] intb = BitConverter.GetBytes ((int) $3);
\r
3371 $$ = (double) BitConverter.ToSingle (intb, 0);
\r
3375 hexbyte : HEXBYTE { }
\r
3378 bytes_list : OPEN_PARENS
\r
3380 tokenizer.InByteArray = true;
\r
3382 bytes CLOSE_PARENS
\r
3385 tokenizer.InByteArray = false;
\r
3389 bytes : /* EMPTY */ { $$ = new byte[0]; }
\r
3392 ArrayList byte_list = (ArrayList) $1;
\r
3393 $$ = byte_list.ToArray (typeof (byte));
\r
3397 hexbytes : hexbyte
\r
3399 ArrayList byte_list = new ArrayList ();
\r
3400 byte_list.Add (Convert.ToByte ($1));
\r
3403 | hexbytes hexbyte
\r
3405 ArrayList byte_list = (ArrayList) $1;
\r
3406 byte_list.Add (Convert.ToByte ($2));
\r
3410 truefalse : K_TRUE
\r
3425 | comp_name DOT comp_name
\r
3427 $$ = (string) $1 + '.' + (string) $3;
\r
3437 legacylibrary_opt : /* empty */
\r
3438 | K_LEGACY K_LIBRARY /* MS ilasm has these keywords for backwards compatibility, we just ignore them */
\r