[svn] r6441: nemerle/trunk: macros/concurrency.n
ncc/generation/Typer4.n ncc/typing/TypedTree.n
nazgul
svnadmin at nemerle.org
Sun Jul 9 14:08:39 CEST 2006
Log:
More changes needed to make initonly work
Author: nazgul
Date: Sun Jul 9 14:08:35 2006
New Revision: 6441
Modified:
nemerle/trunk/macros/concurrency.n
nemerle/trunk/ncc/generation/Typer4.n
nemerle/trunk/ncc/typing/TypedTree.n
Modified: nemerle/trunk/macros/concurrency.n
==============================================================================
--- nemerle/trunk/macros/concurrency.n (original)
+++ nemerle/trunk/macros/concurrency.n Sun Jul 9 14:08:35 2006
@@ -104,11 +104,9 @@
}
unless (is_in_current (tb.LookupMember ("__Chord_Mask"))) {
tb.Define (<[ decl:
- __Chord_Mask : BitMask;
+ mutable __Chord_Mask : BitMask = BitMask (); // it must be mutable, otherwise on every use .NET creates just its copy and does not
+ // modify it in place
]>);
- AddInit (tb, false, <[
- this.__Chord_Mask = BitMask ();
- ]>)
}
unless (is_in_current (tb.LookupMember ("__Chord_Lock"))) {
Modified: nemerle/trunk/ncc/generation/Typer4.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer4.n (original)
+++ nemerle/trunk/ncc/generation/Typer4.n Sun Jul 9 14:08:35 2006
@@ -475,9 +475,8 @@
def obj = Walk (obj);
// use address here for better performance
- when (! obj.NeedAddress && fld.DeclaringType.IsValueType && fld.IsMutable) {
- obj.setNeedAddress (is_instance_ctor);
- }
+ when (! obj.NeedAddress && fld.DeclaringType.IsValueType && fld.IsMutable)
+ _= obj.setNeedAddress (is_instance_ctor);
TExpr.FieldMember (obj, fld)
@@ -510,7 +509,9 @@
Message.Error ("this expression is not a proper lvalue: "
"cannot load value type address");
else
- e1.setNeedAddress (is_instance_ctor);
+ unless (e1.setNeedAddress (is_instance_ctor))
+ Message.Error ("this expression is not a proper lvalue: "
+ "cannot load value type address");
if (NeedBoxing (real_type, e2))
TExpr.Assign (InternalType.Void, e1, Box (real_type, e2))
@@ -521,7 +522,7 @@
def e1 = Walk (e1);
def e2 = Walk (e2);
if (decl.IsCache && decl.Type.Fix ().IsValueType) {
- e1.setNeedAddress (is_instance_ctor);
+ _ = e1.setNeedAddress (is_instance_ctor);
decl.IsManagedPtr = true;
TExpr.DefValIn (decl, e1, e2)
} else if (NeedBoxing (decl.Type.Fix (), e1))
@@ -553,14 +554,14 @@
| MethodRef (obj, meth, type_parms, nonvirt) =>
if (obj.MType is MType.TyVarRef) {
obj.NeedsConstrained = true;
- obj.setNeedAddress (is_instance_ctor);
+ _ = 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.setNeedAddress (is_instance_ctor);
+ _ = obj.setNeedAddress (is_instance_ctor);
else {
// but maybe we should employ boxing
def obj = Box (methty.GetMemType (), obj);
@@ -605,9 +606,7 @@
when (NeedBoxing (t, parm.expr))
parm.expr = Box (t, parm.expr);
} else {
- if (parm.expr.IsAddressable)
- parm.expr.setNeedAddress (is_instance_ctor);
- else
+ unless (parm.expr.IsAddressable && parm.expr.setNeedAddress (is_instance_ctor))
Message.Error ($ "non-addressable expression passed "
"as a ref/out parameter");
}
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Sun Jul 9 14:08:35 2006
@@ -609,7 +609,7 @@
get { flags %&& TExprFlags.NeedAddress }
}
- internal setNeedAddress (from_ctor : bool) : void {
+ internal setNeedAddress (from_ctor : bool) : bool {
Util.cassert (! NeedAddress);
match (this) {
@@ -617,18 +617,23 @@
| LocalRef
| ArrayIndexer
| This =>
- flags |= TExprFlags.NeedAddress
+ flags |= TExprFlags.NeedAddress;
+ true
| FieldMember (This as obj, fld) with is_mutable = from_ctor || fld.IsMutable
- | FieldMember (obj, fld) with is_mutable = fld.IsMutable =>
- when (is_mutable) {
+ | FieldMember (obj, fld) with is_mutable = fld.IsMutable || fld.Attributes %&& NemerleAttributes.CompilerMutable =>
+ if (is_mutable) {
//Message.Debug ($"am being assigned $this");
flags |= TExprFlags.NeedAddress;
- when (fld.DeclaringType.IsValueType && !obj.NeedAddress)
+ if (fld.DeclaringType.IsValueType && !obj.NeedAddress)
obj.setNeedAddress (from_ctor);
+ else
+ true
}
+ else
+ false
- | _ => {}
+ | _ => false
}
}
#endregion
More information about the svn
mailing list