Exemplo n.º 1
0
mrb_value
mrb_class_path(mrb_state *mrb, struct RClass *c)
{
  mrb_value path;
  const char *name;
  int len;

  path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"));
  if (mrb_nil_p(path)) {
    struct RClass *outer = mrb_class_outer_module(mrb, c);
    mrb_sym sym = mrb_class_sym(mrb, c, outer);
    if (sym == 0) {
      return mrb_nil_value();
    }
    else if (outer && outer != mrb->object_class) {
      mrb_value base = mrb_class_path(mrb, outer);
      path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2));
      name = mrb_sym2name_len(mrb, sym, &len);
      mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
    }
    else {
      name = mrb_sym2name_len(mrb, sym, &len);
      path = mrb_str_new(mrb, name, len);
    }
    mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"), path);
  }
  return path;
}
Exemplo n.º 2
0
mrb_value
mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
{
  struct RClass *c = mrb->c->ci->proc->target_class;

  if (!c) c = mrb->c->ci->target_class;
  if (c) {
    struct RClass *c2;
    mrb_value v;

    if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
      return v;
    }
    if (c->tt == MRB_TT_SCLASS) {
      mrb_value klass;
      klass = mrb_obj_iv_get(mrb, (struct RObject *)c,
                             mrb_intern_lit(mrb, "__attached__"));
      c2 = mrb_class_ptr(klass);
      if (c2->tt == MRB_TT_CLASS)
        c = c2;
    }
    c2 = c;
    for (;;) {
      c2 = mrb_class_outer_module(mrb, c2);
      if (!c2) break;
      if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) {
        return v;
      }
    }
  }
  return const_get(mrb, c, sym);
}
Exemplo n.º 3
0
static const char*
get_class_name( mrb_state *mrb, struct RClass *class_obj )
{
  struct RClass *outer;
  mrb_sym class_sym;

  outer = mrb_class_outer_module(mrb, class_obj);
  class_sym = mrb_class_sym(mrb, class_obj, outer);
  return mrb_sym2name(mrb, class_sym);
}
Exemplo n.º 4
0
mrb_value
mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
{
    struct RClass *c = mrb->ci->proc->target_class;

    if (!c) c = mrb->ci->target_class;
    if (c) {
        struct RClass *c2 = c;
        mrb_value v;

        if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
            return v;
        }
        c2 = c;
        for (;;) {
            c2 = mrb_class_outer_module(mrb, c2);
            if (!c2) break;
            if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) {
                return v;
            }
        }
    }
    return const_get(mrb, c, sym);
}
Exemplo n.º 5
0
mrb_value
mrb_class_path(mrb_state *mrb, struct RClass *c)
{
  mrb_value path;

  path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"));
  if (mrb_nil_p(path)) {
    struct RClass *outer = mrb_class_outer_module(mrb, c);
    mrb_sym sym = class_sym(mrb, c, outer);
    if (outer && outer != mrb->object_class) {
      mrb_value base = mrb_class_path(mrb, outer);
      path = mrb_str_plus(mrb, base, mrb_str_new_cstr(mrb, "::"));
      mrb_str_concat(mrb, path, mrb_str_new_cstr(mrb, mrb_sym2name(mrb, sym)));
    }
    else if (sym == 0) {
      return mrb_nil_value();
    }
    else {
      path = mrb_str_new_cstr(mrb, mrb_sym2name(mrb, sym));
    }
    mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"), path);
  }
  return path;
}
Exemplo n.º 6
0
/*
 * Class:     org_jamruby_mruby_RClass
 * Method:    n_classOuterModule
 * Signature: (JJ)J
 */
JNIEXPORT jlong JNICALL Java_org_jamruby_mruby_RClass_n_1classOuterModule
  (JNIEnv *env, jclass, jlong mrb, jlong c)
{
	RClass * const cls = mrb_class_outer_module(to_ptr<mrb_state>(mrb), to_ptr<RClass>(c));
	return to_jlong(cls);
}