gpgscm: Move dispatch table into rodata.

* tests/gpgscm/opdefines.h: Use 0 instead of NULL.
* tests/gpgscm/scheme.c (op_code_info): Use char arrays instead of
pointers, make arity parameters smaller.
(INF_ARG): Adapt.
(_OP_DEF): Likewise.
(dispatch_table): Likewise.
(procname): Likewise.
(Eval_cycle): Likewise.
(scheme_init_custom_alloc): Likewise.

Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
Justus Winter 2017-03-29 16:32:36 +02:00
parent 6f217d116d
commit 7dff6248bd
No known key found for this signature in database
GPG Key ID: DD1A52F9DA8C9020
2 changed files with 14 additions and 13 deletions

View File

@ -154,7 +154,7 @@ _OP_DEF("set-symbol-property!", 3, 3, TST_SYMBOL TST_SYMBOL TST
_OP_DEF("symbol-property", 2, 2, TST_SYMBOL TST_SYMBOL, OP_SYMBOL_PROPERTY ) _OP_DEF("symbol-property", 2, 2, TST_SYMBOL TST_SYMBOL, OP_SYMBOL_PROPERTY )
#endif #endif
#if USE_TAGS #if USE_TAGS
_OP_DEF(NULL, 0, 0, TST_NONE, OP_TAG_VALUE ) _OP_DEF(0, 0, 0, TST_NONE, OP_TAG_VALUE )
_OP_DEF("make-tagged-value", 2, 2, TST_ANY TST_PAIR, OP_MK_TAGGED ) _OP_DEF("make-tagged-value", 2, 2, TST_ANY TST_PAIR, OP_MK_TAGGED )
_OP_DEF("get-tag", 1, 1, TST_ANY, OP_GET_TAG ) _OP_DEF("get-tag", 1, 1, TST_ANY, OP_GET_TAG )
#endif #endif

View File

@ -5262,25 +5262,25 @@ static const struct {
#define TST_NATURAL "\016" #define TST_NATURAL "\016"
typedef struct { typedef struct {
const char *name; char name[31]; /* strlen ("call-with-current-continuation") + 1 */
int min_arity; unsigned char min_arity;
int max_arity; unsigned char max_arity;
const char *arg_tests_encoding; char arg_tests_encoding[3];
} op_code_info; } op_code_info;
#define INF_ARG 0xffff #define INF_ARG 0xff
static const op_code_info dispatch_table[]= { static const op_code_info dispatch_table[]= {
#define _OP_DEF(A,B,C,D,OP) {A,B,C,D}, #define _OP_DEF(A,B,C,D,OP) {{A},B,C,{D}},
#include "opdefines.h" #include "opdefines.h"
#undef _OP_DEF #undef _OP_DEF
{ 0 } {{0},0,0,{0}},
}; };
static const char *procname(pointer x) { static const char *procname(pointer x) {
int n=procnum(x); int n=procnum(x);
const char *name=dispatch_table[n].name; const char *name=dispatch_table[n].name;
if(name==0) { if (name[0] == 0) {
name="ILLEGAL!"; name="ILLEGAL!";
} }
return name; return name;
@ -5291,7 +5291,7 @@ static void Eval_Cycle(scheme *sc, enum scheme_opcodes op) {
sc->op = op; sc->op = op;
for (;;) { for (;;) {
const op_code_info *pcd=dispatch_table+sc->op; const op_code_info *pcd=dispatch_table+sc->op;
if (pcd->name!=0) { /* if built-in function, check arguments */ if (pcd->name[0] != 0) { /* if built-in function, check arguments */
char msg[STRBUFFSIZE]; char msg[STRBUFFSIZE];
int ok=1; int ok=1;
int n=list_length(sc,sc->args); int n=list_length(sc,sc->args);
@ -5312,7 +5312,7 @@ static void Eval_Cycle(scheme *sc, enum scheme_opcodes op) {
pcd->max_arity); pcd->max_arity);
} }
if(ok) { if(ok) {
if(pcd->arg_tests_encoding!=0) { if (pcd->arg_tests_encoding[0] != 0) {
int i=0; int i=0;
int j; int j;
const char *t=pcd->arg_tests_encoding; const char *t=pcd->arg_tests_encoding;
@ -5326,7 +5326,8 @@ static void Eval_Cycle(scheme *sc, enum scheme_opcodes op) {
if(!tests[j].fct(arg)) break; if(!tests[j].fct(arg)) break;
} }
if(t[1]!=0) {/* last test is replicated as necessary */ if (t[1] != 0 && i < sizeof pcd->arg_tests_encoding) {
/* last test is replicated as necessary */
t++; t++;
} }
arglist=cdr(arglist); arglist=cdr(arglist);
@ -5620,7 +5621,7 @@ int scheme_init_custom_alloc(scheme *sc, func_alloc malloc, func_dealloc free) {
assign_syntax(sc, "case"); assign_syntax(sc, "case");
for(i=0; i<n; i++) { for(i=0; i<n; i++) {
if(dispatch_table[i].name!=0) { if (dispatch_table[i].name[0] != 0) {
assign_proc(sc, (enum scheme_opcodes)i, dispatch_table[i].name); assign_proc(sc, (enum scheme_opcodes)i, dispatch_table[i].name);
} }
} }