docs: public static Object add(Object val1, Object val2, Context cx)
      {
          if(val1 instanceof Number && val2 instanceof Number) {
              return wrapNumber(((Number)val1).doubleValue() +
                                ((Number)val2).doubleValue());
          }
          if (val1 instanceof XMLObject) {
              Object test = ((XMLObject)val1).addValues(cx, true, val2);
              if (test != Scriptable.NOT_FOUND) {
                  return test;
              }
          }
          if (val2 instanceof XMLObject) {
              Object test = ((XMLObject)val2).addValues(cx, false, val1);
              if (test != Scriptable.NOT_FOUND) {
                  return test;
              }
          }
          if ((val1 instanceof Symbol) || (val2 instanceof Symbol)) {
              throw typeError0("msg.not.a.number");
          }
          if (val1 instanceof Scriptable)
              val1 = ((Scriptable) val1).getDefaultValue(null);
          if (val2 instanceof Scriptable)
              val2 = ((Scriptable) val2).getDefaultValue(null);
          if (!(val1 instanceof CharSequence) && !(val2 instanceof CharSequence)) {
              if ((val1 instanceof Number) && (val2 instanceof Number)) {
                  return wrapNumber(((Number)val1).doubleValue() + ((Number)val2).doubleValue());
              }
              return wrapNumber(toNumber(val1) + toNumber(val2));
          }
          return new ConsString(toCharSequence(val1), toCharSequence(val2));
      }