private string pinvoke_meth;\r
private PEAPI.PInvokeAttr pinvoke_attr;\r
private ILTokenizer tokenizer;\r
- static int yacc_verbose_flag;\r
+ const int yacc_verbose_flag = 0;\r
KeyValuePair<string, TypeAttr> current_extern;\r
\r
class NameValuePair {\r
\r
public bool CheckSecurityActionValidity (System.Security.Permissions.SecurityAction action, bool for_assembly)\r
{\r
+#pragma warning disable 618\r
if ((action == System.Security.Permissions.SecurityAction.RequestMinimum || \r
action == System.Security.Permissions.SecurityAction.RequestOptional || \r
action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {\r
Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
return false;\r
}\r
-\r
+#pragma warning restore 618\r
return true;\r
}\r
\r
/* Keywords */\r
%token K_AT\r
%token K_AS\r
+%token K_AGGRESSIVEINLINING\r
%token K_IMPLICITCOM\r
%token K_IMPLICITRES\r
%token K_NOAPPDOMAIN\r
%token K_INTERNALCALL\r
%token K_SYNCHRONIZED\r
%token K_NOINLINING\r
+%token K_NOOPTIMIZATION\r
%token K_CUSTOM\r
%token K_FIXED\r
%token K_SYSSTRING\r
%token K_OFF\r
%token K_FORWARDER\r
%token K_CHARMAPERROR\r
+%token K_LEGACY\r
+%token K_LIBRARY\r
+%token K_AUTO\r
\r
/* end generated */\r
\r
}\r
;\r
\r
-class_attrs : class_attrs class_attr\r
- ;\r
-\r
class_attr : /* EMPTY */ \r
{ \r
// Reset some flags\r
| class_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
| class_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
| class_attr K_VALUE { is_value_class = true; }\r
- | class_attr K_ENUM { is_enum_class = true; is_value_class = true;\r
- }\r
+ | class_attr K_ENUM { is_enum_class = true; }\r
| class_attr K_INTERFACE { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
| class_attr K_SEALED { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
| class_attr K_ABSTRACT { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
;\r
\r
\r
-constraints : generic_class_ref\r
+constraints : type\r
{\r
ArrayList al = new ArrayList ();\r
al.Add ($1);\r
$$ = al;\r
}\r
- | constraints COMMA generic_class_ref\r
+ | constraints COMMA type\r
{\r
ArrayList al = (ArrayList) $1;\r
al.Add ($3);\r
{\r
$$ = $1;\r
}\r
+ | K_OBJECT\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+ }\r
| K_CLASS class_ref typars_clause\r
{\r
if ($3 != null)\r
\r
type : generic_class_ref\r
{\r
- $$ = $1;\r
- }\r
- | K_OBJECT\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+ $$ = GetTypeRef ((BaseTypeRef) $1);\r
}\r
| K_VALUE K_CLASS class_ref\r
{\r
- BaseClassRef class_ref = (BaseClassRef) $3;\r
- class_ref.MakeValueClass ();\r
- $$ = class_ref;\r
+ BaseClassRef class_ref = (BaseClassRef) $3;\r
+ class_ref.MakeValueClass ();\r
+ $$ = GetTypeRef (class_ref);\r
}\r
| K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
{\r
if ($6 != null)\r
$$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
else\r
- $$ = ext_ref;\r
+ $$ = GetTypeRef (ext_ref);\r
}\r
| K_VALUETYPE slashed_name typars_clause\r
{\r
if ($3 != null)\r
$$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
else\r
- $$ = t_ref;\r
+ $$ = GetTypeRef (t_ref);\r
}\r
| type OPEN_BRACKET CLOSE_BRACKET\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeArray ();\r
$$ = base_type;\r
}\r
| type OPEN_BRACKET bounds CLOSE_BRACKET\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
ArrayList bound_list = (ArrayList) $3;\r
base_type.MakeBoundArray (bound_list);\r
$$ = base_type;\r
}\r
| type AMPERSAND\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeManagedPointer ();\r
$$ = base_type;\r
}\r
| type STAR\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakeUnmanagedPointer ();\r
$$ = base_type;\r
}\r
| type K_PINNED\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
base_type.MakePinned ();\r
$$ = base_type;\r
}\r
- | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+ | type K_MODREQ OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
- BaseClassRef class_ref = (BaseClassRef) $4;\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
+ BaseTypeRef class_ref = (BaseTypeRef) $4;\r
base_type.MakeCustomModified (codegen,\r
CustomModifier.modreq, class_ref);\r
$$ = base_type;\r
}\r
- | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+ | type K_MODOPT OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
{\r
- BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
- BaseClassRef class_ref = (BaseClassRef) $4;\r
+ BaseTypeRef base_type = (BaseTypeRef) $1;\r
+ BaseTypeRef class_ref = (BaseTypeRef) $4;\r
base_type.MakeCustomModified (codegen,\r
CustomModifier.modopt, class_ref);\r
$$ = base_type;\r
| primitive_type\r
;\r
\r
- ;\r
-\r
primitive_type : K_INT8\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
| K_CLSID\r
;\r
\r
-field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
+custom_modifier_type\r
+ : primitive_type\r
+ | class_ref\r
+ ;\r
+\r
+field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt semicolon_opt\r
{\r
FieldDef field_def = new FieldDef((FieldAttr) $3, \r
(string) $5, (BaseTypeRef) $4);\r
}\r
;\r
\r
-field_init : field_init_primitive\r
+field_init_full : field_init_primitive\r
| K_BYTEARRAY bytes_list\r
{\r
$$ = new ByteArrConst ((byte[]) $2);\r
}\r
+ ;\r
+\r
+field_init : field_init_full\r
| comp_qstring\r
{\r
// ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
}\r
;\r
\r
+member_init : field_init_full\r
+ | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst ((string) $3);\r
+ }\r
+ ;\r
+\r
+opt_truefalse_list\r
+ : truefalse_list\r
+ ;\r
+\r
+truefalse_list\r
+ : truefalse\r
+ {\r
+ $$ = new List<BoolConst> () { new BoolConst ((bool) $1) };\r
+ }\r
+ | truefalse_list truefalse\r
+ {\r
+ var l = (List<BoolConst>) $1;\r
+ l.Add (new BoolConst ((bool) $2));\r
+ $$ = l;\r
+ }\r
+ ;\r
+\r
data_decl : data_head data_body\r
{\r
DataDef datadef = (DataDef) $1;\r
}\r
;\r
\r
-data_head : D_DATA tls id ASSIGN\r
+data_head : D_DATA data_attr id ASSIGN\r
{\r
- $$ = new DataDef ((string) $3, (bool) $2); \r
+ $$ = new DataDef ((string) $3, (DataSegment) $2);\r
} \r
- | D_DATA tls\r
+ | D_DATA data_attr\r
{\r
- $$ = new DataDef (String.Empty, (bool) $2);\r
+ $$ = new DataDef (String.Empty, (DataSegment) $2);\r
}\r
;\r
\r
-tls : /* EMPTY */ { $$ = false; }\r
- | K_TLS { $$ = true; }\r
+data_attr : /* EMPTY */ { $$ = DataSegment.Data; }\r
+ | K_TLS { $$ = DataSegment.TLS; }\r
+ | K_CIL { $$ = DataSegment.CIL; }\r
;\r
\r
data_body : OPEN_BRACE dataitem_list CLOSE_BRACE\r
| impl_attr K_INTERNALCALL { $$ = (ImplAttr) $1 | ImplAttr.InternalCall; }\r
| impl_attr K_SYNCHRONIZED { $$ = (ImplAttr) $1 | ImplAttr.Synchronised; }\r
| impl_attr K_NOINLINING { $$ = (ImplAttr) $1 | ImplAttr.NoInLining; }\r
+ | impl_attr K_NOOPTIMIZATION { $$ = (ImplAttr) $1 | ImplAttr.NoOptimization; }\r
+ | impl_attr K_AGGRESSIVEINLINING{ $$ = (ImplAttr) $1 | ImplAttr.AggressiveInlining; }\r
;\r
\r
sig_args : /* EMPTY */\r
| event_decls event_decl\r
;\r
\r
-event_decl : D_ADDON method_ref\r
+event_decl : D_ADDON method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
(MethodRef) $2); \r
}\r
- | D_REMOVEON method_ref\r
+ | D_REMOVEON method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
(MethodRef) $2);\r
}\r
- | D_FIRE method_ref\r
+ | D_FIRE method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
(MethodRef) $2);\r
}\r
- | D_OTHER method_ref\r
+ | D_OTHER method_ref semicolon_opt\r
{\r
codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
(MethodRef) $2);\r
| language_decl\r
;\r
\r
-customattr_decl : D_CUSTOM custom_type\r
- {\r
- $$ = new CustomAttr ((BaseMethodRef) $2, null);\r
- }\r
- | D_CUSTOM custom_type ASSIGN comp_qstring\r
- | D_CUSTOM custom_type ASSIGN bytes_list\r
- {\r
- $$ = new CustomAttr ((BaseMethodRef) $2,\r
- (byte[]) $4);\r
- }\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
- | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
- bytes_list\r
- ;\r
+customattr_decl\r
+ : D_CUSTOM customattr_owner_type_opt custom_type\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, null);\r
+ }\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN comp_qstring\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN bytes_list\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, new ByteArrConst ((byte[]) $5));\r
+ }\r
+ | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN OPEN_BRACE customattr_values CLOSE_BRACE\r
+ {\r
+ $$ = new CustomAttr ((BaseMethodRef) $3, (PEAPI.Constant) $6);\r
+ }\r
+ ;\r
+\r
+// TODO: unused for now\r
+customattr_owner_type_opt\r
+ : /* empty */\r
+ | OPEN_PARENS type CLOSE_PARENS\r
+ ;\r
+\r
+customattr_values\r
+ : /* empty */\r
+ | K_BOOL OPEN_BRACKET int32 CLOSE_BRACKET OPEN_PARENS opt_truefalse_list CLOSE_PARENS\r
+ {\r
+ var l = (List<BoolConst>) $6;\r
+ $$ = new ArrayConstant (l?.ToArray ()) {\r
+ ExplicitSize = (int) $3\r
+ };\r
+ }\r
+ | K_BYTEARRAY bytes_list\r
+ {\r
+ $$ = new ByteArrConst ((byte[]) $2);\r
+ }\r
+ | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst ((string) $3);\r
+ }\r
+ | customattr_ctor_args\r
+ {\r
+ var c = $1 as Constant;\r
+ $$ = c ?? new ArrayConstant (((List<DataConstant>) $1).ToArray ());\r
+ }\r
+ ;\r
+\r
+customattr_ctor_args\r
+ : customattr_ctor_arg\r
+ | customattr_ctor_args customattr_ctor_arg\r
+ {\r
+ var l = $1 as List<DataConstant>;\r
+ if (l == null) {\r
+ l = new List<DataConstant> () {\r
+ (DataConstant) $1\r
+ };\r
+ }\r
+\r
+ l.Add ((DataConstant) $2);\r
+ $$ = l;\r
+ }\r
+ ;\r
+\r
+customattr_ctor_arg\r
+ : field_init_primitive\r
+ | K_TYPE OPEN_PARENS type CLOSE_PARENS\r
+ {\r
+ $$ = new StringConst (((TypeRef) $3).FullName);\r
+ }\r
+ ;\r
+\r
\r
custom_type : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS\r
{\r
}\r
;\r
\r
-perm_mbr_nameval_pair : SQSTRING ASSIGN field_init_primitive\r
+perm_mbr_nameval_pair : SQSTRING ASSIGN member_init\r
{\r
$$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);\r
}\r
- | SQSTRING ASSIGN K_BYTEARRAY bytes_list\r
- {\r
- $$ = new NameValuePair ((string) $1, new ByteArrConst ((byte[]) $4));\r
- }\r
- | SQSTRING ASSIGN K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
- {\r
- $$ = new NameValuePair ((string) $1, new StringConst ((string) $5));\r
- }\r
;\r
\r
prop_or_field : K_PROPERTY\r
}\r
;\r
\r
-assembly_head : D_ASSEMBLY asm_attr slashed_name\r
+assembly_head : D_ASSEMBLY legacylibrary_opt asm_attr slashed_name\r
{\r
- codegen.SetThisAssembly ((string) $3, (PEAPI.AssemAttr) $2);\r
+ codegen.SetThisAssembly ((string) $4, (PEAPI.AssemAttr) $3);\r
codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
}\r
assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
;\r
\r
-assemblyref_head : D_ASSEMBLY K_EXTERN asm_attr slashed_name\r
+assemblyref_head : D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name\r
{\r
System.Reflection.AssemblyName asmb_name = \r
new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $4;\r
- codegen.BeginAssemblyRef ((string) $4, asmb_name, (PEAPI.AssemAttr) $3);\r
+ asmb_name.Name = (string) $5;\r
+ codegen.BeginAssemblyRef ((string) $5, asmb_name, (PEAPI.AssemAttr) $4);\r
}\r
- | D_ASSEMBLY K_EXTERN asm_attr slashed_name K_AS slashed_name\r
+ | D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name K_AS slashed_name\r
{\r
System.Reflection.AssemblyName asmb_name = \r
new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $4;\r
- codegen.BeginAssemblyRef ((string) $6, asmb_name, (PEAPI.AssemAttr) $3);\r
+ asmb_name.Name = (string) $5;\r
+ codegen.BeginAssemblyRef ((string) $7, asmb_name, (PEAPI.AssemAttr) $4);\r
}\r
;\r
\r
if (codegen.CurrentCustomAttrTarget != null)\r
codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
+ | K_AUTO /* MS ilasm uses this keyword to lookup the specified assembly in the GAC and embeds its attributes, we just ignore it */\r
;\r
\r
exptype_all : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
expt_attr : { $$ = 0; } /* EMPTY */\r
| expt_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
| expt_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
+ | expt_attr K_FORWARDER { $$ = (TypeAttr)$1 | TypeAttr.Forwarder; }\r
| expt_attr K_NESTED K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
| expt_attr K_NESTED K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
| expt_attr K_NESTED K_FAMILY { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
| expt_attr K_NESTED K_ASSEMBLY { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
| expt_attr K_NESTED K_FAMANDASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
| expt_attr K_NESTED K_FAMORASSEM { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
- | K_FORWARDER { $$ = TypeAttr.Forwarder; }\r
;\r
\r
exptype_decls : /* EMPTY */\r
| COMP_NAME\r
;\r
\r
+semicolon_opt\r
+ : /* empty */\r
+ | SEMICOLON\r
+ ;\r
+\r
+legacylibrary_opt : /* empty */\r
+ | K_LEGACY K_LIBRARY /* MS ilasm has these keywords for backwards compatibility, we just ignore them */\r
+ ;\r
+\r
%%\r
\r
}\r