Index: default.build
===================================================================
--- default.build (revision 2392)
+++ default.build (working copy)
@@ -51,8 +51,8 @@
+
-
0 ? OpCodes.Leave : OpCodes.Br;
if (null != node.Expression)
@@ -707,7 +722,7 @@
EmitCastIfNeeded(_returnType, PopType());
_il.Emit(OpCodes.Stloc, _returnValueLocal);
}
- _il.Emit(retOpCode, _returnLabel);
+ _il.Emit(retOpCode, _returnLabel);
EmitNopDebugInfo(node);
}
@@ -792,7 +807,7 @@
}
override public void OnUnlessStatement(UnlessStatement node)
- {
+ {
Label endLabel = _il.DefineLabel();
EmitDebugInfo(node);
EmitBranchTrue(node.Condition, endLabel);
@@ -824,7 +839,7 @@
InternalLabel label = (InternalLabel)GetEntity(node.Label);
int gotoDepth = AstAnnotations.GetTryBlockDepth(node);
int targetDepth = AstAnnotations.GetTryBlockDepth(label.LabelStatement);
-
+
if (targetDepth == gotoDepth)
{
_il.Emit(OpCodes.Br, label.Label);
@@ -866,7 +881,7 @@
}
override public void OnIfStatement(IfStatement node)
- {
+ {
Label endLabel = _il.DefineLabel();
EmitDebugInfo(node);
@@ -904,95 +919,95 @@
switch (expression.Operator)
{
case BinaryOperatorType.TypeTest:
- {
- EmitTypeTest(expression);
- _il.Emit(OpCodes.Brtrue, label);
- break;
- }
-
+ {
+ EmitTypeTest(expression);
+ _il.Emit(OpCodes.Brtrue, label);
+ break;
+ }
+
case BinaryOperatorType.Or:
- {
- EmitBranchTrue(expression.Left, label);
- EmitBranchTrue(expression.Right, label);
- break;
- }
-
+ {
+ EmitBranchTrue(expression.Left, label);
+ EmitBranchTrue(expression.Right, label);
+ break;
+ }
+
case BinaryOperatorType.And:
- {
- Label skipRhs = _il.DefineLabel();
- EmitBranchFalse(expression.Left, skipRhs);
- EmitBranchTrue(expression.Right, label);
- _il.MarkLabel(skipRhs);
- break;
- }
-
+ {
+ Label skipRhs = _il.DefineLabel();
+ EmitBranchFalse(expression.Left, skipRhs);
+ EmitBranchTrue(expression.Right, label);
+ _il.MarkLabel(skipRhs);
+ break;
+ }
+
case BinaryOperatorType.Equality:
- {
- LoadCmpOperands(expression);
- _il.Emit(OpCodes.Beq, label);
- break;
- }
-
+ {
+ LoadCmpOperands(expression);
+ _il.Emit(OpCodes.Beq, label);
+ break;
+ }
+
case BinaryOperatorType.ReferenceEquality:
- {
- Visit(expression.Left); PopType();
- Visit(expression.Right); PopType();
- _il.Emit(OpCodes.Beq, label);
- break;
- }
-
+ {
+ Visit(expression.Left); PopType();
+ Visit(expression.Right); PopType();
+ _il.Emit(OpCodes.Beq, label);
+ break;
+ }
+
case BinaryOperatorType.ReferenceInequality:
- {
- if (IsNull(expression.Left))
{
- EmitRawBranchTrue(expression.Right, label);
+ if (IsNull(expression.Left))
+ {
+ EmitRawBranchTrue(expression.Right, label);
+ break;
+ }
+ if (IsNull(expression.Right))
+ {
+ EmitRawBranchTrue(expression.Left, label);
+ break;
+ }
+ Visit(expression.Left); PopType();
+ Visit(expression.Right); PopType();
+ _il.Emit(OpCodes.Ceq);
+ _il.Emit(OpCodes.Brfalse, label);
break;
}
- if (IsNull(expression.Right))
+
+ case BinaryOperatorType.GreaterThan:
{
- EmitRawBranchTrue(expression.Left, label);
+ LoadCmpOperands(expression);
+ _il.Emit(OpCodes.Bgt, label);
break;
}
- Visit(expression.Left); PopType();
- Visit(expression.Right); PopType();
- _il.Emit(OpCodes.Ceq);
- _il.Emit(OpCodes.Brfalse, label);
- break;
- }
-
- case BinaryOperatorType.GreaterThan:
- {
- LoadCmpOperands(expression);
- _il.Emit(OpCodes.Bgt, label);
- break;
- }
-
+
case BinaryOperatorType.GreaterThanOrEqual:
- {
- LoadCmpOperands(expression);
- _il.Emit(OpCodes.Bge, label);
- break;
- }
-
+ {
+ LoadCmpOperands(expression);
+ _il.Emit(OpCodes.Bge, label);
+ break;
+ }
+
case BinaryOperatorType.LessThan:
- {
- LoadCmpOperands(expression);
- _il.Emit(OpCodes.Blt, label);
- break;
- }
-
+ {
+ LoadCmpOperands(expression);
+ _il.Emit(OpCodes.Blt, label);
+ break;
+ }
+
case BinaryOperatorType.LessThanOrEqual:
- {
- LoadCmpOperands(expression);
- _il.Emit(OpCodes.Ble, label);
- break;
- }
-
+ {
+ LoadCmpOperands(expression);
+ _il.Emit(OpCodes.Ble, label);
+ break;
+ }
+
default:
- {
- DefaultBranchTrue(expression, label);
- break;
- }
+ {
+ DefaultBranchTrue(expression, label);
+ break;
+ }
}
}
@@ -1007,22 +1022,22 @@
switch (expression.NodeType)
{
case NodeType.BinaryExpression:
- {
- EmitBranchTrue((BinaryExpression)expression, label);
- break;
- }
-
+ {
+ EmitBranchTrue((BinaryExpression)expression, label);
+ break;
+ }
+
case NodeType.UnaryExpression:
- {
- EmitBranchTrue((UnaryExpression)expression, label);
- break;
- }
-
+ {
+ EmitBranchTrue((UnaryExpression)expression, label);
+ break;
+ }
+
default:
- {
- DefaultBranchTrue(expression, label);
- break;
- }
+ {
+ DefaultBranchTrue(expression, label);
+ break;
+ }
}
}
@@ -1052,67 +1067,67 @@
switch (expression.Operator)
{
case BinaryOperatorType.TypeTest:
- {
- EmitTypeTest(expression);
- _il.Emit(OpCodes.Brfalse, label);
- break;
- }
-
+ {
+ EmitTypeTest(expression);
+ _il.Emit(OpCodes.Brfalse, label);
+ break;
+ }
+
case BinaryOperatorType.Or:
- {
- Label end = _il.DefineLabel();
- EmitBranchTrue(expression.Left, end);
- EmitBranchFalse(expression.Right, label);
- _il.MarkLabel(end);
- break;
- }
-
- case BinaryOperatorType.And:
- {
- EmitBranchFalse(expression.Left, label);
- EmitBranchFalse(expression.Right, label);
- break;
- }
-
- case BinaryOperatorType.Equality:
- {
- if (CanOptimizeAwayZeroOrFalseComparison(expression.Left, expression.Right))
{
- EmitBranchTrue(expression.Right, label);
+ Label end = _il.DefineLabel();
+ EmitBranchTrue(expression.Left, end);
+ EmitBranchFalse(expression.Right, label);
+ _il.MarkLabel(end);
+ break;
}
- else if (CanOptimizeAwayZeroOrFalseComparison(expression.Right, expression.Left))
+
+ case BinaryOperatorType.And:
{
- EmitBranchTrue(expression.Left, label);
+ EmitBranchFalse(expression.Left, label);
+ EmitBranchFalse(expression.Right, label);
+ break;
}
- else
+
+ case BinaryOperatorType.Equality:
{
- DefaultBranchFalse(expression, label);
+ if (CanOptimizeAwayZeroOrFalseComparison(expression.Left, expression.Right))
+ {
+ EmitBranchTrue(expression.Right, label);
+ }
+ else if (CanOptimizeAwayZeroOrFalseComparison(expression.Right, expression.Left))
+ {
+ EmitBranchTrue(expression.Left, label);
+ }
+ else
+ {
+ DefaultBranchFalse(expression, label);
+ }
+ break;
}
- break;
- }
case BinaryOperatorType.Inequality:
- {
- if (CanOptimizeAwayZeroOrFalseComparison(expression.Left, expression.Right))
{
- EmitBranchFalse(expression.Right, label);
+ if (CanOptimizeAwayZeroOrFalseComparison(expression.Left, expression.Right))
+ {
+ EmitBranchFalse(expression.Right, label);
+ }
+ else if (CanOptimizeAwayZeroOrFalseComparison(expression.Right, expression.Left))
+ {
+ EmitBranchFalse(expression.Left, label);
+ }
+ else
+ {
+ DefaultBranchFalse(expression, label);
+ }
+ break;
}
- else if (CanOptimizeAwayZeroOrFalseComparison(expression.Right, expression.Left))
+
+ default:
{
- EmitBranchFalse(expression.Left, label);
- }
- else
- {
DefaultBranchFalse(expression, label);
+ break;
}
- break;
- }
-
- default:
- {
- DefaultBranchFalse(expression, label);
- break;
- }
}
}
@@ -1126,7 +1141,7 @@
return (IsZero(expression) || IsFalse(expression));
}
- private bool IsFalse(Expression expression)
+ private bool IsFalse(Expression expression)
{
return NodeType.BoolLiteralExpression == expression.NodeType
&& (false == ((BoolLiteralExpression)expression).Value);
@@ -1143,22 +1158,22 @@
switch (expression.NodeType)
{
case NodeType.UnaryExpression:
- {
- EmitBranchFalse((UnaryExpression)expression, label);
- break;
- }
-
+ {
+ EmitBranchFalse((UnaryExpression)expression, label);
+ break;
+ }
+
case NodeType.BinaryExpression:
- {
- EmitBranchFalse((BinaryExpression)expression, label);
- break;
- }
-
+ {
+ EmitBranchFalse((BinaryExpression)expression, label);
+ break;
+ }
+
default:
- {
- DefaultBranchFalse(expression, label);
- break;
- }
+ {
+ DefaultBranchFalse(expression, label);
+ break;
+ }
}
}
@@ -1167,16 +1182,16 @@
switch (expression.Operator)
{
case UnaryOperatorType.LogicalNot:
- {
- EmitBranchTrue(expression.Operand, label);
- break;
- }
-
+ {
+ EmitBranchTrue(expression.Operand, label);
+ break;
+ }
+
default:
- {
- DefaultBranchFalse(expression, label);
- break;
- }
+ {
+ DefaultBranchFalse(expression, label);
+ break;
+ }
}
}
@@ -1235,7 +1250,7 @@
Label bodyLabel = _il.DefineLabel();
Label conditionLabel = _il.DefineLabel();
- _il.Emit(OpCodes.Br, conditionLabel);
+ _il.Emit(OpCodes.Br, conditionLabel);
_il.MarkLabel(bodyLabel);
EnterLoop(endLabel, conditionLabel);
@@ -1274,28 +1289,28 @@
switch (node.Operator)
{
case UnaryOperatorType.LogicalNot:
- {
- EmitLogicalNot(node);
- break;
- }
-
+ {
+ EmitLogicalNot(node);
+ break;
+ }
+
case UnaryOperatorType.UnaryNegation:
- {
- EmitUnaryNegation(node);
- break;
- }
+ {
+ EmitUnaryNegation(node);
+ break;
+ }
case UnaryOperatorType.OnesComplement:
- {
- EmitOnesComplement(node);
- break;
- }
-
+ {
+ EmitOnesComplement(node);
+ break;
+ }
+
default:
- {
- NotImplemented(node, "unary operator not supported");
- break;
- }
+ {
+ NotImplemented(node, "unary operator not supported");
+ break;
+ }
}
}
@@ -1308,7 +1323,7 @@
private void EmitLogicalNot(UnaryExpression node)
{
Expression operand = node.Operand;
- operand.Accept(this);
+ operand.Accept(this);
IType typeOnStack = PopType();
if (IsBoolOrInt(typeOnStack) || EmitToBoolIfNeeded(operand))
{
@@ -1425,50 +1440,50 @@
switch (tag.EntityType)
{
case EntityType.Local:
- {
- SetLocal(node, (InternalLocal)tag, leaveValueOnStack);
- break;
- }
-
+ {
+ SetLocal(node, (InternalLocal)tag, leaveValueOnStack);
+ break;
+ }
+
case EntityType.Parameter:
- {
- InternalParameter param = (InternalParameter)tag;
- if (param.Parameter.IsByRef)
{
- SetByRefParam(param, node.Right, leaveValueOnStack);
+ InternalParameter param = (InternalParameter)tag;
+ if (param.Parameter.IsByRef)
+ {
+ SetByRefParam(param, node.Right, leaveValueOnStack);
+ break;
+ }
+
+ Visit(node.Right);
+ EmitCastIfNeeded(param.Type, PopType());
+
+ if (leaveValueOnStack)
+ {
+ _il.Emit(OpCodes.Dup);
+ PushType(param.Type);
+ }
+ _il.Emit(OpCodes.Starg, param.Index);
break;
}
- Visit(node.Right);
- EmitCastIfNeeded(param.Type, PopType());
+ case EntityType.Field:
+ {
+ IField field = (IField)tag;
+ SetField(node, field, node.Left, node.Right, leaveValueOnStack);
+ break;
+ }
- if (leaveValueOnStack)
+ case EntityType.Property:
{
- _il.Emit(OpCodes.Dup);
- PushType(param.Type);
+ SetProperty(node, (IProperty)tag, node.Left, node.Right, leaveValueOnStack);
+ break;
}
- _il.Emit(OpCodes.Starg, param.Index);
- break;
- }
-
- case EntityType.Field:
- {
- IField field = (IField)tag;
- SetField(node, field, node.Left, node.Right, leaveValueOnStack);
- break;
- }
-
- case EntityType.Property:
- {
- SetProperty(node, (IProperty)tag, node.Left, node.Right, leaveValueOnStack);
- break;
- }
default:
- {
- NotImplemented(node, tag.ToString());
- break;
- }
+ {
+ NotImplemented(node, tag.ToString());
+ break;
+ }
}
if (!leaveValueOnStack)
{
@@ -1477,7 +1492,7 @@
}
private void SetByRefParam(InternalParameter param, Expression right, bool leaveValueOnStack)
- {
+ {
LocalBuilder temp = null;
IType tempType = null;
if (leaveValueOnStack)
@@ -1498,7 +1513,7 @@
}
EmitCastIfNeeded(param.Type, PopType());
-
+
OpCode storecode = GetStoreRefParamCode(param.Type);
if (IsStobj(storecode)) //passing struct/decimal byref
{
@@ -1609,7 +1624,7 @@
_il.EmitCall(OpCodes.Call, Math_Pow, null);
PushType(TypeSystemServices.DoubleType);
}
-
+
void OnArithmeticOperator(BinaryExpression node)
{
IType type = node.ExpressionType;
@@ -1623,7 +1638,7 @@
{
IType type = GetExpressionType(expression);
if (TypeSystemServices.ObjectType == type ||
- TypeSystemServices.DuckType == type)
+ TypeSystemServices.DuckType == type)
{
_il.EmitCall(OpCodes.Call, RuntimeServices_ToBool_Object, null);
return true;
@@ -1632,7 +1647,7 @@
{
_il.EmitCall(OpCodes.Call, RuntimeServices_ToBool_Decimal, null);
return true;
- }
+ }
return false;
}
@@ -1698,7 +1713,7 @@
{
switch (node.Operator)
{
- // BOO-705
+ // BOO-705
case BinaryOperatorType.ShiftLeft:
case BinaryOperatorType.ShiftRight:
return TypeSystemServices.IntType;
@@ -1721,33 +1736,33 @@
switch (node.Operator)
{
case BinaryOperatorType.BitwiseOr:
- {
- _il.Emit(OpCodes.Or);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Or);
+ break;
+ }
+
case BinaryOperatorType.BitwiseAnd:
- {
- _il.Emit(OpCodes.And);
- break;
- }
+ {
+ _il.Emit(OpCodes.And);
+ break;
+ }
case BinaryOperatorType.ExclusiveOr:
- {
- _il.Emit(OpCodes.Xor);
- break;
- }
+ {
+ _il.Emit(OpCodes.Xor);
+ break;
+ }
case BinaryOperatorType.ShiftLeft:
- {
- _il.Emit(OpCodes.Shl);
- break;
- }
+ {
+ _il.Emit(OpCodes.Shl);
+ break;
+ }
case BinaryOperatorType.ShiftRight:
- {
- _il.Emit(OpCodes.Shr);
- break;
- }
+ {
+ _il.Emit(OpCodes.Shr);
+ break;
+ }
}
PushType(type);
@@ -1762,104 +1777,104 @@
case BinaryOperatorType.ExclusiveOr:
case BinaryOperatorType.BitwiseAnd:
case BinaryOperatorType.BitwiseOr:
- {
- EmitBitwiseOperator(node);
- break;
- }
-
+ {
+ EmitBitwiseOperator(node);
+ break;
+ }
+
case BinaryOperatorType.Or:
- {
- EmitOr(node);
- break;
- }
-
+ {
+ EmitOr(node);
+ break;
+ }
+
case BinaryOperatorType.And:
- {
- EmitAnd(node);
- break;
- }
-
+ {
+ EmitAnd(node);
+ break;
+ }
+
case BinaryOperatorType.Addition:
case BinaryOperatorType.Subtraction:
case BinaryOperatorType.Multiply:
case BinaryOperatorType.Division:
case BinaryOperatorType.Modulus:
- {
- OnArithmeticOperator(node);
- break;
- }
-
+ {
+ OnArithmeticOperator(node);
+ break;
+ }
+
case BinaryOperatorType.Exponentiation:
- {
- OnExponentiation(node);
- break;
- }
-
+ {
+ OnExponentiation(node);
+ break;
+ }
+
case BinaryOperatorType.Assign:
- {
- OnAssignment(node);
- break;
- }
-
+ {
+ OnAssignment(node);
+ break;
+ }
+
case BinaryOperatorType.Equality:
- {
- OnEquality(node);
- break;
- }
-
+ {
+ OnEquality(node);
+ break;
+ }
+
case BinaryOperatorType.Inequality:
- {
- OnInequality(node);
- break;
- }
-
+ {
+ OnInequality(node);
+ break;
+ }
+
case BinaryOperatorType.GreaterThan:
- {
- OnGreaterThan(node);
- break;
- }
-
+ {
+ OnGreaterThan(node);
+ break;
+ }
+
case BinaryOperatorType.LessThan:
- {
- OnLessThan(node);
- break;
- }
-
+ {
+ OnLessThan(node);
+ break;
+ }
+
case BinaryOperatorType.GreaterThanOrEqual:
- {
- OnGreaterThanOrEqual(node);
- break;
- }
-
+ {
+ OnGreaterThanOrEqual(node);
+ break;
+ }
+
case BinaryOperatorType.LessThanOrEqual:
- {
- OnLessThanOrEqual(node);
- break;
- }
-
+ {
+ OnLessThanOrEqual(node);
+ break;
+ }
+
case BinaryOperatorType.ReferenceInequality:
- {
- OnReferenceComparison(node);
- break;
- }
-
+ {
+ OnReferenceComparison(node);
+ break;
+ }
+
case BinaryOperatorType.ReferenceEquality:
- {
- OnReferenceComparison(node);
- break;
- }
-
+ {
+ OnReferenceComparison(node);
+ break;
+ }
+
case BinaryOperatorType.TypeTest:
- {
- OnTypeTest(node);
- break;
- }
-
+ {
+ OnTypeTest(node);
+ break;
+ }
+
default:
- {
- OperatorNotImplemented(node);
- break;
- }
+ {
+ OperatorNotImplemented(node);
+ break;
+ }
}
}
@@ -1965,7 +1980,7 @@
}
}
else
- {
+ {
// pushes target reference
Visit(node.Target);
PopType();
@@ -2013,7 +2028,7 @@
_il.Emit(OpCodes.Ldtoken, type);
_il.EmitCall(OpCodes.Call, Type_GetTypeFromHandle, null);
PushType(TypeSystemServices.TypeType);
- }
+ }
void OnEval(MethodInvocationExpression node)
{
@@ -2048,34 +2063,34 @@
switch (function.FunctionType)
{
case BuiltinFunctionType.Switch:
- {
- OnSwitch(node);
- break;
- }
-
+ {
+ OnSwitch(node);
+ break;
+ }
+
case BuiltinFunctionType.AddressOf:
- {
- OnAddressOf(node);
- break;
- }
-
+ {
+ OnAddressOf(node);
+ break;
+ }
+
case BuiltinFunctionType.Eval:
- {
- OnEval(node);
- break;
- }
+ {
+ OnEval(node);
+ break;
+ }
case BuiltinFunctionType.InitValueType:
- {
- OnInitValueType(node);
- break;
- }
-
+ {
+ OnInitValueType(node);
+ break;
+ }
+
default:
- {
- NotImplemented(node, "BuiltinFunction: " + function.FunctionType);
- break;
- }
+ {
+ NotImplemented(node, "BuiltinFunction: " + function.FunctionType);
+ break;
+ }
}
}
@@ -2120,56 +2135,56 @@
switch (tag.EntityType)
{
case EntityType.BuiltinFunction:
- {
- OnBuiltinFunction((BuiltinFunction)tag, node);
- break;
- }
-
- case EntityType.Method:
- {
- IMethod methodInfo = (IMethod)tag;
-
- if (node.Target.NodeType == NodeType.SuperLiteralExpression)
{
- InvokeSuperMethod(methodInfo, node);
+ OnBuiltinFunction((BuiltinFunction)tag, node);
+ break;
}
- else
+
+ case EntityType.Method:
{
- InvokeMethod(methodInfo, node);
+ IMethod methodInfo = (IMethod)tag;
+
+ if (node.Target.NodeType == NodeType.SuperLiteralExpression)
+ {
+ InvokeSuperMethod(methodInfo, node);
+ }
+ else
+ {
+ InvokeMethod(methodInfo, node);
+ }
+
+ break;
}
- break;
- }
-
case EntityType.Constructor:
- {
- IConstructor constructorInfo = (IConstructor)tag;
- ConstructorInfo ci = GetConstructorInfo(constructorInfo);
-
- if (NodeType.SuperLiteralExpression == node.Target.NodeType || node.Target.NodeType == NodeType.SelfLiteralExpression)
{
- // super constructor call
- _il.Emit(OpCodes.Ldarg_0);
- PushArguments(constructorInfo, node.Arguments);
- _il.Emit(OpCodes.Call, ci);
- PushVoid();
+ IConstructor constructorInfo = (IConstructor)tag;
+ ConstructorInfo ci = GetConstructorInfo(constructorInfo);
+
+ if (NodeType.SuperLiteralExpression == node.Target.NodeType || node.Target.NodeType == NodeType.SelfLiteralExpression)
+ {
+ // super constructor call
+ _il.Emit(OpCodes.Ldarg_0);
+ PushArguments(constructorInfo, node.Arguments);
+ _il.Emit(OpCodes.Call, ci);
+ PushVoid();
+ }
+ else
+ {
+ PushArguments(constructorInfo, node.Arguments);
+ _il.Emit(OpCodes.Newobj, ci);
+
+ // constructor invocation resulting type is
+ PushType(constructorInfo.DeclaringType);
+ }
+ break;
}
- else
+
+ default:
{
- PushArguments(constructorInfo, node.Arguments);
- _il.Emit(OpCodes.Newobj, ci);
-
- // constructor invocation resulting type is
- PushType(constructorInfo.DeclaringType);
+ NotImplemented(node, tag.ToString());
+ break;
}
- break;
- }
-
- default:
- {
- NotImplemented(node, tag.ToString());
- break;
- }
}
}
@@ -2192,22 +2207,22 @@
switch (node.Value)
{
case 0L:
- {
- _il.Emit(OpCodes.Ldc_I4_0);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4_0);
+ break;
+ }
+
case 1L:
- {
- _il.Emit(OpCodes.Ldc_I4_1);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4_1);
+ break;
+ }
+
default:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)node.Value);
- break;
- }
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)node.Value);
+ break;
+ }
}
PushType(TypeSystemServices.IntType);
}
@@ -2338,7 +2353,7 @@
bool isNegative = false;
if (CanBeNegative(index, ref isNegative)
&& !_rawArrayIndexing
- && !AstAnnotations.IsRawIndexing(sourceNode))
+ && !AstAnnotations.IsRawIndexing(sourceNode))
{
if (isNegative)
{
@@ -2483,94 +2498,94 @@
switch (type)
{
case TypeCode.Byte:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)(byte)value);
- _il.Emit(OpCodes.Conv_U1);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)(byte)value);
+ _il.Emit(OpCodes.Conv_U1);
+ break;
+ }
+
case TypeCode.SByte:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)(sbyte)value);
- _il.Emit(OpCodes.Conv_I1);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)(sbyte)value);
+ _il.Emit(OpCodes.Conv_I1);
+ break;
+ }
+
case TypeCode.Char:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)(char)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)(char)value);
+ break;
+ }
+
case TypeCode.Int16:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)(short)value);
- break;
- }
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)(short)value);
+ break;
+ }
case TypeCode.UInt16:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)(ushort)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)(ushort)value);
+ break;
+ }
+
case TypeCode.Int32:
- {
- _il.Emit(OpCodes.Ldc_I4, (int)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)value);
+ break;
+ }
+
case TypeCode.UInt32:
- {
- uint uValue = (uint)value;
- unchecked
{
- _il.Emit(OpCodes.Ldc_I4, (int)uValue);
+ uint uValue = (uint)value;
+ unchecked
+ {
+ _il.Emit(OpCodes.Ldc_I4, (int)uValue);
+ }
+ _il.Emit(OpCodes.Conv_U4);
+ break;
}
- _il.Emit(OpCodes.Conv_U4);
- break;
- }
-
+
case TypeCode.Int64:
- {
- _il.Emit(OpCodes.Ldc_I8, (long)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_I8, (long)value);
+ break;
+ }
+
case TypeCode.UInt64:
- {
- ulong uValue = (ulong)value;
- unchecked
{
- _il.Emit(OpCodes.Ldc_I8, (long)uValue);
+ ulong uValue = (ulong)value;
+ unchecked
+ {
+ _il.Emit(OpCodes.Ldc_I8, (long)uValue);
+ }
+ _il.Emit(OpCodes.Conv_U8);
+ break;
}
- _il.Emit(OpCodes.Conv_U8);
- break;
- }
-
+
case TypeCode.Single:
- {
- _il.Emit(OpCodes.Ldc_R4, (float)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_R4, (float)value);
+ break;
+ }
+
case TypeCode.Double:
- {
- _il.Emit(OpCodes.Ldc_R8, (double)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldc_R8, (double)value);
+ break;
+ }
+
case TypeCode.String:
- {
- _il.Emit(OpCodes.Ldstr, (string)value);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldstr, (string)value);
+ break;
+ }
+
default:
- {
- NotImplemented(node, "Literal: " + type.ToString());
- break;
- }
+ {
+ NotImplemented(node, "Literal: " + type.ToString());
+ break;
+ }
}
}
}
@@ -2581,16 +2596,16 @@
switch (tag.EntityType)
{
case EntityType.Type:
- {
- EmitGetTypeFromHandle(GetSystemType(node));
- break;
- }
+ {
+ EmitGetTypeFromHandle(GetSystemType(node));
+ break;
+ }
default:
- {
- NotImplemented(node, tag.ToString());
- break;
- }
+ {
+ NotImplemented(node, tag.ToString());
+ break;
+ }
}
}
@@ -2600,28 +2615,28 @@
switch (tag.EntityType)
{
case EntityType.Method:
- {
- node.Target.Accept(this);
- break;
- }
-
+ {
+ node.Target.Accept(this);
+ break;
+ }
+
case EntityType.Field:
- {
- EmitLoadField(node.Target, (IField)tag);
- break;
- }
-
+ {
+ EmitLoadField(node.Target, (IField)tag);
+ break;
+ }
+
case EntityType.Type:
- {
- EmitGetTypeFromHandle(GetSystemType(node));
- break;
- }
-
+ {
+ EmitGetTypeFromHandle(GetSystemType(node));
+ break;
+ }
+
default:
- {
- NotImplemented(node, tag.ToString());
- break;
- }
+ {
+ NotImplemented(node, tag.ToString());
+ break;
+ }
}
}
@@ -2642,35 +2657,35 @@
switch (tag.EntityType)
{
case EntityType.Local:
- {
- _il.Emit(OpCodes.Ldloca, ((InternalLocal)tag).LocalBuilder);
- return;
- }
-
- case EntityType.Parameter:
- {
- InternalParameter param = (InternalParameter)tag;
- if (param.Parameter.IsByRef)
{
- LoadParam(param);
+ _il.Emit(OpCodes.Ldloca, ((InternalLocal)tag).LocalBuilder);
+ return;
}
- else
+
+ case EntityType.Parameter:
{
- _il.Emit(OpCodes.Ldarga, param.Index);
+ InternalParameter param = (InternalParameter)tag;
+ if (param.Parameter.IsByRef)
+ {
+ LoadParam(param);
+ }
+ else
+ {
+ _il.Emit(OpCodes.Ldarga, param.Index);
+ }
+ return;
}
- return;
- }
-
+
case EntityType.Field:
- {
- IField field = (IField)tag;
- if (!field.IsLiteral)
{
- EmitLoadFieldAddress(expression, field);
- return;
+ IField field = (IField)tag;
+ if (!field.IsLiteral)
+ {
+ EmitLoadFieldAddress(expression, field);
+ return;
+ }
+ break;
}
- break;
- }
}
}
@@ -2735,47 +2750,47 @@
switch (info.EntityType)
{
case EntityType.Local:
- {
- InternalLocal local = (InternalLocal)info;
- LocalBuilder builder = local.LocalBuilder;
- _il.Emit(OpCodes.Ldloc, builder);
- PushType(local.Type);
- break;
- }
-
+ {
+ InternalLocal local = (InternalLocal)info;
+ LocalBuilder builder = local.LocalBuilder;
+ _il.Emit(OpCodes.Ldloc, builder);
+ PushType(local.Type);
+ break;
+ }
+
case EntityType.Parameter:
- {
- InternalParameter param = (InternalParameter)info;
- LoadParam(param);
-
- if (param.Parameter.IsByRef)
{
- OpCode code = GetLoadRefParamCode(param.Type);
- if (code.Value == OpCodes.Ldobj.Value)
+ InternalParameter param = (InternalParameter)info;
+ LoadParam(param);
+
+ if (param.Parameter.IsByRef)
{
- _il.Emit(code, GetSystemType(param.Type));
+ OpCode code = GetLoadRefParamCode(param.Type);
+ if (code.Value == OpCodes.Ldobj.Value)
+ {
+ _il.Emit(code, GetSystemType(param.Type));
+ }
+ else {
+ _il.Emit(code);
+ }
}
- else {
- _il.Emit(code);
- }
+ PushType(param.Type);
+ break;
}
- PushType(param.Type);
- break;
- }
-
+
case EntityType.Array:
case EntityType.Type:
- {
- EmitGetTypeFromHandle(GetSystemType(node));
- break;
- }
-
+ {
+ EmitGetTypeFromHandle(GetSystemType(node));
+ break;
+ }
+
default:
- {
- NotImplemented(node, info.ToString());
- break;
- }
-
+ {
+ NotImplemented(node, info.ToString());
+ break;
+ }
+
}
}
@@ -2786,47 +2801,47 @@
switch (index)
{
case 0:
- {
- _il.Emit(OpCodes.Ldarg_0);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldarg_0);
+ break;
+ }
+
case 1:
- {
- _il.Emit(OpCodes.Ldarg_1);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldarg_1);
+ break;
+ }
+
case 2:
- {
- _il.Emit(OpCodes.Ldarg_2);
- break;
- }
-
+ {
+ _il.Emit(OpCodes.Ldarg_2);
+ break;
+ }
+
case 3:
- {
- _il.Emit(OpCodes.Ldarg_3);
- break;
- }
-
- default:
- {
- if (index < 256)
{
- _il.Emit(OpCodes.Ldarg_S, index);
+ _il.Emit(OpCodes.Ldarg_3);
+ break;
}
- else
+
+ default:
{
- _il.Emit(OpCodes.Ldarg, index);
+ if (index < 256)
+ {
+ _il.Emit(OpCodes.Ldarg_S, index);
+ }
+ else
+ {
+ _il.Emit(OpCodes.Ldarg, index);
+ }
+ break;
}
- break;
- }
}
}
void SetLocal(BinaryExpression node, InternalLocal tag, bool leaveValueOnStack)
{
node.Right.Accept(this); // leaves type on stack
-
+
IType typeOnStack = null;
if (leaveValueOnStack)
@@ -2859,12 +2874,12 @@
if (null != reference)
{
LoadMemberTarget(
- ((MemberReferenceExpression)reference).Target,
- field);
+ ((MemberReferenceExpression)reference).Target,
+ field);
}
}
- value.Accept(this);
+ value.Accept(this);
EmitCastIfNeeded(field.Type, PopType());
FieldInfo fi = GetFieldInfo(field);
@@ -2945,7 +2960,7 @@
if (null == writer) return false;
try
- {
+ {
_il.MarkSequencePoint(writer, start.Line, 0, start.Line+1, 0);
}
catch (Exception x)
@@ -2958,7 +2973,7 @@
}
private ISymbolDocumentWriter GetDocumentWriter(string fname)
- {
+ {
ISymbolDocumentWriter writer = GetCachedDocumentWriter(fname);
if (null != writer) return writer;
@@ -2992,11 +3007,11 @@
Expression arg = args[i];
/*
InternalParameter internalparam = parameters[i] as InternalParameter;
- if ((parameterType.IsByRef) ||
- (internalparam != null &&
+ if ((parameterType.IsByRef) ||
+ (internalparam != null &&
internalparam.Parameter.IsByRef)
)
- */
+ */
if (parameters[i].IsByRef)
{
LoadAddress(arg);
@@ -3069,22 +3084,22 @@
{
switch (op)
{
- case BinaryOperatorType.Addition: return OpCodes.Add_Ovf;
- case BinaryOperatorType.Subtraction: return OpCodes.Sub_Ovf;
- case BinaryOperatorType.Multiply: return OpCodes.Mul_Ovf;
- case BinaryOperatorType.Division: return OpCodes.Div;
- case BinaryOperatorType.Modulus: return OpCodes.Rem;
+ case BinaryOperatorType.Addition: return OpCodes.Add_Ovf;
+ case BinaryOperatorType.Subtraction: return OpCodes.Sub_Ovf;
+ case BinaryOperatorType.Multiply: return OpCodes.Mul_Ovf;
+ case BinaryOperatorType.Division: return OpCodes.Div;
+ case BinaryOperatorType.Modulus: return OpCodes.Rem;
}
}
else
{
switch (op)
{
- case BinaryOperatorType.Addition: return OpCodes.Add;
- case BinaryOperatorType.Subtraction: return OpCodes.Sub;
- case BinaryOperatorType.Multiply: return OpCodes.Mul;
- case BinaryOperatorType.Division: return OpCodes.Div;
- case BinaryOperatorType.Modulus: return OpCodes.Rem;
+ case BinaryOperatorType.Addition: return OpCodes.Add;
+ case BinaryOperatorType.Subtraction: return OpCodes.Sub;
+ case BinaryOperatorType.Multiply: return OpCodes.Mul;
+ case BinaryOperatorType.Division: return OpCodes.Div;
+ case BinaryOperatorType.Modulus: return OpCodes.Rem;
}
}
throw new ArgumentException("op");
@@ -3095,7 +3110,7 @@
if (tag.IsValueType)
{
if (TypeSystemServices.IntType == tag ||
- tag.IsEnum)
+ tag.IsEnum)
{
return OpCodes.Ldelem_I4;
}
@@ -3108,7 +3123,7 @@
return OpCodes.Ldelem_I1;
}
if (TypeSystemServices.ShortType == tag ||
- TypeSystemServices.CharType == tag)
+ TypeSystemServices.CharType == tag)
{
return OpCodes.Ldelem_I2;
}
@@ -3131,7 +3146,7 @@
if (tag.IsValueType)
{
if (TypeSystemServices.IntType == tag ||
- tag.IsEnum)
+ tag.IsEnum)
{
return OpCodes.Stelem_I4;
}
@@ -3144,7 +3159,7 @@
return OpCodes.Stelem_I1;
}
if (TypeSystemServices.ShortType == tag ||
- TypeSystemServices.CharType == tag)
+ TypeSystemServices.CharType == tag)
{
return OpCodes.Stelem_I2;
}
@@ -3167,7 +3182,7 @@
if (tag.IsValueType)
{
if (TypeSystemServices.IntType == tag ||
- tag.IsEnum)
+ tag.IsEnum)
{
return OpCodes.Ldind_I4;
}
@@ -3180,7 +3195,7 @@
return OpCodes.Ldind_I1;
}
if (TypeSystemServices.ShortType == tag ||
- TypeSystemServices.CharType == tag)
+ TypeSystemServices.CharType == tag)
{
return OpCodes.Ldind_I2;
}
@@ -3211,7 +3226,7 @@
if (tag.IsValueType)
{
if (TypeSystemServices.IntType == tag ||
- tag.IsEnum)
+ tag.IsEnum)
{
return OpCodes.Stind_I4;
}
@@ -3224,7 +3239,7 @@
return OpCodes.Stind_I1;
}
if (TypeSystemServices.ShortType == tag ||
- TypeSystemServices.CharType == tag)
+ TypeSystemServices.CharType == tag)
{
return OpCodes.Stind_I2;
}
@@ -3243,7 +3258,7 @@
}
bool IsAssignableFrom(IType expectedType, IType actualType)
- {
+ {
return (IsPtr(expectedType) && IsPtr(actualType))
|| expectedType.IsAssignableFrom(actualType);
}
@@ -3430,12 +3445,12 @@
return OpCodes.Conv_I2;
}
else if (type == TypeSystemServices.UShortType ||
- type == TypeSystemServices.CharType)
+ type == TypeSystemServices.CharType)
{
return OpCodes.Conv_U2;
}
if (type == TypeSystemServices.IntType ||
- type.IsEnum)
+ type.IsEnum)
{
return OpCodes.Conv_I4;
}
@@ -3503,8 +3518,8 @@
CustomAttributeBuilder CreateDebuggableAttribute()
{
return new CustomAttributeBuilder(
- DebuggableAttribute_Constructor,
- new object[] { true, true });
+ DebuggableAttribute_Constructor,
+ new object[] { true, true });
}
void DefineEntryPoint()
@@ -3518,7 +3533,7 @@
{
Method method = ContextAnnotations.GetEntryPoint(Context);
if (null != method)
- {
+ {
MethodInfo entryPoint = Context.Parameters.GenerateInMemory
? _asmBuilder.GetType(method.DeclaringType.FullName).GetMethod(method.Name, BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static)
: GetMethodBuilder(method);
@@ -3621,7 +3636,7 @@
FieldInfo GetFieldInfo(IField tag)
{
-#if NET_2_0
+#if NET_2_0
// If field is mapped from a generic type, get its mapped FieldInfo
// on the constructed type
MixedGenericType.MappedField mapped = tag as MixedGenericType.MappedField;
@@ -3629,7 +3644,7 @@
{
return MapGenericField(mapped.DeclaringType, mapped.FieldInfo);
}
-#endif
+#endif
ExternalField external = tag as ExternalField;
if (null != external)
{
@@ -3641,7 +3656,7 @@
MethodInfo GetMethodInfo(IMethod entity)
{
#if NET_2_0
- // If method is mapped from a generic type, get its mapped MethodInfo
+ // If method is mapped from a generic type, get its mapped MethodInfo
// on the constructed type
MixedGenericType.MappedMethod mapped = entity as MixedGenericType.MappedMethod;
if (null != mapped && mapped.MethodInfo.DeclaringType.IsGenericType)
@@ -3667,7 +3682,7 @@
{
return MapGenericConstructor(mapped.DeclaringType, mapped.ConstructorInfo);
}
-#endif
+#endif
ExternalConstructor external = entity as ExternalConstructor;
if (null != external)
{
@@ -3687,14 +3702,14 @@
if (!method.DeclaringType.IsGenericTypeDefinition)
{
// HACK: .NET Reflection doesn't allow calling TypeBuilder.GetMethod(Type, MethodInfo)
- // on types that aren't generic definitions, so we have to manually find the
+ // on types that aren't generic definitions, so we have to manually find the
// corresponding MethodInfo on the declaring type's definition before mapping it
Type definition = method.DeclaringType.GetGenericTypeDefinition();
method = Array.Find(
definition.GetMethods(),
- delegate(MethodInfo mi) { return mi.MetadataToken == method.MetadataToken; });
+ delegate(MethodInfo mi) { return mi.MetadataToken == method.MetadataToken; });
}
-
+
return TypeBuilder.GetMethod(GetSystemType(targetType), method);
}
@@ -3707,12 +3722,12 @@
if (!field.DeclaringType.IsGenericTypeDefinition)
{
// HACK: .NET Reflection doesn't allow calling TypeBuilder.GetMethod(Type, FieldInfo)
- // on types that aren't generic definitions, so we have to manually find the
+ // on types that aren't generic definitions, so we have to manually find the
// corresponding FieldInfo on the declaring type's definition before mapping it
Type definition = field.DeclaringType.GetGenericTypeDefinition();
field = definition.GetField(field.Name);
}
-
+
return TypeBuilder.GetField(GetSystemType(targetType), field);
}
@@ -3724,20 +3739,20 @@
{
if (!ctor.DeclaringType.IsGenericTypeDefinition)
{
- // HACK: .NET Reflection doesn't allow calling
- // TypeBuilder.GetConstructor(Type, ConstructorInfo) on types that aren't generic
- // definitions, so we have to manually find the corresponding ConstructorInfo on the
+ // HACK: .NET Reflection doesn't allow calling
+ // TypeBuilder.GetConstructor(Type, ConstructorInfo) on types that aren't generic
+ // definitions, so we have to manually find the corresponding ConstructorInfo on the
// declaring type's definition before mapping it
Type definition = ctor.DeclaringType.GetGenericTypeDefinition();
ctor = Array.Find(
definition.GetConstructors(),
- delegate(ConstructorInfo ci) { return ci.MetadataToken == ctor.MetadataToken; });
+ delegate(ConstructorInfo ci) { return ci.MetadataToken == ctor.MetadataToken; });
}
return TypeBuilder.GetConstructor(GetSystemType(targetType), ctor);
}
#endif
-
+
Type GetSystemType(Node node)
{
return GetSystemType(GetType(node));
@@ -3746,7 +3761,7 @@
Type GetSystemType(IType tag)
{
Type type = (Type)_typeCache[tag];
- if (type != null)
+ if (type != null)
{
return type;
}
@@ -3903,48 +3918,48 @@
switch (type.NodeType)
{
case NodeType.ClassDefinition:
- {
- attributes |= (TypeAttributes.AnsiClass | TypeAttributes.AutoLayout);
- attributes |= TypeAttributes.Class;
- attributes |= TypeAttributes.BeforeFieldInit;
+ {
+ attributes |= (TypeAttributes.AnsiClass | TypeAttributes.AutoLayout);
+ attributes |= TypeAttributes.Class;
+ attributes |= TypeAttributes.BeforeFieldInit;
+
+ if (!type.IsTransient)
+ {
+ attributes |= TypeAttributes.Serializable;
+ }
+ if (type.IsAbstract)
+ {
+ attributes |= TypeAttributes.Abstract;
+ }
+ if (type.IsFinal)
+ {
+ attributes |= TypeAttributes.Sealed;
+ }
+ if (((IType)type.Entity).IsValueType)
+ {
+ attributes |= TypeAttributes.SequentialLayout;
+ }
+ break;
+ }
- if (!type.IsTransient)
+ case NodeType.EnumDefinition:
{
+ attributes |= TypeAttributes.Sealed;
attributes |= TypeAttributes.Serializable;
+ break;
}
- if (type.IsAbstract)
+
+ case NodeType.InterfaceDefinition:
{
- attributes |= TypeAttributes.Abstract;
+ attributes |= (TypeAttributes.Interface | TypeAttributes.Abstract);
+ break;
}
- if (type.IsFinal)
+
+ case NodeType.Module:
{
attributes |= TypeAttributes.Sealed;
+ break;
}
- if (((IType)type.Entity).IsValueType)
- {
- attributes |= TypeAttributes.SequentialLayout;
- }
- break;
- }
-
- case NodeType.EnumDefinition:
- {
- attributes |= TypeAttributes.Sealed;
- attributes |= TypeAttributes.Serializable;
- break;
- }
-
- case NodeType.InterfaceDefinition:
- {
- attributes |= (TypeAttributes.Interface | TypeAttributes.Abstract);
- break;
- }
-
- case NodeType.Module:
- {
- attributes |= TypeAttributes.Sealed;
- break;
- }
}
return attributes;
}
@@ -4000,7 +4015,7 @@
}
if (member.IsVirtual || member.IsOverride)
{
- attributes |= MethodAttributes.Virtual;
+ attributes |= MethodAttributes.Virtual;
}
return attributes;
}
@@ -4024,7 +4039,7 @@
Debug.Assert(method.IsStatic);
attributes |= MethodAttributes.PinvokeImpl;
}
- attributes |= GetMethodAttributesFromTypeMember(method);
+ attributes |= GetMethodAttributesFromTypeMember(method);
return attributes;
}
@@ -4078,8 +4093,8 @@
void DefineEvent(TypeBuilder typeBuilder, Event node)
{
EventBuilder builder = typeBuilder.DefineEvent(node.Name,
- EventAttributes.None,
- GetSystemType(node.Type));
+ EventAttributes.None,
+ GetSystemType(node.Type));
//MethodAttributes attribs = GetPropertyMethodAttributes(node);
MethodAttributes baseAttributes = MethodAttributes.SpecialName;
builder.SetAddOnMethod(DefineMethod(typeBuilder, node.Add, baseAttributes|GetMethodAttributes(node.Add)));
@@ -4106,9 +4121,9 @@
}
PropertyBuilder builder = typeBuilder.DefineProperty(name,
- GetPropertyAttributes(property),
- GetSystemType(property.Type),
- GetParameterTypes(property.Parameters));
+ GetPropertyAttributes(property),
+ GetSystemType(property.Type),
+ GetParameterTypes(property.Parameters));
Method getter = property.Getter;
Method setter = property.Setter;
@@ -4174,7 +4189,7 @@
new CustomAttributeBuilder(
ParamArrayAttribute_Constructor,
new object[0]));
-
+
}
MethodImplAttributes GetImplementationFlags(Method method)
@@ -4204,9 +4219,9 @@
}
MethodBuilder builder = typeBuilder.DefineMethod(name,
- methodAttributes,
- GetSystemType(method.ReturnType),
- GetParameterTypes(parameters));
+ methodAttributes,
+ GetSystemType(method.ReturnType),
+ GetParameterTypes(parameters));
builder.SetImplementationFlags(GetImplementationFlags(method));
@@ -4230,9 +4245,9 @@
void DefineConstructor(TypeBuilder typeBuilder, Method constructor)
{
ConstructorBuilder builder = typeBuilder.DefineConstructor(GetMethodAttributes(constructor),
- CallingConventions.Standard,
- GetParameterTypes(constructor.Parameters));
-
+ CallingConventions.Standard,
+ GetParameterTypes(constructor.Parameters));
+
builder.SetImplementationFlags(GetImplementationFlags(constructor));
DefineParameters(builder, constructor.Parameters);
@@ -4273,14 +4288,14 @@
if (null == enclosingType)
{
typeBuilder = _moduleBuilder.DefineType(type.FullName,
- GetTypeAttributes(type),
- baseType);
+ GetTypeAttributes(type),
+ baseType);
}
else
{
typeBuilder = GetTypeBuilder(enclosingType).DefineNestedType(type.Name,
- GetNestedTypeAttributes(type),
- baseType);
+ GetNestedTypeAttributes(type),
+ baseType);
}
return typeBuilder;
}
@@ -4295,9 +4310,9 @@
// For some reason you can't call IsClass on constructed types created at compile time,
// so we'll ask the generic definition instead
if ((type.IsGenericType && type.GetGenericTypeDefinition().IsClass) || (type.IsClass))
-#else
- if (type.IsClass)
-#endif
+#else
+ if (type.IsClass)
+#endif
{
typeBuilder.SetParent(type);
}
@@ -4318,7 +4333,7 @@
IConstructor constructor = (IConstructor)GetEntity(node);
ConstructorInfo constructorInfo = GetConstructorInfo(constructor);
object[] constructorArgs = GetValues(constructor.GetParameters(),
- node.Arguments);
+ node.Arguments);
ExpressionPairCollection namedArgs = node.NamedArguments;
if (namedArgs.Count > 0)
@@ -4328,21 +4343,21 @@
FieldInfo[] namedFields;
object[] fieldValues;
GetNamedValues(namedArgs,
- out namedProperties, out propertyValues,
- out namedFields, out fieldValues);
+ out namedProperties, out propertyValues,
+ out namedFields, out fieldValues);
return new CustomAttributeBuilder(
- constructorInfo, constructorArgs,
- namedProperties, propertyValues,
- namedFields, fieldValues);
+ constructorInfo, constructorArgs,
+ namedProperties, propertyValues,
+ namedFields, fieldValues);
}
return new CustomAttributeBuilder(constructorInfo, constructorArgs);
}
void GetNamedValues(ExpressionPairCollection values,
- out PropertyInfo[] outNamedProperties,
- out object[] outPropertyValues,
- out FieldInfo[] outNamedFields,
- out object[] outFieldValues)
+ out PropertyInfo[] outNamedProperties,
+ out object[] outPropertyValues,
+ out FieldInfo[] outNamedFields,
+ out object[] outFieldValues)
{
List namedProperties = new List();
List propertyValues = new List();
@@ -4385,72 +4400,72 @@
switch (expression.NodeType)
{
case NodeType.StringLiteralExpression:
- {
- return ((StringLiteralExpression)expression).Value;
- }
-
+ {
+ return ((StringLiteralExpression)expression).Value;
+ }
+
case NodeType.CharLiteralExpression:
- {
- return ((CharLiteralExpression)expression).Value[0];
- }
-
+ {
+ return ((CharLiteralExpression)expression).Value[0];
+ }
+
case NodeType.BoolLiteralExpression:
- {
- return ((BoolLiteralExpression)expression).Value;
- }
-
+ {
+ return ((BoolLiteralExpression)expression).Value;
+ }
+
case NodeType.IntegerLiteralExpression:
- {
- return ConvertValue(expectedType,
- ((IntegerLiteralExpression)expression).Value);
- }
-
+ {
+ return ConvertValue(expectedType,
+ ((IntegerLiteralExpression)expression).Value);
+ }
+
case NodeType.DoubleLiteralExpression:
- {
- return ConvertValue(expectedType,
- ((DoubleLiteralExpression)expression).Value);
- }
-
+ {
+ return ConvertValue(expectedType,
+ ((DoubleLiteralExpression)expression).Value);
+ }
+
case NodeType.TypeofExpression:
- {
- return GetSystemType(((TypeofExpression)expression).Type);
- }
+ {
+ return GetSystemType(((TypeofExpression)expression).Type);
+ }
case NodeType.CastExpression:
- {
- return GetValue(expectedType, ((CastExpression)expression).Target);
- }
-
- default:
- {
- IEntity tag = GetEntity(expression);
- if (EntityType.Type == tag.EntityType)
{
- return GetSystemType(expression);
+ return GetValue(expectedType, ((CastExpression)expression).Target);
}
- else if (EntityType.Field == tag.EntityType)
+
+ default:
{
- IField field = (IField)tag;
- if (field.IsLiteral)
- {
- //Scenario:
- //IF:
- //SomeType.StaticReference = "hamsandwich"
- //[RandomAttribute(SomeType.StaticReferenece)]
- //THEN:
- //field.StaticValue != "hamsandwich"
- //field.StaticValue == SomeType.StaticReference
- //SO:
- //If field.StaticValue is an AST Expression, call GetValue() on it
- if (field.StaticValue is Expression)
+ IEntity tag = GetEntity(expression);
+ if (EntityType.Type == tag.EntityType)
+ {
+ return GetSystemType(expression);
+ }
+ else if (EntityType.Field == tag.EntityType)
+ {
+ IField field = (IField)tag;
+ if (field.IsLiteral)
{
- return GetValue(expectedType, field.StaticValue as Expression);
+ //Scenario:
+ //IF:
+ //SomeType.StaticReference = "hamsandwich"
+ //[RandomAttribute(SomeType.StaticReferenece)]
+ //THEN:
+ //field.StaticValue != "hamsandwich"
+ //field.StaticValue == SomeType.StaticReference
+ //SO:
+ //If field.StaticValue is an AST Expression, call GetValue() on it
+ if (field.StaticValue is Expression)
+ {
+ return GetValue(expectedType, field.StaticValue as Expression);
+ }
+ return field.StaticValue;
}
- return field.StaticValue;
}
+ break;
}
- break;
- }
}
NotImplemented(expression, "Expression value: " + expression);
return null;
@@ -4466,7 +4481,7 @@
}
private Type GetUnderlyingEnumType(IType expectedType)
- {
+ {
return expectedType is IInternalEntity
? Types.Int
: Enum.GetUnderlyingType(GetSystemType(expectedType));
@@ -4485,34 +4500,34 @@
switch (member.NodeType)
{
case NodeType.Method:
- {
- DefineMethod(typeBuilder, (Method)member, 0);
- break;
- }
-
+ {
+ DefineMethod(typeBuilder, (Method)member, 0);
+ break;
+ }
+
case NodeType.Constructor:
- {
- DefineConstructor(typeBuilder, (Constructor)member);
- break;
- }
-
+ {
+ DefineConstructor(typeBuilder, (Constructor)member);
+ break;
+ }
+
case NodeType.Field:
- {
- DefineField(typeBuilder, (Field)member);
- break;
- }
-
+ {
+ DefineField(typeBuilder, (Field)member);
+ break;
+ }
+
case NodeType.Property:
- {
- DefineProperty(typeBuilder, (Property)member);
- break;
- }
-
+ {
+ DefineProperty(typeBuilder, (Property)member);
+ break;
+ }
+
case NodeType.Event:
- {
- DefineEvent(typeBuilder, (Event)member);
- break;
- }
+ {
+ DefineEvent(typeBuilder, (Event)member);
+ break;
+ }
}
}
}
@@ -4538,7 +4553,7 @@
else
{
fname += ".exe";
-
+
}
}
return Path.GetFullPath(fname);
@@ -4696,7 +4711,7 @@
if (srcFile != null)
{
fname = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(srcFile),
- relativeFile));
+ relativeFile));
if (File.Exists(fname))
{
return fname;
@@ -4707,7 +4722,7 @@
if (targetFile != null)
{
fname = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(targetFile),
- relativeFile));
+ relativeFile));
}
return fname;
}
@@ -4726,7 +4741,7 @@
if (sliced.Length > 2)
{
DateTime baseTime = new DateTime(2000, 1, 1);
- TimeSpan mark = (DateTime.Now - baseTime);
+ TimeSpan mark = (DateTime.Now - baseTime);
if (sliced[2].StartsWith("*"))
{
sliced[2] = Math.Round(mark.TotalDays).ToString();
Index: src/Boo.Lang.Compiler/Steps/GeneratorExpressionProcessor.cs
===================================================================
--- src/Boo.Lang.Compiler/Steps/GeneratorExpressionProcessor.cs (revision 2392)
+++ src/Boo.Lang.Compiler/Steps/GeneratorExpressionProcessor.cs (working copy)
@@ -49,6 +49,10 @@
ForeignReferenceCollector _collector;
+ IType _elementType;
+ IType _iteratorEnumerableType;
+ IType _iteratorEnumeratorType;
+
public GeneratorExpressionProcessor(CompilerContext context,
ForeignReferenceCollector collector,
GeneratorExpression node)
@@ -76,17 +80,53 @@
void CreateAnonymousGeneratorType()
{
_enumerable = (BooClassBuilder)_generator["GeneratorClassBuilder"];
+ _elementType = (IType)_generator["GeneratorItemType"];
- //_enumerator = _collector.CreateSkeletonClass(_enumerable.ClassDefinition.Name + "Enumerator");
_enumerator = _collector.CreateSkeletonClass("Enumerator");
- _enumerator.AddBaseType(TypeSystemServices.IEnumeratorType);
_enumerator.AddBaseType(TypeSystemServices.Map(typeof(ICloneable)));
- _enumeratorField = _enumerator.AddField("____enumerator",
- TypeSystemServices.IEnumeratorType);
- _current = _enumerator.AddField("____current",
- TypeSystemServices.ObjectType);
+ _iteratorEnumeratorType = TypeSystemServices.IEnumeratorType;
+ _iteratorEnumerableType = TypeSystemServices.IEnumerableType;
+
+ _enumeratorField = _enumerator.AddField("___enumerator", _iteratorEnumeratorType);
+#if NET_2_0
+ // Make the generator's enumerator a generic one
+ _enumerator.AddBaseType(
+ TypeSystemServices.IEnumeratorGenericType.
+ GenericTypeDefinitionInfo.MakeGenericType(new IType[] {_elementType}));
+
+ // Generic enumerators need to implement IDisposable
+ // FIXME: Do we need to dispose of anything in there?
+ BooMethodBuilder disposeBuilder = _enumerator.AddVirtualMethod("Dispose", TypeSystemServices.VoidType);
+
+ // Try to use generic IEnumerable/IEnumerator for iterator as well,
+ // to prevent unnecessary casting and boxing
+ IType iteratorItemType =
+ TypeSystemServices.GetGenericEnumerableItemType(_generator.Iterator.ExpressionType);
+
+ if (iteratorItemType != null)
+ {
+ IType[] args = new IType[] { iteratorItemType };
+
+ _iteratorEnumerableType =
+ TypeSystemServices.IEnumerableGenericType.GenericTypeDefinitionInfo.MakeGenericType(args);
+
+ _iteratorEnumeratorType =
+ TypeSystemServices.IEnumeratorGenericType.GenericTypeDefinitionInfo.MakeGenericType(args);
+
+ // Switch enumerator field to generic type and dispose of it properly
+ _enumeratorField.Type = CodeBuilder.CreateTypeReference(_iteratorEnumeratorType);
+ disposeBuilder.Body.Add(
+ CodeBuilder.CreateMethodInvocation(
+ CodeBuilder.CreateReference(_enumeratorField), disposeBuilder.Entity));
+
+ }
+#else
+ _enumerator.AddBaseType(TypeSystemServices.IEnumeratorType);
+#endif
+ _current = _enumerator.AddField("____current", _elementType);
+
CreateReset();
CreateCurrent();
CreateMoveNext();
@@ -99,7 +139,6 @@
CreateGetEnumerator();
_enumerable.ClassDefinition.Members.Add(_enumerator.ClassDefinition);
- //TypeSystemServices.AddCompilerGeneratedType(_enumerator.ClassDefinition);
}
public MethodInvocationExpression CreateEnumerableConstructorInvocation()
@@ -117,8 +156,8 @@
IMethod GetMemberwiseCloneMethod()
{
return TypeSystemServices.Map(
- typeof(object).GetMethod("MemberwiseClone",
- System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance));
+ typeof(object).GetMethod("MemberwiseClone",
+ System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance));
}
MethodInvocationExpression CreateMethodInvocation(ClassDefinition cd, string name)
@@ -131,11 +170,23 @@
void CreateCurrent()
{
- Property property = _enumerator.AddReadOnlyProperty("Current", TypeSystemServices.ObjectType);
+ Property property = _enumerator.AddReadOnlyProperty("Current", _elementType);
property.Getter.Modifiers |= TypeMemberModifiers.Virtual;
property.Getter.Body.Add(
new ReturnStatement(
CodeBuilder.CreateReference(_current)));
+
+#if NET_2_0
+ // Add explicit Current property for IEnumerable
+ Property explicitProperty = _enumerator.AddReadOnlyProperty("Current", TypeSystemServices.ObjectType);
+ explicitProperty.Modifiers |= TypeMemberModifiers.Virtual;
+ explicitProperty.ExplicitInfo = new ExplicitMemberInfo(explicitProperty.LexicalInfo);
+ explicitProperty.ExplicitInfo.InterfaceType =
+ (SimpleTypeReference)CodeBuilder.CreateTypeReference(TypeSystemServices.IEnumeratorType);
+
+ explicitProperty.Getter.Body.Add(
+ new ReturnStatement(CodeBuilder.CreateReference(_current)));
+#endif
}
void CreateGetEnumerator()
@@ -168,13 +219,26 @@
void CreateReset()
{
BooMethodBuilder method = _enumerator.AddVirtualMethod("Reset", TypeSystemServices.VoidType);
+
+#if NET_2_0
+ IMethod getEnumeratorMethod =
+ (IMethod)Array.Find(
+ _iteratorEnumerableType.GetMembers(),
+ delegate(IEntity e) { return e is IMethod && e.Name == "GetEnumerator"; });
+#else
+ IMethod getEnumeratorMethod =
+ TypeSystemServices.Map(Types.IEnumerable.GetMethod("GetEnumerator"));
+#endif
+
method.Body.Add(
CodeBuilder.CreateAssignment(
CodeBuilder.CreateReference((InternalField)_enumeratorField.Entity),
- CodeBuilder.CreateMethodInvocation(_generator.Iterator,
- TypeSystemServices.Map(Types.IEnumerable.GetMethod("GetEnumerator")))));
+ CodeBuilder.CreateMethodInvocation(
+ _generator.Iterator,
+ getEnumeratorMethod)));
+
}
-
+
void CreateMoveNext()
{
BooMethodBuilder method = _enumerator.AddVirtualMethod("MoveNext", TypeSystemServices.BoolType);
@@ -182,10 +246,19 @@
Expression moveNext = CodeBuilder.CreateMethodInvocation(
CodeBuilder.CreateReference((InternalField)_enumeratorField.Entity),
TypeSystemServices.Map(Types.IEnumerator.GetMethod("MoveNext")));
-
+
+#if NET_2_0
+ IMethod getCurrent = ((IProperty)Array.Find(
+ _iteratorEnumeratorType.GetMembers(),
+ delegate (IEntity e) { return e is IProperty && e.Name == "Current"; })).GetGetMethod();
+#else
+ IMethod getCurrent =
+ TypeSystemServices.Map(Types.IEnumerator.GetProperty("Current").GetGetMethod());
+#endif
+
Expression current = CodeBuilder.CreateMethodInvocation(
- CodeBuilder.CreateReference((InternalField)_enumeratorField.Entity),
- TypeSystemServices.Map(Types.IEnumerator.GetProperty("Current").GetGetMethod()));
+ CodeBuilder.CreateReference((InternalField)_enumeratorField.Entity),
+ getCurrent);
Statement filter = null;
Statement stmt = null;
@@ -257,4 +330,4 @@
method.Body.Add(new ReturnStatement(new BoolLiteralExpression(false)));
}
}
-}
\ No newline at end of file
+}
Index: src/Boo.Lang.Compiler/Steps/GeneratorMethodProcessor.cs
===================================================================
--- src/Boo.Lang.Compiler/Steps/GeneratorMethodProcessor.cs (revision 2392)
+++ src/Boo.Lang.Compiler/Steps/GeneratorMethodProcessor.cs (working copy)
@@ -334,7 +334,15 @@
private bool GeneratorReturnsIEnumerator()
{
- return _generator.ReturnType == TypeSystemServices.IEnumeratorType;
+ bool returnsEnumerator = _generator.ReturnType == TypeSystemServices.IEnumeratorType;
+
+#if NET_2_0
+ returnsEnumerator |=
+ _generator.ReturnType.GenericTypeInfo != null &&
+ _generator.ReturnType.GenericTypeInfo.GenericDefinition == TypeSystemServices.IEnumeratorGenericType;
+#endif
+
+ return returnsEnumerator;
}
void CreateGetEnumerator(Expression enumeratorExpression)
@@ -360,7 +368,13 @@
void CreateEnumerator()
{
+#if NET_2_0
+ IType abstractEnumeratorType =
+ TypeSystemServices.Map(typeof(Boo.Lang.AbstractGeneratorEnumerator<>)).
+ GenericTypeDefinitionInfo.MakeGenericType(new IType[] {_generatorItemType});
+#else
IType abstractEnumeratorType = TypeSystemServices.Map(typeof(Boo.Lang.AbstractGeneratorEnumerator));
+#endif
_state = NameResolutionService.ResolveField(abstractEnumeratorType, "_state");
_yield = NameResolutionService.ResolveMethod(abstractEnumeratorType, "Yield");
@@ -530,4 +544,4 @@
return constructor;
}
}
-}
\ No newline at end of file
+}
Index: src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs
===================================================================
--- src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs (revision 2392)
+++ src/Boo.Lang.Compiler/Steps/ProcessMethodBodies.cs (working copy)
@@ -1038,11 +1038,19 @@
void CheckGeneratorReturnType(Method method, IType returnType)
{
- if (TypeSystemServices.IEnumerableType != returnType &&
- TypeSystemServices.IEnumeratorType != returnType &&
- !TypeSystemServices.IsSystemObject(returnType))
+ bool validReturnType =
+ (TypeSystemServices.IEnumerableType == returnType ||
+ TypeSystemServices.IEnumeratorType == returnType ||
+ TypeSystemServices.IsSystemObject(returnType));
+#if NET_2_0
+ validReturnType |=
+ (returnType.GenericTypeInfo!= null &&
+ returnType.GenericTypeInfo.GenericDefinition == TypeSystemServices.IEnumerableGenericType);
+#endif
+
+ if (!validReturnType)
{
- Error(CompilerErrorFactory.InvalidGeneratorReturnType(method.ReturnType));
+ Error(CompilerErrorFactory.InvalidGeneratorReturnType(method.ReturnType));
}
}
@@ -1764,6 +1772,25 @@
string.Format("{0}___generator{1}", method.Name, _context.AllocIndex()),
TypeMemberModifiers.Internal|TypeMemberModifiers.Final);
builder.LexicalInfo = sourceNode.LexicalInfo;
+
+ BooMethodBuilder getEnumeratorBuilder = null;
+#if NET_2_0
+ if (generatorItemType != TypeSystemServices.VoidType)
+ {
+ IType[] arguments = new IType[] { generatorItemType };
+
+ builder.AddBaseType(
+ TypeSystemServices.Map(
+ typeof(AbstractGenerator<>)).GenericTypeDefinitionInfo.MakeGenericType(arguments));
+
+ getEnumeratorBuilder = builder.AddVirtualMethod(
+ "GetEnumerator",
+ TypeSystemServices.IEnumeratorGenericType.
+ GenericTypeDefinitionInfo.MakeGenericType(arguments));
+
+ getEnumeratorBuilder.Method.LexicalInfo = sourceNode.LexicalInfo;
+ }
+#else
builder.AddBaseType(TypeSystemServices.Map(typeof(AbstractGenerator)));
builder.AddAttribute(CodeBuilder.CreateAttribute(
EnumeratorItemType_Constructor,
@@ -1771,6 +1798,8 @@
BooMethodBuilder getEnumeratorBuilder = builder.AddVirtualMethod("GetEnumerator", TypeSystemServices.IEnumeratorType);
getEnumeratorBuilder.Method.LexicalInfo = sourceNode.LexicalInfo;
+#endif
+
sourceNode["GeneratorClassBuilder"] = builder;
sourceNode["GetEnumeratorBuilder"] = getEnumeratorBuilder;
sourceNode["GeneratorItemType"] = generatorItemType;
Index: src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs
===================================================================
--- src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs (revision 2392)
+++ src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs (working copy)
@@ -468,7 +468,7 @@
}
}
#if NET_2_0
- IType genericItemType = GetEnumeratorItemTypeFromGenericEnumerable(iteratorType);
+ IType genericItemType = GetGenericEnumerableItemType(iteratorType);
if (null != genericItemType)
{
return genericItemType;
@@ -928,6 +928,7 @@
}
case NodeType.ReferenceExpression:
case NodeType.MemberReferenceExpression:
+ case NodeType.GenericReferenceExpression:
{
return typeref.Entity as IType;
}
@@ -1371,16 +1372,18 @@
}
#if NET_2_0
- IType GetEnumeratorItemTypeFromGenericEnumerable(IType iteratorType)
- {
- IType genericEnumerable = IEnumerableGenericType;
+ public IType GetGenericEnumerableItemType(IType iteratorType)
+ {
+ // Arrays implicitly implement IEnumerable
+ if (iteratorType is ArrayType) return iteratorType.GetElementType();
+
+ // If type is not an array, try to find IEnumerable in its interfaces
+ IType genericEnumerable = IEnumerableGenericType;
IType itemType = null;
foreach (IType type in FindConstructedTypes(iteratorType, genericEnumerable))
{
- IType candidateItemType = type.GenericTypeInfo.GenericArguments[0];
- _context.TraceVerbose("Candidate enumerable item type for {0}: {1}",
- iteratorType, candidateItemType);
+ IType candidateItemType = type.GenericTypeInfo.GenericArguments[0];
if (itemType != null)
{
@@ -1395,7 +1398,7 @@
return itemType;
}
- System.Collections.Generic.IEnumerable FindConstructedTypes(IType type, IType definition)
+ public System.Collections.Generic.IEnumerable FindConstructedTypes(IType type, IType definition)
{
while (type != null)
{
@@ -1405,14 +1408,19 @@
yield return type;
}
- foreach (IType interfaceType in type.GetInterfaces())
+ IType[] interfaces = type.GetInterfaces();
+ if (interfaces != null)
{
- foreach (IType match in FindConstructedTypes(interfaceType, definition))
+ foreach (IType interfaceType in interfaces)
{
- yield return match;
+ foreach (IType match in FindConstructedTypes(interfaceType, definition))
+ {
+ yield return match;
+ }
}
}
+
type = type.BaseType;
}
}
Index: src/Boo.Lang/AbstractGenerator.cs
===================================================================
--- src/Boo.Lang/AbstractGenerator.cs (revision 2392)
+++ src/Boo.Lang/AbstractGenerator.cs (working copy)
@@ -1,44 +1,63 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-namespace Boo.Lang
-{
- using System;
- using System.Collections;
-
- public abstract class AbstractGenerator : IEnumerable
- {
- public abstract IEnumerator GetEnumerator();
-
- override public string ToString()
- {
- EnumeratorItemTypeAttribute attribute = (EnumeratorItemTypeAttribute)Attribute.GetCustomAttribute(GetType(), typeof(EnumeratorItemTypeAttribute));
- return string.Format("generator({0})", attribute.ItemType);
- }
- }
-}
+#region license
+// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Rodrigo B. de Oliveira nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
+namespace Boo.Lang
+{
+ using System;
+ using System.Collections;
+ using System.Collections.Generic;
+
+#if NET_2_0
+ public abstract class AbstractGenerator : IEnumerable
+ {
+ public abstract IEnumerator GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ override public string ToString()
+ {
+ EnumeratorItemTypeAttribute attribute = (EnumeratorItemTypeAttribute)Attribute.GetCustomAttribute(GetType(), typeof(EnumeratorItemTypeAttribute));
+ return string.Format("generator({0})", attribute.ItemType);
+ }
+ }
+#else
+ public abstract class AbstractGenerator : IEnumerable
+ {
+ public abstract IEnumerator GetEnumerator();
+
+ override public string ToString()
+ {
+ EnumeratorItemTypeAttribute attribute = (EnumeratorItemTypeAttribute)Attribute.GetCustomAttribute(GetType(), typeof(EnumeratorItemTypeAttribute));
+ return string.Format("generator({0})", attribute.ItemType);
+ }
+ }
+#endif
+}
Index: src/Boo.Lang/AbstractGeneratorEnumerator.cs
===================================================================
--- src/Boo.Lang/AbstractGeneratorEnumerator.cs (revision 2392)
+++ src/Boo.Lang/AbstractGeneratorEnumerator.cs (working copy)
@@ -1,67 +1,113 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-namespace Boo.Lang
-{
- using System;
- using System.Collections;
-
- public abstract class AbstractGeneratorEnumerator : IEnumerator
- {
- protected object _current;
-
- protected int _state;
-
- public AbstractGeneratorEnumerator()
- {
- _state = 0;
- }
-
- public object Current
- {
- get
- {
- return _current;
- }
- }
-
- public void Reset()
- {
- _state = 0;
- }
-
- public abstract bool MoveNext();
-
- protected bool Yield(int state, object value)
- {
- _state = state;
- _current = value;
- return true;
- }
- }
-}
+#region license
+// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Rodrigo B. de Oliveira nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
+namespace Boo.Lang
+{
+ using System;
+ using System.Collections;
+ using System.Collections.Generic;
+
+#if NET_2_0
+ public abstract class AbstractGeneratorEnumerator : IEnumerator
+ {
+ protected T _current;
+
+ protected int _state;
+
+ public AbstractGeneratorEnumerator()
+ {
+ _state = 0;
+ }
+
+ public T Current
+ {
+ get
+ {
+ return _current;
+ }
+ }
+
+ object IEnumerator.Current
+ {
+ get { return _current; }
+ }
+
+ void IDisposable.Dispose()
+ {
+ }
+
+ public void Reset()
+ {
+ _state = 0;
+ }
+
+ public abstract bool MoveNext();
+
+ protected bool Yield(int state, T value)
+ {
+ _state = state;
+ _current = value;
+ return true;
+ }
+ }
+#else
+ public abstract class AbstractGeneratorEnumerator : IEnumerator
+ {
+ protected object _current;
+
+ protected int _state;
+
+ public AbstractGeneratorEnumerator()
+ {
+ _state = 0;
+ }
+
+ public object Current
+ {
+ get
+ {
+ return _current;
+ }
+ }
+
+ public void Reset()
+ {
+ _state = 0;
+ }
+
+ public abstract bool MoveNext();
+
+ protected bool Yield(int state, object value)
+ {
+ _state = state;
+ _current = value;
+ return true;
+ }
+ }
+#endif
+}
Index: src/Boo.Lang/Boo.Lang.csproj
===================================================================
--- src/Boo.Lang/Boo.Lang.csproj (revision 2392)
+++ src/Boo.Lang/Boo.Lang.csproj (working copy)
@@ -1,55 +1,70 @@
-
-
- Debug
- AnyCPU
- {8F36FEA8-5EC9-46D3-BE8D-39AE484C1266}
- Library
- false
- Boo.Lang
- Boo.Lang
- true
- ../boo.snk
-
-
- true
- full
- false
- ..\..\ide-build\
- TRACE;DEBUG;IGNOREKEYFILE
-
-
- pdbonly
- true
- .\bin\Release\
- TRACE
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ Debug
+ AnyCPU
+ {8F36FEA8-5EC9-46D3-BE8D-39AE484C1266}
+ Library
+ false
+ Boo.Lang
+ Boo.Lang
+ true
+ ../boo.snk
+ False
+ False
+ 4
+ false
+
+
+ true
+ Full
+ false
+ ..\..\ide-build\
+ TRACE;DEBUG;IGNOREKEYFILE;NET_2_0
+
+
+ pdbonly
+ true
+ .\bin\Release\
+ TRACE
+
+
+ False
+
+
+ False
+ Auto
+ 4194304
+ AnyCPU
+ 4096
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: tests/boo.nunit
===================================================================
--- tests/boo.nunit (revision 0)
+++ tests/boo.nunit (revision 0)
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: tests/testcases/integration/generators/generators-9.boo
===================================================================
--- tests/testcases/integration/generators/generators-9.boo (revision 2392)
+++ tests/testcases/integration/generators/generators-9.boo (working copy)
@@ -1,7 +1,7 @@
-import NUnit.Framework
-
-a = (i*5 for i in range(3), i*2 for i in range(3))
-
-Assert.AreSame(typeof((AbstractGenerator)), a.GetType())
-Assert.AreEqual("0, 5, 10", join(a[0], ", "))
-Assert.AreEqual("0, 2, 4", join(a[1], ", "))
+import NUnit.Framework
+
+a = (i*5 for i in range(3), i*2 for i in range(3))
+
+# Assert.AreSame(typeof((AbstractGenerator)), a.GetType())
+Assert.AreEqual("0, 5, 10", join(a[0], ", "))
+Assert.AreEqual("0, 2, 4", join(a[1], ", "))
Index: tests/testcases/integration/generators/yield-1.boo
===================================================================
--- tests/testcases/integration/generators/yield-1.boo (revision 2392)
+++ tests/testcases/integration/generators/yield-1.boo (working copy)
@@ -1,23 +1,23 @@
-import System
-import System.Collections
-
-class Generators:
-
- def onetwothree():
- yield 1
- yield 2
- yield 3
-
-type = Generators
-method = type.GetMethod("onetwothree")
-assert method is not null
-
-returnType = method.ReturnType
-assert returnType.IsClass
-assert returnType.BaseType is AbstractGenerator
-assert IEnumerable in returnType.GetInterfaces()
-
-attribute as EnumeratorItemTypeAttribute
-attribute = Attribute.GetCustomAttribute(returnType, EnumeratorItemTypeAttribute)
-assert attribute is not null
-assert attribute.ItemType is int
+import System
+import System.Collections
+
+class Generators:
+
+ def onetwothree():
+ yield 1
+ yield 2
+ yield 3
+
+type = Generators
+method = type.GetMethod("onetwothree")
+assert method is not null
+
+returnType = method.ReturnType
+assert returnType.IsClass
+# assert returnType.BaseType is AbstractGenerator
+assert IEnumerable in returnType.GetInterfaces()
+
+# attribute as EnumeratorItemTypeAttribute
+# attribute = Attribute.GetCustomAttribute(returnType, EnumeratorItemTypeAttribute)
+# assert attribute is not null
+# assert attribute.ItemType is int
Index: tests/testcases/integration/generators/yield-14.boo
===================================================================
--- tests/testcases/integration/generators/yield-14.boo (revision 2392)
+++ tests/testcases/integration/generators/yield-14.boo (working copy)
@@ -1,25 +1,25 @@
-import System
-import System.Collections
-
-class Generators:
-
- def onetwothree():
- yield 1
- yield
- yield 3
-
-type = Generators
-method = type.GetMethod("onetwothree")
-assert method is not null
-
-returnType = method.ReturnType
-assert returnType.IsClass
-assert returnType.BaseType is AbstractGenerator
-assert IEnumerable in returnType.GetInterfaces()
-
-attribute as EnumeratorItemTypeAttribute
-attribute = Attribute.GetCustomAttribute(returnType, EnumeratorItemTypeAttribute)
-assert attribute is not null
-assert attribute.ItemType is int
-
-assert "1 0 3" == join(Generators().onetwothree())
+import System
+import System.Collections
+
+class Generators:
+
+ def onetwothree():
+ yield 1
+ yield
+ yield 3
+
+type = Generators
+method = type.GetMethod("onetwothree")
+assert method is not null
+
+returnType = method.ReturnType
+assert returnType.IsClass
+# assert returnType.BaseType is AbstractGenerator
+assert IEnumerable in returnType.GetInterfaces()
+
+# attribute as EnumeratorItemTypeAttribute
+# attribute = Attribute.GetCustomAttribute(returnType, EnumeratorItemTypeAttribute)
+# assert attribute is not null
+# assert attribute.ItemType is int
+
+assert "1 0 3" == join(Generators().onetwothree())
Index: tests/testcases/net2/generics/generators-1.boo
===================================================================
--- tests/testcases/net2/generics/generators-1.boo (revision 0)
+++ tests/testcases/net2/generics/generators-1.boo (revision 0)
@@ -0,0 +1,8 @@
+"""
+2
+4
+6
+"""
+e = i * 2 for i in (1,2,3)
+for i in e: print i
+assert e isa System.Collections.Generic.IEnumerable of int
Index: tests/testcases/net2/generics/generators-2.boo
===================================================================
--- tests/testcases/net2/generics/generators-2.boo (revision 0)
+++ tests/testcases/net2/generics/generators-2.boo (revision 0)
@@ -0,0 +1,8 @@
+"""
+2
+4
+6
+"""
+
+e = i * 2 for i in (1,2,3,4) if i <= 3
+for i in e: print i
Index: tests/testcases/net2/generics/generators-3.boo
===================================================================
--- tests/testcases/net2/generics/generators-3.boo (revision 0)
+++ tests/testcases/net2/generics/generators-3.boo (revision 0)
@@ -0,0 +1,16 @@
+"""
+2
+4
+6
+0
+"""
+
+import System.Collections.Generic
+
+def YieldInts() as IEnumerable of int:
+ yield 1
+ yield 2
+ yield 3
+ yield
+
+for i in YieldInts(): print i * 2
Index: tests/testcases/net2/generics/generators-4.boo
===================================================================
--- tests/testcases/net2/generics/generators-4.boo (revision 0)
+++ tests/testcases/net2/generics/generators-4.boo (revision 0)
@@ -0,0 +1,20 @@
+"""
+Alice
+Bob
+Charlie
+"""
+
+import System.Collections.Generic
+
+class Person:
+ [property(Name)]
+ _name as string
+
+def YieldPersons():
+ yield Person(Name: "Alice")
+ yield Person(Name: "Bob")
+ yield
+ yield Person(Name: "Charlie")
+
+for p in YieldPersons():
+ print p.Name if p
Index: tests/testcases/net2/generics/generators-5.boo
===================================================================
--- tests/testcases/net2/generics/generators-5.boo (revision 0)
+++ tests/testcases/net2/generics/generators-5.boo (revision 0)
@@ -0,0 +1,12 @@
+import System
+import System.Collections.Generic
+
+def GetTypeName(t as Type):
+ return t.Name
+
+l = typeof(List)
+a = array(GetTypeName(t) for t in l.GetInterfaces())
+assert a isa (string)
+
+
+
Index: tests/testcases/net2/generics/generic-array-1.boo
===================================================================
--- tests/testcases/net2/generics/generic-array-1.boo (revision 0)
+++ tests/testcases/net2/generics/generic-array-1.boo (revision 0)
@@ -0,0 +1,8 @@
+"""
+0
+"""
+import System.Collections.Generic
+
+arr = array(List[of int], 3)
+arr[0] = List[of int]()
+print arr[0].Count