本文整理汇总了C++中RCLASS_IV_TBL函数的典型用法代码示例。如果您正苦于以下问题:C++ RCLASS_IV_TBL函数的具体用法?C++ RCLASS_IV_TBL怎么用?C++ RCLASS_IV_TBL使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RCLASS_IV_TBL函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: add_module
static void add_module(VALUE self, VALUE module)
{
VALUE super = RCLASS_SUPER(rb_singleton_class(self));
#ifdef RUBY_19
VALUE klass = class_alloc(T_ICLASS, rb_cClass);
#else
NEWOBJ(klass, struct RClass);
OBJSETUP(klass, rb_cClass, T_ICLASS);
#endif
if (BUILTIN_TYPE(module) == T_ICLASS) {
module = KLASS_OF(module);
}
if (!RCLASS_IV_TBL(module)) {
RCLASS_IV_TBL(module) = (void*)st_init_numtable();
}
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
RCLASS_SUPER(klass) = super;
if (TYPE(module) == T_ICLASS) {
KLASS_OF(klass) = KLASS_OF(module);
} else {
KLASS_OF(klass) = module;
}
OBJ_INFECT(klass, module);
OBJ_INFECT(klass, super);
RCLASS_SUPER(rb_singleton_class(self)) = (VALUE)klass;
}
开发者ID:kristianmandrup,项目名称:mixology,代码行数:32,代码来源:mixology.c
示例2: rb_mod_init_copy
/* :nodoc: */
VALUE
rb_mod_init_copy(VALUE clone, VALUE orig)
{
rb_obj_init_copy(clone, orig);
if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
RBASIC(clone)->klass = rb_singleton_class_clone(orig);
}
RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
if (RCLASS_IV_TBL(orig)) {
ID id;
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
CONST_ID(id, "__classpath__");
st_delete(RCLASS_IV_TBL(clone), (st_data_t*)&id, 0);
CONST_ID(id, "__classid__");
st_delete(RCLASS_IV_TBL(clone), (st_data_t*)&id, 0);
}
if (RCLASS_M_TBL(orig)) {
struct clone_method_data data;
data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
data.klass = clone;
st_foreach(RCLASS_M_TBL(orig), clone_method,
(st_data_t)&data);
}
return clone;
}
开发者ID:technohippy,项目名称:oruby,代码行数:28,代码来源:class.c
示例3: create_class_restorer
static VALUE create_class_restorer(VALUE klass)
{
/* On Ruby 1.8, there is a check in marshal_dump() to ensure that
* the object being dumped has no modifications to its singleton
* class (e.g. no singleton instance variables, and no singleton
* methods defined). Since we need to dump the class's singleton
* class in order to dump class methods, we need a way around this
* restriction. The solution found here temporarily removes the
* singleton instance variables and singleton methods while the
* class is being dumped, and sets a special singleton instance
* variable that restores the tables when dumping is complete. A
* hack for sure, but it seems to work.
*/
struct RClass * singleton_class = RCLASS(CLASS_OF(klass));
struct Class_Restorer * class_restorer;
if(!RCLASS_IV_TBL(singleton_class))
{
rb_raise(
rb_eTypeError,
"can't dump singleton class on Ruby 1.8 without iv_tbl");
}
class_restorer = ALLOC(struct Class_Restorer);
class_restorer->klass = CLASS_OF(klass);
class_restorer->m_tbl = *RCLASS_M_TBL(singleton_class);
class_restorer->iv_tbl = *RCLASS_IV_TBL(singleton_class);
#ifndef RUBY_VM
class_restorer->thread_critical = rb_thread_critical;
#endif
return Data_Wrap_Struct(
rb_cClass_Restorer, mark_class_restorer, ruby_xfree,
class_restorer);
}
开发者ID:shmulim,项目名称:ruby-internal,代码行数:34,代码来源:module.c
示例4: include_class_new
static VALUE
include_class_new(VALUE module, VALUE super)
{
VALUE klass = class_alloc(T_ICLASS, rb_cClass);
if (BUILTIN_TYPE(module) == T_ICLASS) {
module = RBASIC(module)->klass;
}
if (!RCLASS_IV_TBL(module)) {
RCLASS_IV_TBL(module) = st_init_numtable();
}
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
RCLASS_SUPER(klass) = super;
if (TYPE(module) == T_ICLASS) {
RBASIC(klass)->klass = RBASIC(module)->klass;
}
else {
RBASIC(klass)->klass = module;
}
OBJ_INFECT(klass, module);
OBJ_INFECT(klass, super);
return (VALUE)klass;
}
开发者ID:technohippy,项目名称:oruby,代码行数:25,代码来源:class.c
示例5: rb_singleton_class_clone
VALUE
rb_singleton_class_clone(VALUE obj)
{
VALUE klass = RBASIC(obj)->klass;
if (!FL_TEST(klass, FL_SINGLETON))
return klass;
else {
struct clone_method_data data;
/* copy singleton(unnamed) class */
VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
if (BUILTIN_TYPE(obj) == T_CLASS) {
RBASIC(clone)->klass = (VALUE)clone;
}
else {
RBASIC(clone)->klass = rb_singleton_class_clone(klass);
}
RCLASS_SUPER(clone) = RCLASS_SUPER(klass);
if (RCLASS_IV_TBL(klass)) {
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
}
RCLASS_M_TBL(clone) = st_init_numtable();
data.tbl = RCLASS_M_TBL(clone);
data.klass = (VALUE)clone;
st_foreach(RCLASS_M_TBL(klass), clone_method,
(st_data_t)&data);
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
FL_SET(clone, FL_SINGLETON);
return (VALUE)clone;
}
}
开发者ID:technohippy,项目名称:oruby,代码行数:33,代码来源:class.c
示例6: evilr_singleton_class_instance
/* call-seq:
* singleton_class_instance -> Object || nil
*
* Returns the object attached to the singleton class.
* If the class does not have an object attached to it (possibly because
* it isn't a singleton class), returns +nil+. */
static VALUE evilr_singleton_class_instance(VALUE klass) {
VALUE obj;
if(RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass), evilr__attached, &obj)) {
return obj;
}
return Qnil;
}
开发者ID:jeremyevans,项目名称:evilr,代码行数:13,代码来源:evilr.c
示例7: find_class_path
static VALUE
find_class_path(VALUE klass)
{
struct fc_result arg;
arg.name = 0;
arg.path = 0;
arg.klass = klass;
arg.track = rb_cObject;
arg.prev = 0;
if (RCLASS_CONST_TBL(rb_cObject)) {
st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
}
if (arg.path == 0) {
st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
}
if (arg.path) {
st_data_t tmp = tmp_classpath;
if (!RCLASS_IV_TBL(klass)) {
RCLASS_IV_TBL(klass) = st_init_numtable();
}
st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path);
st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
return arg.path;
}
return Qnil;
}
开发者ID:alexanderblair,项目名称:Gemdata,代码行数:27,代码来源:variable.c
示例8: classname
static VALUE
classname(VALUE klass)
{
VALUE path = Qnil;
st_data_t n;
if (!klass) klass = rb_cObject;
if (RCLASS_IV_TBL(klass)) {
if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
return find_class_path(klass);
}
path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
OBJ_FREEZE(path);
st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, (st_data_t)path);
n = classid;
st_delete(RCLASS_IV_TBL(klass), &n, 0);
}
else {
path = (VALUE)n;
}
if (TYPE(path) != T_STRING) {
rb_bug("class path is not set properly");
}
return path;
}
return find_class_path(klass);
}
开发者ID:alexanderblair,项目名称:Gemdata,代码行数:28,代码来源:variable.c
示例9: rb_class_path
VALUE
rb_class_path(VALUE klass)
{
VALUE path = classname(klass);
st_data_t n = (st_data_t)path;
if (!NIL_P(path)) return path;
if (RCLASS_IV_TBL(klass) && st_lookup(RCLASS_IV_TBL(klass),
(st_data_t)tmp_classpath, &n)) {
return (VALUE)n;
}
else {
const char *s = "Class";
if (TYPE(klass) == T_MODULE) {
if (rb_obj_class(klass) == rb_cModule) {
s = "Module";
}
else {
s = rb_class2name(RBASIC(klass)->klass);
}
}
path = rb_sprintf("#<%s:%p>", s, (void*)klass);
OBJ_FREEZE(path);
rb_ivar_set(klass, tmp_classpath, path);
return path;
}
}
开发者ID:alexanderblair,项目名称:Gemdata,代码行数:29,代码来源:variable.c
示例10: rb_include_class_new
VALUE
rb_include_class_new(VALUE module, VALUE super)
{
VALUE klass = class_alloc(T_ICLASS, rb_cClass);
if (BUILTIN_TYPE(module) == T_ICLASS) {
module = RBASIC(module)->klass;
}
if (!RCLASS_IV_TBL(module)) {
RCLASS_IV_TBL(module) = st_init_numtable();
}
if (!RCLASS_CONST_TBL(module)) {
RCLASS_CONST_TBL(module) = st_init_numtable();
}
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
RCLASS_M_TBL_WRAPPER(OBJ_WB_UNPROTECT(klass)) =
RCLASS_M_TBL_WRAPPER(OBJ_WB_UNPROTECT(RCLASS_ORIGIN(module)));
RCLASS_SET_SUPER(klass, super);
if (RB_TYPE_P(module, T_ICLASS)) {
RBASIC_SET_CLASS(klass, RBASIC(module)->klass);
}
else {
RBASIC_SET_CLASS(klass, module);
}
OBJ_INFECT(klass, module);
OBJ_INFECT(klass, super);
return (VALUE)klass;
}
开发者ID:Danylyuk,项目名称:first_app,代码行数:32,代码来源:class.c
示例11: fc_path
static VALUE
fc_path(struct fc_result *fc, ID name)
{
VALUE path, tmp;
path = rb_str_dup(rb_id2str(name));
while (fc) {
st_data_t n;
if (fc->track == rb_cObject) break;
if (RCLASS_IV_TBL(fc->track) &&
st_lookup(RCLASS_IV_TBL(fc->track), (st_data_t)classpath, &n)) {
tmp = rb_str_dup((VALUE)n);
rb_str_cat2(tmp, "::");
rb_str_append(tmp, path);
path = tmp;
break;
}
tmp = rb_str_dup(rb_id2str(fc->name));
rb_str_cat2(tmp, "::");
rb_str_append(tmp, path);
path = tmp;
fc = fc->prev;
}
OBJ_FREEZE(path);
return path;
}
开发者ID:alexanderblair,项目名称:Gemdata,代码行数:26,代码来源:variable.c
示例12: evilr_detach_singleton
/* call-seq:
* detach_singleton -> self
*
* If the receiver is a singleton class, it is transformed into a
* regular class and it is detached from the instance. Note that
* this means it becomes the class of the object to which it was previous
* attached. If the receiver is not a singleton class, has no effect.
* Returns the receiver. */
static VALUE evilr_detach_singleton(VALUE klass) {
if (IS_SINGLETON_CLASS(klass)) {
FL_UNSET(klass, FL_SINGLETON);
if (RCLASS_IV_TBL(klass)) {
st_delete(RCLASS_IV_TBL(klass), (st_data_t*)&evilr__attached, 0);
}
}
return klass;
}
开发者ID:jeremyevans,项目名称:evilr,代码行数:17,代码来源:evilr.c
示例13: rb_singleton_class_attached
/*!
* Attach a object to a singleton class.
* @pre \a klass is the singleton class of \a obj.
*/
void
rb_singleton_class_attached(VALUE klass, VALUE obj)
{
if (FL_TEST(klass, FL_SINGLETON)) {
if (!RCLASS_IV_TBL(klass)) {
RCLASS_IV_TBL(klass) = st_init_numtable();
}
st_insert(RCLASS_IV_TBL(klass), id_attached, obj);
}
}
开发者ID:fi8on,项目名称:ruby,代码行数:14,代码来源:class.c
示例14: rb_singleton_class_attached
void
rb_singleton_class_attached(VALUE klass, VALUE obj)
{
if (FL_TEST(klass, FL_SINGLETON)) {
ID attached;
if (!RCLASS_IV_TBL(klass)) {
RCLASS_IV_TBL(klass) = st_init_numtable();
}
CONST_ID(attached, "__attached__");
st_insert(RCLASS_IV_TBL(klass), attached, obj);
}
}
开发者ID:technohippy,项目名称:oruby,代码行数:12,代码来源:class.c
示例15: rb_reset_tbls
VALUE
rb_reset_tbls(VALUE self)
{
RCLASS_IV_TBL(self) = (struct st_table *) 0;
RCLASS_M_TBL(self) = (struct st_table *) st_init_numtable();
return Qnil;
}
开发者ID:RavensKrag,项目名称:texplay,代码行数:7,代码来源:object2module.c
示例16: j_class_new
/* a modified version of include_class_new from class.c */
static VALUE
j_class_new(VALUE module, VALUE sup)
{
#ifdef RUBY_19
VALUE klass = class_alloc(T_ICLASS, rb_cClass);
#else
NEWOBJ(klass, struct RClass);
OBJSETUP(klass, rb_cClass, T_ICLASS);
#endif
if (BUILTIN_TYPE(module) == T_ICLASS) {
module = KLASS_OF(module);
}
if (!RCLASS_IV_TBL(module)) {
RCLASS_IV_TBL(module) = (struct st_table *)st_init_numtable();
}
/* assign iv_tbl, m_tbl and super */
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
RCLASS_SUPER(klass) = sup;
if(TYPE(module) != T_OBJECT) {
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
}
else {
RCLASS_M_TBL(klass) = RCLASS_M_TBL(CLASS_OF(module));
}
/* */
if (TYPE(module) == T_ICLASS) {
KLASS_OF(klass) = KLASS_OF(module);
}
else {
KLASS_OF(klass) = module;
}
if(TYPE(module) != T_OBJECT) {
OBJ_INFECT(klass, module);
OBJ_INFECT(klass, sup);
}
return (VALUE)klass;
}
开发者ID:RavensKrag,项目名称:texplay,代码行数:47,代码来源:object2module.c
示例17: set_class_restore_state
static void set_class_restore_state(VALUE klass)
{
struct RClass * singleton_class = RCLASS(CLASS_OF(klass));
RCLASS_IV_TBL(singleton_class)->num_entries = 1;
RCLASS_M_TBL(singleton_class)->num_entries = 0;
#ifndef RUBY_VM
rb_thread_critical = 1;
#endif
}
开发者ID:shmulim,项目名称:ruby-internal,代码行数:9,代码来源:module.c
示例18: evilr_swap_instance_variables
/* call-seq:
* swap_instance_variables(other) -> self
*
* Swaps only the instance variables of the receiver and +other+.
* You can only swap the instance variables between two objects that
* use the internal type number T_OBJECT, or between Classes and Modules.
* You cannot swap instance variables of immediate values, since they
* do not have instance variables. Invalid swap attempts will raise
* +TypeError+. */
static VALUE evilr_swap_instance_variables(VALUE self, VALUE other) {
#ifndef RUBY19
struct st_table *tmp;
#endif
evilr__check_immediates(self, other);
switch(BUILTIN_TYPE(self)) {
case T_OBJECT:
if (BUILTIN_TYPE(other) != T_OBJECT) {
goto bad_types;
}
break;
case T_MODULE:
case T_CLASS:
if (BUILTIN_TYPE(other) != T_MODULE && BUILTIN_TYPE(other) != T_CLASS) {
goto bad_types;
}
break;
default:
bad_types:
rb_raise(rb_eTypeError, "incompatible types used");
}
#ifdef RUBY19
if (BUILTIN_TYPE(self) == T_MODULE || BUILTIN_TYPE(self) == T_CLASS) {
struct st_table *tmp;
tmp = RCLASS_IV_TBL(self);
RCLASS(self)->ptr->iv_tbl = RCLASS_IV_TBL(other);
RCLASS(other)->ptr->iv_tbl = tmp;
} else {
char tmp[OBJECT_SIZE];
memcpy(tmp, &(ROBJECT(self)->as), sizeof(ROBJECT(tmp)->as));
memcpy(&(ROBJECT(self)->as), &(ROBJECT(other)->as), sizeof(ROBJECT(self)->as));
memcpy(&(ROBJECT(other)->as), tmp, sizeof(ROBJECT(other)->as));
}
#else
/* RClass and RObject have iv_tbl at same position in the structure
* so no funny business is needed */
tmp = ROBJECT_IVPTR(self);
ROBJECT(self)->iv_tbl = ROBJECT_IVPTR(other);
ROBJECT(other)->iv_tbl = tmp;
#endif
return self;
}
开发者ID:jeremyevans,项目名称:evilr,代码行数:53,代码来源:evilr.c
示例19: Looksee_singleton_instance
VALUE Looksee_singleton_instance(VALUE self, VALUE klass) {
if (!SPECIAL_CONST_P(klass) && BUILTIN_TYPE(klass) == T_CLASS && FL_TEST(klass, FL_SINGLETON)) {
VALUE object;
if (!Looksee_method_table_lookup(RCLASS_IV_TBL(klass), rb_intern("__attached__"), (st_data_t *)&object))
rb_raise(rb_eRuntimeError, "[looksee bug] can't find singleton object");
return object;
} else {
return Qnil;
}
}
开发者ID:mathieujobin,项目名称:looksee,代码行数:10,代码来源:mri.c
示例20: Looksee_singleton_instance
VALUE Looksee_singleton_instance(VALUE self, VALUE singleton_class) {
if (BUILTIN_TYPE(singleton_class) == T_CLASS && FL_TEST(singleton_class, FL_SINGLETON)) {
VALUE object;
if (!Looksee_method_table_lookup(RCLASS_IV_TBL(singleton_class), rb_intern("__attached__"), (st_data_t *)&object))
rb_raise(rb_eRuntimeError, "[looksee bug] can't find singleton object");
return object;
} else {
rb_raise(rb_eTypeError, "expected singleton class, got %s", rb_obj_classname(singleton_class));
}
}
开发者ID:hkraji,项目名称:looksee,代码行数:10,代码来源:mri.c
注:本文中的RCLASS_IV_TBL函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论