2
Copyright 2008-2013 Michalis Kamburelis.
4
This file is part of "Castle Game Engine".
6
"Castle Game Engine" is free software; see the file COPYING.txt,
7
included in this distribution, for details about the copyright.
9
"Castle Game Engine" is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
----------------------------------------------------------------------------
16
constructor TCasScriptXxxArray.Create(const AWriteable: boolean; const AValue: TXxxList);
22
constructor TCasScriptXxxArray.Create(const AWriteable: boolean);
25
FValue := TXxxList.Create;
28
destructor TCasScriptXxxArray.Destroy;
34
procedure TCasScriptXxxArray.SetValue(const AValue: TXxxList);
36
FValue.Assign(AValue);
37
ValueAssigned := true;
40
procedure TCasScriptXxxArray.AssignValue(Source: TCasScriptValue);
42
if Source is TCasScriptXxxArray then
43
Value := TCasScriptXxxArray(Source).Value else
44
raise ECasScriptAssignError.CreateFmt('Assignment from %s to %s not possible', [Source.ClassName, ClassName]);
47
class procedure TCasScriptXxxArray.HandleArrayFun(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
52
CreateValueIfNeeded(AResult, ParentOfResult, TCasScriptXxxArray);
54
Arr := TCasScriptXxxArray(AResult).Value;
55
Arr.Count := Length(Arguments);
56
for I := 0 to Length(Arguments) - 1 do
57
Arr.L[I] := TCasScriptXxxElement(Arguments[I]).Value;
59
TCasScriptXxxArray(AResult).ValueAssigned := true;
62
class procedure TCasScriptXxxArray.HandleArrayGetCount(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
64
CreateValueIfNeeded(AResult, ParentOfResult, TCasScriptInteger);
65
TCasScriptInteger(AResult).Value :=
66
TCasScriptXxxArray(Arguments[0]).FValue.Count;
69
class procedure TCasScriptXxxArray.HandleArraySetCount(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
73
if ParentOfResult then
74
AResult.FreeByParentExpression;
76
ParentOfResult := false;
78
NewCount := TCasScriptInteger(Arguments[1]).Value;
80
raise ECasScriptError.CreateFmt('Invalid count %d for array_set_count (should be non-negative)',
83
TCasScriptXxxArray(Arguments[0]).FValue.Count := NewCount;
84
TCasScriptXxxArray(Arguments[0]).ValueAssigned := true;
86
AResult := Arguments[0];
89
class procedure TCasScriptXxxArray.HandleArrayGet(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
94
CreateValueIfNeeded(AResult, ParentOfResult, TCasScriptXxxElement);
96
Arr := TCasScriptXxxArray(Arguments[0]).Value;
98
Index := TCasScriptInteger(Arguments[1]).Value;
99
if not Between(Index, 0, Arr.Count - 1) then
100
raise ECasScriptError.CreateFmt('Invalid index %d for array_get, array count is %d',
103
TCasScriptXxxElement(AResult).Value := Arr.L[Index];
106
class procedure TCasScriptXxxArray.HandleArraySet(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
111
if ParentOfResult then
112
AResult.FreeByParentExpression;
114
ParentOfResult := false;
116
Arr := TCasScriptXxxArray(Arguments[0]).Value;
118
Index := TCasScriptInteger(Arguments[1]).Value;
119
if not Between(Index, 0, Arr.Count - 1) then
120
raise ECasScriptError.CreateFmt('Invalid index %d for array_set, array count is %d',
123
Arr.L[Index] := TCasScriptXxxElement(Arguments[2]).Value;
124
TCasScriptXxxArray(Arguments[0]).ValueAssigned := true;
126
AResult := Arguments[0];
129
class procedure TCasScriptXxxArray.HandleAdd(AFunction: TCasScriptFunction; const Arguments: array of TCasScriptValue; var AResult: TCasScriptValue; var ParentOfResult: boolean);
134
CreateValueIfNeeded(AResult, ParentOfResult, TCasScriptXxxArray);
136
Arr := TCasScriptXxxArray(AResult).Value;
137
{ initially Arr is empty. This is needed to set explicitly,
138
since CreateValueIfNeeded could left previous AResult }
140
for I := 0 to Length(Arguments) - 1 do
141
Arr.AddList(TCasScriptXxxArray(Arguments[I]).Value);
143
TCasScriptXxxArray(AResult).ValueAssigned := true;
146
procedure RegisterXxxFunctions;
148
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleArrayFun, TCasScriptXxxArrayFun, [TCasScriptXxxElement], true);
149
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleArrayGetCount, TCasScriptArrayGetCount, [TCasScriptXxxArray], false);
150
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleArraySetCount, TCasScriptArraySetCount, [TCasScriptXxxArray, TCasScriptInteger], false);
151
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleArrayGet, TCasScriptArrayGet, [TCasScriptXxxArray, TCasScriptInteger], false);
152
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleArraySet, TCasScriptArraySet, [TCasScriptXxxArray, TCasScriptInteger, TCasScriptXxxElement], false);
153
FunctionHandlers.RegisterHandler(@TCasScriptXxxArray(nil).HandleAdd, TCasScriptAdd, [TCasScriptXxxArray], true);