Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }