CIL (MSIL) рекурсия хвостового вызова в методах экземпляра
Фон: я программирую компилятор.NET (очень похожий на C#) для школьного проекта. Одна из возможностей, которую я сейчас пытаюсь добавить, - это рекурсия хвостового вызова в методах.
Дополнительная информация: В CIL "this" передается в методы экземпляра, как если бы это был просто еще один аргумент. Таким образом, при доступе к первому аргументу статического метода вы бы выдавали ldarg.0, но при доступе к первому аргументу метода экземпляра вы бы испускали ldarg.1, а доступ к "this" в методе экземпляра вы бы испускали ldarg.0, (Методы экземпляра даже больше похожи на методы расширения, чем я когда-либо мог себе представить.)
Вопрос: Можете ли вы установить "это" с помощью starg.0 без каких-либо побочных эффектов?
Почему это так? Вопрос о том, является ли метод экземпляром, задается с помощью MethodBuilder, который представляет собой черный ящик. Хотя "это" похоже на любой другой аргумент, я знаю, что некоторые JIT-компиляторы отслеживают "это" отдельно и изменяют свое поведение в зависимости от этого значения. Если при установке "this" в методе экземпляра возникают побочные эффекты, то как их избежать?
2 ответа
Возможно, вы захотите взглянуть на то, как F# реализует хвостовой вызов.
Вы можете извлечь это как локальную переменную. Таким образом, вы будете знать, что вы можете установить его безопасно. (Надеюсь, я правильно понял ваш вопрос)