[NTLK] NEWT/0 set-aref bug

Matej Horvat matej.horvat at guest.arnes.si
Mon Dec 15 15:33:43 EST 2014


I have discovered a bug in NEWT/0.

Suppose we have the following function:

func()
begin
	local A := [0, 0];
	A[0] := 1;
	A[1] := 2;
	Print("Hello world!");
end

NEWT/0 incorrectly compiles the array assignments. It generates:

get-var A
push-constant 0
push-constant 1
freq-func set-aref
get-var A
push-constant 1
push-constant 2
freq-func set-aref

There should be a pop instruction after each set-aref, because the result  
is not used.

When returning from the function, the stack pointer is in this case 2  
higher than it should be, which causes problems in NSM, which has a fixed  
size stack. I am not sure how the Newton OS reacts to this.

I have already informed Makoto Nukui of this. I am just reposting this  
here as a warning as DyneTK and tntk both use NEWT/0, so they are also  
affected (I can reproduce the bug in both).

A workaround may be to use a function like

func(Array, Pos, Value)
	ArrayMunger(Array, Pos, 1, [Value], 0, 1)

and a similar kludge involving StuffByte and Ord for strings, but that is  
of course inconvenient.

Matej Horvat
http://matejhorvat.si/


More information about the NewtonTalk mailing list