Bug 1197941 - Allow getline() to malloc its own buffer to avoid intermittent crashes, r=shu

--HG--
extra : commitid : 1uyyLvURamj
extra : rebase_source : 3bf604d75b79c81d75931701c50f9d4088e7d568
This commit is contained in:
Steve Fink 2015-09-29 16:39:45 -07:00
Родитель e84d186efc
Коммит 48bb3e0096
1 изменённых файлов: 11 добавлений и 11 удалений

Просмотреть файл

@ -158,21 +158,21 @@ function cLibrary()
fopen: lib.declare("fopen", ctypes.default_abi, ctypes.void_t.ptr, ctypes.char.ptr, ctypes.char.ptr), fopen: lib.declare("fopen", ctypes.default_abi, ctypes.void_t.ptr, ctypes.char.ptr, ctypes.char.ptr),
getline: lib.declare("getline", ctypes.default_abi, ctypes.ssize_t, ctypes.char.ptr.ptr, ctypes.size_t.ptr, ctypes.void_t.ptr), getline: lib.declare("getline", ctypes.default_abi, ctypes.ssize_t, ctypes.char.ptr.ptr, ctypes.size_t.ptr, ctypes.void_t.ptr),
fclose: lib.declare("fopen", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr), fclose: lib.declare("fopen", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr),
setvbuf: lib.declare("setvbuf", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr, ctypes.char.ptr, ctypes.int, ctypes.size_t), free: lib.declare("free", ctypes.default_abi, ctypes.void_t.ptr),
}; };
} }
function* readFileLines_gen(filename) function* readFileLines_gen(filename)
{ {
var libc = cLibrary(); var libc = cLibrary();
var linebuf = ctypes.char.array(4096)(); var linebuf = ctypes.char.ptr();
var bufsize = ctypes.size_t(4096); var bufsize = ctypes.size_t(0);
var fp = libc.fopen(filename, "r"); var fp = libc.fopen(filename, "r");
if (fp.isNull()) if (fp.isNull())
throw "Unable to open '" + filename + "'" throw "Unable to open '" + filename + "'"
var bufp = ctypes.char.ptr(linebuf.addressOfElement(0)); while (libc.getline(linebuf.address(), bufsize.address(), fp) > 0)
while (libc.getline(bufp.address(), bufsize.address(), fp) > 0) yield linebuf.readString();
yield bufp.readString(); libc.fclose(fp);
libc.fclose(fp); libc.free(ctypes.void_t.ptr(linebuf));
} }