зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
e84d186efc
Коммит
48bb3e0096
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче