using System.Security;\r
using System.Security.Permissions;\r
\r
+using MIPermission = Mono.ILASM.Permission;\r
+using MIPermissionSet = Mono.ILASM.PermissionSet;\r
+\r
namespace Mono.ILASM {\r
\r
public class ILParser {\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
- Console.Error.WriteLine (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
+ Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
return false;\r
}\r
\r
return true;\r
}\r
\r
+ public void AddSecDecl (object perm, bool for_assembly)\r
+ {\r
+ PermPair pp = perm as PermPair;\r
+\r
+ if (pp == null) {\r
+ MIPermissionSet ps_20 = (MIPermissionSet) perm;\r
+ codegen.AddPermission (ps_20.SecurityAction, ps_20);\r
+ return;\r
+ }\r
+\r
+ if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) pp.sec_action, for_assembly))\r
+ Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
+\r
+ codegen.AddPermission (pp.sec_action, pp.perm);\r
+ }\r
+\r
public object ClassRefToObject (object class_ref, object val)\r
{\r
ExternTypeRef etr = class_ref as ExternTypeRef;\r
get { return codegen; }\r
}\r
\r
- private ITypeRef GetTypeRef (ITypeRef b)\r
+ private BaseTypeRef GetTypeRef (BaseTypeRef b)\r
{\r
- ExternTypeRefInst etri = b as ExternTypeRefInst;\r
- ExternTypeRef etr;\r
-\r
- if (etri != null)\r
- return etri.Clone ();\r
-\r
- etr = b as ExternTypeRef;\r
- if (etr != null)\r
- return etr.Clone ();\r
-\r
- return b;\r
+ //FIXME: Caching required.. \r
+ return b.Clone ();\r
}\r
\r
%}\r
%token D_CLASS\r
%token D_COMTYPE\r
%token D_CONFIG\r
-%token D_CONSTRAINT\r
%token D_IMAGEBASE\r
%token D_CORFLAGS\r
%token D_CTOR\r
%token K_FAMILY\r
%token K_INITONLY\r
%token K_RTSPECIALNAME\r
+%token K_STRICT\r
%token K_SPECIALNAME\r
%token K_ASSEMBLY\r
%token K_FAMANDASSEM\r
%token K_ANSI\r
%token K_UNICODE\r
%token K_AUTOCHAR\r
+%token K_BESTFIT\r
%token K_IMPORT\r
%token K_SERIALIZABLE\r
%token K_NESTED\r
%token K_FLOAT64\r
%token K_ERROR\r
%token K_UNSIGNED\r
+%token K_UINT\r
+%token K_UINT8\r
+%token K_UINT16\r
+%token K_UINT32\r
+%token K_UINT64\r
%token K_DECIMAL\r
%token K_DATE\r
%token K_BSTR\r
%token K_MODREQ\r
%token K_MODOPT\r
%token K_TYPEDREF\r
+%token K_TYPE\r
%token K_WCHAR\r
%token K_CHAR\r
%token K_FROMUNMANAGED\r
%token K_HANDLER\r
%token K_TLS\r
%token K_FIELD\r
+%token K_PROPERTY\r
%token K_REQUEST\r
%token K_DEMAND\r
%token K_ASSERT\r
// %token K_PUBLICKEY\r
%token K_ENABLEJITTRACKING\r
%token K_DISABLEJITOPTIMIZER\r
+%token K_RETARGETABLE\r
%token K_PRESERVESIG\r
%token K_BEFOREFIELDINIT\r
%token K_ALIGNMENT\r
%token K_TRUE\r
%token K_FALSE\r
%token K_IS\r
+%token K_ON\r
+%token K_OFF\r
+%token K_CHARMAPERROR\r
\r
/* end generated */\r
\r
| module_head\r
| sec_decl\r
| customattr_decl\r
+ {\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ }\r
| D_SUBSYSTEM int32\r
{\r
codegen.SetSubSystem ((int) $2);\r
| D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
;\r
\r
-constraint_decl : D_CONSTRAINT BANG int32 K_IS type\r
- {\r
- codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);\r
- }\r
- ;\r
\r
vtfixup_decl : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
vtfixup_attr K_AT id\r
}\r
;\r
\r
-class_head : D_CLASS class_attr id formal_typars_clause extends_clause\r
+class_head : D_CLASS class_attr comp_name formal_typars_clause extends_clause\r
impl_clause\r
{\r
codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
- $5 as IClassRef, $6 as ArrayList, null);\r
+ $5 as BaseClassRef, $6 as ArrayList, null, (GenericParameters) $4);\r
\r
if (is_value_class)\r
codegen.CurrentTypeDef.MakeValueClass ();\r
if (is_enum_class)\r
codegen.CurrentTypeDef.MakeEnumClass ();\r
-\r
- if ($4 != null) {\r
- ArrayList typars_list = (ArrayList) $4;\r
- foreach (string id in typars_list)\r
- codegen.CurrentTypeDef.AddGenericParam (id);\r
- } \r
}\r
;\r
\r
;\r
\r
extends_clause : /* EMPTY */\r
- | K_EXTENDS class_ref\r
+ | K_EXTENDS generic_class_ref\r
{\r
$$ = $2;\r
}\r
;\r
\r
impl_clause : /* EMPTY */\r
- | K_IMPLEMENTS class_refs\r
+ | impl_class_refs\r
+ ;\r
+\r
+impl_class_refs : K_IMPLEMENTS generic_class_ref\r
{\r
- $$ = $2;\r
+ ArrayList al = new ArrayList ();\r
+ al.Add ($2);\r
+ $$ = al;\r
}\r
- ;\r
+ | impl_class_refs COMMA generic_class_ref\r
+ {\r
+ ArrayList al = (ArrayList) $1;\r
+\r
+ al.Insert (0, $3);\r
+ $$ = al;\r
+ }\r
+ ;\r
\r
formal_typars_clause : /* EMPTY */\r
| OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
{\r
+#if NET_2_0 || BOOTSTRAP_NET_2_0\r
$$ = $2;\r
+#else\r
+ Report.Error ("Use ilasm2 for generics support.");\r
+#endif\r
}\r
;\r
\r
typars_clause : /* EMPTY */\r
| OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
{\r
+#if NET_2_0 || BOOTSTRAP_NET_2_0\r
$$ = $2;\r
+#else\r
+ Report.Error ("Use ilasm2 for generics support.");\r
+#endif\r
}\r
;\r
\r
typars : type\r
{\r
- ArrayList typars_list = new ArrayList ();\r
- typars_list.Add ($1);\r
- $$ = typars_list;\r
+ GenericArguments ga = new GenericArguments ();\r
+ ga.Add ((BaseTypeRef) $1);\r
+ $$ = ga;\r
}\r
| typars COMMA type\r
{\r
- ArrayList typars_list = (ArrayList) $1;\r
- typars_list.Add ($3);\r
- $$ = typars_list;\r
+ ((GenericArguments) $1).Add ((BaseTypeRef) $3);\r
+ $$ = $1;\r
}\r
;\r
\r
-formal_typars : formal_typar\r
+constraints_clause : /* EMTPY */\r
+ | OPEN_PARENS constraints CLOSE_PARENS\r
{\r
- ArrayList formal_list = new ArrayList ();\r
- formal_list.Add ($1);\r
- $$ = formal_list;\r
+ $$ = $2;\r
}\r
- | formal_typars COMMA formal_typar\r
+ ;\r
+\r
+\r
+constraints : generic_class_ref\r
+ {\r
+ ArrayList al = new ArrayList ();\r
+ al.Add ($1);\r
+ $$ = al;\r
+ }\r
+ | constraints COMMA generic_class_ref\r
{\r
- ArrayList formal_list = (ArrayList) $1;\r
- formal_list.Add ($3);\r
- $$ = formal_list;\r
+ ArrayList al = (ArrayList) $1;\r
+ al.Add ($3);\r
+ $$ = al;\r
}\r
- ;\r
+ ;\r
+\r
+generic_class_ref : class_ref\r
+ {\r
+ $$ = $1;\r
+ }\r
+ | K_CLASS class_ref typars_clause\r
+ {\r
+ if ($3 != null)\r
+ $$ = ((BaseClassRef) $2).GetGenericTypeInst ((GenericArguments) $3);\r
+ else\r
+ $$ = $2;\r
+ }\r
+ | BANG int32\r
+ {\r
+ GenParam gpar = new GenParam ((int) $2, "", GenParamType.Var);\r
+ $$ = new GenericParamRef (gpar, $2.ToString ());\r
+ }\r
+ | BANG BANG int32\r
+ {\r
+ GenParam gpar = new GenParam ((int) $3, "", GenParamType.MVar);\r
+ $$ = new GenericParamRef (gpar, $3.ToString ());\r
+ }\r
+ | BANG id\r
+ {\r
+ int num = -1;\r
+ string name = (string) $2;\r
+ if (codegen.CurrentTypeDef != null)\r
+ num = codegen.CurrentTypeDef.GetGenericParamNum (name);\r
+ GenParam gpar = new GenParam (num, name, GenParamType.Var);\r
+ $$ = new GenericParamRef (gpar, name);\r
+ }\r
+ | BANG BANG id\r
+ {\r
+ int num = -1;\r
+ string name = (string) $3;\r
+ if (codegen.CurrentMethodDef != null)\r
+ num = codegen.CurrentMethodDef.GetGenericParamNum (name);\r
+ GenParam gpar = new GenParam (num, name, GenParamType.MVar);\r
+ $$ = new GenericParamRef (gpar, name);\r
+ }\r
+ ; \r
+\r
+formal_typars : formal_typar_attr constraints_clause formal_typar\r
+ {\r
+ GenericParameter gp = new GenericParameter ((string) $3, (PEAPI.GenericParamAttributes) $1, (ArrayList) $2);\r
\r
+ GenericParameters colln = new GenericParameters ();\r
+ colln.Add (gp);\r
+ $$ = colln;\r
+ }\r
+ | formal_typars COMMA formal_typar_attr constraints_clause formal_typar\r
+ {\r
+ GenericParameters colln = (GenericParameters) $1;\r
+ colln.Add (new GenericParameter ((string) $5, (PEAPI.GenericParamAttributes) $3, (ArrayList) $4));\r
+ $$ = colln;\r
+ }\r
+ ;\r
+ \r
+formal_typar_attr : /* EMPTY */\r
+ {\r
+ $$ = new PEAPI.GenericParamAttributes ();\r
+ }\r
+ | formal_typar_attr PLUS\r
+ {\r
+ $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Covariant; \r
+ }\r
+ | formal_typar_attr DASH\r
+ {\r
+ $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Contravariant; \r
+ }\r
+ | formal_typar_attr D_CTOR\r
+ {\r
+ $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.DefaultConstructorConstrait; \r
+ }\r
+ | formal_typar_attr K_VALUETYPE\r
+ {\r
+ $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.NotNullableValueTypeConstraint; \r
+ }\r
+ | formal_typar_attr K_CLASS\r
+ {\r
+ $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.ReferenceTypeConstraint; \r
+ }\r
+ ;\r
\r
formal_typar : id\r
{\r
$$ = $1;\r
}\r
;\r
+\r
+param_type_decl : D_PARAM K_TYPE id\r
+ {\r
+ if (codegen.CurrentMethodDef != null)\r
+ codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam ((string) $3);\r
+ else\r
+ codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam ((string) $3);\r
+ if (codegen.CurrentCustomAttrTarget == null)\r
+ Report.Error (String.Format ("Type parameter '{0}' undefined.", (string) $3));\r
+ }\r
+ | D_PARAM K_TYPE OPEN_BRACKET int32 CLOSE_BRACKET\r
+ {\r
+ int index = ((int) $4);\r
+ if (codegen.CurrentMethodDef != null)\r
+ codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam (index - 1);\r
+ else\r
+ codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam (index - 1);\r
+ if (codegen.CurrentCustomAttrTarget == null)\r
+ Report.Error (String.Format ("Type parameter '{0}' index out of range.", index));\r
+ }\r
+ ;\r
\r
class_refs : class_ref\r
{\r
class_ref : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
{\r
if (codegen.IsThisAssembly ((string) $2)) {\r
- $$ = new TypeRef ((string) $4, false, null);\r
+ $$ = codegen.GetTypeRef ((string) $4);\r
} else {\r
$$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
}\r
| OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
{\r
if (codegen.IsThisModule ((string) $3)) {\r
- $$ = new TypeRef ((string) $5, false, null);\r
+ $$ = codegen.GetTypeRef ((string) $5);\r
} else {\r
$$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
}\r
if (prim != null && !codegen.IsThisAssembly ("mscorlib"))\r
$$ = prim;\r
else\r
- $$ = new TypeRef ((string) $1, false, null);\r
+ $$ = codegen.GetTypeRef ((string) $1);\r
}\r
\r
;\r
| data_decl\r
| sec_decl\r
{\r
- PermPair pp = (PermPair) $1;\r
- if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, false))\r
- throw new Exception (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
- codegen.AddPermission (pp.sec_action, pp.perm);\r
+ AddSecDecl ($1, false);\r
}\r
| extsource_spec\r
| customattr_decl\r
{\r
- codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
+ | param_type_decl\r
| D_SIZE int32\r
{\r
codegen.CurrentTypeDef.SetSize ((int) $2);\r
// My copy of the spec didn't have a type_list but\r
// it seems pretty crucial\r
//\r
- ITypeRef owner = (ITypeRef) $2;\r
+ BaseTypeRef owner = (BaseTypeRef) $2;\r
ArrayList arg_list = (ArrayList) $11;\r
- ITypeRef[] param_list;\r
- IMethodRef decl;\r
+ BaseTypeRef[] param_list;\r
+ BaseMethodRef decl;\r
\r
if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
else\r
- param_list = new ITypeRef[0];\r
+ param_list = new BaseTypeRef[0];\r
\r
- decl = owner.GetMethodRef ((ITypeRef) $7,\r
- (CallConv) $6, (string) $4, param_list);\r
+ decl = owner.GetMethodRef ((BaseTypeRef) $7,\r
+ (CallConv) $6, (string) $4, param_list, 0);\r
\r
// NOTICE: `owner' here might be wrong\r
- string sig = MethodDef.CreateSignature (owner, (string) $10,\r
- param_list);\r
+ string sig = MethodDef.CreateSignature (owner, (CallConv) $6, (string) $10,\r
+ param_list, 0, false);\r
codegen.CurrentTypeDef.AddOverride (sig, decl); \r
}\r
OPEN_PARENS sig_args CLOSE_PARENS\r
| language_decl\r
- | constraint_decl\r
;\r
\r
-type : K_CLASS class_ref\r
+type : generic_class_ref\r
{\r
- $$ = $2;\r
+ $$ = $1;\r
}\r
| K_OBJECT\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
}\r
- | K_STRING\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
- }\r
| K_VALUE K_CLASS class_ref\r
{\r
- IClassRef class_ref = (IClassRef) $3;\r
+ BaseClassRef class_ref = (BaseClassRef) $3;\r
class_ref.MakeValueClass ();\r
$$ = class_ref;\r
}\r
- | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+ | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
{\r
ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, true);\r
- $$ = ext_ref;\r
+ if ($6 != null)\r
+ $$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
+ else\r
+ $$ = ext_ref;\r
}\r
- | K_VALUETYPE slashed_name\r
+ | K_VALUETYPE slashed_name typars_clause\r
{\r
- TypeRef t_ref = new TypeRef ((string) $2, true, null);\r
+ TypeRef t_ref = codegen.GetTypeRef ((string) $2);\r
t_ref.MakeValueClass ();\r
- $$ = t_ref;\r
+ if ($3 != null)\r
+ $$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
+ else\r
+ $$ = t_ref;\r
}\r
| type OPEN_BRACKET CLOSE_BRACKET\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
base_type.MakeArray ();\r
$$ = base_type;\r
}\r
| type OPEN_BRACKET bounds CLOSE_BRACKET\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
ArrayList bound_list = (ArrayList) $3;\r
base_type.MakeBoundArray (bound_list);\r
$$ = base_type;\r
}\r
| type AMPERSAND\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
base_type.MakeManagedPointer ();\r
$$ = base_type;\r
}\r
| type STAR\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
base_type.MakeUnmanagedPointer ();\r
$$ = base_type;\r
}\r
| type K_PINNED\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
base_type.MakePinned ();\r
$$ = base_type;\r
}\r
| type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
- IClassRef class_ref = (IClassRef) $4;\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseClassRef class_ref = (BaseClassRef) $4;\r
base_type.MakeCustomModified (codegen,\r
- CustomModifier.modopt, class_ref);\r
+ CustomModifier.modreq, class_ref);\r
$$ = base_type;\r
}\r
| type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
{\r
- ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
- IClassRef class_ref = (IClassRef) $4;\r
+ BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+ BaseClassRef class_ref = (BaseClassRef) $4;\r
base_type.MakeCustomModified (codegen,\r
CustomModifier.modopt, class_ref);\r
$$ = base_type;\r
}\r
| K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
{\r
- $$ = new MethodPointerTypeRef ((CallConv) $2, (ITypeRef) $3, (ArrayList) $6);\r
- }\r
- | K_TYPEDREF\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
- "System.TypedReference");\r
- }\r
- | K_CHAR\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+ $$ = new MethodPointerTypeRef ((CallConv) $2, (BaseTypeRef) $3, (ArrayList) $6);\r
}\r
- | K_WCHAR\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
- }\r
- | K_VOID\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
- }\r
- | K_BOOL\r
- {\r
- $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
- }\r
- | K_INT8\r
+ | primitive_type\r
+ ;\r
+\r
+ ;\r
+\r
+primitive_type : K_INT8\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
}\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
}\r
+ | K_UINT8\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
+ }\r
| K_UNSIGNED K_INT16\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16"); \r
}\r
+ | K_UINT16\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16"); \r
+ }\r
| K_UNSIGNED K_INT32\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
}\r
+ | K_UINT32\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+ }\r
| K_UNSIGNED K_INT64\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
}\r
+ | K_UINT64\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+ }\r
| K_NATIVE K_INT\r
{\r
// TODO: Is this the proper full name\r
$$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
}\r
- \r
| K_NATIVE K_UNSIGNED K_INT\r
{\r
$$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
}\r
- | BANG int32\r
+ | K_NATIVE K_UINT\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
+ }\r
+ | K_TYPEDREF\r
{\r
- GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
- $$ = new GenericTypeRef (spec, $2.ToString ());\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+ "System.TypedReference");\r
}\r
- | BANG BANG int32\r
+ | K_CHAR\r
{\r
- MVar mvar = new MVar ((int) $3);\r
- $$ = new GenericTypeRef (mvar, $3.ToString ());\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
}\r
- | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET\r
+ | K_WCHAR\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+ }\r
+ | K_VOID\r
{\r
- $$ = new TypeRef ((string) $2, false, null);\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
}\r
- | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+ | K_BOOL\r
{\r
- ArrayList typar_list = (ArrayList) $4;\r
- ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));\r
- \r
- $$ = new GenericTypeInst ((string)$2, typar_array);\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
+ }\r
+ | K_STRING\r
+ {\r
+ $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
}\r
;\r
\r
}\r
| int32\r
{\r
- // ******** Not sure what this is?\r
- // For now I will say it is size because there\r
- // is allready a way to set lower\r
- $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);\r
+ /* Only size specified */ \r
+ int size = (int) $1;\r
+ if (size < 0)\r
+ /* size cannot be < 0, so emit as (0, ...)\r
+ ilasm.net emits it like this */\r
+ $$ = new DictionaryEntry (0, TypeRef.Ellipsis);\r
+ else\r
+ $$ = new DictionaryEntry (TypeRef.Ellipsis, size);\r
}\r
| int32 ELLIPSIS int32\r
{\r
- // lower bound and size\r
+ // lower and upper bound\r
+ int lower = (int) $1;\r
+ int upper = (int) $3;\r
+ if (lower > upper) \r
+ Report.Error ("Lower bound " + lower + " must be <= upper bound " + upper);\r
+\r
$$ = new DictionaryEntry ($1, $3);\r
}\r
| int32 ELLIPSIS\r
$$ = NativeType.Float64;\r
}\r
| K_ERROR\r
+ {\r
+ $$ = NativeType.Error;\r
+ }\r
| K_UNSIGNED K_INT8\r
{\r
$$ = NativeType.UInt8;\r
}\r
+ | K_UINT8\r
+ {\r
+ $$ = NativeType.UInt8;\r
+ }\r
| K_UNSIGNED K_INT16\r
{\r
$$ = NativeType.UInt16;\r
}\r
+ | K_UINT16\r
+ {\r
+ $$ = NativeType.UInt16;\r
+ }\r
| K_UNSIGNED K_INT32\r
{\r
$$ = NativeType.UInt32;\r
}\r
+ | K_UINT32\r
+ {\r
+ $$ = NativeType.UInt32;\r
+ }\r
| K_UNSIGNED K_INT64\r
{\r
$$ = NativeType.UInt64;\r
}\r
+ | K_UINT64\r
+ {\r
+ $$ = NativeType.UInt64;\r
+ }\r
| native_type STAR\r
| native_type OPEN_BRACKET CLOSE_BRACKET\r
{\r
$$ = NativeType.AsAny;\r
}\r
| K_LPSTRUCT\r
+ {\r
+ $$ = NativeType.LPStruct;\r
+ }\r
;\r
\r
variant_type : /* EMPTY */\r
field_decl : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
{\r
FieldDef field_def = new FieldDef((FieldAttr) $3, \r
- (string) $5, (ITypeRef) $4);\r
+ (string) $5, (BaseTypeRef) $4);\r
codegen.AddFieldDef (field_def);\r
codegen.CurrentCustomAttrTarget = field_def;\r
\r
}\r
;\r
\r
-field_init : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
+field_init_primitive : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
{\r
$$ = new FloatConst (Convert.ToSingle ($3));\r
}\r
{\r
$$ = new IntConst (Convert.ToInt64 ($3));\r
}\r
+ | K_UINT64 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new UIntConst (Convert.ToUInt64 ((ulong)(long) $3));\r
+ }\r
| K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
{\r
$$ = new IntConst ((int)((long)$3));\r
}\r
+ | K_UINT32 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new UIntConst ((uint)((long)$3));\r
+ }\r
| K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
{\r
$$ = new IntConst ((short)((long) $3));\r
}\r
+ | K_UINT16 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new UIntConst ((ushort)((long) $3));\r
+ }\r
| K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
{\r
$$ = new CharConst (Convert.ToChar ($3));\r
}\r
| K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
{\r
- $$ = new IntConst ((byte)((long) ($3)));\r
+ $$ = new IntConst ((sbyte)((long) ($3)));\r
+ }\r
+ | K_UINT8 OPEN_PARENS int64 CLOSE_PARENS\r
+ {\r
+ $$ = new UIntConst ((byte)((long) ($3)));\r
}\r
| K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
{\r
$$ = new BoolConst ((bool) $3);\r
}\r
+ ;\r
+\r
+field_init : field_init_primitive\r
| K_BYTEARRAY bytes_list\r
{\r
$$ = new ByteArrConst ((byte[]) $2);\r
method_head : D_METHOD meth_attr call_conv param_attr type method_name\r
formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
{\r
- MethodDef methdef = new MethodDef (\r
- codegen, (MethAttr) $2, (CallConv) $3,\r
- (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
- (ArrayList) $9, tokenizer.Reader.Location);\r
+ CallConv cc = (CallConv) $3;\r
+ if ($7 != null)\r
+ cc |= CallConv.Generic;\r
\r
+ MethodDef methdef = new MethodDef (\r
+ codegen, (MethAttr) $2, cc,\r
+ (ImplAttr) $11, (string) $6, (BaseTypeRef) $5,\r
+ (ArrayList) $9, tokenizer.Reader.Location, (GenericParameters) $7, codegen.CurrentTypeDef);\r
if (pinvoke_info) {\r
ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
pinvoke_info = false;\r
}\r
-\r
- if ($7 != null) {\r
- ArrayList typars_list = (ArrayList) $7;\r
- foreach (string id in typars_list)\r
- methdef.AddGenericParam (id);\r
- }\r
}\r
| D_METHOD meth_attr call_conv param_attr type \r
K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
{\r
MethodDef methdef = new MethodDef (\r
codegen, (MethAttr) $2, (CallConv) $3,\r
- (ImplAttr) $14, (string) $10, (ITypeRef) $5,\r
- (ArrayList) $12, tokenizer.Reader.Location);\r
+ (ImplAttr) $14, (string) $10, (BaseTypeRef) $5,\r
+ (ArrayList) $12, tokenizer.Reader.Location, null, codegen.CurrentTypeDef);\r
\r
if (pinvoke_info) {\r
ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
| meth_attr K_REQSECOBJ { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
| meth_attr K_SPECIALNAME { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
| meth_attr K_RTSPECIALNAME { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+ | meth_attr K_STRICT { $$ = (MethAttr) $1 | MethAttr.Strict; }\r
| meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }\r
| meth_attr K_UNMANAGEDEXP \r
| meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
| pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
| pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
| pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
+ | pinv_attr K_BESTFIT COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_on; }\r
+ | pinv_attr K_BESTFIT COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_off; }\r
+ | pinv_attr K_CHARMAPERROR COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_on; }\r
+ | pinv_attr K_CHARMAPERROR COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_off; }\r
;\r
\r
method_name : D_CTOR\r
\r
sig_arg : param_attr type\r
{\r
- $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+ $$ = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
}\r
| param_attr type id\r
{\r
- $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
+ $$ = new ParamDef ((ParamAttr) $1, (string) $3, (BaseTypeRef) $2);\r
}\r
| ELLIPSIS\r
{\r
}\r
| param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
{\r
- ParamDef param_def = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+ ParamDef param_def = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
\r
$$ = param_def;\r
}\r
| param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
{\r
- ParamDef param_def = new ParamDef ((ParamAttr) $1, (string) $7, (ITypeRef) $2);\r
+ ParamDef param_def = new ParamDef ((ParamAttr) $1, (string) $7, (BaseTypeRef) $2);\r
param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
\r
$$ = param_def;\r
;\r
\r
method_decl : D_EMITBYTE int32\r
+ {\r
+ codegen.CurrentMethodDef.AddInstr (new\r
+ EmitByteInstr ((int) $2, tokenizer.Location));\r
+ \r
+ }\r
| D_MAXSTACK int32\r
{\r
codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
| D_OVERRIDE type_spec DOUBLE_COLON method_name\r
{\r
codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
- (ITypeRef) $2, (string) $4);\r
+ (BaseTypeRef) $2, (string) $4);\r
\r
}\r
+ | D_OVERRIDE K_METHOD method_ref\r
+ {\r
+ codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
+ (BaseMethodRef) $3);\r
+ }\r
+ | D_OVERRIDE K_METHOD call_conv type type_spec DOUBLE_COLON method_name\r
+ OPEN_ANGLE_BRACKET OPEN_BRACKET int32 CLOSE_BRACKET CLOSE_ANGLE_BRACKET\r
+ OPEN_PARENS type_list CLOSE_PARENS \r
+ {\r
+ BaseTypeRef owner = (BaseTypeRef) $5;\r
+ ArrayList arg_list = (ArrayList) $14;\r
+ BaseTypeRef[] param_list;\r
+ BaseMethodRef methref;\r
+\r
+ if (arg_list != null)\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
+ else\r
+ param_list = new BaseTypeRef[0];\r
+\r
+ if (owner.UseTypeSpec) {\r
+ methref = new TypeSpecMethodRef (owner, (CallConv) $3, (BaseTypeRef) $4,\r
+ (string) $7, param_list, (int) $10);\r
+ } else {\r
+ methref = owner.GetMethodRef ((BaseTypeRef) $4,\r
+ (CallConv) $3, (string) $7, param_list, (int) $10);\r
+ }\r
+\r
+ codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
+ methref);\r
+ }\r
| scope_block\r
| D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
{\r
- codegen.CurrentMethodDef.AddParamDefaultValue ((int)$3 - 1, (Constant)$5);\r
- codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetParam ((int)$3 - 1);\r
+ int index = (int) $3;\r
+ ParamDef param = codegen.CurrentMethodDef.GetParam (index);\r
+ codegen.CurrentCustomAttrTarget = param;\r
+\r
+ if (param == null) {\r
+ Report.Warning (tokenizer.Location, String.Format ("invalid param index ({0}) with .param", index));\r
+ break;\r
+ }\r
+ if ($5 != null)\r
+ param.AddDefaultValue ((Constant) $5);\r
}\r
+ | param_type_decl\r
| id COLON\r
{\r
codegen.CurrentMethodDef.AddLabel ((string) $1);\r
| instr\r
| sec_decl\r
{\r
- PermPair pp = (PermPair) $1;\r
- if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, false))\r
- throw new Exception (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
- codegen.AddPermission (pp.sec_action, pp.perm);\r
+ AddSecDecl ($1, false);\r
}\r
| extsource_spec\r
| language_decl\r
| customattr_decl\r
{\r
- codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
| data_decl\r
;\r
\r
local : type\r
{\r
- $$ = new Local (-1, (ITypeRef) $1);\r
+ $$ = new Local (-1, (BaseTypeRef) $1);\r
}\r
| type id\r
{\r
- $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
+ $$ = new Local (-1, (string) $2, (BaseTypeRef) $1);\r
}\r
| slot_num type\r
{\r
- $$ = new Local ((int) $1, (ITypeRef) $2);\r
+ $$ = new Local ((int) $1, (BaseTypeRef) $2);\r
}\r
| slot_num type id\r
{\r
- $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
+ $$ = new Local ((int) $1, (string) $3, (BaseTypeRef) $2);\r
}\r
;\r
\r
}\r
;\r
\r
-type_spec : class_ref\r
- | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
+type_spec : OPEN_BRACKET slashed_name CLOSE_BRACKET\r
{\r
// This is a reference to a global method in another\r
// assembly. This is not supported in the MS version of ilasm\r
{\r
$$ = new HandlerBlock ((LabelInfo) $1,\r
codegen.CurrentMethodDef.AddLabel ());\r
+ codegen.CurrentMethodDef.EndLocalsScope ();\r
}\r
;\r
\r
scope_block_begin : OPEN_BRACE\r
{\r
$$ = codegen.CurrentMethodDef.AddLabel ();\r
+ codegen.CurrentMethodDef.BeginLocalsScope ();\r
}\r
;\r
\r
}\r
;\r
\r
-seh_clause : K_CATCH class_ref handler_block\r
+seh_clause : K_CATCH type handler_block\r
{\r
if ($2.GetType () == typeof (PrimitiveTypeRef))\r
- /* FIXME: Report Error here */\r
- Console.Error.WriteLine ("Exception not be of a primitive type.");\r
+ Report.Error ("Exception not be of a primitive type.");\r
\r
- IClassRef type = (IClassRef) $2;\r
+ BaseTypeRef type = (BaseTypeRef) $2;\r
CatchBlock cb = new CatchBlock (type);\r
cb.SetHandlerBlock ((HandlerBlock) $3);\r
$$ = cb;\r
}\r
| K_HANDLER int32 K_TO int32\r
{\r
- LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
- LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+ LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+ LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
\r
$$ = new HandlerBlock (from, to);\r
}\r
| INSTR_LOCAL id\r
{\r
int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+ if (slot < 0)\r
+ Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
codegen.CurrentMethodDef.AddInstr (\r
new IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
}\r
| INSTR_PARAM id\r
{\r
int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
+ if (pos < 0)\r
+ Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
+\r
codegen.CurrentMethodDef.AddInstr (\r
new IntInstr ((IntOp) $1, pos, tokenizer.Location));\r
}\r
| INSTR_I id\r
{\r
int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+ if (slot < 0)\r
+ Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
codegen.CurrentMethodDef.AddInstr (new\r
IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
}\r
}\r
| INSTR_R bytes_list\r
{\r
+ byte[] fpdata;\r
switch ((MiscInstr) $1) {\r
case MiscInstr.ldc_r4:\r
- float s = BitConverter.ToSingle ((byte []) $2, 0);\r
+ fpdata = (byte []) $2;\r
+ if (!BitConverter.IsLittleEndian) {\r
+ System.Array.Reverse (fpdata, 0, 4);\r
+ }\r
+ float s = BitConverter.ToSingle (fpdata, 0);\r
codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, s, tokenizer.Location));\r
break;\r
case MiscInstr.ldc_r8:\r
- double d = BitConverter.ToDouble ((byte []) $2, 0);\r
+ fpdata = (byte []) $2;\r
+ if (!BitConverter.IsLittleEndian) {\r
+ // FIXME: handle the stupid ARM FPA format\r
+ System.Array.Reverse (fpdata, 0, 8);\r
+ }\r
+ double d = BitConverter.ToDouble (fpdata, 0);\r
codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, d, tokenizer.Location));\r
break;\r
}\r
| INSTR_METHOD method_ref\r
{\r
codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
- (IMethodRef) $2, tokenizer.Location));\r
+ (BaseMethodRef) $2, tokenizer.Location));\r
}\r
| INSTR_FIELD type type_spec DOUBLE_COLON id\r
{\r
\r
- ITypeRef owner = (ITypeRef) $3;\r
+ BaseTypeRef owner = (BaseTypeRef) $3;\r
+ GenericParamRef gpr = $2 as GenericParamRef;\r
+ if (gpr != null && codegen.CurrentMethodDef != null)\r
+ codegen.CurrentMethodDef.ResolveGenParam ((PEAPI.GenParam) gpr.PeapiType);\r
IFieldRef fieldref = owner.GetFieldRef (\r
- (ITypeRef) $2, (string) $5);\r
+ (BaseTypeRef) $2, (string) $5);\r
\r
codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
}\r
| INSTR_FIELD type id\r
{\r
- GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+ GlobalFieldRef fieldref = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
\r
codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
}\r
| INSTR_TYPE type_spec\r
{\r
codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
- (ITypeRef) $2, tokenizer.Location));\r
+ (BaseTypeRef) $2, tokenizer.Location));\r
}\r
| INSTR_STRING comp_qstring\r
{\r
| INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
{\r
ArrayList arg_list = (ArrayList) $5;\r
- ITypeRef[] arg_array = null;\r
+ BaseTypeRef[] arg_array = null;\r
\r
if (arg_list != null)\r
- arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ arg_array = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
\r
codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
- (ITypeRef) $3, arg_array, tokenizer.Location));\r
+ (BaseTypeRef) $3, arg_array, tokenizer.Location));\r
} \r
| INSTR_TOK owner_type\r
{\r
if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
- if ($2 is IMethodRef)\r
- codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2, tokenizer.Location));\r
+ if ($2 is BaseMethodRef)\r
+ codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseMethodRef) $2, tokenizer.Location));\r
else if ($2 is IFieldRef)\r
codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2, tokenizer.Location));\r
else\r
- codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2, tokenizer.Location));\r
+ codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseTypeRef) $2, tokenizer.Location));\r
\r
}\r
}\r
}\r
;\r
\r
-method_ref : call_conv type type_spec DOUBLE_COLON method_name\r
- OPEN_PARENS type_list CLOSE_PARENS \r
+method_ref : call_conv type method_name typars_clause\r
+ OPEN_PARENS type_list CLOSE_PARENS\r
{\r
- ITypeRef owner = (ITypeRef) $3;\r
- ArrayList arg_list = (ArrayList) $7;\r
- ITypeRef[] param_list;\r
- IMethodRef methref;\r
-\r
+ ArrayList arg_list = (ArrayList) $6;\r
+ GenericArguments ga = (GenericArguments) $4;\r
+ BaseTypeRef[] param_list;\r
+ \r
if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
else\r
- param_list = new ITypeRef[0];\r
+ param_list = new BaseTypeRef[0];\r
\r
- if (codegen.IsThisAssembly ("mscorlib")) {\r
- PrimitiveTypeRef prim = owner as PrimitiveTypeRef;\r
- if (prim != null && prim.SigMod == "")\r
- owner = new TypeRef (prim.Name, false, null);\r
- }\r
+ BaseMethodRef methref = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
+ (string) $3, param_list, (ga != null ? ga.Count : 0));\r
\r
- methref = owner.GetMethodRef ((ITypeRef) $2,\r
- (CallConv) $1, (string) $5, param_list);\r
+ if (ga != null)\r
+ methref = methref.GetGenericMethodRef (ga);\r
\r
$$ = methref;\r
}\r
- | call_conv type method_name \r
- OPEN_PARENS type_list CLOSE_PARENS\r
- {\r
- ArrayList arg_list = (ArrayList) $5;\r
- ITypeRef[] param_list;\r
- \r
- if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
- else\r
- param_list = new ITypeRef[0];\r
-\r
- $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
- (string) $3, param_list);\r
- }\r
| call_conv type type_spec DOUBLE_COLON method_name\r
typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
{\r
- ITypeRef owner = (ITypeRef) $3;\r
+ BaseTypeRef owner = (BaseTypeRef) $3;\r
ArrayList arg_list = (ArrayList) $8;\r
- ITypeRef[] param_list;\r
- IMethodRef methref;\r
+ GenericArguments ga = (GenericArguments) $6;\r
+ BaseTypeRef[] param_list;\r
+ BaseMethodRef methref;\r
\r
if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
else\r
- param_list = new ITypeRef[0];\r
+ param_list = new BaseTypeRef[0];\r
+\r
+ if (codegen.IsThisAssembly ("mscorlib")) {\r
+ PrimitiveTypeRef prim = owner as PrimitiveTypeRef;\r
+ if (prim != null && prim.SigMod == "")\r
+ owner = codegen.GetTypeRef (prim.Name);\r
+ }\r
\r
if (owner.UseTypeSpec) {\r
- methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
- (CallConv) $1, (string) $5, param_list);\r
+ methref = new TypeSpecMethodRef (owner, (CallConv) $1, (BaseTypeRef) $2,\r
+ (string) $5, param_list, (ga != null ? ga.Count : 0));\r
} else {\r
- methref = owner.GetMethodRef ((ITypeRef) $2,\r
- (CallConv) $1, (string) $5, param_list);\r
+ methref = owner.GetMethodRef ((BaseTypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list, (ga != null ? ga.Count : 0));\r
}\r
\r
- if ($6 != null) {\r
- ArrayList tp = (ArrayList) $6;\r
- ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));\r
- \r
- methref = new GenericMethodRef (methref, new GenericMethodSig (ta));\r
- }\r
+ if (ga != null)\r
+ methref = methref.GetGenericMethodRef (ga);\r
\r
$$ = methref;\r
}\r
| id\r
{\r
ArrayList label_list = new ArrayList ();\r
- label_list.Add ($1);\r
+ label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $1));\r
$$ = label_list;\r
}\r
| int32\r
| labels COMMA id\r
{\r
ArrayList label_list = (ArrayList) $1;\r
- label_list.Add ($3);\r
+ label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $3));\r
}\r
| labels COMMA int32\r
{\r
}\r
| K_FIELD type type_spec DOUBLE_COLON id\r
{\r
- ITypeRef owner = (ITypeRef) $3;\r
+ BaseTypeRef owner = (BaseTypeRef) $3;\r
\r
$$ = owner.GetFieldRef (\r
- (ITypeRef) $2, (string) $5);\r
+ (BaseTypeRef) $2, (string) $5);\r
}\r
| K_FIELD type id\r
{\r
- $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+ $$ = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
}\r
;\r
\r
event_head : D_EVENT event_attr type_spec comp_name\r
{\r
EventDef event_def = new EventDef ((FeatureAttr) $2,\r
- (ITypeRef) $3, (string) $4);\r
+ (BaseTypeRef) $3, (string) $4);\r
codegen.CurrentTypeDef.BeginEventDef (event_def);\r
codegen.CurrentCustomAttrTarget = event_def;\r
}\r
}\r
| customattr_decl\r
{\r
- codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
| extsource_spec\r
| language_decl\r
\r
prop_head : D_PROPERTY prop_attr type comp_name OPEN_PARENS type_list CLOSE_PARENS init_opt\r
{\r
- PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
+ PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (BaseTypeRef) $3,\r
(string) $4, (ArrayList) $6);\r
codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
codegen.CurrentCustomAttrTarget = prop_def;\r
}\r
| prop_attr K_INSTANCE\r
{\r
+ $$ = (FeatureAttr) $1 | FeatureAttr.Instance;\r
}\r
;\r
\r
}\r
| customattr_decl\r
{\r
- codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
| extsource_spec\r
| language_decl\r
\r
customattr_decl : D_CUSTOM custom_type\r
{\r
- $$ = new CustomAttr ((IMethodRef) $2, null);\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 ((IMethodRef) $2,\r
+ $$ = new CustomAttr ((BaseMethodRef) $2,\r
(byte[]) $4);\r
}\r
| D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
bytes_list\r
;\r
\r
-custom_type : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+custom_type : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS\r
{\r
- ITypeRef owner = (ITypeRef) $3;\r
+ BaseTypeRef owner = (BaseTypeRef) $3;\r
ArrayList arg_list = (ArrayList) $7;\r
- ITypeRef[] param_list;\r
+ BaseTypeRef[] param_list;\r
\r
if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
else\r
- param_list = new ITypeRef[0];\r
+ param_list = new BaseTypeRef[0];\r
\r
- $$ = owner.GetMethodRef ((ITypeRef) $2,\r
- (CallConv) $1, (string) $5, param_list);\r
+ $$ = owner.GetMethodRef ((BaseTypeRef) $2,\r
+ (CallConv) $1, (string) $5, param_list, 0);\r
}\r
- | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+ | call_conv type method_name OPEN_PARENS type_list CLOSE_PARENS\r
{\r
ArrayList arg_list = (ArrayList) $5;\r
- ITypeRef[] param_list;\r
+ BaseTypeRef[] param_list;\r
\r
if (arg_list != null)\r
- param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+ param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
else\r
- param_list = new ITypeRef[0];\r
+ param_list = new BaseTypeRef[0];\r
\r
- $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
- (string) $3, param_list);\r
+ $$ = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
+ (string) $3, param_list, 0);\r
}\r
;\r
\r
psa.XML = ue.GetString ((byte []) $4);\r
$$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
}\r
+ | D_PERMISSIONSET sec_action comp_qstring\r
+ {\r
+ PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);\r
+ psa.XML = (string) $3;\r
+ $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
+ }\r
+ | D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE\r
+ {\r
+#if NET_2_0\r
+ $$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);\r
+#else\r
+ Report.Error ("Use ilasm2 for 2.0 style declarative security attributes.");\r
+#endif\r
+ }\r
+ ;\r
+\r
+permissions : permission\r
+ {\r
+ ArrayList list = new ArrayList ();\r
+ list.Add ($1);\r
+ $$ = list;\r
+ }\r
+ | permissions COMMA permission\r
+ {\r
+ ArrayList list = (ArrayList) $1;\r
+ list.Add ($3);\r
+ $$ = list;\r
+ }\r
+ ;\r
+ \r
+permission : class_ref ASSIGN OPEN_BRACE permission_members CLOSE_BRACE\r
+ {\r
+ $$ = new MIPermission ((BaseTypeRef) $1, (ArrayList) $4);\r
+ }\r
+ ;\r
+\r
+permission_members : permission_member\r
+ {\r
+ ArrayList list = new ArrayList ();\r
+ list.Add ($1);\r
+ $$ = list;\r
+ }\r
+ | permission_members permission_member\r
+ {\r
+ ArrayList list = (ArrayList) $1;\r
+ list.Add ($2);\r
+ $$ = list;\r
+ }\r
+ ;\r
+\r
+permission_member : prop_or_field primitive_type perm_mbr_nameval_pair\r
+ {\r
+ NameValuePair pair = (NameValuePair) $3;\r
+ $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $2, pair.Name, pair.Value);\r
+ }\r
+ | prop_or_field K_ENUM class_ref perm_mbr_nameval_pair\r
+ {\r
+ NameValuePair pair = (NameValuePair) $4;\r
+ $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $3, pair.Name, pair.Value);\r
+ }\r
+ ;\r
+\r
+perm_mbr_nameval_pair : SQSTRING ASSIGN field_init_primitive\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
+ $$ = MemberTypes.Property;\r
+ }\r
+ | K_FIELD\r
+ {\r
+ $$ = MemberTypes.Field;\r
+ }\r
;\r
\r
nameval_pairs : nameval_pair \r
;\r
\r
assembly_all : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
+ {\r
+ codegen.CurrentCustomAttrTarget = null;\r
+ codegen.CurrentDeclSecurityTarget = null;\r
+ }\r
;\r
\r
assembly_head : D_ASSEMBLY asm_attr slashed_name\r
{\r
- codegen.SetAssemblyName ((string) $3);\r
+ codegen.SetThisAssembly ((string) $3, (PEAPI.AssemAttr) $2);\r
+ codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
+ codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
}\r
;\r
\r
asm_attr : /* EMPTY */\r
- | asm_attr K_NOAPPDOMAIN\r
+ {\r
+ $$ = new PEAPI.AssemAttr ();\r
+ }\r
+ /*| asm_attr K_NOAPPDOMAIN\r
| asm_attr K_NOPROCESS\r
- | asm_attr K_NOMACHINE\r
+ | asm_attr K_NOMACHINE*/\r
+ | asm_attr K_RETARGETABLE\r
+ {\r
+ $$ = ((PEAPI.AssemAttr) $1) | PEAPI.AssemAttr.Retargetable;\r
+ }\r
;\r
\r
assembly_decls : /* EMPTY */\r
\r
assembly_decl : D_PUBLICKEY ASSIGN bytes_list\r
{\r
- codegen.SetAssemblyPublicKey ((byte []) $3);\r
+ codegen.ThisAssembly.SetPublicKey ((byte []) $3);\r
}\r
| D_VER int32 COLON int32 COLON int32 COLON int32\r
{\r
- codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+ codegen.ThisAssembly.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
}\r
| D_LOCALE comp_qstring\r
{\r
- codegen.SetAssemblyLocale ((string) $2);\r
+ codegen.ThisAssembly.SetLocale ((string) $2);\r
}\r
| D_LOCALE ASSIGN bytes_list\r
| D_HASH K_ALGORITHM int32\r
{\r
- codegen.SetAssemblyHashAlgorithm ((int) $3);\r
+ codegen.ThisAssembly.SetHashAlgorithm ((int) $3);\r
}\r
| customattr_decl\r
{\r
- codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);\r
+ codegen.ThisAssembly.AddCustomAttribute ((CustomAttr) $1);\r
}\r
| sec_decl\r
{\r
- PermPair pp = (PermPair) $1;\r
- if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, true))\r
- throw new Exception (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
- codegen.AddAssemblyPermission (pp.sec_action, pp.perm);\r
+ AddSecDecl ($1, true);\r
}\r
;\r
\r
assemblyref_all : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
;\r
\r
-assemblyref_head : D_ASSEMBLY K_EXTERN slashed_name\r
+assemblyref_head : D_ASSEMBLY K_EXTERN asm_attr slashed_name\r
{\r
System.Reflection.AssemblyName asmb_name = \r
new System.Reflection.AssemblyName ();\r
- asmb_name.Name = (string) $3;\r
- codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
+ asmb_name.Name = (string) $4;\r
+ codegen.BeginAssemblyRef ((string) $4, asmb_name, (PEAPI.AssemAttr) $3);\r
}\r
- | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
+ | D_ASSEMBLY K_EXTERN 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) $3;\r
- codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
+ asmb_name.Name = (string) $4;\r
+ codegen.BeginAssemblyRef ((string) $6, asmb_name, (PEAPI.AssemAttr) $3);\r
}\r
;\r
\r
}\r
| customattr_decl\r
{\r
- codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+ if (codegen.CurrentCustomAttrTarget != null)\r
+ codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
}\r
;\r
\r
{\r
int i = (int) $3;\r
byte[] intb = BitConverter.GetBytes (i);\r
- $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ $$ = (double) BitConverter.ToSingle (intb, 0);\r
}\r
| K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
{\r
| K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
{\r
byte[] intb = BitConverter.GetBytes ((long) $3);\r
- $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ $$ = BitConverter.ToDouble (intb, 0);\r
}\r
| K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
{\r
byte[] intb = BitConverter.GetBytes ((int) $3);\r
- $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+ $$ = (double) BitConverter.ToSingle (intb, 0);\r
}\r
;\r
\r