Example #1
0
        public static string ToString(ref mdr.DValue arg)
        {
          //TODO: it seems eventually, this is the right implementation, but for now, we use the special implementation
          //mdr.DValue output;
          //if (Operations.Internals.CallToStringProperty(Operations.Convert.ToObject.Run(ref arg), out output))
          //  return output.AsString();
          //else
          //  return Operations.Convert.ToString.Run(ref arg);

          string s;
          if (!mdr.ValueTypesHelper.IsObject(arg.ValueType))
          {
            s = Operations.Convert.ToString.Run(ref arg);
          }
          else
          {
            var argObj = arg.AsDObject(); //TODO: should we call ToObject(arg) here instead?!
            var toString = argObj.GetField("toString");
            if (toString.ValueType == mdr.ValueTypes.Function)
            {
              var cf = new mdr.CallFrame();
              cf.Function = toString.AsDFunction();
              cf.Signature = mdr.DFunctionSignature.EmptySignature;
              cf.This = argObj;
              cf.Arguments = null;
              cf.Function.Call(ref cf);
              s = Operations.Convert.ToString.Run(ref cf.Return);
            }
            else
            {
              s = arg.AsString();
            }
          }
          return s;
        }