fix read(0), readline(0); make tuple for call_object args
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index d833527..0a03c47 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -376,16 +376,12 @@
 	if (f->f_fp == NULL)
 		return err_closed();
 	if (args == NULL)
-		n = 0;
+		n = -1;
 	else {
 		if (!getargs(args, "i", &n))
 			return NULL;
-		if (n < 0) {
-			err_setstr(ValueError, "negative read count");
-			return NULL;
-		}
 	}
-	n2 = n != 0 ? n : BUFSIZ;
+	n2 = n >= 0 ? n : BUFSIZ;
 	v = newsizedstringobject((char *)NULL, n2);
 	if (v == NULL)
 		return NULL;
@@ -399,7 +395,7 @@
 		n1 += n3;
 		if (n1 == n)
 			break;
-		if (n == 0) {
+		if (n < 0) {
 			n2 = n1 + BUFSIZ;
 			RET_SAVE
 			if (resizestring(&v, n2) < 0)
@@ -561,10 +557,10 @@
 	else {
 		if (!getintarg(args, &n))
 			return NULL;
-		if (n < 0) {
-			err_setstr(ValueError, "negative readline count");
-			return NULL;
-		}
+		if (n == 0)
+			return newstringobject("");
+		if (n < 0)
+			n = 0;
 	}
 
 	return getline(f, n);
@@ -783,7 +779,7 @@
 	object *f;
 	int flags;
 {
-	object *writer, *value, *result;
+	object *writer, *value, *args, *result;
 	if (f == NULL) {
 		err_setstr(TypeError, "writeobject with NULL file");
 		return -1;
@@ -807,9 +803,16 @@
 		DECREF(writer);
 		return -1;
 	}
-	result = call_object(writer, value);
-	DECREF(writer);
+	args = mkvalue("(O)", value);
+	if (value == NULL) {
+		DECREF(value);
+		DECREF(writer);
+		return -1;
+	}
+	result = call_object(writer, args);
+	DECREF(args);
 	DECREF(value);
+	DECREF(writer);
 	if (result == NULL)
 		return -1;
 	DECREF(result);