Skip to content

Commit 45a5dff

Browse files
committed
COMMON: minor performance tweak
1 parent ba508cb commit 45a5dff

File tree

4 files changed

+129
-153
lines changed

4 files changed

+129
-153
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2020-06-06 (0.12.19)
2+
COMMON: minor performance tweak
3+
14
2020-05-11 (0.12.19)
25
ANDROID: complain when samsung keyboard detected
36
COMMON: fix compile warnings

src/common/eval.c

Lines changed: 80 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@
1919
#define IP prog_ip
2020
#define CODE(x) prog_source[(x)]
2121
#define CODE_PEEK() CODE(IP)
22-
#define V_FREE(v) \
23-
if ((v) && ((v)->type == V_STR || \
24-
(v)->type == V_MAP || \
25-
(v)->type == V_ARRAY)) { \
26-
v_free((v)); \
22+
#define V_FREE(v) \
23+
if ((v) && ((v)->type == V_STR || \
24+
(v)->type == V_MAP || \
25+
(v)->type == V_ARRAY)) { \
26+
v_free((v)); \
2727
}
28-
#define V_FREE2(v) \
29-
if (((v)->type == V_STR || \
30-
(v)->type == V_MAP || \
31-
(v)->type == V_ARRAY)) { \
32-
v_free((v)); \
28+
#define V_FREE2(v) \
29+
if (((v)->type == V_STR || \
30+
(v)->type == V_MAP || \
31+
(v)->type == V_ARRAY)) { \
32+
v_free((v)); \
3333
}
3434

3535
/**
@@ -379,7 +379,7 @@ static inline void oper_mul(var_t *r, var_t *left) {
379379
} else {
380380
err_matop();
381381
}
382-
} else if (op == '*') {
382+
} else if (op == '*') {
383383
mat_mul(left, r);
384384
} else {
385385
err_matop();
@@ -1245,23 +1245,6 @@ void eval(var_t *r) {
12451245
r->v.n = code_getreal();
12461246
break;
12471247

1248-
case kwTYPE_STR:
1249-
// string - constant
1250-
IP++;
1251-
V_FREE(r);
1252-
v_eval_str(r);
1253-
break;
1254-
1255-
case kwTYPE_LOGOPR:
1256-
IP++;
1257-
oper_log(r, left);
1258-
break;
1259-
1260-
case kwTYPE_CMPOPR:
1261-
IP++;
1262-
oper_cmp(r, left);
1263-
break;
1264-
12651248
case kwTYPE_ADDOPR:
12661249
IP++;
12671250
oper_add(r, left);
@@ -1272,17 +1255,6 @@ void eval(var_t *r) {
12721255
oper_mul(r, left);
12731256
break;
12741257

1275-
case kwTYPE_POWOPR:
1276-
IP++;
1277-
oper_powr(r, left);
1278-
break;
1279-
1280-
case kwTYPE_UNROPR:
1281-
// unary
1282-
IP++;
1283-
oper_unary(r);
1284-
break;
1285-
12861258
case kwTYPE_VAR:
12871259
// variable
12881260
V_FREE(r);
@@ -1317,15 +1289,10 @@ void eval(var_t *r) {
13171289
IP++;
13181290
if (!eval_sp) {
13191291
err_syntax_unknown();
1320-
} else {
1321-
eval_sp--;
1322-
left = &eval_stk[eval_sp];
1292+
return;
13231293
}
1324-
break;
1325-
1326-
case kwTYPE_EVAL_SC:
1327-
IP++;
1328-
eval_shortc(r);
1294+
eval_sp--;
1295+
left = &eval_stk[eval_sp];
13291296
break;
13301297

13311298
case kwTYPE_CALLF:
@@ -1334,48 +1301,80 @@ void eval(var_t *r) {
13341301
eval_callf(r);
13351302
break;
13361303

1304+
case kwTYPE_STR:
1305+
// string - constant
1306+
IP++;
1307+
V_FREE(r);
1308+
v_eval_str(r);
1309+
break;
1310+
1311+
case kwTYPE_LOGOPR:
1312+
IP++;
1313+
oper_log(r, left);
1314+
break;
1315+
1316+
case kwTYPE_CMPOPR:
1317+
IP++;
1318+
oper_cmp(r, left);
1319+
break;
1320+
1321+
case kwTYPE_POWOPR:
1322+
IP++;
1323+
oper_powr(r, left);
1324+
break;
1325+
1326+
case kwTYPE_UNROPR:
1327+
// unary
1328+
IP++;
1329+
oper_unary(r);
1330+
break;
1331+
1332+
case kwTYPE_EVAL_SC:
1333+
IP++;
1334+
eval_shortc(r);
1335+
break;
1336+
13371337
case kwTYPE_CALL_UDF:
13381338
eval_call_udf(r);
13391339
break;
13401340

1341-
default:
1342-
// less used codes
1343-
switch (code) {
1344-
case kwTYPE_CALLEXTF:
1345-
// [lib][index] external functions
1346-
IP++;
1347-
eval_extf(r);
1348-
break;
1349-
1350-
case kwTYPE_PTR:
1351-
// UDF pointer - constant
1352-
IP++;
1353-
eval_ptr(r);
1354-
break;
1341+
case kwTYPE_CALLEXTF:
1342+
// [lib][index] external functions
1343+
IP++;
1344+
eval_extf(r);
1345+
break;
13551346

1356-
case kwBYREF:
1357-
// unexpected code
1358-
err_evsyntax();
1359-
break;
1347+
case kwTYPE_PTR:
1348+
// UDF pointer - constant
1349+
IP++;
1350+
eval_ptr(r);
1351+
break;
13601352

1361-
default: {
1362-
if (code == kwTYPE_EOC ||
1363-
code == kwTYPE_SEP ||
1364-
code == kwTO ||
1365-
kw_check_evexit(code)) {
1366-
// restore stack pointer
1367-
eval_sp = eval_pos;
1353+
case kwBYREF:
1354+
// unexpected code
1355+
err_evsyntax();
1356+
return;
1357+
1358+
default: {
1359+
if (code == kwTYPE_LINE ||
1360+
code == kwTYPE_SEP ||
1361+
code == kwTO ||
1362+
code == kwTHEN ||
1363+
code == kwSTEP ||
1364+
kw_check_evexit(code)) {
1365+
// restore stack pointer
1366+
eval_sp = eval_pos;
13681367

1369-
// normal exit
1370-
return;
1371-
}
1372-
rt_raise("UNKNOWN ERROR. IP:%d=0x%02X", IP, code);
1373-
if (!opt_quiet) {
1374-
hex_dump(prog_source, prog_length);
1375-
}
1376-
}};
1377-
}
1368+
// normal exit
1369+
return;
1370+
}
1371+
rt_raise("UNKNOWN ERROR. IP:%d=0x%02X", IP, code);
1372+
if (!opt_quiet) {
1373+
hex_dump(prog_source, prog_length);
1374+
}
1375+
}};
13781376
}
1377+
13791378
// restore stack pointer
13801379
eval_sp = eval_pos;
13811380
}

src/common/kw.c

Lines changed: 31 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,6 @@
1010
#include "common/var.h"
1111
#include "common/scan.h"
1212

13-
/*
14-
* valid exit codes from eval
15-
*/
16-
code_t kw_eval_validexit[] = {
17-
kwTYPE_EOC,
18-
kwTYPE_LINE,
19-
kwTYPE_SEP,
20-
kwFILLED,
21-
kwCOLOR,
22-
kwUSE,
23-
kwTO,
24-
kwIN,
25-
kwSTEP,
26-
kwFORSEP,
27-
kwINPUTSEP,
28-
kwINPUT,
29-
kwOUTPUTSEP,
30-
kwAPPENDSEP,
31-
kwAS,
32-
kwUSING,
33-
kwTHEN,
34-
kwDO,
35-
kwBACKG,
36-
0
37-
};
38-
3913
/*
4014
* functions without parameters
4115
*/
@@ -53,31 +27,41 @@ bid_t kw_noarg_func_table[] = {
5327
0
5428
};
5529

56-
//
57-
int kw_check(code_t *table, code_t code) {
58-
register int i;
59-
60-
for (i = 0; table[i] != 0; i++) {
61-
if (code == table[i]) {
62-
return 1;
63-
}
64-
}
65-
return 0;
66-
}
67-
68-
//
30+
/*
31+
* valid exit codes from eval
32+
*/
6933
int kw_check_evexit(code_t code) {
70-
return kw_check(kw_eval_validexit, code);
34+
switch (code) {
35+
case kwTYPE_EOC:
36+
case kwTYPE_LINE:
37+
case kwTYPE_SEP:
38+
case kwFILLED:
39+
case kwCOLOR:
40+
case kwUSE:
41+
case kwTO:
42+
case kwIN:
43+
case kwSTEP:
44+
case kwFORSEP:
45+
case kwINPUTSEP:
46+
case kwINPUT:
47+
case kwOUTPUTSEP:
48+
case kwAPPENDSEP:
49+
case kwAS:
50+
case kwUSING:
51+
case kwTHEN:
52+
case kwDO:
53+
case kwBACKG:
54+
return 1;
55+
default:
56+
return 0;
57+
}
7158
}
7259

73-
/*
74-
*/
7560
int kw_getcmdname(code_t code, char *dest) {
76-
int i;
7761
int found = 0;
7862

7963
*dest = '\0';
80-
for (i = 0; keyword_table[i].name[0] != '\0'; i++) {
64+
for (int i = 0; keyword_table[i].name[0] != '\0'; i++) {
8165
if (code == keyword_table[i].code) {
8266
strcpy(dest, keyword_table[i].name);
8367
found++;
@@ -90,14 +74,11 @@ int kw_getcmdname(code_t code, char *dest) {
9074
return found;
9175
}
9276

93-
/*
94-
*/
9577
int kw_getfuncname(bid_t code, char *dest) {
96-
int i;
9778
int found = 0;
9879

9980
*dest = '\0';
100-
for (i = 0; func_table[i].name[0] != '\0'; i++) {
81+
for (int i = 0; func_table[i].name[0] != '\0'; i++) {
10182
if (code == func_table[i].fcode) {
10283
strcpy(dest, func_table[i].name);
10384
found++;
@@ -110,14 +91,11 @@ int kw_getfuncname(bid_t code, char *dest) {
11091
return found;
11192
}
11293

113-
/*
114-
*/
11594
int kw_getprocname(bid_t code, char *dest) {
116-
int i;
11795
int found = 0;
11896

11997
*dest = '\0';
120-
for (i = 0; proc_table[i].name[0] != '\0'; i++) {
98+
for (int i = 0; proc_table[i].name[0] != '\0'; i++) {
12199
if (code == proc_table[i].pcode) {
122100
strcpy(dest, proc_table[i].name);
123101
found++;
@@ -130,12 +108,8 @@ int kw_getprocname(bid_t code, char *dest) {
130108
return found;
131109
}
132110

133-
/*
134-
*/
135111
int kw_noarg_func(bid_t code) {
136-
int i;
137-
138-
for (i = 0; kw_noarg_func_table[i] != 0; i++) {
112+
for (int i = 0; kw_noarg_func_table[i] != 0; i++) {
139113
if (kw_noarg_func_table[i] == code) {
140114
return 1;
141115
}

0 commit comments

Comments
 (0)