Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Замена Ldnull на Ldc_I4_0 #3117

Merged
merged 2 commits into from
May 11, 2024
Merged

Conversation

SunSerega
Copy link
Contributor

ldnull лучше чем ldc0 когда речь идёт об указателях и IntPtr, но mono об этом не знает.

Данный пулл исправляет проблему из этой темы на форуме:

https://forum.mmcs.sfedu.ru/t/kak-rabotat-so-svyazannymi-spiskami-zapisyami-pod-linux/4225/13

Обходя эту issue mono:

mono/mono#20709

Путём замены всех OpCodes.Ldnull на OpCodes.Ldc_I4_0 в компиляторе.

@SunSerega SunSerega requested a review from ibond84 May 9, 2024 13:24
@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

C# генерит ldnull. Почему вы решили, что ldc_0 и ldnull эквивалентны.

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

Под линукс надо генерить ldc_0. А под .NET ничего нельзя ломать!

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

Посмотрел детальнее. null для указателей генерится с ldc.i4.0

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

null для ссылочных типов ldnull

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

Ну то есть, как обычно, в IL все опять сложно и навороченно и нужны типизорованные null в семантике. А мона слишком строга к IL-коду.

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

Хотя нет. В type хранится конкретный тип nil

public override void visit(INullConstantNode value)
        {
            il.Emit(OpCodes.Ldnull);
        }

@ibond84
Copy link
Contributor

ibond84 commented May 10, 2024

Просто добавьте проверку на указатель и все. А все остальные ldnull не надо трогать

@SunSerega
Copy link
Contributor Author

	//Интерфейс, представляющий индексируемый с 0 массив.
	public interface IRefTypeNode : ITypeNode
	{
		ITypeNode pointed_type
		{
			get;
		}
	}

Кхммм... Это указатель что ли? Потому что "ref" это обычно ссылка, а комментарий вообще про массивы говорит...

@ibond84 ibond84 merged commit 61e5aed into pascalabcnet:master May 11, 2024
1 check passed
@SunSerega SunSerega deleted the ldnull-ldc0 branch May 12, 2024 09:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants