def test_globals(self, space): space.stuff = 4 g = GlobalsDict() g.define_virtual("x", lambda s: s.stuff) assert g.get(space, "x") == 4 with self.raises(space, "NameError"): g.set(space, "x", 5) g.define_virtual("y", lambda s: s.stuff, lambda s, v: setattr(s, "stuff", v)) assert g.get(space, "y") == 4 g.set(space, "y", 5) assert g.get(space, "y") == 5
def __init__(self, config): self.config = config self.cache = SpaceCache(self) self.symbol_cache = {} self._executioncontexts = ExecutionContextHolder() self.globals = GlobalsDict() self.bootstrap = True self.exit_handlers_w = [] self.w_true = W_TrueObject(self) self.w_false = W_FalseObject(self) self.w_nil = W_NilObject(self) # Force the setup of a few key classes, we create a fake "Class" class # for the initial bootstrap. self.w_class = self.newclass("FakeClass", None) cls_reference = weakref.ref(self.w_class) self.w_basicobject = self.getclassfor(W_BaseObject) self.w_object = self.getclassfor(W_Object) self.w_class = self.getclassfor(W_ClassObject) # We replace the one reference to our FakeClass with the real class. self.w_basicobject.klass.superclass = self.w_class gc.collect() assert cls_reference() is None self.w_symbol = self.getclassfor(W_SymbolObject) self.w_array = self.getclassfor(W_ArrayObject) self.w_proc = self.getclassfor(W_ProcObject) self.w_binding = self.getclassfor(W_BindingObject) self.w_numeric = self.getclassfor(W_NumericObject) self.w_fixnum = self.getclassfor(W_FixnumObject) self.w_float = self.getclassfor(W_FloatObject) self.w_bignum = self.getclassfor(W_BignumObject) self.w_integer = self.getclassfor(W_IntegerObject) self.w_module = self.getclassfor(W_ModuleObject) self.w_string = self.getclassfor(W_StringObject) self.w_regexp = self.getclassfor(W_RegexpObject) self.w_hash = self.getclassfor(W_HashObject) self.w_method = self.getclassfor(W_MethodObject) self.w_unbound_method = self.getclassfor(W_UnboundMethodObject) self.w_io = self.getclassfor(W_IOObject) self.w_NoMethodError = self.getclassfor(W_NoMethodError) self.w_ArgumentError = self.getclassfor(W_ArgumentError) self.w_LocalJumpError = self.getclassfor(W_LocalJumpError) self.w_NameError = self.getclassfor(W_NameError) self.w_NotImplementedError = self.getclassfor(W_NotImplementedError) self.w_IndexError = self.getclassfor(W_IndexError) self.w_KeyError = self.getclassfor(W_KeyError) self.w_IOError = self.getclassfor(W_IOError) self.w_EOFError = self.getclassfor(W_EOFError) self.w_FiberError = self.getclassfor(W_FiberError) self.w_LoadError = self.getclassfor(W_LoadError) self.w_RangeError = self.getclassfor(W_RangeError) self.w_FloatDomainError = self.getclassfor(W_FloatDomainError) self.w_RegexpError = self.getclassfor(W_RegexpError) self.w_RuntimeError = self.getclassfor(W_RuntimeError) self.w_StandardError = self.getclassfor(W_StandardError) self.w_StopIteration = self.getclassfor(W_StopIteration) self.w_SyntaxError = self.getclassfor(W_SyntaxError) self.w_SystemCallError = self.getclassfor(W_SystemCallError) self.w_SystemExit = self.getclassfor(W_SystemExit) self.w_SystemStackError = self.getclassfor(W_SystemStackError) self.w_TypeError = self.getclassfor(W_TypeError) self.w_ZeroDivisionError = self.getclassfor(W_ZeroDivisionError) self.w_kernel = self.getmoduleobject(Kernel.moduledef) self.w_topaz = self.getmoduleobject(Topaz.moduledef) for w_cls in [ self.w_basicobject, self.w_object, self.w_array, self.w_proc, self.w_numeric, self.w_fixnum, self.w_bignum, self.w_float, self.w_string, self.w_symbol, self.w_class, self.w_module, self.w_hash, self.w_regexp, self.w_method, self.w_unbound_method, self.w_io, self.w_binding, self.w_NoMethodError, self.w_ArgumentError, self.w_TypeError, self.w_ZeroDivisionError, self.w_SystemExit, self.w_RangeError, self.w_RegexpError, self.w_RuntimeError, self.w_SystemCallError, self.w_LoadError, self.w_StopIteration, self.w_SyntaxError, self.w_NameError, self.w_StandardError, self.w_LocalJumpError, self.w_IndexError, self.w_IOError, self.w_NotImplementedError, self.w_EOFError, self.w_FloatDomainError, self.w_FiberError, self.w_SystemStackError, self.w_KeyError, self.w_kernel, self.w_topaz, self.getclassfor(W_NilObject), self.getclassfor(W_TrueObject), self.getclassfor(W_FalseObject), self.getclassfor(W_RangeObject), self.getclassfor(W_FileObject), self.getclassfor(W_DirObject), self.getclassfor(W_EncodingObject), self.getclassfor(W_IntegerObject), self.getclassfor(W_RandomObject), self.getclassfor(W_ThreadObject), self.getclassfor(W_TimeObject), self.getclassfor(W_MethodObject), self.getclassfor(W_UnboundMethodObject), self.getclassfor(W_FiberObject), self.getclassfor(W_MatchDataObject), self.getclassfor(W_ExceptionObject), self.getclassfor(W_ThreadError), self.getmoduleobject(Comparable.moduledef), self.getmoduleobject(Enumerable.moduledef), self.getmoduleobject(Marshal.moduledef), self.getmoduleobject(Math.moduledef), self.getmoduleobject(Fcntl.moduledef), self.getmoduleobject(FFI.moduledef), self.getmoduleobject(Process.moduledef), self.getmoduleobject(Signal.moduledef), self.getmoduleobject(ObjectSpaceModule.moduledef), ]: self.set_const(self.w_object, self.str_w(self.send(w_cls, "name")), w_cls) for w_cls in [ self.getclassfor(W_EnvObject), self.getclassfor(W_HashIterator), ]: self.set_const(self.w_topaz, self.str_w(self.send(w_cls, "name")), w_cls) self.set_const(self.w_basicobject, "BasicObject", self.w_basicobject) # This is bootstrap. We have to delay sending until true, false and nil # are defined self.send(self.w_object, "include", [self.w_kernel]) self.bootstrap = False self.w_load_path = self.newarray([]) self.globals.define_virtual("$LOAD_PATH", lambda space: space.w_load_path) self.globals.define_virtual("$:", lambda space: space.w_load_path) self.globals.define_virtual( "$$", lambda space: space.send( space.getmoduleobject(Process.moduledef), "pid")) self.w_loaded_features = self.newarray([]) self.globals.define_virtual("$LOADED_FEATURES", lambda space: space.w_loaded_features) self.globals.define_virtual('$"', lambda space: space.w_loaded_features) self.w_main_thread = W_ThreadObject(self) self.w_load_path = self.newarray([]) self.base_lib_path = os.path.abspath( os.path.join( os.path.join(os.path.dirname(__file__), os.path.pardir), "lib-ruby"))