Skip to content

Commit b2e4c7a

Browse files
committed
COMMON: m3Apply no longer crashes if the second argument is not an array
1 parent 3917d73 commit b2e4c7a

File tree

3 files changed

+66
-111
lines changed

3 files changed

+66
-111
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2022-02-23 (12.24)
2+
COMMON: m3Apply no longer crashes if the second argument is not an array
3+
14
2022-02-23 (12.24)
25
EMCC: Implemented emscripten web version
36

samples/distro-examples/tests/matrices.bas

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ C=LinEqn(a,b)
3939
print "[x; y; z] = "; C
4040
?
4141

42-
rem -- handling for dot product and multiplication of two 1D arrays
42+
rem - handling for dot product and multiplication of two 1D arrays
4343
a1=[1,2,4]
4444
a2=[1,4,5]
4545
if (a1 * a2 != [1,8,20]) then throw "err"
@@ -53,3 +53,14 @@ r = s * v
5353
if (r[0] != 10) then throw "err1"
5454
if (r[1] != 20) then throw "err2"
5555
if (r[2] != 20) then throw "err3"
56+
57+
rem - blib_graph.c cleanup m3xx
58+
strip = [[1,0.6], [1,0.2]]
59+
dim m(0 to 2, 0 to 2)
60+
m3ident m
61+
m3trans m, 1,1
62+
m3scale m, 0, 0, 20, 20
63+
m3rotate m, 2
64+
m3Apply m, strip
65+
if (strip != [[-18.23450585285103,14.19218649794793],[-10.96012643824558,17.52136119032507]]) then throw "m3Apply failed"
66+

src/common/blib_graph.c

Lines changed: 51 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,13 +1247,11 @@ var_t *par_getm3() {
12471247

12481248
void m3combine(var_t *m, var_num_t nm[3][3]) {
12491249
var_num_t om[3][3];
1250-
int i, j;
1251-
var_t *e;
12521250

12531251
// copy m to om
1254-
for (i = 0; i < 3; i++) {
1255-
for (j = 0; j < 3; j++) {
1256-
e = v_elem(m, (i * 3 + j));
1252+
for (int i = 0; i < 3; i++) {
1253+
for (int j = 0; j < 3; j++) {
1254+
var_t *e = v_elem(m, (i * 3 + j));
12571255
if (e->type == V_NUM) {
12581256
om[i][j] = e->v.n;
12591257
} else if (e->type == V_INT) {
@@ -1265,25 +1263,21 @@ void m3combine(var_t *m, var_num_t nm[3][3]) {
12651263
}
12661264

12671265
// combine
1268-
for (i = 0; i < 3; i++) {
1269-
for (j = 0; j < 3; j++) {
1270-
e = v_elem(m, (i * 3 + j));
1266+
for (int i = 0; i < 3; i++) {
1267+
for (int j = 0; j < 3; j++) {
1268+
var_t *e = v_elem(m, (i * 3 + j));
12711269
if (e->type != V_NUM) {
12721270
v_free(e);
12731271
}
12741272
e->type = V_NUM;
12751273
e->v.n = nm[i][0] * om[0][j] + nm[i][1] * om[1][j] + nm[i][2] * om[2][j];
12761274
}
12771275
}
1278-
12791276
}
12801277

1281-
//
12821278
void m3ident(var_num_t m[3][3]) {
1283-
int i, j;
1284-
1285-
for (i = 0; i < 3; i++) {
1286-
for (j = 0; j < 3; j++) {
1279+
for (int i = 0; i < 3; i++) {
1280+
for (int j = 0; j < 3; j++) {
12871281
m[i][j] = (i == j) ? 1.0 : 0.0;
12881282
}
12891283
}
@@ -1293,16 +1287,10 @@ void m3ident(var_num_t m[3][3]) {
12931287
// M3IDENT BYREF m3x3
12941288
//
12951289
void cmd_m3ident() {
1296-
var_t *m, *e;
1297-
int i, j;
1298-
1299-
m = par_getm3();
1300-
if (prog_error) {
1301-
return;
1302-
}
1303-
for (i = 0; i < 3; i++) {
1304-
for (j = 0; j < 3; j++) {
1305-
e = v_elem(m, (i * 3 + j));
1290+
var_t *m = par_getm3(); IF_PROG_ERR_RTN;
1291+
for (int i = 0; i < 3; i++) {
1292+
for (int j = 0; j < 3; j++) {
1293+
var_t *e = v_elem(m, (i * 3 + j));
13061294
v_init(e);
13071295
e->type = V_NUM;
13081296
e->v.n = (i == j) ? 1.0 : 0.0;
@@ -1318,32 +1306,15 @@ void cmd_m3rotate() {
13181306
var_num_t angle, x = 0, y = 0, c, s;
13191307
var_num_t matrix[3][3];
13201308

1321-
m = par_getm3();
1322-
if (prog_error) {
1323-
return;
1324-
}
1325-
par_getcomma();
1326-
if (prog_error) {
1327-
return;
1328-
}
1329-
angle = par_getnum();
1330-
if (prog_error) {
1331-
return;
1332-
}
1309+
m = par_getm3(); IF_PROG_ERR_RTN;
1310+
par_getcomma(); IF_PROG_ERR_RTN;
1311+
angle = par_getnum(); IF_PROG_ERR_RTN;
1312+
13331313
if (code_peek() == kwTYPE_SEP) {
1334-
par_getcomma();
1335-
if (prog_error)
1336-
return;
1337-
x = par_getnum();
1338-
if (prog_error)
1339-
return;
1340-
par_getcomma();
1341-
if (prog_error)
1342-
return;
1343-
y = par_getnum();
1344-
if (prog_error) {
1345-
return;
1346-
}
1314+
par_getcomma(); IF_PROG_ERR_RTN;
1315+
x = par_getnum(); IF_PROG_ERR_RTN;
1316+
par_getcomma(); IF_PROG_ERR_RTN;
1317+
y = par_getnum(); IF_PROG_ERR_RTN;
13471318
}
13481319

13491320
c = cos(angle);
@@ -1367,33 +1338,15 @@ void cmd_m3scale() {
13671338
var_num_t x, y, fx, fy;
13681339
var_num_t matrix[3][3];
13691340

1370-
m = par_getm3();
1371-
if (prog_error)
1372-
return;
1373-
par_getcomma();
1374-
if (prog_error)
1375-
return;
1376-
x = par_getnum();
1377-
if (prog_error)
1378-
return;
1379-
par_getcomma();
1380-
if (prog_error)
1381-
return;
1382-
y = par_getnum();
1383-
if (prog_error)
1384-
return;
1385-
par_getcomma();
1386-
if (prog_error)
1387-
return;
1388-
fx = par_getnum();
1389-
if (prog_error)
1390-
return;
1391-
par_getcomma();
1392-
if (prog_error)
1393-
return;
1394-
fy = par_getnum();
1395-
if (prog_error)
1396-
return;
1341+
m = par_getm3(); IF_PROG_ERR_RTN;
1342+
par_getcomma(); IF_PROG_ERR_RTN;
1343+
x = par_getnum(); IF_PROG_ERR_RTN;
1344+
par_getcomma(); IF_PROG_ERR_RTN;
1345+
y = par_getnum(); IF_PROG_ERR_RTN;
1346+
par_getcomma(); IF_PROG_ERR_RTN;
1347+
fx = par_getnum();IF_PROG_ERR_RTN;
1348+
par_getcomma(); IF_PROG_ERR_RTN;
1349+
fy = par_getnum();IF_PROG_ERR_RTN;
13971350

13981351
m3ident(matrix);
13991352
matrix[0][0] = fx;
@@ -1411,21 +1364,11 @@ void cmd_m3translate() {
14111364
var_num_t x, y;
14121365
var_num_t matrix[3][3];
14131366

1414-
m = par_getm3();
1415-
if (prog_error)
1416-
return;
1417-
par_getcomma();
1418-
if (prog_error)
1419-
return;
1420-
x = par_getnum();
1421-
if (prog_error)
1422-
return;
1423-
par_getcomma();
1424-
if (prog_error)
1425-
return;
1426-
y = par_getnum();
1427-
if (prog_error)
1428-
return;
1367+
m = par_getm3(); IF_PROG_ERR_RTN;
1368+
par_getcomma(); IF_PROG_ERR_RTN;
1369+
x = par_getnum(); IF_PROG_ERR_RTN;
1370+
par_getcomma(); IF_PROG_ERR_RTN;
1371+
y = par_getnum(); IF_PROG_ERR_RTN;
14291372

14301373
m3ident(matrix);
14311374
matrix[2][0] = x;
@@ -1439,22 +1382,21 @@ void cmd_m3translate() {
14391382
void cmd_m3apply() {
14401383
var_t *m, *p, *e;
14411384
var_num_t om[3][3], x, y;
1442-
int i, j, count;
14431385

1444-
m = par_getm3();
1445-
if (prog_error)
1446-
return;
1447-
par_getcomma();
1448-
if (prog_error)
1449-
return;
1450-
p = par_getvarray();
1451-
if (prog_error)
1386+
m = par_getm3(); IF_PROG_ERR_RTN;
1387+
par_getcomma(); IF_PROG_ERR_RTN;
1388+
p = par_getvarray(); IF_PROG_ERR_RTN;
1389+
1390+
if (!p || p->type != V_ARRAY) {
1391+
err_varisnotarray();
14521392
return;
1453-
count = v_asize(p);
1393+
}
1394+
1395+
int count = v_asize(p);
14541396

14551397
// copy m to om
1456-
for (i = 0; i < 3; i++) {
1457-
for (j = 0; j < 3; j++) {
1398+
for (int i = 0; i < 3; i++) {
1399+
for (int j = 0; j < 3; j++) {
14581400
e = v_elem(m, i * 3 + j);
14591401
om[i][j] = v_getreal(e);
14601402
}
@@ -1466,24 +1408,23 @@ void cmd_m3apply() {
14661408
int o;
14671409

14681410
count = (v_asize(p) >> 1);
1469-
for (i = 0; i < count; i++) {
1411+
for (int i = 0; i < count; i++) {
14701412
o = i << 1;
14711413
x = v_getreal(v_elem(p, o));
14721414
y = v_getreal(v_elem(p, o + 1));
14731415
v_setreal(v_elem(p, o), x * om[0][0] + y * om[1][0] + om[2][0]);
14741416
v_setreal(v_elem(p, o + 1), x * om[0][1] + y * om[1][1] + om[2][1]);
14751417
}
14761418
} else {
1477-
for (i = 0; i < count; i++) {
1419+
for (int i = 0; i < count; i++) {
14781420
e = v_elem(p, i);
14791421

1480-
if (e->type != V_ARRAY)
1422+
if (e->type != V_ARRAY) {
14811423
err_parsepoly(i, 10);
1482-
else if ((v_asize(e) % 2) != 0)
1424+
} else if ((v_asize(e) % 2) != 0) {
14831425
err_parsepoly(i, 11);
1484-
1485-
if (prog_error)
1486-
break;
1426+
}
1427+
IF_PROG_ERR_RTN;
14871428

14881429
x = v_getreal(v_elem(e, 0));
14891430
y = v_getreal(v_elem(e, 1));

0 commit comments

Comments
 (0)