Ignore:
Timestamp:
Sep 14, 2020, 7:34:28 PM (5 years ago)
Author:
bird
Message:

kash: New parser allocator for non-forked-mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/memalloc.h

    r3456 r3457  
    3939        char *stacknxt;
    4040        int stacknleft;
     41#ifdef KASH_SEPARATE_PARSER_ALLOCATOR
     42        unsigned pstacksize;
     43#endif
    4144        struct stackmark *marknext;
    4245};
     
    8487 * subshells by simple reference counting.
    8588 * @{ */
     89#ifdef KASH_SEPARATE_PARSER_ALLOCATOR
     90struct pstack_block;
     91unsigned pstackretain(struct pstack_block *);
     92unsigned pstackrelease(struct shinstance *, struct pstack_block *);
     93struct pstack_block *pstackpush(struct shinstance *);
     94#endif
    8695void *pstalloc(struct shinstance *, size_t);
    8796union node;
     
    9099struct nodelist *pstalloclist(struct shinstance *);
    91100char *pstsavestr(struct shinstance *, const char *); /* was: stsavestr */
    92 #define PSTARTSTACKSTR(psh, p)      do { (p) = (psh)->stacknxt; (psh)->sstrnleft = (psh)->stacknleft; } while (0)
    93101char *pstmakestrspace(struct shinstance *, size_t, char *); /* was: makestrspace / growstackstr */
    94 #define PSTCHECKSTRSPACE(psh, n, p) do { if ((psh)->sstrnleft >= (n)) {/*likely*/} \
     102char *pstputcgrow(struct shinstance *, char *, char);
     103char *pstgrabstr(struct shinstance *, char *); /* was: grabstackstr / grabstackblock*/
     104#ifdef KASH_SEPARATE_PARSER_ALLOCATOR
     105# define PSTBLOCK(psh)               ((psh)->curpstack->nextbyte)
     106# define PSTARTSTACKSTR(psh, p) do { \
     107        pstack_block *pstmacro = (psh)->curpstack; \
     108        pstmacro->strleft = pstmacro->avail; \
     109        (p) = pstmacro->nextbyte; \
     110    } while (0)
     111# define PSTCHECKSTRSPACE(psh, n, p) do { \
     112        if ((psh)->curpstack->strleft >= (n)) {/*likely*/} \
     113        else { (p) = pstmakestrspace(psh, (n), (p)); assert((psh)->curpstack->strleft >= (n)); } \
     114    } while (0)
     115# define PSTUPUTC(psh, c, p) do { \
     116        assert((psh)->curpstack->strleft > 0); \
     117        (psh)->curpstack->strleft -= 1; \
     118        *(p)++ = (c); \
     119    } while (0)
     120# define PSTPUTC(psh, c, p) do { \
     121        if ((ssize_t)--(psh)->curpstack->strleft >= 0) *(p)++ = (c); \
     122        else (p) = pstputcgrow(psh, (p), (c)); \
     123    } while (0)
     124# define PSTPUTSTRN(psh, str, n, p) do { \
     125        pstack_block *pstmacro = (psh)->curpstack; \
     126        if (pstmacro->strleft >= (n)) {/*likely?*/} \
     127        else (p) = pstmakestrspace(psh, (n), (p)); \
     128        pstmacro->strleft -= (n); \
     129        memcpy((p), (str), (n)); \
     130        (p) += (n); \
     131    } while (0)
     132#else
     133# define PSTBLOCK(psh)               ((psh)->stacknxt)
     134# define PSTARTSTACKSTR(psh, p)      do { (p) = (psh)->stacknxt; (psh)->sstrnleft = (psh)->stacknleft; } while (0)
     135# define PSTCHECKSTRSPACE(psh, n, p) do { if ((psh)->sstrnleft >= (n)) {/*likely*/} \
    95136                                         else { (p) = pstmakestrspace(psh, (n), (p)); assert((psh)->sstrnleft >= (n)); } } while (0)
    96 #define PSTUPUTC(psh, c, p)         do { assert((psh)->sstrnleft > 0); --(psh)->sstrnleft; *(p)++ = (c); } while (0)
    97 char *pstputcgrow(struct shinstance *, char *, char);
    98 #define PSTPUTC(psh, c, p)          do { if (--(psh)->sstrnleft >= 0) *(p)++ = (c); else (p) = pstputcgrow(psh, (p), (c)); } while (0)
    99 #define PSTPUTSTRN(psh, str, n, p)  do { if ((psh)->sstrnleft >= (n)) {/*likely?*/} else (p) = pstmakestrspace(psh, (n), (p)); \
     137# define PSTUPUTC(psh, c, p)         do { assert((psh)->sstrnleft > 0); --(psh)->sstrnleft; *(p)++ = (c); } while (0)
     138# define PSTPUTC(psh, c, p)          do { if (--(psh)->sstrnleft >= 0) *(p)++ = (c); else (p) = pstputcgrow(psh, (p), (c)); } while (0)
     139# define PSTPUTSTRN(psh, str, n, p)  do { if ((psh)->sstrnleft >= (n)) {/*likely?*/} else (p) = pstmakestrspace(psh, (n), (p)); \
    100140                                         memcpy((p), (str), (n)); (psh)->sstrnleft -= (n); (p) += (n); } while (0)
    101 #define PSTBLOCK(psh)               ((psh)->stacknxt)
    102 char *pstgrabstr(struct shinstance *, char *); /* was: grabstackstr / grabstackblock*/
     141#endif
    103142/** @} */
    104143
Note: See TracChangeset for help on using the changeset viewer.