destType =(miDest as FieldInfo).FieldType;
if (value != null) {
- origType = value.GetType ();
- if (destType.IsAssignableFrom (origType))
- convertedVal = Convert.ChangeType (value, destType);
- else if (origType.IsPrimitive & destType.IsPrimitive)
- convertedVal = GetConvertMethod (destType).Invoke (null, new Object[] { value });
- else
- convertedVal = getImplicitOp (origType, destType).Invoke (value, null);
+ if (destType == TObject)//TODO: check that test of destType is not causing problems
+ convertedVal = value;
+ else {
+ origType = value.GetType ();
+ if (destType.IsAssignableFrom (origType))
+ convertedVal = Convert.ChangeType (value, destType);
+ else if (origType.IsPrimitive & destType.IsPrimitive)
+ convertedVal = GetConvertMethod (destType).Invoke (null, new Object[] { value });
+ else
+ convertedVal = getImplicitOp (origType, destType).Invoke (value, null);
+ }
}
if (miDest.MemberType == MemberTypes.Property)
#region RIGHT OPERANDES
if (rop.IsStringConstant){
il.Emit (OpCodes.Ldstr, rop.Tokens[0]);
- lop.emitSetProperty (il, cancelFinalSet);
+ lop.emitSetProperty (il);
+ }else if (rop.IsSingleName && rop.Tokens[0] == "this"){
+ il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack, the current node
+ lop.emitSetProperty (il);
}else if (rop.LevelsUp ==0 && !string.IsNullOrEmpty(rop.Tokens[0])) {//parsable constant depending on lop type
//if left operand is member of current node, it's easy to fetch type, else we should use reflexion in msil
if (lopPI == null){//accept GraphicObj members, but it's restricive
//emit left operand assignment
il.Emit (OpCodes.Callvirt, lopPI.GetSetMethod());
} else {//tree parsing and propert gets
- rop.emitGetTarget (il, cancel);
- rop.emitGetProperty (il, cancel);
- lop.emitSetProperty (il, cancelFinalSet);
+ il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack, the current node
+
+ rop.emitGetTarget (il, cancelFinalSet);
+ rop.emitGetProperty (il, cancelFinalSet);
+ lop.emitSetProperty (il);
}
#endregion
} else {
while (splitedExp [ptr] == "..")
ptr++;
+ LevelsUp = ptr;
}
}
if (ptr != splitedExp.Length - 1)
il.Emit (OpCodes.Dup);
il.Emit (OpCodes.Brfalse, nextLogicParent);
} else if (LevelsUp > 0) {//go upward in logical tree
- il.Emit (OpCodes.Ldind_I4, LevelsUp);//push arg 2 of goUpLevels
+ il.Emit (OpCodes.Ldc_I4, LevelsUp);//push arg 2 of goUpLevels
il.Emit (OpCodes.Callvirt, CompilerServices.miGoUpLevels);
//test if null
il.Emit (OpCodes.Dup);
}
for (int i = 1; i < Tokens.Length -1; i++) {
+ System.Reflection.Emit.Label miOK = il.DefineLabel ();
+ il.Emit (OpCodes.Dup);//duplicate instance
il.Emit (OpCodes.Ldstr, Tokens [i]);//load member name
il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
il.Emit (OpCodes.Dup);
- il.Emit (OpCodes.Brfalse, cancel);
+ il.Emit (OpCodes.Brtrue, miOK);
+ il.Emit (OpCodes.Pop);//pop dup instance
+ il.Emit (OpCodes.Br, cancel);
+ il.MarkLabel (miOK);
il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
il.Emit (OpCodes.Dup);
il.Emit (OpCodes.Brfalse, cancel);
}
}
public void emitGetProperty(ILGenerator il, System.Reflection.Emit.Label cancel) {
+ System.Reflection.Emit.Label miOK = il.DefineLabel ();
+ il.Emit (OpCodes.Dup);//duplicate instance
il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name
il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
il.Emit (OpCodes.Dup);
- il.Emit (OpCodes.Brfalse, cancel);
+ il.Emit (OpCodes.Brtrue, miOK);
+ il.Emit (OpCodes.Pop);//pop dup instance
+ il.Emit (OpCodes.Br, cancel);
+ il.MarkLabel (miOK);
il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
}
- public void emitSetProperty(ILGenerator il, System.Reflection.Emit.Label cancel) {
+ public void emitSetProperty(ILGenerator il) {
il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name
- il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
- il.Emit (OpCodes.Dup);
- il.Emit (OpCodes.Brfalse, cancel);
il.Emit (OpCodes.Call, CompilerServices.miSetValWithRefx);
}
}