Exemple #1
0
int
main(void) {
  (void)box_float;
  (void)box_double;
  (void)box_string;
  /*Allocate an environment
   * The environment size depends on how many nested functions there are ?
   */
  svalue_t **env = calloc(sizeof (svalue_t *), 2);
  /* Get the final closure */
  svalue_t *closure1 = make_closure(make_doubleadder, env);
  /* Invoke the closure that the closure returns */
  svalue_t *c1 = invoke1(closure1, box_int(23));
  svalue_t *c2 = invoke1(c1, box_int(5));
  svalue_t *result = invoke1(c2, box_int(334));
  /* The final result */
  printf("print 23 + 5 + 334 == %d\n", result->value.integer);
  svalue_t *a = box_int(123);
  svalue_t *b = box_int(455);
  svalue_t *improper = box_pair(a, b);
  improper->value.pair.right = improper;
  /* woo cyclic pair */
  printf("(%d, %d)\n", improper->value.pair.left->value.integer, improper->value.pair.right->value.pair.left->value.integer);
  return 0;
}
int compile_blit_string(int retreg, Cell* args, int requires) {
  compile_arg(JIT_R0, car(args), TAG_BYTES); // font
  stack_push(JIT_R0, &stack_ptr);

  args = cdr(args);
  compile_arg(JIT_R0, car(args), TAG_ANY); // string
  stack_push(JIT_R0, &stack_ptr);
  
  compile_int_arg();
  compile_int_arg();
  compile_int_arg();
  compile_int_arg();
  compile_int_arg();
  compile_int_arg();

  jit_prepare();
  push_stack_arg(); // color
  push_stack_arg(); // h
  push_stack_arg(); // w
  push_stack_arg(); // y
  push_stack_arg(); // x
  push_stack_arg(); // cursor_pos (or -1)
  
  push_stack_arg(); // string
  push_stack_arg(); // font
  jit_finishi(blit_string1);
  jit_retval(retreg);

  box_int(retreg, requires);
  
  return 1;
}
Exemple #3
0
static inline svalue_t*
make_doubleadder_inner_inner(svalue_t **z, svalue_t **env) {
  int x,y;
  x = env[0]->value.integer;
  y = env[1]->value.integer;
  z[0]->value.integer = x + y + (z[0]->value.integer);
  return box_int(z[0]->value.integer);
}
Exemple #4
0
svalue_t*
read_scm(source_t source_code) {
  size_t nbytes = read(STDIN_FILENO, source_code, 111000);
  if (nbytes == 0) {
    exit(EXIT_FAILURE);
  }

  token_stream toks = tokenize(source_code, 0, nbytes);
  token_t current_tok;
  while (toks.length > 0) {
    current_tok = peek_token(&toks);
    switch (current_tok.token_type) {
      case SYMBOL:
        printf("symbol: %s\n", current_tok.token.symbol);
        break;
      case IDENTIFIER:
        printf("identifer: %s\n", current_tok.token.identifier);
        break;
      case INTEGER:
        printf("integer: %s\n", current_tok.token.integer);
        break;
      case FLOATING:
        printf("floating: %s\n", current_tok.token.floating);
        break;
      case QUOTE:
        printf("quote: '\n");
        break;
      case WSPACE:
        printf("whitespace\n");
        break;
      case PAREN:
        printf("paren: %s\n", current_tok.token.parenthesis);
        break;
      case EMPTY:
        printf("this should not be empty\n");
        break;
      case STRING:
        printf("string: %s\n", current_tok.token.string);
        break;
      default:
        printf("oops, there was an unknown token, check valgrind or gdb\n");
    }
    pop_token(&toks);
  }
  return box_int(12);
}