@@ -16,7 +16,7 @@ interface
1616Uses System.SysUtils, System.Diagnostics, System.TimeSpan, uUtils,
1717 uMachineStack, System.generics.Collections, uListObject, uStringObject,
1818 uArrayObject, uSymbolTable, uConstantTable, uProgramCode, uMemoryManager,
19- uObjectSupport;
19+ uObjectSupport, uIntStack ;
2020
2121const
2222 MAX_STACK_SIZE = 40000 ; // Maximum depth of operand stack
@@ -65,7 +65,7 @@ TVM = class(TObject)
6565
6666 symbolTable : TSymbolTable;
6767 VMStateStack : TStack<TVMState>;
68- subscriptStack : TStack<integer>;
68+ subscriptStack : uIntStack. TStack; // lightweight integer stack
6969
7070 frameStackTop: integer;
7171 frameStack: TFrameStack;
@@ -247,7 +247,8 @@ constructor TVM.Create;
247247 createStack(MAX_STACK_SIZE);
248248 createFrameStack(recursionLimit);
249249 VMStateStack := TStack<TVMState>.Create;
250- subscriptStack := TStack<integer>.Create;
250+ // subscriptStack := TStack<integer>.Create;
251+ uIntStack.create (subscriptStack, uIntStack.MAX_ENTRIES);
251252
252253 callbackPtr := nil ;
253254 printCallbackPtr := nil ;
@@ -262,7 +263,7 @@ destructor TVM.Destroy;
262263 freeStack;
263264 freeFrameStack;
264265 VMStateStack.Free;
265- subscriptStack.Free;
266+ // subscriptStack.Free;
266267 inherited ;
267268end ;
268269
@@ -2054,22 +2055,23 @@ procedure TVM.storeIndexableArray(variable: PMachineStackRecord; index: integer;
20542055 if variable.stackType <> stArray then
20552056 raise ERuntimeException.Create(' left-hand side must be a array' );
20562057
2057- if subscriptStack.Count + 1 < nSubscripts then
2058+ // if subscriptStack.Count + 1 < nSubscripts then
2059+ if subscriptStack.stackPtr + 1 < nSubscripts then
20582060 begin
2059- subscriptStack .Push(index);
2061+ uIntStack .Push(subscriptStack, index);
20602062 push (variable);
20612063 end
20622064 else
20632065 begin
2064- subscriptStack .Push(index);
2065- setLength (idx, subscriptStack.Count );
2066+ uIntStack .Push(subscriptStack, index);
2067+ setLength (idx, subscriptStack.stackPtr );
20662068 // Index backwards since the stack entries are backwards
2067- for i := subscriptStack.Count - 1 downto 0 do
2068- idx[i] := subscriptStack .Pop();
2069+ for i := subscriptStack.stackPtr - 1 downto 0 do
2070+ idx[i] := uIntStack .Pop(subscriptStack );
20692071
20702072 variable.aValue.setValue (idx, value );
20712073
2072- subscriptStack.Clear;
2074+ subscriptStack.stackPtr := - 1 ; // Clear
20732075 end ;
20742076end ;
20752077
@@ -2270,9 +2272,9 @@ procedure TVM.loadIndexableArray(st: PMachineStackRecord; index: integer; nSubsc
22702272 i : integer;
22712273begin
22722274 // For an n dimensional array we will collect the subscripts.
2273- if subscriptStack.Count + 1 < nSubscripts then
2275+ if subscriptStack.StackPtr + 1 < nSubscripts then
22742276 begin
2275- subscriptStack .Push(index);
2277+ uIntStack .Push(subscriptStack, index);
22762278 push (st);
22772279 end
22782280 else
@@ -2286,14 +2288,14 @@ procedure TVM.loadIndexableArray(st: PMachineStackRecord; index: integer; nSubsc
22862288 exit;
22872289 end ;
22882290
2289- subscriptStack .Push(index);
2290- setLength (idx, subscriptStack.Count );
2291+ uIntStack .Push(subscriptStack, index);
2292+ setLength (idx, subscriptStack.stackPtr );
22912293 // Index backwards since the stack entries are backwards
2292- for i := subscriptStack.Count - 1 downto 0 do
2293- idx[i] := subscriptStack .Pop();
2294+ for i := subscriptStack.stackPtr - 1 downto 0 do
2295+ idx[i] := uIntStack .Pop(subscriptStack );
22942296
22952297 push (st.aValue.getValue (idx));
2296- subscriptStack.Clear;
2298+ subscriptStack.stackPtr := - 1 ; // Clear;
22972299 end ;
22982300end ;
22992301
0 commit comments