Merge pull request #1039 from crimsonwoods/fix_the_type_of_opcode
authorYukihiro "Matz" Matsumoto <[email protected]>
Sat, 23 Mar 2013 02:11:51 +0000 (22 19:11 -0700)
committerYukihiro "Matz" Matsumoto <[email protected]>
Sat, 23 Mar 2013 02:11:51 +0000 (22 19:11 -0700)
Fix the type of value that is returned by bit shift expression.

1  2 
src/codegen.c
src/hash.c
src/vm.c

diff --combined src/codegen.c
@@@ -560,7 -560,7 +560,7 @@@ for_body(codegen_scope *s, node *tree
    s = prev;
    genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx - base, OP_L_BLOCK));
    pop();
 -  idx = new_msym(s, mrb_intern(s->mrb, "each"));
 +  idx = new_msym(s, mrb_intern2(s->mrb, "each", 4));
    genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
  }
  
@@@ -580,7 -580,8 +580,8 @@@ lambda_body(codegen_scope *s, node *tre
    }
    tree = tree->cdr;
    if (tree->car) {
-     int ma, oa, ra, pa, ka, kd, ba, a;
+     int32_t a;
+     int ma, oa, ra, pa, ka, kd, ba;
      int pos, i;
      node *n, *opt;
  
      ka = kd = 0;
      ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
  
-     a = ((ma & 0x1f) << 18)
-       | ((oa & 0x1f) << 13)
+     a = ((int32_t)(ma & 0x1f) << 18)
+       | ((int32_t)(oa & 0x1f) << 13)
        | ((ra & 1) << 12)
        | ((pa & 0x1f) << 7)
        | ((ka & 0x1f) << 2)
@@@ -959,7 -960,7 +960,7 @@@ static voi
  gen_send_intern(codegen_scope *s)
  {
    pop();
 -  genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "intern")), 0));
 +  genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "intern", 6)), 0));
    push();
  }
  static void
@@@ -1151,12 -1152,12 +1152,12 @@@ codegen(codegen_scope *s, node *tree, i
                codegen(s, n4->car, VAL);
              }
              else {
 -              genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern(s->mrb, "StandardError"))));
 +              genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern2(s->mrb, "StandardError", 13))));
                push();
              }
              genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
              pop();
 -            genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
 +            genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1));
              tmp = new_label(s);
              genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
              pos2 = tmp;
            if (head) {
              genop(s, MKOP_AB(OP_MOVE, cursp(), head));
              pop();
 -            genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
 +            genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "===", 3)), 1));
            }
            else {
              pop();
        }
        pop_n(n+1);
        if (sendv) n = CALL_MAXARGS;
 -      genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "call")), n));
 +      genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern2(s->mrb, "call", 4)), n));
        if (val) push();
      }
      break;
  
        default:
          {
 -          int sym = new_msym(s, mrb_intern(s->mrb, "-"));
 +          int sym = new_msym(s, mrb_intern2(s->mrb, "-", 1));
  
            genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
            push();
      gen_literal_array(s, tree, TRUE, val);
      break;
  
 +  case NODE_XSTR:
 +    if (val) {
 +      char *p = (char*)tree->car;
 +      size_t len = (intptr_t)tree->cdr;
 +      int ai = mrb_gc_arena_save(s->mrb);
 +      int sym = new_sym(s, mrb_intern2(s->mrb, "Kernel", 6));
 +      int off = new_lit(s, mrb_str_new(s->mrb, p, len));
 +
 +      genop(s, MKOP_A(OP_OCLASS, cursp()));
 +      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
 +      push();
 +      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
 +      pop();
 +      sym = new_sym(s, mrb_intern2(s->mrb, "`", 1));
 +      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
 +      mrb_gc_arena_restore(s->mrb, ai);
 +      push();
 +    }
 +    break;
 +
    case NODE_REGX:
      if (val) {
        char *p1 = (char*)tree->car;
          pop();
        }
        pop();
 -      sym = new_sym(s, mrb_intern(s->mrb, "compile"));
 +      sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7));
        genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
        mrb_gc_arena_restore(s->mrb, ai);
        push();
          pop();
        }
        pop();
 -      sym = new_sym(s, mrb_intern(s->mrb, "compile"));
 +      sym = new_sym(s, mrb_intern2(s->mrb, "compile", 7));
        genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
        mrb_gc_arena_restore(s->mrb, ai);
        push();
      {
        int a = new_msym(s, sym(tree->car));
        int b = new_msym(s, sym(tree->cdr));
 -      int c = new_msym(s, mrb_intern(s->mrb, "alias_method"));
 +      int c = new_msym(s, mrb_intern2(s->mrb, "alias_method", 12));
  
        genop(s, MKOP_A(OP_TCLASS, cursp()));
        push();
  
    case NODE_UNDEF:
      {
 -      int undef = new_msym(s, mrb_intern(s->mrb, "undef_method"));
 +      int undef = new_msym(s, mrb_intern2(s->mrb, "undef_method", 12));
        int num = 0;
        node *t = tree;
  
diff --combined src/hash.c
@@@ -15,7 -15,7 +15,7 @@@
  static inline khint_t
  mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
  {
-   khint_t h = mrb_type(key) << 24;
+   khint_t h = (khint_t)mrb_type(key) << 24;
    mrb_value h2;
  
    h2 = mrb_funcall(mrb, key, "hash", 0, 0);
@@@ -262,7 -262,7 +262,7 @@@ mrb_hash_init_core(mrb_state *mrb, mrb_
      RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
      ifnone = block;
    }
 -  mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone);
 +  mrb_iv_set(mrb, hash, mrb_intern2(mrb, "ifnone", 6), ifnone);
    return hash;
  }
  
@@@ -427,7 -427,7 +427,7 @@@ mrb_hash_set_default(mrb_state *mrb, mr
  
    mrb_get_args(mrb, "o", &ifnone);
    mrb_hash_modify(mrb, hash);
 -  mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone);
 +  mrb_iv_set(mrb, hash, mrb_intern2(mrb, "ifnone", 6), ifnone);
    RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT);
  
    return ifnone;
@@@ -478,7 -478,7 +478,7 @@@ mrb_hash_set_default_proc(mrb_state *mr
  
    mrb_get_args(mrb, "o", &ifnone);
    mrb_hash_modify(mrb, hash);
 -  mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone);
 +  mrb_iv_set(mrb, hash, mrb_intern2(mrb, "ifnone", 6), ifnone);
    RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
  
    return ifnone;
@@@ -759,7 -759,7 +759,7 @@@ mrb_hash_replace(mrb_state *mrb, mrb_va
    else {
      ifnone = RHASH_IFNONE(hash2);
    }
 -  mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone);
 +  mrb_iv_set(mrb, hash, mrb_intern2(mrb, "ifnone", 6), ifnone);
  
    return hash;
  }
@@@ -1104,7 -1104,7 +1104,7 @@@ hash_equal(mrb_state *mrb, mrb_value ha
  
    if (mrb_obj_equal(mrb, hash1, hash2)) return mrb_true_value();
    if (!mrb_hash_p(hash2)) {
 -      if (!mrb_respond_to(mrb, hash2, mrb_intern(mrb, "to_hash"))) {
 +      if (!mrb_respond_to(mrb, hash2, mrb_intern2(mrb, "to_hash", 7))) {
            return mrb_false_value();
        }
        if (eql)
diff --combined src/vm.c
+++ b/src/vm.c
@@@ -349,7 -349,7 +349,7 @@@ mrb_funcall_with_block(mrb_state *mrb, 
      p = mrb_method_search_vm(mrb, &c, mid);
      if (!p) {
        undef = mid;
 -      mid = mrb_intern(mrb, "method_missing");
 +      mid = mrb_intern2(mrb, "method_missing", 14);
        p = mrb_method_search_vm(mrb, &c, mid);
        n++; argc++;
      }
@@@ -869,7 -869,7 +869,7 @@@ mrb_run(mrb_state *mrb, struct RProc *p
        if (!m) {
          mrb_value sym = mrb_symbol_value(mid);
  
 -        mid = mrb_intern(mrb, "method_missing");
 +        mid = mrb_intern2(mrb, "method_missing", 14);
          m = mrb_method_search_vm(mrb, &c, mid);
          if (n == CALL_MAXARGS) {
            mrb_ary_unshift(mrb, regs[a+1], sym);
        c = mrb->ci->target_class->super;
        m = mrb_method_search_vm(mrb, &c, mid);
        if (!m) {
 -        mid = mrb_intern(mrb, "method_missing");
 +        mid = mrb_intern2(mrb, "method_missing", 14);
          m = mrb_method_search_vm(mrb, &c, mid);
          if (n == CALL_MAXARGS) {
            mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid));
      CASE(OP_ENTER) {
        /* Ax             arg setup according to flags (24=5:5:1:5:5:1:1) */
        /* number of optional arguments times OP_JMP should follow */
-       int ax = GETARG_Ax(i);
+       int32_t ax = GETARG_Ax(i);
        int m1 = (ax>>18)&0x1f;
        int o  = (ax>>13)&0x1f;
        int r  = (ax>>12)&0x1;
  
        L_RAISE:
          ci = mrb->ci;
 -        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern(mrb, "lastpc"), mrb_voidp_value(pc));
 -        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->cibase));
 +        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern2(mrb, "lastpc", 6), mrb_voidp_value(pc));
 +        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern2(mrb, "ciidx", 5), mrb_fixnum_value(ci - mrb->cibase));
          eidx = ci->eidx;
          if (ci == mrb->cibase) {
            if (ci->ridx == 0) goto L_STOP;
        if (!m) {
          mrb_value sym = mrb_symbol_value(mid);
  
 -        mid = mrb_intern(mrb, "method_missing");
 +        mid = mrb_intern2(mrb, "method_missing", 14);
          m = mrb_method_search_vm(mrb, &c, mid);
          if (n == CALL_MAXARGS) {
            mrb_ary_unshift(mrb, regs[a+1], sym);