Skip to content

Commit c227096

Browse files
committed
Fixed handling of object methods
1 parent 4904e75 commit c227096

8 files changed

Lines changed: 180 additions & 138 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
a = "1234567890"
3+
4+
assertTrue (a.len ()==10)
5+
assertTrue (a.find ("45")==3)
6+
assertTrue ("abc".toUpper ()=="ABC")
7+
assertTrue ("ABC".toLower ()=="abc")
8+
assertTrue (a.left (3)=="123")
9+
assertTrue (a.right (3)=="890")
10+
assertTrue (a.mid (2,4)=="3456")
11+
assertTrue (" 123 ".trim ()=="123")
12+
assertTrue ("A B C".split (" ")==["A", "B", "C"])
13+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
a = [1,2,3,4,5,6]
3+
4+
assertTrue (a.len ()==6)
5+
a.append ([-1,-2])
6+
assertTrue (a==[1,2,3,4,5,6,[-1,-2]])
7+
8+
a = [1,2,3,4,5,6]
9+
assertTrue (a.sum () == 21)
10+
assertTrue (a.max() == 6)
11+
assertTrue (a.min() == 1)
12+
a.remove(1)
13+
assertTrue (a == [1,3,4,5,6])

Rhodus_Version_3/uBuiltInGlobal.pas

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -649,14 +649,9 @@ procedure TBuiltInGlobal.getHelp (_vm : TObject);
649649
stModule : vm.push(TStringObject.Create (st.module.helpStr));
650650

651651
stFunction :
652-
begin
653652
vm.push(TStringObject.Create (st.fValue.helpStr));
654-
end;
655653
stObjectMethod :
656-
begin
657-
vm.pop(); // dup object
658654
vm.push(TStringObject.Create (st.oValue.helpStr));
659-
end;
660655
else
661656
raise ERuntimeException.Create('Unkown object type in help');
662657
end;

Rhodus_Version_3/uObjectSupport.pas

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ TMethodDetails = class (TObject)
1212
helpStr : string;
1313
nArgs : integer;
1414
method : TObjectMethod;
15+
self : pointer; // Only used during execution but during execution to the 'self' associated with this method
1516
constructor Create (const name : string; nArgs: integer; const helpStr : string; fcn : TObjectMethod);
1617
end;
1718

@@ -52,15 +53,15 @@ destructor TMethodsBase.Destroy;
5253

5354
procedure TMethodsBase.dir(vm: TObject);
5455
var ls : TListObject;
56+
md : TMethodDetails;
5557
begin
56-
TVM (vm).decStackTop;
58+
md := TVM (vm).popMethodDetails;
5759
ls := TListObject.create (0);
5860
for var i := 0 to methodList.Count - 1 do
5961
begin
6062
ls.append (TStringObject.Create (methodList[i].name));
6163
end;
6264

63-
TVM (vm).pop(); // Dump the object
6465
TVM (vm).push (ls);
6566
end;
6667

VirtualMachine/uArrayObject.pas

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ function sameDimensions (m1, m2 : TArrayObject) : boolean;
158158
procedure TArrayMethods.getLength (vm : TObject);
159159
var s : TArrayObject;
160160
nArgs, d : integer;
161+
md : TMethodDetails;
161162
begin
162163
d := 0;
163164
nArgs := TVM (vm).popInteger;
@@ -167,8 +168,8 @@ procedure TArrayMethods.getLength (vm : TObject);
167168
if nArgs > 1 then
168169
raise ERuntimeException.Create('Too many arguments passed to len()');
169170

170-
TVM (vm).decStackTop; // Dump the object method
171-
s := TVM (vm).popArray;
171+
md := TVM (vm).popMethodDetails;
172+
s := TArrayObject (md.self);
172173

173174
if nArgs = 0 then
174175
TVM (vm).push(s.getNumberOfElements())
@@ -189,9 +190,10 @@ procedure TArrayMethods.getShape (vm : TObject);
189190
var s : TArrayObject;
190191
r : TListObject;
191192
i : integer;
193+
md : TMethodDetails;
192194
begin
193-
TVM (vm).decStackTop; // Dump the object method
194-
s := TVM (vm).popArray;
195+
md := TVM (vm).popMethodDetails;
196+
s := TArrayObject (md.self);
195197

196198
r := TListObject.Create(length (s.dim));
197199
for i := 0 to length (s.dim) - 1 do
@@ -206,19 +208,21 @@ procedure TArrayMethods.getShape (vm : TObject);
206208

207209
procedure TArrayMethods.getNumDim (vm: TObject);
208210
var s :TArrayObject;
211+
md : TMethodDetails;
209212
begin
210-
TVM (vm).decStackTop; // Dump the object method
211-
s := TVM (vm).popArray;
213+
md := TVM (vm).popMethodDetails;
214+
s := TArrayObject (md.self);
212215

213216
TVM (vm).push (length (s.dim));
214217
end;
215218

216219

217220
procedure TArrayMethods.getNumRows (vm: TObject);
218221
var s :TArrayObject;
222+
md : TMethodDetails;
219223
begin
220-
TVM (vm).decStackTop; // Dump the object method
221-
s := TVM (vm).popArray;
224+
md := TVM (vm).popMethodDetails;
225+
s := TArrayObject (md.self);
222226

223227
if s.getNumDimensions() <= 2 then
224228
TVM (vm).push (s.dim[0])
@@ -229,9 +233,10 @@ procedure TArrayMethods.getNumRows (vm: TObject);
229233

230234
procedure TArrayMethods.getNumCols (vm: TObject);
231235
var s :TArrayObject;
236+
md : TMethodDetails;
232237
begin
233-
TVM (vm).decStackTop; // Dump the object method
234-
s := TVM (vm).popArray;
238+
md := TVM (vm).popMethodDetails;
239+
s := TArrayObject (md.self);
235240

236241
if s.getNumDimensions() = 2 then
237242
TVM (vm).push (s.dim[1])
@@ -246,11 +251,12 @@ procedure TArrayMethods.appendRow (vm : TObject);
246251
target : TArrayObject;
247252
i, j : integer;
248253
sRows: integer;
254+
md : TMethodDetails;
249255
begin
250256
appendee := TVM (vm).popArray;
251257

252-
TVM (vm).decStackTop; // Dump the object method
253-
s := TVM (vm).popArray;
258+
md := TVM (vm).popMethodDetails;
259+
s := TArrayObject (md.self);
254260

255261
if (s.getNumDimensions() = 2) and (appendee.getNumDimensions() = 2) then
256262
begin
@@ -275,6 +281,7 @@ procedure TArrayMethods.appendRow (vm : TObject);
275281

276282
procedure TArrayMethods.appendCol (vm : TObject);
277283
var s :TArrayObject;
284+
md : TMethodDetails;
278285
begin
279286

280287
end;
@@ -284,9 +291,11 @@ procedure TArrayMethods.getTranspose (vm : TObject);
284291
var s, tmp :TArrayObject;
285292
i, j : integer;
286293
r, c : integer;
294+
md : TMethodDetails;
287295
begin
288-
TVM (vm).decStackTop; // Dump the object method
289-
s := TVM (vm).popArray; // Object itself
296+
md := TVM (vm).popMethodDetails;
297+
s := TArrayObject (md.self);
298+
290299
r := s.dim[0];
291300
c := s.dim[1];
292301

@@ -304,9 +313,11 @@ procedure TArrayMethods.getSqr (vm : TObject);
304313
var i : integer;
305314
s1, s2 : TArrayObject;
306315
len : integer;
316+
md : TMethodDetails;
307317
begin
308-
TVM (vm).decStackTop; // Dump the object method
309-
s1 := TVM (vm).popArray;
318+
md := TVM (vm).popMethodDetails;
319+
s1 := TArrayObject (md.self);
320+
310321
s2 := s1.clone;
311322

312323
len := s1.getNumberOfElements - 1;
@@ -320,10 +331,12 @@ procedure TArrayMethods.add (vm : TObject);
320331
var i, n : integer;
321332
s1, s2 : TArrayObject;
322333
argument : TArrayObject;
334+
md : TMethodDetails;
323335
begin
324336
argument := TVM (vm).popArray;
325-
TVM (vm).decStackTop; // Dump the object method
326-
s1 := TVM (vm).popArray;
337+
338+
md := TVM (vm).popMethodDetails;
339+
s1 := TArrayObject (md.self);
327340
s2 := s1.clone;
328341

329342
if sameDimensions (s1, argument) then
@@ -342,10 +355,12 @@ procedure TArrayMethods.sub (vm : TObject);
342355
var i, n : integer;
343356
s1, s2 : TArrayObject;
344357
argument : TArrayObject;
358+
md : TMethodDetails;
345359
begin
346360
argument := TVM (vm).popArray;
347-
TVM (vm).decStackTop; // Dump the object method
348-
s1 := TVM (vm).popArray;
361+
362+
md := TVM (vm).popMethodDetails;
363+
s1 := TArrayObject (md.self);
349364
s2 := s1.clone;
350365

351366
if sameDimensions (s1, argument) then
@@ -364,9 +379,10 @@ procedure TArrayMethods.getMax (vm : TObject);
364379
var i : integer;
365380
s1 : TArrayObject;
366381
max : double;
382+
md : TMethodDetails;
367383
begin
368-
TVM (vm).decStackTop; // Dump the object method
369-
s1 := TVM (vm).popArray;
384+
md := TVM (vm).popMethodDetails;
385+
s1 := TArrayObject (md.self);
370386

371387
TVM (vm).push (TArrayObject.getMax(s1));
372388
end;
@@ -376,9 +392,10 @@ procedure TArrayMethods.getMin (vm : TObject);
376392
var i : integer;
377393
s1 : TArrayObject;
378394
min : double;
395+
md : TMethodDetails;
379396
begin
380-
TVM (vm).decStackTop; // Dump the object method
381-
s1 := TVM (vm).popArray;
397+
md := TVM (vm).popMethodDetails;
398+
s1 := TArrayObject (md.self);
382399

383400
TVM (vm).push (TArrayObject.getMin(s1));
384401
end;
@@ -387,9 +404,11 @@ procedure TArrayMethods.getMin (vm : TObject);
387404
procedure TArrayMethods.getTrunc (vm : TObject);
388405
var s, target : TArrayObject;
389406
i : integer;
407+
md : TMethodDetails;
390408
begin
391-
TVM (vm).decStackTop; // Dump the object method
392-
s := TVM (vm).popArray;
409+
md := TVM (vm).popMethodDetails;
410+
s := TArrayObject (md.self);
411+
393412
target := s.clone;
394413

395414
for i := 0 to s.getNumberOfElements() - 1 do

0 commit comments

Comments
 (0)