uintptr_t *MJC_allocArray(int32_t elements, int32_t element_size) {

  // size request was # bytes - convert to words
  int32_t size = WORDSIZE(elements * element_size);

  if (size < 0) {
    die_w_msg("Negative array size request");
  }


#ifdef DEBUG_ALLOC
  printf("MJC alloc array: num elements %d, size %d bytes (%d words)\n", elements,
         element_size, (int)WORDSIZE(element_size));
#endif

  // array header includes type and size
  uintptr_t *a = heapalloc(size + OBJ_HEADER_SIZE) + OBJ_HEADER_SIZE;

  // store the marker "ARRAY" to indicate an array object
  a[-OBJ_HEADER_TYPE_OFFSET] = (uintptr_t)(ARRAY_HEADER_TYPE);
  a[-OBJ_HEADER_SIZE_OFFSET] = size;

  // initialize remaining alloc space to 0
  memset(a, 0, size * sizeof(uintptr_t));

  return a;
}
Example #2
0
void set_first_derives(void)
{
  register unsigned *rrow;
  register unsigned *vrow;
  register int j;
  register unsigned mask;
  register unsigned cword;
  register Yshort *rp;

  int rule;
  int i;
  int rulesetsize;
  int varsetsize;

  rulesetsize = WORDSIZE(nrules);
  varsetsize = WORDSIZE(nvars);
  first_derives = NEW2(nvars * rulesetsize, first_derives[0]);
  first_derives -= ntokens * rulesetsize;

  set_EFF();

  rrow = first_derives + ntokens * rulesetsize;

  for (i = start_symbol; i < nsyms; ++i)
    {
      vrow = EFF + ((i - ntokens) * varsetsize);
      cword = *vrow++;
      mask = 1;

      for (j = start_symbol; j < nsyms; ++j)
        {
          if (cword & mask)
            {
              rp = derives[j];
              while ((rule = *rp++) >= 0)
                {
                  SETBIT(rrow, rule);
                }
            }

          mask <<= 1;
          if (mask == 0)
            {
              cword = *vrow++;
              mask = 1;
            }
        }

      vrow += varsetsize;
      rrow += rulesetsize;
    }

    if (tflag > 1)
        print_first_derives();

  FREE(EFF);
}
Example #3
0
void set_first_derives(void)
{
    unsigned *rrow;
    unsigned *vrow;
    int j;
    unsigned mask;
    unsigned cword;
    short *rp;

    int rule;
    int i;
    int rulesetsize;
    int varsetsize;

    rulesetsize = WORDSIZE(nrules);
    varsetsize = WORDSIZE(nvars);
    first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;

    set_EFF();

    rrow = first_derives + ntokens * rulesetsize;
    for (i = start_symbol; i < nsyms; i++)
    {
	vrow = EFF + ((i - ntokens) * varsetsize);
	cword = *vrow++;
	mask = 1;
	for (j = start_symbol; j < nsyms; j++)
	{
	    if (cword & mask)
	    {
		rp = derives[j];
		while ((rule = *rp++) >= 0)
		{
		    SETBIT(rrow, rule);
		}
	    }

	    mask <<= 1;
	    if (mask == 0)
	    {
		cword = *vrow++;
		mask = 1;
	    }
	}

	vrow += varsetsize;
	rrow += rulesetsize;
    }

#ifdef	DEBUG
    print_first_derives();
#endif

    FREE(EFF);
}
Example #4
0
void
set_first_derives(void)
{
    unsigned *rrow;
    unsigned *vrow;
    int j;
    unsigned k;
    unsigned cword = 0;
    Value_t *rp;

    int rule;
    int i;
    int rulesetsize;
    int varsetsize;

    rulesetsize = WORDSIZE(nrules);
    varsetsize = WORDSIZE(nvars);
    first_base = NEW2(nvars * rulesetsize, unsigned);
    first_derives = first_base - ntokens * rulesetsize;

    set_EFF();

    rrow = first_derives + ntokens * rulesetsize;
    for (i = start_symbol; i < nsyms; i++)
    {
	vrow = EFF + ((i - ntokens) * varsetsize);
	k = BITS_PER_WORD;
	for (j = start_symbol; j < nsyms; k++, j++)
	{
	    if (k >= BITS_PER_WORD)
	    {
		cword = *vrow++;
		k = 0;
	    }

	    if (cword & (unsigned)(1 << k))
	    {
		rp = derives[j];
		while ((rule = *rp++) >= 0)
		{
		    SETBIT(rrow, rule);
		}
	    }
	}

	rrow += rulesetsize;
    }

#ifdef	DEBUG
    print_first_derives();
#endif

    FREE(EFF);
}
Example #5
0
static void print_EFF(void)
{
    register int i, j;
    register unsigned *rowp;
    register unsigned word;
    register unsigned mask;

    BtYacc_logf("\n\nEpsilon Free Firsts\n");

    for (i = start_symbol; i < nsyms; ++i)
    {
        BtYacc_logf("\n%-30s : ", symbol_name[i]);
        rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
        word = *rowp++;

        mask = 1;
        for (j = 0; j < nvars; ++j)
        {
            if (word & mask)
                BtYacc_logf("  %s", symbol_name[start_symbol + j]);

            mask <<= 1;
            if (mask == 0)
            {
                word = *rowp++;
                mask = 1;
            }
        }
    }
}
Example #6
0
static void set_EFF(void)
{
    register unsigned *row;
    register Yshort symbol;
    register Yshort *sp;
    register int rowsize;
    register int i;
    register int rule;

    rowsize = WORDSIZE(nvars);
    EFF = NEW2(nvars * rowsize, EFF[0]);

    row = EFF;

    for (i = start_symbol; i < nsyms; ++i)
    {
        sp = derives[i];
        for (rule = *sp; rule > 0; rule = *++sp)
        {
            symbol = ritem[rrhs[rule]];
            if (ISVAR(symbol))
            {
                symbol -= start_symbol;
                SETBIT(row, symbol);
            }
        }
        row += rowsize;
    }

    reflexive_transitive_closure(EFF, nvars);

    if (tflag > 1)
        print_EFF();
}
Example #7
0
void
reflexive_transitive_closure(unsigned *R, int n)
{
    int rowsize;
    unsigned i;
    unsigned *rp;
    unsigned *relend;

    transitive_closure(R, n);

    rowsize = WORDSIZE(n);
    relend = R + n*rowsize;

    i = 0;
    rp = R;
    while (rp < relend)
    {
	*rp |= (1 << i);
	if (++i >= BITS_PER_WORD)
	{
	    i = 0;
	    rp++;
	}

	rp += rowsize;
    }
}
Example #8
0
void
finalize_closure(void)
{
  FREE(itemset);
  FREE(ruleset);
  FREE(first_derives + ntokens * WORDSIZE(nrules));
}
Example #9
0
void print_EFF(void)
{
    int i, j, k;
    unsigned *rowp;
    unsigned word;
    unsigned mask;

    printf("\n\nEpsilon Free Firsts\n");

    for (i = start_symbol; i < nsyms; i++)
    {
	printf("\n%s", symbol_name[i]);
	rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
	word = *rowp++;

	mask = 1;
	for (j = 0; j < nvars; j++)
	{
	    if (word & mask) printf("  %s", symbol_name[start_symbol + j]);

	    mask <<= 1;
	    if (mask == 0)
	    {
		word = *rowp++;
		mask = 1;
	    }
	}
    }
}
Example #10
0
void set_EFF(void)
{
    unsigned *row;
    int symbol;
    short *sp;
    int rowsize;
    int i;
    int rule;

    rowsize = WORDSIZE(nvars);
    EFF = NEW2(nvars * rowsize, unsigned);

    row = EFF;
    for (i = start_symbol; i < nsyms; i++)
    {
	sp = derives[i];
	for (rule = *sp; rule > 0; rule = *++sp)
	{
	    symbol = ritem[rrhs[rule]];
	    if (ISVAR(symbol))
	    {
		symbol -= start_symbol;
		SETBIT(row, symbol);
	    }
	}
	row += rowsize;
    }

    reflexive_transitive_closure(EFF, nvars);

#ifdef	DEBUG
    print_EFF();
#endif
}
Example #11
0
static void
print_EFF(void)
{
    int i, j;
    unsigned *rowp;
    unsigned word;
    unsigned k;

    printf("\n\nEpsilon Free Firsts\n");

    for (i = start_symbol; i < nsyms; i++)
    {
	printf("\n%s", symbol_name[i]);
	rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
	word = *rowp++;

	k = BITS_PER_WORD;
	for (j = 0; j < nvars; k++, j++)
	{
	    if (k >= BITS_PER_WORD)
	    {
		word = *rowp++;
		k = 0;
	    }

	    if (word & (1 << k))
		printf("  %s", symbol_name[start_symbol + j]);
	}
    }
}
Example #12
0
void reflexive_transitive_closure(unsigned *R, int n)
{
    int rowsize;
    unsigned mask;
    unsigned *rp;
    unsigned *relend;

    transitive_closure(R, n);

    rowsize = WORDSIZE(n);
    relend = R + n*rowsize;

    mask = 1;
    rp = R;
    while (rp < relend)
    {
	*rp |= mask;
	mask <<= 1;
	if (mask == 0)
	{
	    mask = 1;
	    rp++;
	}

	rp += rowsize;
    }
}
Example #13
0
static void
print_first_derives(void)
{
    int i;
    int j;
    unsigned *rp;
    unsigned cword;
    unsigned k;

    printf("\n\n\nFirst Derives\n");

    for (i = start_symbol; i < nsyms; i++)
    {
	printf("\n%s derives\n", symbol_name[i]);
	rp = first_derives + i * WORDSIZE(nrules);
	k = BITS_PER_WORD;
	for (j = 0; j <= nrules; k++, j++)
        {
	  if (k >= BITS_PER_WORD)
	  {
	      cword = *rp++;
	      k = 0;
	  }

	  if (cword & (1 << k))
	    printf("   %d\n", j);
	}
    }

  fflush(stdout);
}
Example #14
0
void
finalize_closure(void)
{
  free(itemset);
  free(ruleset);
  free(first_derives + ntokens * WORDSIZE(nrules));
}
Example #15
0
void print_first_derives(void)
{
    int i;
    int j;
    unsigned *rp;
    unsigned cword;
    unsigned mask;

    printf("\n\n\nFirst Derives\n");

    for (i = start_symbol; i < nsyms; i++)
    {
	printf("\n%s derives\n", symbol_name[i]);
	rp = first_derives + i * WORDSIZE(nrules);
	cword = *rp++;
	mask = 1;
	for (j = 0; j <= nrules; j++)
	{
	    if (cword & mask) printf("   %d\n", j);
	    mask <<= 1;
	    if (mask == 0)
	    {
		cword = *rp++;
		mask = 1;
	    }
	}
    }
    fflush(stdout);
}
uintptr_t *MJC_allocObject(size_t size) {

#ifdef DEBUG_ALLOC
  printf("MJC alloc object size %zu bytes (%zu words)\n", size, WORDSIZE(size));
#endif

  // size request was # bytes - convert to words
  size = WORDSIZE(size);

  uintptr_t *obj = heapalloc(size + OBJ_HEADER_SIZE) + OBJ_HEADER_SIZE;

  // store a class type into the header for later use
  obj[-OBJ_HEADER_TYPE_OFFSET] = (uintptr_t)(OBJECT_HEADER_TYPE);
  obj[-OBJ_HEADER_SIZE_OFFSET] = size;

  // initialize remaining alloc space to 0
  memset(obj, 0, size * sizeof(uintptr_t));

  return obj;
}
Example #17
0
void transitive_closure(unsigned *R, int n)
{
    int rowsize;
    unsigned mask;
    unsigned *rowj;
    unsigned *rp;
    unsigned *rend;
    unsigned *ccol;
    unsigned *relend;
    unsigned *cword;
    unsigned *rowi;

    rowsize = WORDSIZE(n);
    relend = R + n*rowsize;

    cword = R;
    mask = 1;
    rowi = R;
    while (rowi < relend)
    {
	ccol = cword;
	rowj = R;

	while (rowj < relend)
	{
	    if (*ccol & mask)
	    {
		rp = rowi;
		rend = rowj + rowsize;
		while (rowj < rend)
		    *rowj++ |= *rp++;
	    }
	    else
	    {
		rowj += rowsize;
	    }

	    ccol += rowsize;
	}

	mask <<= 1;
	if (mask == 0)
	{
	    mask = 1;
	    cword++;
	}

	rowi += rowsize;
    }
}
Example #18
0
static void
transitive_closure(unsigned *R, int n)
{
    int rowsize;
    unsigned i;
    unsigned *rowj;
    unsigned *rp;
    unsigned *rend;
    unsigned *ccol;
    unsigned *relend;
    unsigned *cword;
    unsigned *rowi;

    rowsize = WORDSIZE(n);
    relend = R + n*rowsize;

    cword = R;
    i = 0;
    rowi = R;
    while (rowi < relend)
    {
	ccol = cword;
	rowj = R;

	while (rowj < relend)
	{
	    if (*ccol & (1 << i))
	    {
		rp = rowi;
		rend = rowj + rowsize;
		while (rowj < rend)
		    *rowj++ |= *rp++;
	    }
	    else
	    {
		rowj += rowsize;
	    }

	    ccol += rowsize;
	}

	if (++i >= BITS_PER_WORD)
	{
	    i = 0;
	    cword++;
	}

	rowi += rowsize;
    }
}
Example #19
0
static void print_first_derives(void)
{
  register int i;
  register int j;
  register unsigned *rp;
  register unsigned cword;
  register unsigned mask;
  int kp;

  BtYacc_logf("\n\n\nFirst Derives\n");

  for (i = start_symbol; i < nsyms; ++i)
    {
      BtYacc_logf("\n%-30s derives\n", symbol_name[i]);
      assert(i >= ntokens);
      rp = first_derives + i * WORDSIZE(nrules);
      cword = *rp++;
      mask = 1;
      kp = 0;

      for (j = 0; j <= nrules; ++j)
        {
          if (cword & mask)
          {
            BtYacc_logf(" %5d", j);
            kp++;
            if (kp == 10)
            {
                BtYacc_logf("\n");
                kp = 0;
            }
          }

          mask <<= 1;
          if (mask == 0)
            {
              cword = *rp++;
              mask = 1;
            }
        }

        if (kp)
        {
            BtYacc_logf("\n");
        }
    }

  fflush(stdout);
}
Example #20
0
File: lalr.c Project: jruby/jay
void lalr() {
    tokensetsize = WORDSIZE(ntokens);

    set_state_table();
    set_accessing_symbol();
    set_shift_table();
    set_reduction_table();
    set_maxrhs();
    initialize_LA();
    set_goto_map();
    initialize_F();
    build_relations();
    compute_FOLLOWS();
    compute_lookaheads();
}
Example #21
0
static void
transitive_closure(unsigned *R, int n)
{
     register size_t rowsize;
     register unsigned mask;
     register unsigned *rowj;
     register unsigned *rp;
     register unsigned *rend;
     register unsigned *ccol;
     
     unsigned *relend;
     unsigned *cword;
     unsigned *rowi;
     
     rowsize = WORDSIZE (n) * sizeof (unsigned);
     relend = (unsigned *) ((char *) R + (n * rowsize));
     
     cword = R;
     mask = 1;
     rowi = R;
     while (rowi < relend) {
	  ccol = cword;
	  rowj = R;
                
	  while (rowj < relend) {
	       if (*ccol & mask) {
		    rp = rowi;
		    rend = (unsigned *) ((char *) rowj + rowsize);
                                
		    while (rowj < rend)
			 *rowj++ |= *rp++;
	       } else {
		    rowj = (unsigned *) ((char *) rowj + rowsize);
	       }
	  
	       ccol = (unsigned *) ((char *) ccol + rowsize);
	  }
                
	  mask <<= 1;
	  if (mask == 0) {
	       mask = 1;
	       cword++;
	  }
	  rowi = (unsigned *) ((char *) rowi + rowsize);
     }
}
Example #22
0
static void graph_LA(int ruleno) {
    int i;
    unsigned tokensetsize;
    unsigned *rowp;

    tokensetsize = (unsigned)WORDSIZE(ntokens);

    if (ruleno == LAruleno[larno]) {
        rowp = LA + larno * tokensetsize;

        fprintf(graph_file, " { ");
        for (i = ntokens - 1; i >= 0; i--)
            if (BIT(rowp, i))
                fprintf(graph_file, "%s ", symbol_pname[i]);
        fprintf(graph_file, "}");
        ++larno;
    }
}
Example #23
0
File: mkpar.c Project: jruby/jay
action* add_reductions(int stateno, action* actions) {
    register int i, j, m, n;
    register int ruleno, tokensetsize;
    register unsigned *rowp;

    tokensetsize = WORDSIZE(ntokens);
    m = lookaheads[stateno];
    n = lookaheads[stateno + 1];
    for (i = m; i < n; i++)
    {
	ruleno = LAruleno[i];
	rowp = LA + i * tokensetsize;
	for (j = ntokens - 1; j >= 0; j--)
	{
	    if (BIT(rowp, j))
		actions = add_reduce(actions, ruleno, j);
	}
    }
    return (actions);
}
Example #24
0
void
closure(Value_t *nucleus, int n)
{
    unsigned ruleno;
    unsigned word;
    unsigned i;
    Value_t *csp;
    unsigned *dsp;
    unsigned *rsp;
    int rulesetsize;

    Value_t *csend;
    unsigned *rsend;
    int symbol;
    Value_t itemno;

    rulesetsize = WORDSIZE(nrules);
    rsend = ruleset + rulesetsize;
    for (rsp = ruleset; rsp < rsend; rsp++)
	*rsp = 0;

    csend = nucleus + n;
    for (csp = nucleus; csp < csend; ++csp)
    {
	symbol = ritem[*csp];
	if (ISVAR(symbol))
	{
	    dsp = first_derives + symbol * rulesetsize;
	    rsp = ruleset;
	    while (rsp < rsend)
		*rsp++ |= *dsp++;
	}
    }

    ruleno = 0;
    itemsetend = itemset;
    csp = nucleus;
    for (rsp = ruleset; rsp < rsend; ++rsp)
    {
	word = *rsp;
	if (word)
	{
	    for (i = 0; i < BITS_PER_WORD; ++i)
	    {
		if (word & (unsigned)(1 << i))
		{
		    itemno = rrhs[ruleno + i];
		    while (csp < csend && *csp < itemno)
			*itemsetend++ = *csp++;
		    *itemsetend++ = itemno;
		    while (csp < csend && *csp == itemno)
			++csp;
		}
	    }
	}
	ruleno += BITS_PER_WORD;
    }

    while (csp < csend)
	*itemsetend++ = *csp++;

#ifdef	DEBUG
    print_closure(n);
#endif
}
Example #25
0
void closure(short *nucleus,int n)
{
    int ruleno;
    unsigned word;
    unsigned mask;
    short *csp;
    unsigned *dsp;
    unsigned *rsp;
    int rulesetsize;

    short *csend;
    unsigned *rsend;
    int symbol;
    int itemno;

    rulesetsize = WORDSIZE(nrules);
    rsp = ruleset;
    rsend = ruleset + rulesetsize;
    for (rsp = ruleset; rsp < rsend; rsp++)
      *rsp = 0;

    csend = nucleus + n;
    for (csp = nucleus; csp < csend; ++csp)
    {
	symbol = ritem[*csp];
	if (ISVAR(symbol))
	{
	    dsp = first_derives + symbol * rulesetsize;
	    rsp = ruleset;
	    while (rsp < rsend)
	      *rsp++ |= *dsp++;
	}
    }

    ruleno = 0;
    itemsetend = itemset;
    csp = nucleus;
    for (rsp = ruleset; rsp < rsend; ++rsp)
    {
	word = *rsp;
	if (word == 0) ruleno += BITS_PER_WORD;
	else
	{
	    mask = 1;
	    while (mask)
	    {
		if (word & mask)
		{
		    itemno = rrhs[ruleno];
		    while (csp < csend && *csp < itemno)
		      *itemsetend++ = *csp++;
		    *itemsetend++ = itemno;
		    while (csp < csend && *csp == itemno)
		      ++csp;
		}

		mask <<= 1;
		++ruleno;
	    }
	}
    }

    while (csp < csend)
      *itemsetend++ = *csp++;

#ifdef	DEBUG
    print_closure(n);
#endif
}