public override Value Evaluate(RubyContext context) { #if DEBUG context.VM.CurrentEvalNode = this; #endif var result = new DefinedFunction(body, args, context); var fname = AstParser.GetNamePathFinalName(name); if (fname == VM.INITIALIZE) { result.isConstructor = true; } if (context.Module != null) { context.Module.SetInstanceMethod(fname, result); } else { // context.Self.c.SetInstanceMethod ( AstParser.GetNamePathFinalName ( name ), result ); (( RClass )context.Self).SetInstanceMethod(fname, result); } return(null); }
public override Value Evaluate(RubyContext context) { #if DEBUG context.VM.CurrentEvalNode = this; #endif string name = AstParser.GetNamePathFinalName(this.name); RClass target = (context.Self is RClass) ? ( RClass )context.Self : null; Value value = null; if (context.Module != null) { if (context.Module.constants.HasLocalValue(name)) { value = context.Module.constants.GetLocalValue(name); } } else if (context.HasValue(name)) { value = context.GetValue(name); } if (value == null || !(value is RClass)) { var classclass = context.RootContext.GetLocalValue("Class").As <RClass> (); var superclass = context.RootContext.GetLocalValue("Object").As <RClass> (); var parent = target == null ? context.Module : target; if (super != null) { superclass = super.Evaluate(context)?.As <RClass> (); if (superclass == null) { VM.ThrowException($"superclass '{super}' not found."); } } var newclass = context.VM.DefClass(classclass, name, superclass, parent); value = Value.Class(newclass); if (context.VM.IsCustomClass(superclass)) { context.VM.WriteCustomClassFlag(newclass, context.VM.GetCustomClassType(superclass)); context.VM.WriteCustomClassRClass(newclass, context.VM.GetCustomClassRClass(superclass)); } if (parent == null) { context.RootContext.SetLocalValue(name, value); } else { parent.constants.SetLocalValue(name, value); } } var dclass = value.As <RClass> (); RubyContext classcontext = context.VM.NewContext(dclass, context); body.Evaluate(classcontext); return(null); }