Ejemplo n.º 1
0
void register_apply( obj closure )
{
unsigned i;
obj call_ctx;

    PUSH_PARTCONT(full_call_done,1);
    SET_PARTCONT_REG(0,dynamic_state_reg);

    call_ctx = alloc( SLOT(arg_count_reg + 1), vector_class );
    gvec_write_init( call_ctx, SLOT(0), closure );
    for (i=0; i<arg_count_reg; i++)
    {
	gvec_write_init( call_ctx, SLOT(i+1), reg_ref(i) );
    }
    dynamic_state_reg = cons( call_ctx, dynamic_state_reg );

    if (bci_trace_flag > 0) 
      {
	fprintf( stdout, "calling: " );
	fprinto( stdout, gvec_read(literals_reg,SLOT(2)) );
	fprintf( stdout, "\n" );

	for (i=0; i<arg_count_reg; i++)
	  {
	    printf( "      reg[%u] = ", i );
	    fprinto( stdout, reg_ref(i) );
	    printf( "\n" );
	  }
	fflush(stdout);
      }
}
Ejemplo n.º 2
0
obj collect_top( unsigned first_reg )
{
obj list = NIL_OBJ;
unsigned i;

    if (first_reg < 10)
      {
	if (arg_count_reg > 10)
	  {
	    list = collect_top(10);
	    i = 10;
	  }
	else
	  i = arg_count_reg;

	while (i > first_reg)
	    list = cons( reg_ref(--i), list );
	return list;
      }
    
    i = arg_count_reg;
    while (i > first_reg)
      {
	unsigned r = --i;
	list = cons( REG(r), list );
      }
    return list;
}
Ejemplo n.º 3
0
void *tcl_gateway( void )
{
char **argp, *(args[102]);
Tcl_CmdInfo *info;
Tcl_Interp *interp;
char temp[1000], *d;
int i, rc;

    assert( arg_count_reg <= 100 );
    info = (Tcl_CmdInfo *)PTR_TO_DATAPTR(LEXREF0(0));
    interp = (Tcl_Interp *)OBJ_TO_RAW_PTR(LEXREF0(1));

    d = temp;
    argp = args;
    *argp++ = (char *)string_text( LEXREF0(2) );
    for (i=0; i<arg_count_reg; i++)
      {
	obj arg;

	arg = reg_ref(i);
	if (STRING_P(arg))
	  {
	    *argp++ = (char *)string_text(arg);
	  }
	else if (OBJ_ISA_FIXNUM(arg))
	  {
	    *argp++ = d;
	    sprintf( d, "%d", fx2int(arg) );
	    d += strlen(d) + 1;
	  }
	else if (SYMBOL_P(arg))
	  {
	    *argp++ = (char *)symbol_text(arg);
	  }
	else
	  {
	    scheme_error( "tcl_gateway: ~s invalid", 1, arg );
	  }
      }
    *argp++ = NULL;
    Tcl_ResetResult( interp );
    rc = info->proc( info->clientData,
		     interp,
		     arg_count_reg + 1,
		     args );
    if (rc)
      {
	REG0 = make_string( interp->result );
	REG1 = int2fx( rc );
	RETURN(2);
      }
    else
      {
	if (interp->result[0])
	  REG0 = make_string( interp->result );
	else
	  REG0 = TRUE_OBJ;
	RETURN1();
      }
}
Ejemplo n.º 4
0
void run_scu_operation(machinecode *program, int *pc, int *convert, union bit *reg) {
    switch(program[*pc].opcode) {
    case 0: /* set reg */
        reg_set(reg, program[*pc].dr, reg_ref(reg,program[*pc].sr2,convert), convert);
        (*pc)++;
        break;
    case (0 + IMD_SIZE): /* set imd */
        reg_set(reg, program[*pc].dr, program[*pc].imd, convert);
        (*pc)++;
        break;
     case 1: /* + reg */
        reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (1 + IMD_SIZE): /* + imd */
        reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 2: /* - reg */
        reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (2 + IMD_SIZE): /* - imd */
        reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 3: /* xor reg */
        reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (3 + IMD_SIZE): /* xor imd */
        reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 4: /* or reg */
        reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (4 + IMD_SIZE): /* or imd */
        reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 5: /* and reg */
        reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (5 + IMD_SIZE): /* adn imd */
        reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 6: /* not reg */
        reg_set(reg, program[*pc].dr, do_not(reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (6 + IMD_SIZE): /* not imd */
        reg_set(reg, program[*pc].dr, do_not(program[*pc].imd), convert);
        (*pc)++;
        break;
     default:
        fprintf(stderr, "%2x : unknown instruction\n", (program[*pc].info)+(program[*pc].opcode));
        exit(EXIT_FAILURE);
    }
}
Ejemplo n.º 5
0
static void rs_vmd_pass( FILE *f, int pass )
{
  obj saved_cr;
  unsigned i;
  obj envts[20];
  unsigned num_envts = 0;

  fprintf( f, "--------- VM State ----------\n" );
  fprintf( f, "Registers:\n" );
  rs_vmd_prn( f, pass, "envt_reg", envt_reg );
  if (OBJ_ISA_PTR_OF_CLASS( envt_reg, binding_envt_class )) {
    envts[num_envts++] = envt_reg;
  }

  rs_vmd_prn( f, pass, "literals_reg", literals_reg );
  rs_vmd_prn( f, pass, "dynamic_state_reg", dynamic_state_reg );
  rs_vmd_prn( f, pass, "thread_state_reg", thread_state_reg );
  fprintf( f, "         arg_count_reg: %8u\n", arg_count_reg );
  fprintf( f, "      continuation_reg: %08lx\n", VAL(continuation_reg) );

  for (i=0; i<arg_count_reg; i++) {
    char tmp[20];
    sprintf( tmp, "REG(%d)", i );
    
    rs_vmd_prn( f, pass, tmp, reg_ref(i) );
  }

  fflush( f );  /* get all of that out of the process boundary */

  /* now, try to dive into some more detail... */

  fprintf( f, "Continuation Chain:\n" );

  saved_cr = continuation_reg;

  for (i=0; i<10; i++) {
    unsigned n, j;
    obj x;

    fprintf( f, "   (%u) will continue in #[FRAME %08lx]", i, VAL(continuation_reg) );
    fflush( f );
    
    /* 'n' is the number of slots above and beyond CONT_FIXED */

    n = get_partcont_size( continuation_reg );
    fprintf( f, " (%u slots)\n", n );

    x = gvec_ref( continuation_reg, SLOT(0) );
    rs_vmd_prn( f, pass, ".envt", x );
    if (OBJ_ISA_PTR_OF_CLASS( x, binding_envt_class ) && (num_envts < 20)) {
      envts[num_envts++] = x;
    }
    rs_vmd_prn( f, pass, ".literals", gvec_ref( continuation_reg, SLOT(1) ) );
    rs_vmd_prn( f, pass, ".label", gvec_ref( continuation_reg, SLOT(2) ) );
    rs_vmd_prn( f, pass, ".contn", gvec_ref( continuation_reg, SLOT(3) ) );

    for (j=0; j<n; j++) {
      char tmp[20];
      sprintf( tmp, "slot[%u]", j );
      rs_vmd_prn( f, pass, tmp, gvec_ref( continuation_reg, SLOT(j + CONT_FIXED) ) );
    }
    RESTORE_CONT_REG();
    if (!OBJ_ISA_PTR( continuation_reg )) {
      break;
    }
  }

  fprintf( f, "Binding Environments:\n" );
  for (i=0; i<num_envts; i++) {
    rs_vmd_envts( f, pass, envts[i] );
  }

  continuation_reg = saved_cr;
}
Ejemplo n.º 6
0
void run_cmp_operation(machinecode *program, int *pc, int *convert, union bit *reg) {
    switch(program[*pc].opcode) {
    case 0: /* = reg */
        reg_set(reg, program[*pc].dr, do_equal(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (0 + IMD_SIZE): /* = imd */
        reg_set(reg, program[*pc].dr, do_equal(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 1: /* =. reg */
        reg_set(reg, program[*pc].dr, do_equal_dot(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (1 + IMD_SIZE): /* =. imd */
        reg_set(reg, program[*pc].dr, do_equal_dot(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 2: /* > reg */
        reg_set(reg, program[*pc].dr, do_greater(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (2 + IMD_SIZE): /* > imd */
        reg_set(reg, program[*pc].dr, do_greater(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 3: /* >. reg */
        reg_set(reg, program[*pc].dr, do_greater_dot(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (3 + IMD_SIZE): /* >. imd */
        reg_set(reg, program[*pc].dr, do_greater_dot(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 4: /* < reg */
        reg_set(reg, program[*pc].dr, do_less(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (4 + IMD_SIZE): /* < imd */
        reg_set(reg, program[*pc].dr, do_less(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 5: /* <. reg */
        reg_set(reg, program[*pc].dr, do_less_dot(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (5 + IMD_SIZE): /* <. imd */
        reg_set(reg, program[*pc].dr, do_less_dot(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 6: /* >= reg */
        reg_set(reg, program[*pc].dr, do_greater_equal(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (6 + IMD_SIZE): /* >= imd */
        reg_set(reg, program[*pc].dr, do_greater_equal(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 7: /* >=. reg */
        reg_set(reg, program[*pc].dr, do_greater_equal_dot(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (7 + IMD_SIZE): /* >=. imd */
        reg_set(reg, program[*pc].dr, do_greater_equal_dot(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 8: /* <= reg */
        reg_set(reg, program[*pc].dr, do_less_equal(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (8 + IMD_SIZE): /* <= imd */
        reg_set(reg, program[*pc].dr, do_less_equal(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    case 9: /* <=. reg */
        reg_set(reg, program[*pc].dr, do_less_equal_dot(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
    case (9 + IMD_SIZE): /* <=. imd */
        reg_set(reg, program[*pc].dr, do_less_equal_dot(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
    default:
        fprintf(stderr, "%2x : unknown instruction\n", (program[*pc].info+program[*pc].opcode));
        exit(EXIT_FAILURE);
    }
}