@@ -70,6 +70,7 @@ TScriptDynamicDataArray = class (TDataContext, IScriptDynArray)//(TInterfaced
70
70
function SetFromExpr (index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
71
71
72
72
public
73
+ procedure FreeInstance ; override;
73
74
74
75
function ScriptTypeName : String; override;
75
76
@@ -112,8 +113,13 @@ TScriptDynamicDataArray = class (TDataContext, IScriptDynArray)//(TInterfaced
112
113
property AsString[index : NativeInt] : String write SetAsString;
113
114
end ;
114
115
115
- TScriptDynamicValueArray = class (TScriptDynamicDataArray)
116
+ TScriptDynamicValueArray = class sealed (TScriptDynamicDataArray)
116
117
public
118
+ class function NewInstance : TObject; override;
119
+
120
+ class procedure PrepareInstanceTemplate ; static;
121
+ class procedure ReleaseInstanceTemplate ; static;
122
+
117
123
procedure Swap (i1, i2 : NativeInt); override;
118
124
end ;
119
125
@@ -356,6 +362,7 @@ TScriptDynamicNativeBaseInterfaceArray = class (TScriptDynamicNativeArray)
356
362
357
363
public
358
364
class function InterfaceToDataOffset : Integer; override; final;
365
+ procedure FreeInstance ; override;
359
366
360
367
procedure SetArrayLength (n : NativeInt);
361
368
@@ -413,8 +420,13 @@ TScriptDynamicNativeInterfaceArray = class (TScriptDynamicNativeBaseInterface
413
420
procedure AddFromExpr (exec : TdwsExecution; valueExpr : TExprBase);
414
421
function SetFromExpr (index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
415
422
end ;
416
- TScriptDynamicNativeObjectArray = class (TScriptDynamicNativeBaseInterfaceArray, IScriptDynArray)
423
+ TScriptDynamicNativeObjectArray = class sealed (TScriptDynamicNativeBaseInterfaceArray, IScriptDynArray)
417
424
public
425
+ class function NewInstance : TObject; override;
426
+
427
+ class procedure PrepareInstanceTemplate ; static;
428
+ class procedure ReleaseInstanceTemplate ; static;
429
+
418
430
procedure AddFromExpr (exec : TdwsExecution; valueExpr : TExprBase);
419
431
function SetFromExpr (index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
420
432
end ;
@@ -492,7 +504,8 @@ TScriptDynamicNativeBooleanArray = class (TScriptDynamicNativeArray, IScriptD
492
504
procedure WriteToJSON (writer : TdwsJSONWriter);
493
505
end ;
494
506
495
- procedure CreateNewDynamicArray (elemTyp : TTypeSymbol; var result : IScriptDynArray);
507
+ function CreateNewDynamicArray (elemTyp : TTypeSymbol) : TInterfacedObject; overload;
508
+ procedure CreateNewDynamicArray (elemTyp : TTypeSymbol; var result : IScriptDynArray); inline; overload;
496
509
497
510
// ------------------------------------------------------------------
498
511
// ------------------------------------------------------------------
@@ -535,9 +548,9 @@ procedure DynamicArrayAddStrings(const dyn : IScriptDynArray; sl : TStrings);
535
548
dyn.AsString[i+n] := sl[i];
536
549
end ;
537
550
538
- // CreateNewDynamicArray
551
+ // CreateNewDynamicArray (func)
539
552
//
540
- procedure CreateNewDynamicArray (elemTyp : TTypeSymbol; var result : IScriptDynArray) ;
553
+ function CreateNewDynamicArray (elemTyp : TTypeSymbol) : TInterfacedObject ;
541
554
var
542
555
size : Integer;
543
556
ct : TClass;
@@ -565,6 +578,13 @@ procedure CreateNewDynamicArray(elemTyp : TTypeSymbol; var result : IScriptDynAr
565
578
end else Result := TScriptDynamicDataArray.Create(elemTyp);
566
579
end ;
567
580
581
+ // CreateNewDynamicArray (proc IScriptDynArray)
582
+ //
583
+ procedure CreateNewDynamicArray (elemTyp : TTypeSymbol; var result : IScriptDynArray);
584
+ begin
585
+ result := CreateNewDynamicArray(elemTyp) as IScriptDynArray;
586
+ end ;
587
+
568
588
// ------------------
569
589
// ------------------ TScriptDynamicDataArray ------------------
570
590
// ------------------
@@ -723,6 +743,14 @@ function TScriptDynamicDataArray.SetFromExpr(index : NativeInt; exec : TdwsExecu
723
743
end else Result := False;
724
744
end ;
725
745
746
+ // FreeInstance
747
+ //
748
+ procedure TScriptDynamicDataArray.FreeInstance ;
749
+ begin
750
+ ClearData;
751
+ FreeMemory(Self);
752
+ end ;
753
+
726
754
// AddStrings
727
755
//
728
756
procedure TScriptDynamicDataArray.AddStrings (sl : TStrings);
@@ -975,6 +1003,43 @@ function TScriptDynamicDataArray.GetElementType : TTypeSymbol;
975
1003
// ------------------ TScriptDynamicValueArray ------------------
976
1004
// ------------------
977
1005
1006
+ // NewInstance
1007
+ //
1008
+ var
1009
+ vDynamicValueArrayInstanceTemplate : Pointer;
1010
+ class function TScriptDynamicValueArray.NewInstance : TObject;
1011
+ begin
1012
+ if vDynamicValueArrayInstanceTemplate = nil then begin
1013
+ Result := inherited NewInstance;
1014
+ vDynamicValueArrayInstanceTemplate := GetMemory(InstanceSize);
1015
+ System.Move(Pointer(Result)^, vDynamicValueArrayInstanceTemplate^, InstanceSize);
1016
+ end else begin
1017
+ Result := GetMemory(InstanceSize);
1018
+ System.Move(vDynamicValueArrayInstanceTemplate^, Pointer(Result)^, InstanceSize);
1019
+ end ;
1020
+ end ;
1021
+
1022
+ // PrepareInstanceTemplate
1023
+ //
1024
+ class procedure TScriptDynamicValueArray.PrepareInstanceTemplate ;
1025
+ var
1026
+ a : TScriptDynamicValueArray;
1027
+ begin
1028
+ a := TScriptDynamicValueArray.Create(nil );
1029
+ a.Free;
1030
+ end ;
1031
+
1032
+ // ReleaseInstanceTemplate
1033
+ //
1034
+ class procedure TScriptDynamicValueArray.ReleaseInstanceTemplate ;
1035
+ var
1036
+ p : Pointer;
1037
+ begin
1038
+ p := vDynamicValueArrayInstanceTemplate;
1039
+ vDynamicValueArrayInstanceTemplate := nil ;
1040
+ FreeMem(p);
1041
+ end ;
1042
+
978
1043
// Swap
979
1044
//
980
1045
procedure TScriptDynamicValueArray.Swap (i1, i2 : NativeInt);
@@ -2606,6 +2671,14 @@ class function TScriptDynamicNativeBaseInterfaceArray.InterfaceToDataOffset : In
2606
2671
Result := NativeInt(@instance.FData) - NativeInt(intf);
2607
2672
end ;
2608
2673
2674
+ // FreeInstance
2675
+ //
2676
+ procedure TScriptDynamicNativeBaseInterfaceArray.FreeInstance ;
2677
+ begin
2678
+ FData := nil ;
2679
+ FreeMemory(Self);
2680
+ end ;
2681
+
2609
2682
// ------------------
2610
2683
// ------------------ TScriptDynamicNativeInterfaceArray ------------------
2611
2684
// ------------------
@@ -2634,6 +2707,43 @@ procedure TScriptDynamicNativeInterfaceArray.AddFromExpr(exec : TdwsExecution; v
2634
2707
// ------------------ TScriptDynamicNativeObjectArray ------------------
2635
2708
// ------------------
2636
2709
2710
+ // NewInstance
2711
+ //
2712
+ var
2713
+ vDynamicNativeObjectArrayInstanceTemplate : Pointer;
2714
+ class function TScriptDynamicNativeObjectArray.NewInstance : TObject;
2715
+ begin
2716
+ if vDynamicNativeObjectArrayInstanceTemplate = nil then begin
2717
+ Result := inherited NewInstance;
2718
+ vDynamicNativeObjectArrayInstanceTemplate := GetMemory(InstanceSize);
2719
+ System.Move(Pointer(Result)^, vDynamicNativeObjectArrayInstanceTemplate^, InstanceSize);
2720
+ end else begin
2721
+ Result := GetMemory(InstanceSize);
2722
+ System.Move(vDynamicNativeObjectArrayInstanceTemplate^, Pointer(Result)^, InstanceSize);
2723
+ end ;
2724
+ end ;
2725
+
2726
+ // PrepareInstanceTemplate
2727
+ //
2728
+ class procedure TScriptDynamicNativeObjectArray.PrepareInstanceTemplate ;
2729
+ var
2730
+ a : TScriptDynamicNativeObjectArray;
2731
+ begin
2732
+ a := TScriptDynamicNativeObjectArray.Create(nil );
2733
+ a.Free;
2734
+ end ;
2735
+
2736
+ // ReleaseInstanceTemplate
2737
+ //
2738
+ class procedure TScriptDynamicNativeObjectArray.ReleaseInstanceTemplate ;
2739
+ var
2740
+ p : Pointer;
2741
+ begin
2742
+ p := vDynamicNativeObjectArrayInstanceTemplate;
2743
+ vDynamicNativeObjectArrayInstanceTemplate := nil ;
2744
+ FreeMem(p);
2745
+ end ;
2746
+
2637
2747
// SetFromExpr
2638
2748
//
2639
2749
function TScriptDynamicNativeObjectArray.SetFromExpr (index : NativeInt; exec : TdwsExecution; valueExpr : TExprBase) : Boolean;
@@ -3112,4 +3222,20 @@ procedure TScriptDynamicNativeBooleanArray.WriteToJSON(writer : TdwsJSONWriter);
3112
3222
writer.EndArray;
3113
3223
end ;
3114
3224
3225
+ // ------------------------------------------------------------------
3226
+ // ------------------------------------------------------------------
3227
+ // ------------------------------------------------------------------
3228
+ initialization
3229
+ // ------------------------------------------------------------------
3230
+ // ------------------------------------------------------------------
3231
+ // ------------------------------------------------------------------
3232
+
3233
+ TScriptDynamicValueArray.PrepareInstanceTemplate;
3234
+ TScriptDynamicNativeObjectArray.PrepareInstanceTemplate;
3235
+
3236
+ finalization
3237
+
3238
+ TScriptDynamicValueArray.ReleaseInstanceTemplate;
3239
+ TScriptDynamicNativeObjectArray.ReleaseInstanceTemplate;
3240
+
3115
3241
end .
0 commit comments