1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// Copyright (C) Lluis Sanchez Gual, 2004
//
#if !FULL_AOT_RUNTIME
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace Mono.CodeGeneration
{
public abstract class CodeExpression: CodeItem
{
internal CodeVariableReference var;
public abstract Type GetResultType ();
public virtual void GenerateAsStatement (ILGenerator gen)
{
Generate (gen);
gen.Emit (OpCodes.Pop);
}
public CodeExpression CallToString ()
{
return new CodeMethodCall (this, "ToString");
}
public static CodeExpression AreEqual (CodeExpression e1, CodeExpression e2)
{
return new CodeEquals (e1, e2);
}
public static CodeExpression AreNotEqual (CodeExpression e1, CodeExpression e2)
{
return new CodeNotEquals (e1, e2);
}
public static CodeExpression IsGreaterThan (CodeExpression e1, CodeExpression e2)
{
return new CodeGreaterThan (e1, e2);
}
public static CodeExpression IsSmallerThan (CodeExpression e1, CodeExpression e2)
{
return new CodeLessThan (e1, e2);
}
public static CodeExpression IsGreaterEqualThan (CodeExpression e1, CodeExpression e2)
{
return new CodeGreaterEqualThan (e1, e2);
}
public static CodeExpression IsSmallerEqualThan (CodeExpression e1, CodeExpression e2)
{
return new CodeLessEqualThan (e1, e2);
}
public static CodeExpression Not (CodeExpression e)
{
return new CodeNot (e);
}
public static CodeExpression Add (CodeExpression e1, CodeExpression e2)
{
return new CodeAdd (e1, e2);
}
public static CodeExpression Subtract (CodeExpression e1, CodeExpression e2)
{
return new CodeSub (e1, e2);
}
public static CodeExpression Multiply (CodeExpression e1, CodeExpression e2)
{
return new CodeMul (e1, e2);
}
public static CodeExpression Divide (CodeExpression e1, CodeExpression e2)
{
return new CodeDiv (e1, e2);
}
public CodeExpression CastTo (Type type)
{
return new CodeCast (type, this);
}
public CodeExpression And (CodeExpression other)
{
return new CodeAnd (this, other);
}
public CodeExpression Is (Type type)
{
return new CodeIs (type, this);
}
public CodeExpression Call (string name, params CodeExpression[] parameters)
{
return new CodeMethodCall (this, name, parameters);
}
public CodeExpression Call (MethodInfo method, params CodeExpression[] parameters)
{
return new CodeMethodCall (this, method, parameters);
}
public CodeValueReference MemGet (string name)
{
MemberInfo[] mems = GetResultType().GetMember (name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
if (mems.Length == 0) throw new InvalidOperationException ("Field '" + name + "' not found in " + GetResultType());
return MemGet (mems[0]);
}
public CodeValueReference MemGet (MemberInfo member)
{
if (member is FieldInfo)
return new CodeFieldReference (this, (FieldInfo)member);
else if (member is PropertyInfo)
return new CodePropertyReference (this, (PropertyInfo)member);
else
throw new InvalidOperationException (member.Name + " is not either a field or a property");
}
public CodeValueReference this [CodeExpression index]
{
get { return new CodeArrayItem (this, index); }
}
public CodeValueReference this [string name]
{
get { return MemGet (name); }
}
public CodeValueReference this [FieldInfo field]
{
get { return new CodeFieldReference (this, field); }
}
public CodeValueReference this [PropertyInfo prop]
{
get { return new CodePropertyReference (this, prop); }
}
public CodeExpression ArrayLength
{
get { return new CodeArrayLength (this); }
}
public CodeExpression IsNull
{
get { return new CodeEquals (this, new CodeLiteral (null, this.GetResultType())); }
}
public static CodeExpression NullValue (Type type)
{
return new CodeLiteral (null, type);
}
public bool IsNumber
{
get {
return CodeGenerationHelper.IsNumber (GetResultType ());
}
}
}
public abstract class CodeConditionExpression: CodeExpression
{
public virtual void GenerateForBranch (ILGenerator gen, Label label, bool jumpCase)
{
Generate (gen);
if (jumpCase)
gen.Emit (OpCodes.Brtrue, label);
else
gen.Emit (OpCodes.Brfalse, label);
}
}
}
#endif
|