summaryrefslogtreecommitdiff
path: root/src/cmd/gc/subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/gc/subr.c')
-rw-r--r--src/cmd/gc/subr.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 3e58415a8..ee47cc8e1 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -364,7 +364,7 @@ importdot(Pkg *opkg, Node *pack)
}
}
-void
+static void
gethunk(void)
{
char *h;
@@ -374,7 +374,7 @@ gethunk(void)
if(thunk >= 10L*NHUNK)
nh = 10L*NHUNK;
h = (char*)malloc(nh);
- if(h == (char*)-1) {
+ if(h == nil) {
flusherrors();
yyerror("out of memory");
errorexit();
@@ -389,11 +389,22 @@ mal(int32 n)
{
void *p;
+ if(n >= NHUNK) {
+ p = malloc(n);
+ if(p == nil) {
+ flusherrors();
+ yyerror("out of memory");
+ errorexit();
+ }
+ memset(p, 0, n);
+ return p;
+ }
+
while((uintptr)hunk & MAXALIGN) {
hunk++;
nhunk--;
}
- while(nhunk < n)
+ if(nhunk < n)
gethunk();
p = hunk;
@@ -410,7 +421,12 @@ remal(void *p, int32 on, int32 n)
q = (uchar*)p + on;
if(q != hunk || nhunk < n) {
- while(nhunk < on+n)
+ if(on+n >= NHUNK) {
+ q = mal(on+n);
+ memmove(q, p, on);
+ return q;
+ }
+ if(nhunk < on+n)
gethunk();
memmove(hunk, p, on);
p = hunk;