using System;
using System.Collections;
using System.Reflection;
+using System.Security;
namespace Mono.ILASM {
- public abstract class ExternRef {
+ public interface IScope {
+ ExternTypeRef GetTypeRef (string full_name, bool is_valuetype, ExternTable table);
+ PEAPI.ClassRef GetType (string full_name, bool is_valuetype);
+ }
+
+ public abstract class ExternRef : ICustomAttrTarget, IScope {
protected string name;
protected Hashtable class_table;
protected Hashtable typeref_table;
+ protected ArrayList customattr_list;
+ protected bool is_resolved;
public abstract void Resolve (CodeGen codegen);
public abstract PEAPI.IExternRef GetExternRef ();
class_table = new Hashtable ();
}
- public ExternTypeRef GetTypeRef (string full_name, bool is_valuetype, ExternTable table)
+ public string Name {
+ get { return name; }
+ }
+
+ public void AddCustomAttribute (CustomAttr customattr)
{
- ExternTypeRef type_ref = typeref_table [full_name] as ExternTypeRef;
-
- if (type_ref != null)
- return type_ref;
-
- type_ref = new ExternTypeRef (this, full_name, is_valuetype, table);
- typeref_table [full_name] = type_ref;
-
- return type_ref;
+ if (customattr_list == null)
+ customattr_list = new ArrayList ();
+
+ customattr_list.Add (customattr);
}
- public PEAPI.ClassRef GetType (string full_name)
+ public ExternTypeRef GetTypeRef (string full_name, bool is_valuetype, ExternTable table)
{
- PEAPI.ClassRef klass = class_table[full_name] as PEAPI.ClassRef;
+ string first= full_name;
+ string rest = "";
+ int slash = full_name.IndexOf ('/');
+ if (slash > 0) {
+ first = full_name.Substring (0, slash);
+ rest = full_name.Substring (slash + 1);
+ }
+
+ ExternTypeRef type_ref = typeref_table [first] as ExternTypeRef;
- if (klass != null)
- return klass;
-
- string name_space, name;
- ExternTable.GetNameAndNamespace (full_name, out name_space, out name);
-
- klass = (PEAPI.ClassRef) GetExternRef ().AddClass (name_space, name);
- class_table[full_name] = klass;
+ if (type_ref != null) {
+ if (is_valuetype && rest == "")
+ type_ref.MakeValueClass ();
+ } else {
+ type_ref = new ExternTypeRef (this, first, is_valuetype, table);
+ typeref_table [first] = type_ref;
+ }
- return klass;
+ return (rest == "" ? type_ref : type_ref.GetTypeRef (rest, is_valuetype, table));
}
- public PEAPI.ClassRef GetValueType (string full_name)
+ public PEAPI.ClassRef GetType (string full_name, bool is_valuetype)
{
PEAPI.ClassRef klass = class_table[full_name] as PEAPI.ClassRef;
-
- if (klass != null)
+
+ if (klass != null)
return klass;
string name_space, name;
ExternTable.GetNameAndNamespace (full_name, out name_space, out name);
- klass = (PEAPI.ClassRef) GetExternRef ().AddValueClass (name_space, name);
- class_table[full_name] = klass;
+ if (is_valuetype)
+ klass = (PEAPI.ClassRef) GetExternRef ().AddValueClass (name_space, name);
+ else
+ klass = (PEAPI.ClassRef) GetExternRef ().AddClass (name_space, name);
+ class_table [full_name] = klass;
return klass;
}
+
}
public class ExternModule : ExternRef {
public override void Resolve (CodeGen codegen)
{
+ if (is_resolved)
+ return;
+
ModuleRef = codegen.PEFile.AddExternModule (name);
+ if (customattr_list != null)
+ foreach (CustomAttr customattr in customattr_list)
+ customattr.AddTo (codegen, ModuleRef);
+
+ is_resolved = true;
}
}
}
- public class ExternAssembly : ExternRef {
+ public class ExternAssembly : ExternRef, IDeclSecurityTarget {
public PEAPI.AssemblyRef AssemblyRef;
private byte [] public_key_token;
private string locale;
private byte [] hash;
+ private DeclSecurity decl_sec;
public ExternAssembly (string name, AssemblyName asmb_name) : base (name)
{
public override void Resolve (CodeGen code_gen)
{
+ if (is_resolved)
+ return;
+
AssemblyRef = code_gen.PEFile.AddExternAssembly (name);
if (major != -1)
AssemblyRef.AddVersionInfo (major, minor, build, revision);
AssemblyRef.AddCulture (locale);
if (hash != null)
AssemblyRef.AddHash (hash);
+
+ if (customattr_list != null)
+ foreach (CustomAttr customattr in customattr_list)
+ customattr.AddTo (code_gen, AssemblyRef);
+
+ if (decl_sec != null)
+ decl_sec.AddTo (code_gen, AssemblyRef);
+
class_table = new Hashtable ();
+
+ is_resolved = true;
}
public override PEAPI.IExternRef GetExternRef ()
{
return AssemblyRef;
}
+
+ public void AddPermissionSet (PEAPI.SecurityAction sec_action, PermissionSet ps)
+ {
+ if (decl_sec == null)
+ decl_sec = new DeclSecurity ();
+
+ decl_sec.AddPermissionSet (sec_action, ps);
+ }
+
+ public void AddPermission (PEAPI.SecurityAction sec_action, IPermission iper)
+ {
+ if (decl_sec == null)
+ decl_sec = new DeclSecurity ();
+
+ decl_sec.AddPermission (sec_action, iper);
+ }
public void SetVersion (int major, int minor, int build, int revision)
{
{
this.hash = hash;
}
+
}
Hashtable assembly_table;
Hashtable module_table;
+ bool is_resolved;
- public ExternTable ()
+ public void AddCorlib ()
{
// Add mscorlib
string mscorlib_name = "mscorlib";
public void Resolve (CodeGen code_gen)
{
- // Assembly table is never null because we add mscorlib
- foreach (ExternAssembly ext in assembly_table.Values)
- ext.Resolve (code_gen);
+ if (is_resolved)
+ return;
+
+ if (assembly_table != null)
+ foreach (ExternAssembly ext in assembly_table.Values)
+ ext.Resolve (code_gen);
if (module_table == null)
return;
foreach (ExternModule ext in module_table.Values)
ext.Resolve (code_gen);
+
+ is_resolved = true;
}
public ExternTypeRef GetTypeRef (string asmb_name, string full_name, bool is_valuetype)
{
- ExternAssembly ext_asmb;
- ext_asmb = assembly_table[asmb_name] as ExternAssembly;
+ ExternAssembly ext_asmb = null;
+ if (assembly_table == null && (asmb_name == "mscorlib" || asmb_name == "corlib"))
+ /* AddCorlib if mscorlib is being referenced but
+ we haven't encountered a ".assembly 'name'" as yet. */
+ AddCorlib ();
+ if (assembly_table != null)
+ ext_asmb = assembly_table[asmb_name] as ExternAssembly;
if (ext_asmb == null)
throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));