public override void visit(assign _assign)
 {
     _assign.from.visit(this);
     if (ret_val.prim_val == null && ret_val.obj_val == null && eval_stack.Count > 0)
     {
         ret_val = eval_stack.Peek();
     }
     if (_assign.to is ident)
     {
         NamedValue nv = GetValue((_assign.to as ident).name);
         if (ret_val.prim_val != null)
             nv.SetValue(DebugUtils.MakeValue(ret_val.prim_val));
         else if (ret_val.obj_val != null)
             nv.SetValue(ret_val.obj_val);
     }
 }
 public override void visit(uint64_const _uint64_const)
 {
     RetValue val = new RetValue();
     val.prim_val = _uint64_const.val;
     names.Add(_uint64_const.val.ToString());
 }
 public override void visit(typeof_operator _typeof_operator)
 {
     RetValue rv = new RetValue();
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < _typeof_operator.type_name.names.Count; i++)
     {
         sb.Append(_typeof_operator.type_name.names[i].name);
         if (i < _typeof_operator.type_name.names.Count - 1)
             sb.Append('.');
     }
     Type t = AssemblyHelper.GetType(sb.ToString());
     if (t != null && t.FullName != null)
     {
         Value v = DebugUtils.MakeValue(t.FullName);
         //DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(typeof(Type).Assembly.ManifestModule.ScopeName),(uint)typeof(Type).MetadataToken);
         MethodInfo mi = MethodInfo.GetFromName(this.debuggedProcess, typeof(Type), "GetType", 1);
         rv.obj_val = mi.Invoke(null, new Value[1] { v });
     }
     eval_stack.Push(rv);
 }
 public override void visit(nil_const _nil_const)
 {
     RetValue res = new RetValue();
     res.is_null = true;
     eval_stack.Push(res);
 }
 public override void visit(format_expr _format_expr)
 {
     if (_format_expr.format2 == null)
         throw new NotImplementedException();
     RetValue res = new RetValue();
     _format_expr.expr.visit(this);
     RetValue expr = eval_stack.Pop();
     _format_expr.format1.visit(this);
     RetValue format1 = eval_stack.Pop();
     RetValue format2 = new RetValue();
     if (_format_expr.format2 != null)
     {
         _format_expr.format2.visit(this);
         format2 = eval_stack.Pop();
     }
     Type t = AssemblyHelper.GetType("PABCSystem.PABCSystem");
     string name = t.Assembly.ManifestModule.ScopeName;
     DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(name), (uint)AssemblyHelper.GetType("PABCSystem.PABCSystem").MetadataToken);
     IList<MemberInfo> meths = dt.GetMember("FormatValue", BindingFlags.All);
     MethodInfo mi = selectFormatMethod(meths, _format_expr.format2 == null ? 2 : 3);
     if (_format_expr.format2 == null)
         res.obj_val = mi.Invoke(null, new Value[2] { MakeValue(expr), MakeValue(format1) });
     else
         res.obj_val = mi.Invoke(null, new Value[3] { MakeValue(expr), MakeValue(format1), MakeValue(format2) });
     eval_stack.Push(res);
 }
 public override void visit(pascal_set_constant _pascal_set_constant)
 {
     //throw new NotImplementedException();
     List<object> args = new List<object>();
     if (_pascal_set_constant.values != null)
     {
         foreach (expression e in _pascal_set_constant.values.expressions)
         {
             e.visit(this);
             RetValue rv = eval_stack.Pop();
             if (rv.prim_val != null)
                 args.Add(rv.prim_val);
             else if (rv.obj_val != null)
             {
                 args.Add(rv.obj_val);
             }
         }
     }
     List<Value> vargs = new List<Value>();
     foreach (object o in args)
         if (o is Value) vargs.Add(box(o as Value));
         else vargs.Add(box(DebugUtils.MakeValue(o)));
     RetValue res = new RetValue();
     Type t = AssemblyHelper.GetType("PABCSystem.TypedSet");
     string name = t.Assembly.ManifestModule.ScopeName;
     DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(name), (uint)t.MetadataToken);
     res.obj_val = Eval.NewObject(this.debuggedProcess, dt.CorClass);
     MethodInfo mi = res.obj_val.Type.GetMember("CreateIfNeed", BindingFlags.All)[0] as MethodInfo;
     mi.Invoke(res.obj_val, new Value[0]);
     mi = res.obj_val.Type.GetMember("IncludeElement", BindingFlags.All)[0] as MethodInfo;
     foreach (Value v in vargs)
         mi.Invoke(res.obj_val, new Value[] { v });
     eval_stack.Push(res);
 }
 public override void visit(sharp_char_const _sharp_char_const)
 {
     RetValue val = new RetValue();
     val.prim_val = Convert.ToChar(_sharp_char_const.char_num);
     eval_stack.Push(val);
     names.Add("#" + _sharp_char_const.char_num.ToString());
 }
 private void EvalUnmin()
 {
     RetValue left = eval_stack.Pop();
     RetValue res = new RetValue();
     if (left.prim_val == null && left.obj_val != null)
     {
         if (left.obj_val.IsPrimitive)
             left.prim_val = left.obj_val.PrimitiveValue;
     }
     if (left.prim_val != null)
     {
         TypeCode lcode = Type.GetTypeCode(left.prim_val.GetType());
         switch (lcode)
         {
             case TypeCode.Byte: res.prim_val = -(byte)left.prim_val; break;
             case TypeCode.Int16: res.prim_val = -(System.Int16)left.prim_val; break;
             case TypeCode.Int32: res.prim_val = -(System.Int32)left.prim_val; break;
             case TypeCode.Int64: res.prim_val = -(System.Int64)left.prim_val; break;
             case TypeCode.SByte: res.prim_val = -(sbyte)left.prim_val; break;
             case TypeCode.UInt16: res.prim_val = -(System.UInt16)left.prim_val; break;
             case TypeCode.UInt32: res.prim_val = -(System.UInt32)left.prim_val; break;
             //case TypeCode.UInt64: res.prim_val = -(System.UInt64)left.prim_val; break;
             case TypeCode.Double: res.prim_val = -(double)left.prim_val; break;
             case TypeCode.Single: res.prim_val = -(System.Single)left.prim_val; break;
             default: throw new NoOperatorForThisType("-");
         }
         eval_stack.Push(res);
     }
 }
 public override void visit(double_const _double_const)
 {
     RetValue val = new RetValue();
     val.prim_val = _double_const.val;
     names.Add(_double_const.val.ToString());
     eval_stack.Push(val);
 }
 private void EvalIn()
 {
     RetValue right = eval_stack.Pop();
     RetValue left = eval_stack.Pop();
     RetValue res = new RetValue();
     if (right.obj_val != null && right.obj_val.Type.FullName == "PABCSystem.TypedSet")
     {
         MethodInfo mi = right.obj_val.Type.GetMember("Contains", BindingFlags.All)[0] as MethodInfo;
         Value tmp = box(MakeValue(left));
         Value v = mi.Invoke(right.obj_val, new Value[1] { tmp });
         res.prim_val = v.PrimitiveValue;
         //res.prim_val = MakeValue(left).PrimitiveValue;//v.PrimitiveValue;
         //Value v = mi.Invoke(right.obj_val,new Value[1]{right.obj_val});
         //res.prim_val = MakeValue(left).PrimitiveValue;
     }
     else throw new NoOperatorForThisType("in");
     eval_stack.Push(res);
 }
 private void EvalNot()
 {
     RetValue left = eval_stack.Pop();
     RetValue res = new RetValue();
     if (left.prim_val == null && left.obj_val != null)
     {
         if (left.obj_val.IsPrimitive)
             left.prim_val = left.obj_val.PrimitiveValue;
     }
     if (left.prim_val != null)
     {
         TypeCode lcode = Type.GetTypeCode(left.prim_val.GetType());
         switch (lcode)
         {
             case TypeCode.Boolean: res.prim_val = !(bool)left.prim_val; break;
             case TypeCode.Byte: res.prim_val = ~(byte)left.prim_val; break;
             case TypeCode.Int16: res.prim_val = ~(System.Int16)left.prim_val; break;
             case TypeCode.Int32: res.prim_val = ~(System.Int32)left.prim_val; break;
             case TypeCode.Int64: res.prim_val = ~(System.Int64)left.prim_val; break;
             case TypeCode.SByte: res.prim_val = ~(sbyte)left.prim_val; break;
             case TypeCode.UInt16: res.prim_val = ~(System.UInt16)left.prim_val; break;
             case TypeCode.UInt32: res.prim_val = ~(System.UInt32)left.prim_val; break;
             case TypeCode.UInt64: res.prim_val = ~(System.UInt64)left.prim_val; break;
             default: throw new NoOperatorForThisType("not");
         }
         eval_stack.Push(res);
     }
     else
     {
         string op = PascalABCCompiler.TreeConverter.compiler_string_consts.GetNETOperName(PascalABCCompiler.TreeConverter.compiler_string_consts.not_name);
         {
             IList<MemberInfo> mems = left.obj_val.Type.GetMember(op, Debugger.BindingFlags.All);
             if (mems != null && mems.Count == 1 && mems[0] is MethodInfo)
             {
                 MethodInfo mi = mems[0] as MethodInfo;
                 res.obj_val = mi.Invoke(null, new Value[1] { left.obj_val });
             }
             else
                 throw new NoOperatorForThisType("not");
         }
     }
 }
 public Value MakeValue(RetValue val)
 {
     if (val.obj_val != null) return val.obj_val;
     return DebugUtils.MakeValue(val.prim_val);
 }
        private void EvalIs()
        {
            RetValue right = eval_stack.Pop();
            RetValue left = eval_stack.Pop();
            RetValue res = new RetValue();
            if (right.type != null && (left.obj_val != null || left.prim_val != null))
            {
                if (left.obj_val != null)
                {
                    DebugType t = left.obj_val.Type;
                    while (t != null && t != right.type)
                    {
                        t = t.BaseType;
                    }
                    res.prim_val = t == right.type;
                }
                else if (right.managed_type != null)
                    res.prim_val = left.prim_val.GetType().IsSubclassOf(right.managed_type);
                else
                    res.prim_val = false;
            }
            else if (left.managed_type != null)
                throw new VariableExpectedTypeFound(left.managed_type.Name);

            eval_stack.Push(res);
        }
        private void EvalRem()
        {
            RetValue right = eval_stack.Pop();
            RetValue left = eval_stack.Pop();
            RetValue res = new RetValue();
            if (left.prim_val == null && left.obj_val != null)
            {
                if (left.obj_val.IsPrimitive)
                    left.prim_val = left.obj_val.PrimitiveValue;
            }
            if (right.prim_val == null && right.obj_val != null)
            {
                if (right.obj_val.IsPrimitive)
                    right.prim_val = right.obj_val.PrimitiveValue;
            }
            if (left.prim_val != null && right.prim_val != null)
            {
                TypeCode lcode = Type.GetTypeCode(left.prim_val.GetType());
                TypeCode rcode = Type.GetTypeCode(right.prim_val.GetType());
                switch (lcode)
                {
                    case TypeCode.Int32:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (int)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (int)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (int)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (int)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((int)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (int)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (int)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (int)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (int)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((int)left.prim_val) % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (int)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.Byte:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (byte)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (byte)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (byte)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (byte)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((byte)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (byte)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (byte)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (byte)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (byte)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (byte)left.prim_val % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (byte)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.Int16:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.Int16)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.Int16)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (System.Int16)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.Int16)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.Int16)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.Int16)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.Int16)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.Int16)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.Int16)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((System.Int16)left.prim_val) % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (System.Int16)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.Int64:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.Int64)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.Int64)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (System.Int64)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.Int64)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.Int64)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.Int64)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.Int64)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.Int64)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.Int64)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.Int64)left.prim_val % (System.Int64)((System.UInt64)right.prim_val); break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (System.Int64)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;

                    case TypeCode.SByte:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.SByte)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.SByte)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (System.SByte)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.SByte)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.SByte)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.SByte)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.SByte)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.SByte)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.SByte)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((System.SByte)left.prim_val) % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (System.SByte)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.UInt16:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt16)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt16)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (System.UInt16)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.UInt16)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt16)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt16)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.UInt16)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt16)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt16)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt16)left.prim_val % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (System.UInt16)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.UInt32:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt32)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt32)left.prim_val % (int)right.prim_val; break;
                                //case TypeCode.Double : res.prim_val = (System.UInt32)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.UInt32)left.prim_val % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt32)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt32)left.prim_val % (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.UInt32)left.prim_val % (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt32)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt32)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt32)left.prim_val % (System.UInt64)right.prim_val; break;
                                //case TypeCode.Single : res.prim_val = (System.UInt32)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    case TypeCode.UInt64:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt64)left.prim_val % (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt64)left.prim_val % (System.UInt64)((int)right.prim_val); break;
                                //case TypeCode.Double : res.prim_val = (System.UInt64)left.prim_val % (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (long)((System.UInt64)left.prim_val) % (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt64)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt64)left.prim_val % (System.UInt64)((System.Int16)right.prim_val); break;
                                case TypeCode.SByte: res.prim_val = (System.UInt64)left.prim_val % (System.UInt64)((sbyte)right.prim_val); break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt64)left.prim_val % (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt64)left.prim_val % (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)left.prim_val % (System.UInt64)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                                //case TypeCode.Single : res.prim_val = (System.UInt64)left.prim_val % (System.Single)right.prim_val; break;
                            }
                        }
                        break;
                    default: throw new NoOperatorForThisType("rem");
                }

                eval_stack.Push(res);
            }
            else
            {
                if (left.obj_val == null && left.prim_val != null)
                    left.obj_val = DebugUtils.MakeValue(left.prim_val);
                if (right.obj_val == null && right.prim_val != null)
                    right.obj_val = DebugUtils.MakeValue(right.prim_val);
                res.obj_val = EvalCommonOperation(left.obj_val, right.obj_val, PascalABCCompiler.TreeConverter.compiler_string_consts.GetNETOperName(PascalABCCompiler.TreeConverter.compiler_string_consts.mod_name), "mod");
            }
        }
 public object GetSimpleValue(RetValue rv)
 {
     if (rv.prim_val != null) return rv.prim_val;
     else if (rv.obj_val != null && rv.obj_val.IsPrimitive) return rv.obj_val.PrimitiveValue;
     else if (rv.obj_val != null) return rv.obj_val;
     return null;
 }
 public override void visit(ident _ident)
 {
     RetValue val = new RetValue();
     if (string.Compare(_ident.name, "true", true) == 0)
     {
         val.prim_val = true;
     }
     else if (string.Compare(_ident.name, "false", true) == 0)
     {
         val.prim_val = false;
     }
     else
     {
         names.Add(_ident.name);
         val.obj_val = GetValue(_ident.name);
         if (val.obj_val == null)
         {
             val.prim_val = EvalStandFuncNoParam(_ident.name);
         }
         if (val.obj_val == null && val.prim_val == null)
         {
             Type t = AssemblyHelper.GetType(_ident.name);
             if (t != null)
             {
                 val.type = DebugUtils.GetDebugType(t);//DebugType.Create(this.debuggedProcess.GetModule(name),(uint)t.MetadataToken);
                 val.managed_type = t;
             }
         }
         if (val.obj_val == null && val.prim_val == null && val.type == null && !by_dot)
             throw new UnknownName(_ident.name);
     }
     eval_stack.Push(val);
 }
        public override void visit(method_call _method_call)
        {
            //throw new NotImplementedException();
            RetValue res = new RetValue();
            if (!for_immediate)
            {
                ident id = _method_call.dereferencing_value as ident;
                List<object> args = new List<object>();
                if (id != null)
                {
                    if (_method_call.parameters != null)
                        foreach (expression e in _method_call.parameters.expressions)
                        {
                            e.visit(this);
                            RetValue rv = eval_stack.Pop();
                            args.Add(GetSimpleValue(rv));
                        }
                    res.prim_val = EvalStandFuncWithParam(id.name, args.ToArray());
                }
                eval_stack.Push(res);
            }
            else
            {
                Value obj_val = null;
                MethodInfo[] meths = get_method(_method_call.dereferencing_value, out obj_val);
                //ret_val = eval_stack.Pop();
                //if (ret_val.obj_val == null && ret_val.prim_val == null)
                //	return;
                List<Value> args = new List<Value>();
                if (_method_call.parameters != null)
                    foreach (expression e in _method_call.parameters.expressions)
                    {
                        e.visit(this);
                        RetValue rv = eval_stack.Pop();
                        if (rv.obj_val != null)
                            args.Add(rv.obj_val);
                        else if (rv.prim_val != null)
                            args.Add(DebugUtils.MakeValue(rv.prim_val));

                    }
                MethodInfo mi = select_method(meths, get_values_types(args));
                if (mi == null)
                    throw new NoSuitableMethod();
                res.obj_val = mi.Invoke(obj_val, args.ToArray());
                eval_stack.Push(res);
            }
        }
 public override void visit(named_type_reference _named_type_reference)
 {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < _named_type_reference.names.Count; i++)
     {
         sb.Append(_named_type_reference.names[i].name);
         if (i < _named_type_reference.names.Count - 1)
             sb.Append('.');
     }
     RetValue res = new RetValue();
     res.managed_type = AssemblyHelper.GetTypeForStatic(sb.ToString());
     if (res.managed_type != null)
         res.type = DebugUtils.GetDebugType(res.managed_type);
     else
         throw new UnknownName(sb.ToString());
     eval_stack.Push(res);
 }
 public override void visit(char_const _char_const)
 {
     RetValue val = new RetValue();
     val.prim_val = _char_const.cconst;
     eval_stack.Push(val);
     names.Add("'" + _char_const.cconst.ToString() + "'");
 }
 public override void visit(string_const _string_const)
 {
     RetValue val = new RetValue();
     val.prim_val = _string_const.Value;
     eval_stack.Push(val);
     names.Add("'" + _string_const.Value + "'");
 }
 public override void visit(literal_const_line _literal_const_line)
 {
     string s = "";
     string_const strc;
     sharp_char_const sharpcharconst;
     char_const charconst;
     syntax_tree_node tnf = _literal_const_line.literals[0], tnl = null;
     for (int i = 0; i < _literal_const_line.literals.Count; i++)
     {
         if ((strc = _literal_const_line.literals[i] as string_const) != null)
             s = s + strc.Value;
         else
             if ((sharpcharconst = _literal_const_line.literals[i] as sharp_char_const) != null)
                 s = s + Convert.ToChar(sharpcharconst.char_num);
             else
                 if ((charconst = _literal_const_line.literals[i] as char_const) != null)
                     s = s + charconst.cconst;
         if (i == _literal_const_line.literals.Count - 1)
             tnl = _literal_const_line.literals[i];
     }
     RetValue val = new RetValue();
     val.prim_val = s;
     eval_stack.Push(val);
 }
 public override void visit(roof_dereference _roof_dereference)
 {
     _roof_dereference.dereferencing_value.visit(this);
     RetValue rv = eval_stack.Pop();
     Value v = rv.obj_val.GetPermanentReference();
     rv = new RetValue();
     rv.obj_val = v;
     eval_stack.Push(rv);
 }
 public override void visit(diapason_expr _diapason_expr)
 {
     RetValue res = new RetValue();
     _diapason_expr.left.visit(this);
     RetValue left = eval_stack.Pop();
     _diapason_expr.right.visit(this);
     RetValue right = eval_stack.Pop();
     Type t = AssemblyHelper.GetType("PABCSystem.PABCSystem");
     string name = t.Assembly.ManifestModule.ScopeName;
     DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(name), (uint)AssemblyHelper.GetType("PABCSystem.PABCSystem").MetadataToken);
     Value lv = null;
     Value rv = null;
     if (left.prim_val != null && right.prim_val != null)
     {
         Type left_type = left.prim_val.GetType();
         Type right_type = right.prim_val.GetType();
         if (left.prim_val is IComparable && right.prim_val is IComparable)
         {
             if ((left.prim_val as IComparable).CompareTo(right.prim_val) > 0)
                 throw new InvalidRangesInDiapason();
             switch (Type.GetTypeCode(left_type))
             {
                 case TypeCode.Boolean:
                 case TypeCode.Byte:
                 case TypeCode.Char:
                 case TypeCode.SByte:
                 case TypeCode.UInt16:
                 case TypeCode.Int16:
                 case TypeCode.Int32:
                 case TypeCode.UInt32:
                 case TypeCode.Int64:
                 case TypeCode.UInt64: break;
                 default:
                     throw new InvalidExpressionTypeInDiapason();
             }
             switch (Type.GetTypeCode(right_type))
             {
                 case TypeCode.Boolean:
                 case TypeCode.Byte:
                 case TypeCode.Char:
                 case TypeCode.SByte:
                 case TypeCode.UInt16:
                 case TypeCode.Int16:
                 case TypeCode.Int32:
                 case TypeCode.UInt32:
                 case TypeCode.Int64:
                 case TypeCode.UInt64: break;
                 default:
                     throw new InvalidExpressionTypeInDiapason();
             }
         }
         else
             throw new InvalidExpressionTypeInDiapason();
     }
     if (left.prim_val != null)
         lv = (DebugUtils.MakeValue(left.prim_val));
     else
         lv = (left.obj_val);
     if (right.prim_val != null)
         rv = (DebugUtils.MakeValue(right.prim_val));
     else
         rv = (right.obj_val);
     MethodInfo mi = null;
     if (lv.Type.ManagedType != typeof(char))
     {
         mi = dt.GetMember("CreateDiapason", BindingFlags.All)[0] as MethodInfo;
     }
     else
     {
         mi = dt.GetMember("CreateObjDiapason", BindingFlags.All)[0] as MethodInfo;
         lv = box(lv);
         rv = box(rv);
     }
     res.obj_val = mi.Invoke(null, new Value[2] { lv, rv });
     eval_stack.Push(res);
 }
        public override void visit(indexer _indexer)
        {
            bool tmp = by_dot;
            by_dot = true;
            _indexer.dereferencing_value.visit(this);
            by_dot = tmp;
            RetValue rv = eval_stack.Pop();
            List<object> indices = new List<object>();
            Value _val = null;
            names.Add("[");
            for (int i = 0; i < _indexer.indexes.expressions.Count; i++)
            {
                expression e = _indexer.indexes.expressions[i];
                by_dot = false;
                e.visit(this);
                if (i < _indexer.indexes.expressions.Count - 1)
                    names.Add(",");
                RetValue val = eval_stack.Pop();
                if (val.prim_val == null && val.obj_val != null)
                {
                    if (val.obj_val.IsPrimitive)
                        val.prim_val = val.obj_val.PrimitiveValue;
                }
                if (val.prim_val != null)
                {
                    TypeCode code = Type.GetTypeCode(val.prim_val.GetType());
                    switch (code)
                    {
                        //case TypeCode.Boolean : indices.Add((uint)((int)((bool)val.prim_val))); break;
                        case TypeCode.Byte: indices.Add((uint)((byte)val.prim_val)); break;
                        case TypeCode.Char: indices.Add((uint)((char)val.prim_val)); break;
                        case TypeCode.Int16: indices.Add((uint)((System.Int16)val.prim_val)); break;
                        case TypeCode.Int32: indices.Add((int)((System.Int32)val.prim_val)); break;
                        case TypeCode.Int64: indices.Add((uint)((System.Int64)val.prim_val)); break;
                        case TypeCode.SByte: indices.Add((uint)((sbyte)val.prim_val)); break;
                        case TypeCode.UInt16: indices.Add((uint)((System.UInt16)val.prim_val)); break;
                        case TypeCode.UInt32: indices.Add((uint)((System.UInt32)val.prim_val)); break;
                        case TypeCode.UInt64: indices.Add((uint)((System.UInt64)val.prim_val)); break;
                        default: indices.Add(val.prim_val); break;
                    }
                }
                else
                {
                    indices.Add(val.obj_val);
                }

            }
            by_dot = tmp;
            names.Add("]");
            if (rv.obj_val != null)
            {
                if (rv.obj_val is MemberValue && (rv.obj_val as MemberValue).MemberInfo is PropertyInfo)
                {
                    PropertyInfo pi = (rv.obj_val as MemberValue).MemberInfo as PropertyInfo;
                    Type t = AssemblyHelper.GetType(last_obj.Type.FullName);
                    System.Reflection.PropertyInfo rpi = t.GetProperty(pi.Name, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Instance);
                    /*System.Reflection.MemberInfo[] props = t.GetMembers(System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Static|System.Reflection.BindingFlags.CreateInstance);
                    System.Reflection.PropertyInfo rpi = null;
                    foreach (System.Reflection.MemberInfo p in props)
                    if (p is System.Reflection.PropertyInfo && p.Name == pi.Name)
                    {
                        rpi = p as System.Reflection.PropertyInfo;
                        break;
                    }*/
                    RetValue res = new RetValue();
                    res.obj_val = ((rv.obj_val as MemberValue).MemberInfo as PropertyInfo).GetValue(last_obj,
                                                                                                    get_val_arr(indices, false, rpi.GetGetMethod(true)));
                    eval_stack.Push(res);
                    return;
                }
                if (rv.obj_val.IsArray)
                {
                    RetValue res = new RetValue();
                    res.obj_val = rv.obj_val.GetArrayElement(conv_to_uint_arr(indices));
                    check_for_out_of_range(res.obj_val);
                    eval_stack.Push(res);

                }
                else
                {
                    IList<MemberInfo> mis = rv.obj_val.Type.GetMember("get_val", BindingFlags.All);
                    if (mis.Count > 0)
                    {
                        MethodInfo cur_mi = null;
                        int low_bound = 0;
                        foreach (MemberInfo mi in mis)
                        {
                            if (mi is MethodInfo)
                            {
                                cur_mi = mi as MethodInfo;
                                //FieldInfo fi = rv.obj_val.Type.GetMember("LowerIndex",BindingFlags.All)[0] as FieldInfo;
                                System.Reflection.FieldInfo fi = AssemblyHelper.GetType(rv.obj_val.Type.FullName).GetField("LowerIndex");
                                low_bound = Convert.ToInt32(fi.GetRawConstantValue());
                            }
                        }
                        RetValue res = new RetValue();
                        uint[] tmp_indices = new uint[1];
                        int j = 0;
                        try
                        {
                            object obj = indices[j++];
                            int v = 0;
                            if (obj is Value && DebugUtils.IsEnum(obj as Value, out v))
                                tmp_indices[0] = (uint)(v - low_bound);
                            else
                                tmp_indices[0] = (uint)(Convert.ToInt32(obj) - low_bound);
                        }
                        catch (System.FormatException)
                        {
                            throw new WrongTypeInIndexer();
                        }
                        catch (System.InvalidCastException)
                        {
                            throw new WrongTypeInIndexer();
                        }
                        //res.obj_val = cur_mi.Invoke(rv.obj_val,indices.ToArray()) as NamedValue;
                        Value nv = rv.obj_val.GetMember("NullBasedArray");
                        res.obj_val = nv.GetArrayElement(tmp_indices);
                        check_for_out_of_range(res.obj_val);
                        nv = res.obj_val.GetMember("NullBasedArray");
                        while (nv != null && j < indices.Count)
                        {
                            System.Reflection.FieldInfo tmp_fi = AssemblyHelper.GetType(res.obj_val.Type.FullName).GetField("LowerIndex");
                            low_bound = Convert.ToInt32(tmp_fi.GetRawConstantValue());
                            try
                            {
                                object obj = indices[j++];
                                int v = 0;
                                if (obj is Value && DebugUtils.IsEnum(obj as Value, out v))
                                    tmp_indices[0] = (uint)(v - low_bound);
                                else
                                    tmp_indices[0] = (uint)(Convert.ToInt32(obj) - low_bound);
                            }
                            catch (System.FormatException)
                            {
                                throw new WrongTypeInIndexer();
                            }
                            catch (System.InvalidCastException)
                            {
                                throw new WrongTypeInIndexer();
                            }
                            res.obj_val = nv.GetArrayElement(tmp_indices);
                            check_for_out_of_range(res.obj_val);
                            nv = res.obj_val.GetMember("NullBasedArray");

                        }
                        if (j < indices.Count)
                            throw new WrongIndexersNumber();
                        eval_stack.Push(res);
                    }
                    else
                    {
                        string name = get_type_name(rv.obj_val.Type);
                        Type t = AssemblyHelper.GetType(name);
                        if (t == null && declaringType != null)
                            t = AssemblyHelper.GetType(declaringType.FullName + "+" + name);
                        DebugType[] gen_args = rv.obj_val.Type.GetGenericArguments();
                        if (gen_args.Length > 0)
                        {
                            List<Type> gens = new List<Type>();
                            for (int i = 0; i < gen_args.Length; i++)
                                gens.Add(AssemblyHelper.GetType(get_type_name(gen_args[i])));
                            t = t.MakeGenericType(gens.ToArray());
                        }
                        System.Reflection.MemberInfo[] def_members = t.GetDefaultMembers();
                        System.Reflection.PropertyInfo _default_property = null;
                        if (def_members != null && def_members.Length > 0)
                        {
                            foreach (System.Reflection.MemberInfo mi in def_members)
                            {
                                System.Reflection.PropertyInfo pi = mi as System.Reflection.PropertyInfo;
                                if (pi != null)
                                {
                                    _default_property = pi;
                                    break;
                                }
                            }
                        }
                        if (_default_property != null)
                        {
                            if (_default_property.GetGetMethod().GetParameters().Length != indices.Count)
                                throw new WrongIndexersNumber();
                            MethodInfo mi2 = rv.obj_val.Type.GetMember(_default_property.GetGetMethod().Name, Debugger.BindingFlags.All)[0] as MethodInfo;
                            RetValue res = new RetValue();
                            res.obj_val = mi2.Invoke(rv.obj_val, get_val_arr(indices, _default_property.DeclaringType == typeof(string), _default_property.GetGetMethod()));
                            check_for_out_of_range(res.obj_val);
                            eval_stack.Push(res);
                        }
                        else
                            throw new NoIndexerProperty();

                    }
                }
            }
        }
 public override void visit(template_type_reference _template_type_reference)
 {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < _template_type_reference.name.names.Count; i++)
     {
         sb.Append(_template_type_reference.name.names[i].name);
         if (i < _template_type_reference.name.names.Count - 1)
             sb.Append('.');
     }
     List<DebugType> gen_args = new List<DebugType>();
     List<Type> gen_refl_args = new List<Type>();
     for (int i = 0; i < _template_type_reference.params_list.params_list.Count; i++)
     {
         _template_type_reference.params_list.params_list[i].visit(this);
         RetValue rv = eval_stack.Pop();
         gen_args.Add(rv.type);
         gen_refl_args.Add(rv.managed_type);
     }
     RetValue res = new RetValue();
     res.managed_type = AssemblyHelper.GetTypeForStatic(sb.ToString(), gen_refl_args);
     if (res.managed_type != null)
     {
         res.type = DebugUtils.GetDebugType(res.managed_type, gen_args);
         res.managed_type = res.managed_type.MakeGenericType(gen_refl_args.ToArray());
     }
     else
         throw new UnknownName(sb.ToString());
     eval_stack.Push(res);
 }
 public override void visit(hex_constant _hex_constant)
 {
     RetValue val = new RetValue();
     val.prim_val = _hex_constant.val;
     eval_stack.Push(val);
 }
        public override void visit(sizeof_operator _sizeof_operator)
        {
            RetValue rv = new RetValue();
            StringBuilder sb = new StringBuilder();

            if (_sizeof_operator.type_def != null && _sizeof_operator.type_def is named_type_reference)
            {
                named_type_reference ntr = _sizeof_operator.type_def as named_type_reference;
                for (int i = 0; i < ntr.names.Count; i++)
                {
                    sb.Append(ntr.names[i].name);
                    if (i < ntr.names.Count - 1)
                        sb.Append('.');
                }
            }
            Type t = AssemblyHelper.GetType(sb.ToString());
            if (t != null && t.FullName != null)
            {
                if (t == typeof(char))
                {
                    rv.prim_val = 2;
                }
                else if (t == typeof(bool))
                {
                    rv.prim_val = 1;
                }
                else
                {
                    Value v = DebugUtils.MakeValue(t.FullName);
                    //DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(typeof(Type).Assembly.ManifestModule.ScopeName),(uint)typeof(Type).MetadataToken);
                    MethodInfo mi = MethodInfo.GetFromName(this.debuggedProcess, typeof(Type), "GetType", 1);
                    v = mi.Invoke(null, new Value[1] { v });
                    t = typeof(System.Runtime.InteropServices.Marshal);
                    DebugType dt = DebugUtils.GetDebugType(t);//DebugType.Create(this.debuggedProcess.GetModule(name),(uint)t.MetadataToken);
                    IList<MethodInfo> mis = dt.GetMethods();
                    System.Reflection.MethodInfo rmi = t.GetMethod("SizeOf", new Type[1] { typeof(Type) });
                    mi = null;
                    foreach (MethodInfo tmp_mi in mis)
                        if (tmp_mi.Name == "SizeOf" && rmi.MetadataToken == tmp_mi.MetadataToken)
                        {
                            mi = tmp_mi;
                            break;
                        }
                    if (mi != null)
                        rv.obj_val = mi.Invoke(null, new Value[1] { v });
                }
            }
            eval_stack.Push(rv);
        }
        public override void visit(dot_node _dot_node)
        {
            bool tmp2 = by_dot;
            by_dot = true;
            _dot_node.left.visit(this);
            by_dot = tmp2;
            RetValue rv = eval_stack.Pop();
            RetValue res = new RetValue();
            if (rv.obj_val != null)
            {
                if (rv.obj_val.Dereference != null)
                    rv.obj_val = rv.obj_val.Dereference;
                if (_dot_node.right is ident)
                {
                    if (rv.obj_val.IsNull)
                        throw new CommonEvaluationError(new NullReferenceException());
                    ident id = _dot_node.right as ident;
                    names.Add("." + id.name);
                    //IList<Debugger.MemberInfo> members = rv.obj_val.Type.GetMember(id.name, BindingFlags.All);
                    if (rv.obj_val.IsArray)
                    {
                        if (string.Compare(id.name, "Length", true) == 0)
                            res.prim_val = rv.obj_val.ArrayLenght;
                        else
                            if (string.Compare(id.name, "Rank", true) == 0)
                                res.prim_val = rv.obj_val.ArrayRank;
                    }
                    else
                    {
                        res.obj_val = rv.obj_val.GetMember(id.name);
                        if (res.obj_val == null)
                            throw new UnknownName(id.name);
                        if (res.obj_val is MemberValue && (res.obj_val as MemberValue).MemberInfo is PropertyInfo)
                            last_obj = rv.obj_val;
                    }
                    declaringType = rv.obj_val.Type;
                }
            }
            else if (_dot_node.right is ident)
            {
                ident id = _dot_node.right as ident;
                names.Add("." + id.name);
                string name = build_name(_dot_node.left);
                if (name != null)
                {
                    Type t = AssemblyHelper.GetType(name);
                    if (t != null)
                    {
                        //DebugType dt = DebugType.Create(this.debuggedProcess.GetModule(name),(uint)t.MetadataToken);
                        DebugType dt = DebugUtils.GetDebugType(t);
                        IList<MemberInfo> mis = new List<MemberInfo>();//dt.GetMember(id.name,BindingFlags.All);
                        declaringType = dt;
                        DebugType tmp = dt;
                        while (tmp != null && mis.Count == 0)
                        {
                            try
                            {
                                mis = tmp.GetMember(id.name, BindingFlags.All);
                                tmp = tmp.BaseType;
                            }
                            catch
                            {

                            }
                        }
                        if (mis.Count > 0)
                        {
                            if (mis[0] is FieldInfo)
                            {
                                FieldInfo fi = mis[0] as FieldInfo;
                                res.obj_val = fi.GetValue(null);
                                if (res.obj_val == null)
                                    throw new UnknownName(id.name);
                                check_for_static(res.obj_val, id.name);
                            }
                            else if (mis[0] is PropertyInfo)
                            {
                                PropertyInfo pi = mis[0] as PropertyInfo;
                                res.obj_val = pi.GetValue(null);
                                if (res.obj_val == null)
                                    throw new UnknownName(id.name);
                                check_for_static(res.obj_val, id.name);
                            }
                        }
                        else
                        {
                            System.Reflection.FieldInfo fi = t.GetField(id.name);
                            if (fi != null)
                                res.prim_val = fi.GetRawConstantValue();
                            else
                                throw new UnknownName(id.name);
                        }
                    }
                    else
                    {
                        t = AssemblyHelper.GetType(name + "." + id.name);
                        if (t != null)
                        {
                            res.type = DebugUtils.GetDebugType(t);//DebugType.Create(this.debuggedProcess.GetModule(name),(uint)t.MetadataToken);
                            res.managed_type = t;
                        }
                        //						else 
                        //							throw new UnknownName(id.name);
                    }
                }
            }
            eval_stack.Push(res);
        }
        private void EvalMinus()
        {
            RetValue right = eval_stack.Pop();
            RetValue left = eval_stack.Pop();
            RetValue res = new RetValue();
            if (left.prim_val == null && left.obj_val != null)
            {
                if (left.obj_val.IsPrimitive)
                    left.prim_val = left.obj_val.PrimitiveValue;
            }
            if (right.prim_val == null && right.obj_val != null)
            {
                if (right.obj_val.IsPrimitive)
                    right.prim_val = right.obj_val.PrimitiveValue;
            }
            if (left.prim_val != null && right.prim_val != null)
            {
                TypeCode lcode = Type.GetTypeCode(left.prim_val.GetType());
                TypeCode rcode = Type.GetTypeCode(right.prim_val.GetType());
                switch (lcode)
                {
                    case TypeCode.Int32:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (int)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (int)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (int)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (int)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((int)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (int)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (int)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (int)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (int)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((int)left.prim_val) - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (int)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Double:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (double)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (double)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (double)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (double)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((double)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (double)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (double)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (double)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (double)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (double)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (double)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Byte:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (byte)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (byte)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (byte)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (byte)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((byte)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (byte)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (byte)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (byte)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (byte)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (byte)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (byte)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Int16:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.Int16)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.Int16)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.Int16)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.Int16)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.Int16)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.Int16)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.Int16)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.Int16)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.Int16)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((System.Int16)left.prim_val) - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.Int16)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Int64:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.Int64)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.Int64)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.Int64)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.Int64)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.Int64)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.Int64)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.Int64)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.Int64)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.Int64)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.Int64)left.prim_val - (System.Int64)((System.UInt64)right.prim_val); break;
                                case TypeCode.Single: res.prim_val = (System.Int64)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;

                    case TypeCode.SByte:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.SByte)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.SByte)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.SByte)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.SByte)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.SByte)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.SByte)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.SByte)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.SByte)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.SByte)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)((System.SByte)left.prim_val) - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.SByte)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.UInt16:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt16)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt16)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.UInt16)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.UInt16)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt16)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt16)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.UInt16)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt16)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt16)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt16)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.UInt16)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.UInt32:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt32)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt32)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.UInt32)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.UInt32)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt32)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt32)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.UInt32)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt32)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt32)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt32)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.UInt32)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.UInt64:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.UInt64)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.UInt64)left.prim_val - (System.UInt64)((int)right.prim_val); break;
                                case TypeCode.Double: res.prim_val = (System.UInt64)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (long)((System.UInt64)left.prim_val) - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.UInt64)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.UInt64)left.prim_val - (System.UInt64)((System.Int16)right.prim_val); break;
                                case TypeCode.SByte: res.prim_val = (System.UInt64)left.prim_val - (System.UInt64)((sbyte)right.prim_val); break;
                                case TypeCode.UInt16: res.prim_val = (System.UInt64)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.UInt64)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.UInt64)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.UInt64)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Decimal:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (decimal)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (decimal)left.prim_val - (System.UInt64)((int)right.prim_val); break;
                                //case TypeCode.Double : res.prim_val = (System.UInt64)left.prim_val + (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (decimal)left.prim_val - (System.UInt64)((long)right.prim_val); break;
                                //case TypeCode.String : res.prim_val = ((decimal)left.prim_val).ToString() - (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (decimal)left.prim_val - (System.UInt64)((System.Int16)right.prim_val); break;
                                case TypeCode.SByte: res.prim_val = (decimal)left.prim_val - (System.UInt64)((sbyte)right.prim_val); break;
                                case TypeCode.UInt16: res.prim_val = (decimal)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (decimal)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (decimal)left.prim_val - (System.UInt64)right.prim_val; break;
                                //case TypeCode.Single : res.prim_val = (System.UInt64)left.prim_val + (System.Single)right.prim_val; break;
                                case TypeCode.Decimal: res.prim_val = (decimal)left.prim_val - (decimal)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Single:
                        {
                            switch (rcode)
                            {
                                case TypeCode.Byte: res.prim_val = (System.Single)left.prim_val - (byte)right.prim_val; break;
                                case TypeCode.Int32: res.prim_val = (System.Single)left.prim_val - (int)right.prim_val; break;
                                case TypeCode.Double: res.prim_val = (System.Single)left.prim_val - (double)right.prim_val; break;
                                case TypeCode.Int64: res.prim_val = (System.Single)left.prim_val - (long)right.prim_val; break;
                                //case TypeCode.String : res.prim_val = ((System.Single)left.prim_val).ToString() + (string)right.prim_val; break;
                                case TypeCode.Int16: res.prim_val = (System.Single)left.prim_val - (System.Int16)right.prim_val; break;
                                case TypeCode.SByte: res.prim_val = (System.Single)left.prim_val - (sbyte)right.prim_val; break;
                                case TypeCode.UInt16: res.prim_val = (System.Single)left.prim_val - (System.UInt16)right.prim_val; break;
                                case TypeCode.UInt32: res.prim_val = (System.Single)left.prim_val - (System.UInt32)right.prim_val; break;
                                case TypeCode.UInt64: res.prim_val = (System.Single)left.prim_val - (System.UInt64)right.prim_val; break;
                                case TypeCode.Single: res.prim_val = (System.Single)left.prim_val - (System.Single)right.prim_val; break;
                                default: throw new IncompatibleTypesInExpression();
                            }
                        }
                        break;
                    case TypeCode.Object:
                        {
                            if (left.obj_val.Type.FullName == "PABCSystem.TypedSet" && right.obj_val.Type.FullName == "PABCSystem.TypedSet")
                            {
                                res.obj_val = (left.obj_val.Type.GetMember("SubtractSet", BindingFlags.All)[0] as MethodInfo).Invoke(left.obj_val, new Value[1] { right.obj_val });
                            }
                        }
                        break;
                    default: throw new NoOperatorForThisType("-");
                }

            }
            else
            {
                if (left.obj_val == null && left.prim_val != null)
                    left.obj_val = DebugUtils.MakeValue(left.prim_val);
                if (right.obj_val == null && right.prim_val != null)
                    right.obj_val = DebugUtils.MakeValue(right.prim_val);
                if (left.obj_val.Type.FullName == "PABCSystem.TypedSet" && right.obj_val.Type.FullName == "PABCSystem.TypedSet")
                {
                    res.obj_val = (left.obj_val.Type.GetMember("SubtractSet", BindingFlags.All)[0] as MethodInfo).Invoke(left.obj_val, new Value[1] { right.obj_val });
                }
                else
                {
                    res.obj_val = EvalCommonOperation(left.obj_val, right.obj_val, PascalABCCompiler.TreeConverter.compiler_string_consts.GetNETOperName(PascalABCCompiler.TreeConverter.compiler_string_consts.minus_name), "-");
                }
            }
            eval_stack.Push(res);
        }
 public RetValue GetValueForExpression(string expr, out string preformat)
 {
     declaringType = null;
     for_immediate = false;
     ret_val = default(RetValue);
     preformat = expr.Trim(' ', '\n', '\r', '\t');
     names.Clear();
     string fileName = "test" + System.IO.Path.GetExtension(this.FileName);
     List<PascalABCCompiler.Errors.Error> Errors = new List<PascalABCCompiler.Errors.Error>();
     expression e = vec.StandartCompiler.ParsersController.GetExpression(fileName, expr, Errors);
     RetValue res = new RetValue(); res.syn_err = false;
     try
     {
         if (e != null && Errors.Count == 0)
         {
             e.visit(this);
             if (eval_stack.Count > 0)
             {
                 res = eval_stack.Pop();
                 preformat = string.Join("", names.ToArray());
                 return res;
             }
         }
     }
     catch (System.Exception ex)
     {
         //throw new System.Exception(ex.Message);
     }
     finally
     {
         if (eval_stack.Count > 0) eval_stack.Clear();
     }
     return new RetValue();
 }