Beispiel #1
0
        /// <summary>
        /// Resume the continuation that spawned the current one
        /// </summary>
        private new void Resume()
        {
            if (!RPop(out var next))
            {
                Break();
                return;
            }

            switch (next)
            {
            case ICallable call:
                call.Invoke(_registry, DataStack);
                break;

            case IClassBase @class:
                Push(@class.NewInstance());
                break;

            case MethodInfo mi:
                var numArgs = mi.GetParameters().Length;
                if (DataStack.Count < numArgs + 1)
                {
                    var servant = DataStack.Count > 0 ? DataStack.Peek() : "null";
                    throw new NotEnoughArgumentsException($"{servant}.{mi.Name} expects {numArgs} args");
                }

                var obj  = Pop();
                var args = new object[numArgs];
                for (var n = 0; n < numArgs; ++n)
                {
                    args[numArgs - n - 1] = Pop();
                }
                var ret = mi.Invoke(obj, args);
                if (mi.ReturnType != typeof(void))
                {
                    Push(ret);
                }
                break;

            default:
                PushContext(next);
                _current = null;
                break;
            }

            Break();
        }