예제 #1
0
        public Value Invoke(Value self, RubyContext context, IList <Value> values)
        {
            RubyContext newContext = context.VM.NewContext(context.VM.rb_obj_ptr(self), this.context);

            int k = 0;

            // int cv = values.Count;

            foreach (var parameter in parameters.args)
            {
                switch (parameter.type)
                {
                case AstNodeType.CONST:
                case AstNodeType.LVAR:
                case AstNodeType.SYM:
                    newContext.SetLocalValue(
                        (parameter as INamedNode).name,
                        context.VM.GetArg <Value> (values, k)
                        );
                    k++;
                    break;

                default:
                    Console.WriteLine($"DefinedFunction::Invoke param type: {parameter.type} 未实现");
                    break;
                }
            }

            // if ( isConstructor ) {
            //  body.Evaluate ( newContext );
            //  return self;
            // }

            return(body.Evaluate(newContext));
        }
예제 #2
0
        public override Value Evaluate(RubyContext context)
        {
#if DEBUG
            context.VM.CurrentEvalNode = this;
#endif

            Value ret = cdr.Evaluate(context);

            switch (car.type)
            {
            case AstNodeType.GVAR:
                context.RootContext.SetLocalValue((( INamedNode )car).name, ret);
                return(ret);

            case AstNodeType.SYM:
            case AstNodeType.CONST:
            case AstNodeType.LVAR:
                context.SetLocalValue((( INamedNode )car).name, ret);
                return(ret);

            case AstNodeType.CVAR:
                context.Self.SingletonClass.SetIV((( INamedNode )car).name, ret);
                return(ret);

            case AstNodeType.IVAR:
                context.Self.SetIV((( INamedNode )car).name, ret);
                return(ret);

            case AstNodeType.AREF:
                var arrayRefNode = car.As <ArrayRefNode> ();
                var array        = arrayRefNode.car.Evaluate(context);
                var indexed      = arrayRefNode.cdr.Evaluate(context);
                context.VM.FunctionCall(array, "[]=", new [] { indexed, ret });
                break;

            case AstNodeType.DOT:
            default:
                VM.ThrowException($"AsgnNode type: {car.type} not impl.");
                break;
            }

            return(ret);
        }