PublicSealed = 0x101, SpecialName = 0x400, RTSpecialName = 0x800,
Import = 0x1000, Serializable = 0x2000, UnicodeClass = 0x10000,
AutoClass = 0x20000, HasSecurity = 0x40000, BeforeFieldInit = 0x100000,
+ Forwarder = 0x200000,
VisibilityMask = 0x07 }
/// <summary>
ExternClass externClass;
internal ExternClassRef(TypeAttr attrs, string nsName, string name,
- FileRef declFile, MetaData md) : base(nsName,name,md)
+ MetaDataElement declRef, MetaData md) : base(nsName,name,md)
{
- externClass = new ExternClass(attrs,nameSpaceIx,nameIx,declFile);
+ externClass = new ExternClass(attrs,nameSpaceIx,nameIx,declRef);
metaData.AddToTable(MDTable.ExportedType,externClass);
}
return modRef;
}
+ public ClassRef AddExternClass(string name, TypeAttr attrs, MetaDataElement declRef)
+ {
+ return new ExternClassRef (attrs, null, name, declRef, metaData);
+ }
+
/// <summary>
/// Add a "global" method to this module
/// </summary>
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Reflection;
using System.Security;
using System.Globalization;
+using PEAPI;
namespace Mono.ILASM {
}
+ public class ExternClass
+ {
+ string name;
+ TypeAttr ta;
+ string assemblyReference;
+
+ public ExternClass (string name, TypeAttr ta, string assemblyReference)
+ {
+ this.name = name;
+ this.ta = ta;
+ this.assemblyReference = assemblyReference;
+ }
+
+ public void Resolve (CodeGen code_gen, ExternTable table)
+ {
+ var ar = table.GetAssemblyRef (assemblyReference);
+ if (ar != null)
+ code_gen.PEFile.AddExternClass (name, ta, ar.AssemblyRef);
+ }
+ }
+
public class ExternTable {
Hashtable assembly_table;
Hashtable module_table;
+ List<ExternClass> class_table;
+
bool is_resolved;
public void AddCorlib ()
return em;
}
+ public void AddClass (string name, TypeAttr ta, string assemblyReference)
+ {
+ if (class_table == null)
+ class_table = new List<ExternClass> ();
+
+ class_table.Add (new ExternClass (name, ta, assemblyReference));
+ }
+
public void Resolve (CodeGen code_gen)
{
if (is_resolved)
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;
+ if (module_table != null)
+ foreach (ExternModule ext in module_table.Values)
+ ext.Resolve (code_gen);
+
+ if (class_table != null)
+ foreach (var entry in class_table)
+ entry.Resolve (code_gen, this);
+
+ is_resolved = true;
}
public ExternTypeRef GetTypeRef (string asmb_name, string full_name, bool is_valuetype)
return mod.GetTypeRef (full_name, is_valuetype);
}
+ public ExternAssembly GetAssemblyRef (string assembly_name)
+ {
+ ExternAssembly ass = null;
+ if (assembly_table != null)
+ ass = assembly_table [assembly_name] as ExternAssembly;
+
+ if (ass == null)
+ Report.Error ("Assembly " + assembly_name + " is not defined.");
+
+ return ass;
+ }
+
public static void GetNameAndNamespace (string full_name,
out string name_space, out string name) {
using System;\r
using System.IO;\r
using System.Collections;\r
+using System.Collections.Generic;\r
using System.Globalization;\r
using System.Reflection;\r
using System.Security;\r
private PEAPI.PInvokeAttr pinvoke_attr;\r
private ILTokenizer tokenizer;\r
static int yacc_verbose_flag;\r
+ KeyValuePair<string, TypeAttr> current_extern;\r
\r
class NameValuePair {\r
public string Name;\r
%token K_IS\r
%token K_ON\r
%token K_OFF\r
+%token K_FORWARDER\r
%token K_CHARMAPERROR\r
\r
/* end generated */\r
;\r
\r
exptype_head : D_CLASS K_EXTERN expt_attr comp_name\r
+ {\r
+ current_extern = new KeyValuePair<string, TypeAttr> ((string) $4, (TypeAttr) $3);\r
+ }\r
;\r
\r
expt_attr : /* EMPTY */\r
- | expt_attr K_PRIVATE\r
- | expt_attr K_PUBLIC \r
- | expt_attr K_NESTED K_PUBLIC\r
- | expt_attr K_NESTED K_PRIVATE\r
- | expt_attr K_NESTED K_FAMILY\r
- | expt_attr K_NESTED K_ASSEMBLY\r
- | expt_attr K_NESTED K_FAMANDASSEM\r
- | expt_attr K_NESTED K_FAMORASSEM\r
+ | expt_attr K_PRIVATE { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
+ | expt_attr K_PUBLIC { $$ = (TypeAttr)$1 | TypeAttr.Public; }\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
\r
exptype_decl : D_FILE comp_name\r
| D_CLASS K_EXTERN comp_name\r
- | D_CLASS int32\r
| customattr_decl\r
+ | D_ASSEMBLY K_EXTERN comp_name\r
+ {\r
+ codegen.ExternTable.AddClass (current_extern.Key, current_extern.Value, (string) $3);\r
+ }\r
;\r
\r
manifestres_all : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r
keywords ["on"] = new ILToken (Token.K_ON, "on");\r
keywords ["off"] = new ILToken (Token.K_OFF, "off");\r
keywords ["strict"] = new ILToken (Token.K_STRICT, "strict");\r
+ keywords ["forwarder"] = new ILToken (Token.K_FORWARDER, "forwarder");\r
\r
return keywords;\r
}\r