CIL (MSIL) рекурсия хвостового вызова в экземплярах методов - PullRequest
3 голосов
/ 09 февраля 2012

Справочная информация: я программирую компилятор .NET (очень похожий на C #) для школьного проекта.Одна из возможностей, которую я сейчас пытаюсь добавить, - это рекурсия хвостового вызова в методах.

Дополнительная информация: В CIL «this» передается в методы экземпляра, как если бы это был просто еще один аргумент.Таким образом, при доступе к первому аргументу статического метода вы бы выдавали ldarg.0, но при доступе к первому аргументу метода экземпляра вы бы испускали ldarg.1, а доступ к «this» в методе экземпляра вы бы испускали ldarg.0,(Методы экземпляра даже больше похожи на методы расширения, чем я когда-либо себе представлял.)

Вопрос: Можете ли вы установить «this», используя starg.0 без каких-либо побочных эффектов?

Почему это под вопросом: Является или нет метод методом экземпляра, задается с помощью MethodBuilder, который является чем-то вроде черного ящика.Хотя «это» выглядит как любой другой аргумент, я знаю, что некоторые JIT-компиляторы отслеживают «это» отдельно и изменяют свое поведение в зависимости от этого значения.Если при установке «this» в методе экземпляра возникают побочные эффекты, то как их избежать?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Возможно, вы захотите взглянуть на , как F # реализует хвостовой вызов .

1 голос
/ 09 февраля 2012

Вы можете извлечь это как локальную переменную.Таким образом, вы будете знать, что вы можете установить его безопасно.(Надеюсь, я правильно понял ваш вопрос)

...