[svn] r6439: nemerle/trunk/ncc: external/LibrariesLoader.n
generation/ILEmitter.n generation/Typer4.n hier...
nazgul
svnadmin at nemerle.org
Sun Jul 9 02:10:29 CEST 2006
Log:
Changes needed to make initonly flag not cause verification errors
Author: nazgul
Date: Sun Jul 9 02:10:25 2006
New Revision: 6439
Modified:
nemerle/trunk/ncc/external/LibrariesLoader.n
nemerle/trunk/ncc/generation/ILEmitter.n
nemerle/trunk/ncc/generation/Typer4.n
nemerle/trunk/ncc/hierarchy/ClassMembers.n
nemerle/trunk/ncc/hierarchy/TypeBuilder.n
nemerle/trunk/ncc/hierarchy/TypeInfo.n
nemerle/trunk/ncc/parsing/Lexer.n
nemerle/trunk/ncc/typing/TypedTree.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n (original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n Sun Jul 9 02:10:25 2006
@@ -681,7 +681,7 @@
public this (lib : LibraryReference, h : System.Type, ns_node : NamespaceTree.Node)
{
- base (ns_node, lib.Manager);
+ base (ns_node, lib.Manager, Util.StripGenericMark (h.FullName.Replace ('+', '.')));
// first cache ourself to avoid loops
LibraryReferenceManager.CacheTypeInfo (h, this, ns_node);
@@ -703,8 +703,6 @@
foreach (t in supertypes)
supertype_map = supertype_map.Add (t.tycon, t);
- fullname = Util.StripGenericMark (system_type.FullName.Replace ('+', '.'));
-
def parms = List.Map (typarms, fun (x) { MType.TyVarRef (x) });
self_type = MType.Class (this, parms);
Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n (original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n Sun Jul 9 02:10:25 2006
@@ -1244,8 +1244,8 @@
| TupleIndexer (obj, pos, len) =>
def tt = InternalType.GetTupleType (len);
- when (tt.TyCon.IsValueType && !obj.NeedAddress)
- obj.NeedAddress = true;
+ //when (tt.TyCon.IsValueType && !obj.NeedAddress)
+ // obj.NeedAddress = true;
emit (obj);
_ilg.Emit (OpCodes.Ldfld, GetFieldInfo (obj.SystemType, tt.GetField (pos + 1)));
Modified: nemerle/trunk/ncc/generation/Typer4.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer4.n (original)
+++ nemerle/trunk/ncc/generation/Typer4.n Sun Jul 9 02:10:25 2006
@@ -50,7 +50,7 @@
current_type : TypeBuilder;
messenger : Messenger;
the_method : MethodBuilder;
-
+ is_instance_ctor : bool;
#region Entry points
public this (meth : MethodBuilder)
@@ -60,6 +60,7 @@
the_method = meth;
messenger = Manager.Solver.CurrentMessenger;
current_type = meth.DeclaringType;
+ is_instance_ctor = the_method.GetFunKind () is FunKind.Constructor;
}
@@ -474,8 +475,9 @@
def obj = Walk (obj);
// use address here for better performance
- when (! obj.NeedAddress && fld.DeclaringType.IsValueType)
- obj.NeedAddress = true;
+ when (! obj.NeedAddress && fld.DeclaringType.IsValueType && fld.IsMutable) {
+ obj.setNeedAddress (is_instance_ctor);
+ }
TExpr.FieldMember (obj, fld)
@@ -493,7 +495,7 @@
// (like when the field had to be closurised inside the constructor)
unless (fld.IsMutable ||
fld.Attributes %&& NemerleAttributes.CompilerMutable ||
- obj is TExpr.This && the_method.GetFunKind () is FunKind.Constructor)
+ obj is TExpr.This && is_instance_ctor)
Message.Error ("assignment to immutable field is allowed only inside code,"
" which is executed inside constructor, but this field access"
" is done through closure");
@@ -508,8 +510,7 @@
Message.Error ("this expression is not a proper lvalue: "
"cannot load value type address");
else
- e1.NeedAddress = true;
-
+ e1.setNeedAddress (is_instance_ctor);
if (NeedBoxing (real_type, e2))
TExpr.Assign (InternalType.Void, e1, Box (real_type, e2))
@@ -520,7 +521,7 @@
def e1 = Walk (e1);
def e2 = Walk (e2);
if (decl.IsCache && decl.Type.Fix ().IsValueType) {
- e1.NeedAddress = true;
+ e1.setNeedAddress (is_instance_ctor);
decl.IsManagedPtr = true;
TExpr.DefValIn (decl, e1, e2)
} else if (NeedBoxing (decl.Type.Fix (), e1))
@@ -552,14 +553,14 @@
| MethodRef (obj, meth, type_parms, nonvirt) =>
if (obj.MType is MType.TyVarRef) {
obj.NeedsConstrained = true;
- obj.NeedAddress = true;
+ obj.setNeedAddress (is_instance_ctor);
}
else
// we would kinda like address here
when (obj.Type.Fix ().IsValueType) {
def methty = meth.DeclaringType;
if (methty.IsValueType)
- obj.NeedAddress = true;
+ obj.setNeedAddress (is_instance_ctor);
else {
// but maybe we should employ boxing
def obj = Box (methty.GetMemType (), obj);
@@ -605,7 +606,7 @@
parm.expr = Box (t, parm.expr);
} else {
if (parm.expr.IsAddressable)
- parm.expr.NeedAddress = true;
+ parm.expr.setNeedAddress (is_instance_ctor);
else
Message.Error ($ "non-addressable expression passed "
"as a ref/out parameter");
Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n (original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n Sun Jul 9 02:10:25 2006
@@ -41,8 +41,6 @@
{
protected loc : Location;
[Accessor]
- protected body_location : Location;
- [Accessor]
protected mutable name : string;
protected accessibility : Accessibility;
[Accessor]
@@ -50,7 +48,7 @@
[Accessor]
protected declaring_type : TypeBuilder;
id : int;
- protected kind : MemberKind;
+ protected mutable kind : MemberKind;
internal mutable ty : MType;
protected mutable handle : MemberInfo;
@@ -108,6 +106,11 @@
name == "value__"
}
+ public virtual BodyLocation : Location
+ {
+ get { loc }
+ }
+
// does current member can be accessed from inside given type
public CanAccess (source : TypeInfo) : bool
{
@@ -642,6 +645,9 @@
internal mutable overridden_method : IMethod;
+ [Accessor (flags = Override)]
+ protected body_location : Location;
+
is_var_args : bool;
public GetMethodBase () : MethodBase
Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n Sun Jul 9 02:10:25 2006
@@ -98,7 +98,7 @@
internal this (manager : TypesManager, par : TypeBuilder, td : PT.TopDeclaration,
ns_node : NamespaceTree.Node)
{
- base (ns_node, manager.Manager);
+ base (ns_node, manager.Manager, ns_node.Name.ToString ("."));
this.TyManager = manager;
@@ -110,7 +110,6 @@
when (this.GlobalEnv == null)
Util.ice ($ "env is null for $(ns_node.Name)");
- fullname = ns_node.Name.ToString (".");
this.enclosing_type = par;
when (par != null)
par.contained_types = this :: par.contained_types;
Modified: nemerle/trunk/ncc/hierarchy/TypeInfo.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeInfo.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeInfo.n Sun Jul 9 02:10:25 2006
@@ -157,11 +157,12 @@
protected namespace_nd : NamespaceTree.Node;
- public this (ns_node : NamespaceTree.Node, man : ManagerClass)
+ public this (ns_node : NamespaceTree.Node, man : ManagerClass, fullname : string)
{
id = Util.next_id ();
namespace_nd = ns_node;
Manager = man;
+ this.fullname = fullname;
}
public NamespaceNode : NamespaceTree.Node
Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n (original)
+++ nemerle/trunk/ncc/parsing/Lexer.n Sun Jul 9 02:10:25 2006
@@ -333,7 +333,7 @@
{
}
- protected this (man : ManagerClass)
+ protected this (man : ManagerClass, fn : string)
{
Manager = man;
line = 1;
@@ -346,6 +346,7 @@
eating_stack = Stack ();
eating_now = 0;
line_stack = -1;
+ file_real = fn;
}
abstract protected read_from_input () : char;
@@ -1419,10 +1420,9 @@
public this (man : ManagerClass, fn : string)
{
- base (man);
+ base (man, fn);
comment_store = StringBuilder (300);
file_idx = Location.AddFile (fn);
- file_real = fn;
try {
def file = IO.FileStream (fn, IO.FileMode.Open, IO.FileAccess.Read);
reader = IO.StreamReader (file, Text.Encoding.UTF8);
@@ -1537,11 +1537,10 @@
public this (man : ManagerClass, fn : string, loc : Location)
{
- base (man);
+ base (man, fn);
reader = fn;
pos = 0;
file_idx = loc.FileIndex;
- file_real = fn;
line = loc.Line;
col = loc.Column;
}
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Sun Jul 9 02:10:25 2006
@@ -607,9 +607,9 @@
internal NeedAddress : bool
{
get { flags %&& TExprFlags.NeedAddress }
+ }
- set {
- Util.cassert (value == true);
+ internal setNeedAddress (from_ctor : bool) : void {
Util.cassert (! NeedAddress);
match (this) {
@@ -619,15 +619,18 @@
| This =>
flags |= TExprFlags.NeedAddress
- | FieldMember (obj, fld) =>
+ | FieldMember (This as obj, fld) with is_mutable = from_ctor || fld.IsMutable
+ | FieldMember (obj, fld) with is_mutable = fld.IsMutable =>
+ when (is_mutable) {
+ //Message.Debug ($"am being assigned $this");
flags |= TExprFlags.NeedAddress;
when (fld.DeclaringType.IsValueType && !obj.NeedAddress)
- obj.NeedAddress = true;
+ obj.setNeedAddress (from_ctor);
+ }
| _ => {}
}
}
- }
#endregion
public Type : TyVar
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Sun Jul 9 02:10:25 2006
@@ -609,7 +609,7 @@
| _ => false
}
| TExpr.StaticPropertyRef (_, p) when !need_ref => p.IsMutable
- | TExpr.FieldMember (TExpr.This, _) when is_instance_ctor => true
+ | TExpr.FieldMember (TExpr.This, fld) when is_instance_ctor && fld.DeclaringType.Equals (current_type) => true
| TExpr.FieldMember (_, mem) =>
if (mem.IsMutable)
true
More information about the svn
mailing list