コード例 #1
0
ファイル: HybType.cs プロジェクト: MonarchSolutions/SlowSharp
        private HybInstance CreateInstanceInterpretType(Runner runner, HybInstance[] args,
                                                        object parentObject = null)
        {
            var inst  = new HybInstance(runner, this, InterpretKlass, parentObject);
            var ctors = GetMethods("$_ctor");

            if (ctors.Length > 0)
            {
                var ctor = OverloadingResolver
                           .FindMethodWithArguments(runner.Resolver, ctors, new HybType[] { }, ref args);
                ctor.Target.Invoke(inst, args);
            }

            return(inst);
        }
コード例 #2
0
ファイル: Runner.Expression.cs プロジェクト: ru-ace/SlowSharp
        private void ProcessArrayInitializer(HybInstance inst, InitializerExpressionSyntax init)
        {
            var addMethods = inst.GetMethods("Add");

            foreach (var expr in init.Expressions)
            {
                if (expr is AssignmentExpressionSyntax)
                {
                    throw new SemanticViolationException("");
                }

                var value   = RunExpression(expr);
                var addArgs = new HybInstance[] { value };
                var method  = OverloadingResolver.FindMethodWithArguments(
                    Resolver, addMethods, new HybType[] { }, ref addArgs);

                method.Target.Invoke(inst, addArgs);
            }
        }
コード例 #3
0
        public HybInstance Invoke(string name, params object[] args)
        {
            var wrappedArgs = args.Wrap();
            var methods     = GetMethods(name);

            if (methods.Length == 0)
            {
                throw new ArgumentException($"No such method: {name}");
            }

            var method = OverloadingResolver.FindMethodWithArguments(
                Runner.Resolver, methods, new HybType[] { }, ref wrappedArgs);

            if (method == null)
            {
                throw new ArgumentException($"No matching override found: {name}");
            }

            if (method.DeclaringType == Type)
            {
                return(method.Target.Invoke(this, wrappedArgs));
            }
            return(method.Target.Invoke(Parent, wrappedArgs));
        }
コード例 #4
0
        private void ProcessInitializer(HybInstance inst, InitializerExpressionSyntax init)
        {
            if (IsDictionaryAddible(inst, init))
            {
                var setMethod = inst.GetSetIndexerMethod();
                foreach (var expr in init.Expressions)
                {
                    if (expr is AssignmentExpressionSyntax assign)
                    {
                        var right = RunExpression(assign.Right);
                        if (assign.Left is ImplicitElementAccessSyntax ea)
                        {
                            var args  = new HybInstance[ea.ArgumentList.Arguments.Count];
                            var count = 0;
                            foreach (var arg in ea.ArgumentList.Arguments)
                            {
                                args[count++] = RunExpression(arg.Expression);
                            }

                            inst.SetIndexer(args, right);
                        }
                    }
                    else if (expr is InitializerExpressionSyntax initializer)
                    {
                        var left  = RunExpression(initializer.Expressions[0]);
                        var right = RunExpression(initializer.Expressions[1]);
                        inst.SetIndexer(new HybInstance[] { left }, right);
                    }
                    else
                    {
                        throw new SemanticViolationException("");
                    }
                }
            }
            else if (IsArrayAddible(inst))
            {
                var addMethods = inst.GetMethods("Add");
                foreach (var expr in init.Expressions)
                {
                    if (expr is AssignmentExpressionSyntax)
                    {
                        throw new SemanticViolationException("");
                    }

                    var value   = RunExpression(expr);
                    var addArgs = new HybInstance[] { value };
                    var method  = OverloadingResolver.FindMethodWithArguments(
                        Resolver, addMethods, new HybType[] { }, ref addArgs);

                    method.Target.Invoke(inst, addArgs);
                }
            }
            else
            {
                foreach (var expr in init.Expressions)
                {
                    if (expr is AssignmentExpressionSyntax assign)
                    {
                        var id    = (IdentifierNameSyntax)assign.Left;
                        var value = RunExpression(assign.Right);
                        if (inst.SetPropertyOrField($"{id.Identifier}", value) == false)
                        {
                            throw new SemanticViolationException($"No such member: {id}");
                        }
                    }
                    else
                    {
                        throw new SemanticViolationException("");
                    }
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Runs invocation expression.
        ///   [Syntax] Console.WriteLine("Hello World");
        ///            Foo(1234);
        /// </summary>
        private HybInstance RunInvocation(InvocationExpressionSyntax node)
        {
            string      calleeId = "";
            string      targetId = "";
            HybInstance callee   = null;

            SSMethodInfo[] callsite            = null;
            HybType[]      implicitGenericArgs = null;

            var(args, hasRefOrOut) = ResolveArgumentList(node.ArgumentList);

            if (node.Expression is MemberAccessExpressionSyntax ma)
            {
                var leftIsType = false;
                var rightName  = $"{ma.Name.Identifier}";

                implicitGenericArgs = ResolveGenericArgumentsFromName(ma.Name);

                if (ma.Expression is PredefinedTypeSyntax pd)
                {
                    HybType leftType = null;
                    leftIsType = true;
                    leftType   = Resolver.GetType($"{pd}");
                    callsite   = leftType.GetStaticMethods(rightName);
                }
                else if (ma.Expression is IdentifierNameSyntax id)
                {
                    HybType leftType = null;
                    if (Resolver.TryGetType($"{id.Identifier}", out leftType))
                    {
                        leftIsType = true;
                        callsite   = leftType.GetStaticMethods(rightName);
                    }
                    else
                    {
                        callee   = ResolveId(id);
                        callsite = callee.GetMethods(rightName);
                    }

                    calleeId = $"{id.Identifier}";
                }
                else if (ma.Expression is ExpressionSyntax expr)
                {
                    callee   = RunExpression(expr);
                    callsite = callee.GetMethods($"{ma.Name}");
                }

                if (leftIsType == false &&
                    callsite.Length == 0)
                {
                    callsite = ExtResolver.GetCallablegExtensions(callee, $"{ma.Name}");

                    args = (new HybInstance[] { callee }).Concat(args).ToArray();
                }

                targetId = $"{ma.Name}";
                //callsite = ResolveMemberAccess(node.Expression as MemberAccessExpressionSyntax);
            }
            else if (node.Expression is SimpleNameSyntax ||
                     node.Expression is MemberBindingExpressionSyntax)
            {
                SimpleNameSyntax id = node.Expression as SimpleNameSyntax;
                if (id == null)
                {
                    id     = (node.Expression as MemberBindingExpressionSyntax)?.Name;
                    callee = Ctx._bound;
                }
                else
                {
                    callee = Ctx._this;
                }

                implicitGenericArgs = ResolveGenericArgumentsFromName(id);
                callsite            =
                    ResolveLocalMember(id)
                    .Concat(Ctx.Method.DeclaringType.GetStaticMethods(id.Identifier.Text))
                    .ToArray();
                targetId = id.Identifier.Text;
            }

            if (callsite.Length == 0)
            {
                throw new NoSuchMethodException($"{calleeId}", targetId);
            }

            var method = OverloadingResolver.FindMethodWithArguments(
                Resolver,
                callsite,
                implicitGenericArgs.ToArray(),
                ref args);

            if (method == null)
            {
                throw new SemanticViolationException($"No matching override for `{targetId}`");
            }

            if (callee != null && method.DeclaringType.Parent == callee.GetHybType())
            {
                callee = callee.Parent;
            }

            var ret = method.Target.Invoke(callee, args, hasRefOrOut);

            // post-invoke
            if (hasRefOrOut)
            {
                var count = 0;
                foreach (var arg in node.ArgumentList.Arguments)
                {
                    if (arg.RefKindKeyword != null)
                    {
                        RunAssign(arg.Expression, args[count]);
                    }
                    count++;
                }
            }

            return(ret);
        }