diff --git a/src/backends/packrat.c b/src/backends/packrat.c
index abb198b02560e1bdec3d98211310f2e6e47da170..f21e22ab00cdf7bd2fe906ddc9b82dd3c66382c3 100644
--- a/src/backends/packrat.c
+++ b/src/backends/packrat.c
@@ -188,9 +188,10 @@ HParseResult* h_do_parse(const HParser* parser, HParseState *state) {
   // check to see if there is already a result for this object...
   if (!m) {
     // It doesn't exist, so create a dummy result to cache
-    HLeftRec *base = a_new(HLeftRec, 1);
+    HLeftRec *base = NULL;
     // But only cache it now if there's some chance it could grow; primitive parsers can't
     if (parser->vtable->higher) {
+      base = a_new(HLeftRec, 1);
       base->seed = NULL; base->rule = parser; base->head = NULL;
       h_slist_push(state->lr_stack, base);
       // cache it
@@ -207,7 +208,7 @@ HParseResult* h_do_parse(const HParser* parser, HParseState *state) {
       cached->input_stream = state->input_stream;
     }
     // setupLR, used below, mutates the LR to have a head if appropriate, so we check to see if we have one
-    if (NULL == base->head) {
+    if (!base || NULL == base->head) {
       h_hashtable_put(state->cache, key, cached_result(state, tmp_res));
       return tmp_res;
     } else {