UNPKG

3.33 kBtext/coffeescriptView Raw
1
2
3# n is the total number of things on the stack. The first thing on the stack
4# is the object to be indexed, followed by the indices themselves.
5
6# called by Eval_index
7index_function = (n) ->
8 i = 0
9 k = 0
10 m = 0
11 ndim = 0
12 nelem = 0
13 t = 0
14
15 save()
16 s = tos - n
17 p1 = stack[s]
18
19
20 ndim = p1.tensor.ndim
21
22 m = n - 1
23
24 if (m > ndim)
25 stop("too many indices for tensor")
26
27 k = 0
28
29 for i in [0...m]
30 push(stack[s + i + 1])
31 t = pop_integer()
32 if (t < 1 || t > p1.tensor.dim[i])
33 stop("index out of range")
34 k = k * p1.tensor.dim[i] + t - 1
35
36 if (ndim == m)
37 moveTos tos - n
38 push(p1.tensor.elem[k])
39 restore()
40 return
41
42 for i in [m...ndim]
43 k = k * p1.tensor.dim[i] + 0
44
45 nelem = 1
46
47 for i in [m...ndim]
48 nelem *= p1.tensor.dim[i]
49
50 p2 = alloc_tensor(nelem)
51
52 p2.tensor.ndim = ndim - m
53
54 for i in [m...ndim]
55 p2.tensor.dim[i - m] = p1.tensor.dim[i]
56
57 for i in [0...nelem]
58 p2.tensor.elem[i] = p1.tensor.elem[k + i]
59
60 check_tensor_dimensions p1
61 check_tensor_dimensions p2
62
63 moveTos tos - n
64 push(p2)
65 restore()
66
67#-----------------------------------------------------------------------------
68#
69# Input: n Number of args on stack
70#
71# tos-n Right-hand value
72#
73# tos-n+1 Left-hand value
74#
75# tos-n+2 First index
76#
77# .
78# .
79# .
80#
81# tos-1 Last index
82#
83# Output: Result on stack
84#
85#-----------------------------------------------------------------------------
86
87#define LVALUE p1
88#define RVALUE p2
89#define TMP p3
90
91set_component = (n) ->
92 i = 0
93 k = 0
94 m = 0
95 ndim = 0
96 t = 0
97
98 save()
99
100 if (n < 3)
101 stop("error in indexed assign")
102
103 s = tos - n
104
105 p2 = stack[s]; # p2 is RVALUE
106
107 p1 = stack[s+1]; # p1 is LVALUE
108
109 if (!istensor(p1)) # p1 is LVALUE
110 stop("error in indexed assign")
111
112 ndim = p1.tensor.ndim; # p1 is LVALUE
113
114 m = n - 2
115
116 if (m > ndim)
117 stop("error in indexed assign")
118
119 k = 0
120
121 for i in [0...m]
122 push(stack[ s + i + 2])
123 t = pop_integer()
124 if (t < 1 || t > p1.tensor.dim[i]) # p1 is LVALUE
125 stop("error in indexed assign\n")
126 k = k * p1.tensor.dim[i] + t - 1
127
128 for i in [m...ndim]
129 k = k * p1.tensor.dim[i] + 0
130
131 # copy
132
133 p3 = alloc_tensor(p1.tensor.nelem); # p1 is LVALUE # p3 is TMP
134
135 p3.tensor.ndim = p1.tensor.ndim; # p1 is LVALUE # p3 is TMP
136
137 for i in [0...p1.tensor.ndim]
138 p3.tensor.dim[i] = p1.tensor.dim[i]; # p1 is LVALUE # p3 is TMP
139
140 for i in [0...p1.tensor.nelem]
141 p3.tensor.elem[i] = p1.tensor.elem[i]; # p1 is LVALUE # p3 is TMP
142
143 check_tensor_dimensions p1
144 check_tensor_dimensions p3
145
146 p1 = p3; # p1 is LVALUE # p3 is TMP
147
148 if (ndim == m)
149 if (istensor(p2)) # p2 is RVALUE
150 stop("error in indexed assign")
151 p1.tensor.elem[k] = p2; # p1 is LVALUE # p2 is RVALUE
152
153 check_tensor_dimensions p1
154
155 moveTos tos - n
156 push(p1); # p1 is LVALUE
157 restore()
158 return
159
160
161 # see if the rvalue matches
162
163 if (!istensor(p2)) # p2 is RVALUE
164 stop("error in indexed assign")
165
166 if (ndim - m != p2.tensor.ndim) # p2 is RVALUE
167 stop("error in indexed assign")
168
169 for i in [0...p2.tensor.ndim] # p2 is RVALUE
170 if (p1.tensor.dim[m + i] != p2.tensor.dim[i]) # p1 is LVALUE # p2 is RVALUE
171 stop("error in indexed assign")
172
173 # copy rvalue
174
175 for i in [0...p2.tensor.nelem] # p2 is RVALUE
176 p1.tensor.elem[k + i] = p2.tensor.elem[i]; # p1 is LVALUE # p2 is RVALUE
177
178 check_tensor_dimensions p1
179 check_tensor_dimensions p2
180
181 moveTos tos - n
182
183 push(p1); # p1 is LVALUE
184
185 restore()
186