void rb_attr(VALUE klass, ID id, int read, int write, int ex) { const char *name; int noex; if (!ex) { noex = NOEX_PUBLIC; } else { // TODO honor current scope ex noex = NOEX_PUBLIC; } if (!rb_is_local_id(id) && !rb_is_const_id(id)) { rb_name_error(id, "invalid attribute name `%s'", rb_id2name(id)); } name = rb_id2name(id); if (!name) { rb_raise(rb_eArgError, "argument needs to be symbol or string"); } rb_vm_define_attr((Class)klass, name, read, write, noex); if (write) { rb_objc_define_kvo_setter(klass, id); } }
void rb_attr(VALUE klass, ID id, int read, int write, int ex) { if (!rb_is_local_id(id) && !rb_is_const_id(id)) { rb_name_error(id, "invalid attribute name `%s'", rb_id2name(id)); } const char *name = rb_id2name(id); if (name == NULL) { rb_raise(rb_eArgError, "argument needs to be symbol or string"); } rb_vm_define_attr((Class)klass, name, read, write); if (write) { rb_objc_define_kvo_setter(klass, id); } }