LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Если использовать метки блоков, вот так будет выглядеть алгоритм с вручную развёрнутым циклом.

Но пока метки блоков я не реализовал.

attribute(hot)
word FindInNamespace(char @Name; word pNamespace)
	when pNamespace >= nDict:
		StopInternal(__FILE__, __LINE__);
	word hash = str_hash(@Name);
	word P = Dict[pNamespace].pFirst;
	label outer:
	forever loop
		label inner:
		forever loop
			when P >= nDICT:
				exit outer;
			when Dict[P].Name.Hash == hash:
				exit inner;
			P = Dict[P].pNext;
			when P >= nDICT:
				exit outer;
			when Dict[P].Name.Hash == hash:
				exit inner;
			P = Dict[P].pNext;
		end:inner

		if str_eq(@DictGetName(P), @Name) then
			return DictResolveAlias(P);
		end
		P = Dict[P].pNext;
	end:outer
	return nDICT;
end

Исходная версия wandrien, :

Если использовать метки блоков, вот так будет выглядеть алгоритм с развёрнутым циклом.

Но пока метки блоков я не реализовал.

attribute(hot)
word FindInNamespace(char @Name; word pNamespace)
	when pNamespace >= nDict:
		StopInternal(__FILE__, __LINE__);
	word hash = str_hash(@Name);
	word P = Dict[pNamespace].pFirst;
	label outer:
	forever loop
		label inner:
		forever loop
			when P >= nDICT:
				exit outer;
			when Dict[P].Name.Hash == hash:
				exit inner;
			P = Dict[P].pNext;
			when P >= nDICT:
				exit outer;
			when Dict[P].Name.Hash == hash:
				exit inner;
			P = Dict[P].pNext;
		end:inner

		if str_eq(@DictGetName(P), @Name) then
			return DictResolveAlias(P);
		end
		P = Dict[P].pNext;
	end:outer
	return nDICT;
end