class Namespace
Namespace is designed to provide separated spaces in a Ruby process, to isolate applications and libraries. See Namespace.
Public Class Methods
Source
static VALUE
rb_namespace_s_current(VALUE recv)
{
const rb_namespace_t *ns;
if (!rb_namespace_available())
return Qnil;
ns = rb_vm_current_namespace(GET_EC());
VM_ASSERT(ns && ns->ns_object);
return ns->ns_object;
}
Returns the current namespace. Returns nil if it is the built-in namespace. Returns false if namespace is not enabled.
Source
static VALUE
rb_namespace_s_getenabled(VALUE recv)
{
return RBOOL(rb_namespace_available());
}
Returns true if namespace is enabled.
Source
static VALUE
namespace_initialize(VALUE namespace)
{
rb_namespace_t *ns;
rb_classext_t *object_classext;
VALUE entry;
ID id_namespace_entry;
CONST_ID(id_namespace_entry, "__namespace_entry__");
if (!rb_namespace_available()) {
rb_raise(rb_eRuntimeError, "Namespace is disabled. Set RUBY_NAMESPACE=1 environment variable to use Namespace.");
}
entry = rb_class_new_instance_pass_kw(0, NULL, rb_cNamespaceEntry);
ns = get_namespace_struct_internal(entry);
ns->ns_object = namespace;
ns->ns_id = namespace_generate_id();
rb_define_singleton_method(ns->load_path, "resolve_feature_path", rb_resolve_feature_path, 1);
// Set the Namespace object unique/consistent from any namespaces to have just single
// constant table from any view of every (including main) namespace.
// If a code in the namespace adds a constant, the constant will be visible even from root/main.
RCLASS_SET_PRIME_CLASSEXT_WRITABLE(namespace, true);
// Get a clean constant table of Object even by writable one
// because ns was just created, so it has not touched any constants yet.
object_classext = RCLASS_EXT_WRITABLE_IN_NS(rb_cObject, ns);
RCLASS_SET_CONST_TBL(namespace, RCLASSEXT_CONST_TBL(object_classext), true);
rb_ivar_set(namespace, id_namespace_entry, entry);
return namespace;
}
Returns a new Namespace object.
Public Instance Methods
Source
static VALUE
rb_namespace_eval(VALUE namespace, VALUE str)
{
const rb_iseq_t *iseq;
const rb_namespace_t *ns;
StringValue(str);
iseq = rb_iseq_compile_iseq(str, rb_str_new_cstr("eval"));
VM_ASSERT(iseq);
ns = (const rb_namespace_t *)rb_get_namespace_t(namespace);
return rb_iseq_eval(iseq, ns);
}
Source
static VALUE
rb_namespace_inspect(VALUE obj)
{
rb_namespace_t *ns;
VALUE r;
if (obj == Qfalse) {
r = rb_str_new_cstr("#<Namespace:root>");
return r;
}
ns = rb_get_namespace_t(obj);
r = rb_str_new_cstr("#<Namespace:");
rb_str_concat(r, rb_funcall(LONG2NUM(ns->ns_id), rb_intern("to_s"), 0));
if (NAMESPACE_ROOT_P(ns)) {
rb_str_cat_cstr(r, ",root");
}
if (NAMESPACE_USER_P(ns)) {
rb_str_cat_cstr(r, ",user");
}
if (NAMESPACE_MAIN_P(ns)) {
rb_str_cat_cstr(r, ",main");
}
else if (NAMESPACE_OPTIONAL_P(ns)) {
rb_str_cat_cstr(r, ",optional");
}
rb_str_cat_cstr(r, ">");
return r;
}
Source
static VALUE
rb_namespace_load(int argc, VALUE *argv, VALUE namespace)
{
VALUE fname, wrap;
rb_scan_args(argc, argv, "11", &fname, &wrap);
rb_vm_frame_flag_set_ns_require(GET_EC());
VALUE args = rb_ary_new_from_args(2, fname, wrap);
return rb_load_entrypoint(args);
}
Source
static VALUE
rb_namespace_load_path(VALUE namespace)
{
VM_ASSERT(NAMESPACE_OBJ_P(namespace));
return rb_get_namespace_t(namespace)->load_path;
}
Returns namespace local load path.
Source
static VALUE
rb_namespace_require(VALUE namespace, VALUE fname)
{
rb_vm_frame_flag_set_ns_require(GET_EC());
return rb_require_string(fname);
}
Source
static VALUE
rb_namespace_require_relative(VALUE namespace, VALUE fname)
{
rb_vm_frame_flag_set_ns_require(GET_EC());
return rb_require_relative_entrypoint(fname);
}