public override IEnumerable <string> GetDynamicMemberNames() { var self = (IRubyObject)Value; RubyInstanceData instanceData = self.GetInstanceData(); RubyModule theClass = (instanceData != null ? instanceData.ImmediateClass : null); theClass = theClass ?? self.Class; var names = new List <string>(); theClass.ForEachMember(true, RubyMethodAttributes.DefaultVisibility, delegate(string /*!*/ name, RubyMemberInfo /*!*/ member) { names.Add(name); }); return(names); }
public object Invoke <TScope>(CallSite /*!*/ callSite, TScope /*!*/ scope, object self) { IRubyObject obj = self as IRubyObject; if (obj != null && obj.ImmediateClass.Version.Method == Version) { // TODO: optimize RubyInstanceData data = obj.TryGetInstanceData(); return((data != null) ? data.GetInstanceVariable(Name) : null); } else { return(((CallSite <Func <CallSite, TScope, object, object> >)callSite).Update(callSite, scope, self)); } }
private void CopyInstanceDataFrom(IRubyObject /*!*/ source, bool copyFrozenState) { // copy instance data, but not the state: var sourceData = source.TryGetInstanceData(); if (sourceData != null) { _instanceData = new RubyInstanceData(); sourceData.CopyInstanceVariablesTo(_instanceData); } // copy flags: SetTaint(this, IsTainted(source)); if (copyFrozenState && IsFrozen(source)) { Freeze(this); } }