History

Inline doubles and interned string pointers in the byte code.

Avoid linearly searched per function string and number tables.

Tor Andersson committed 5 years ago

Commit 33ffe6e1 parent 06a6f9f5 files · +62 −59Browse files

Unified · Split

5 files
  1. jscompile.c +15 −32
  2. jscompile.h +0 −6
  3. jsdump.c +14 −5
  4. jsgc.c +0 −2
  5. jsrun.c +33 −14
jscompile.c+15−32
@@ -110,34 +110,6 @@ static int addfunction(JF, js_Function *value) · 109 unmodified lines
110110 return F->funlen++;
111111 }
112112
113−static int addnumber(JF, double value)
114−{
115− int i;
116− for (i = 0; i < F->numlen; ++i)
117− if (F->numtab[i] == value)
118− return i;
119− if (F->numlen >= F->numcap) {
120− F->numcap = F->numcap ? F->numcap * 2 : 16;
121− F->numtab = js_realloc(J, F->numtab, F->numcap * sizeof *F->numtab);
122− }
123− F->numtab[F->numlen] = value;
124− return F->numlen++;
125−}
126−
127−static int addstring(JF, const char *value)
128−{
129− int i;
130− for (i = 0; i < F->strlen; ++i)
131− if (!strcmp(F->strtab[i], value))
132− return i;
133− if (F->strlen >= F->strcap) {
134− F->strcap = F->strcap ? F->strcap * 2 : 16;
135− F->strtab = js_realloc(J, F->strtab, F->strcap * sizeof *F->strtab);
136− }
137− F->strtab[F->strlen] = value;
138− return F->strlen++;
139−}
140−
141113 static int addlocal(JF, js_Ast *ident, int reuse)
142114 {
143115 const char *name = ident->string;
@@ -196,15 +168,27 @@ static void emitnumber(JF, double num) · 52 unmodified lines
196168 emit(J, F, OP_INTEGER);
197169 emitarg(J, F, num + 32768);
198170 } else {
171+#define N (sizeof(num) / sizeof(js_Instruction))
172+ js_Instruction x[N];
173+ size_t i;
199174 emit(J, F, OP_NUMBER);
200− emitarg(J, F, addnumber(J, F, num));
175+ memcpy(x, &num, sizeof(num));
176+ for (i = 0; i < N; ++i)
177+ emitarg(J, F, x[i]);
178+#undef N
201179 }
202180 }
203181
204182 static void emitstring(JF, int opcode, const char *str)
205183 {
184+#define N (sizeof(str) / sizeof(js_Instruction))
185+ js_Instruction x[N];
186+ size_t i;
206187 emit(J, F, opcode);
207− emitarg(J, F, addstring(J, F, str));
188+ memcpy(x, &str, sizeof(str));
189+ for (i = 0; i < N; ++i)
190+ emitarg(J, F, x[i]);
191+#undef N
208192 }
209193
210194 static void emitlocal(JF, int oploc, int opvar, js_Ast *ident)
@@ -623,8 +607,7 @@ static void cexp(JF, js_Ast *exp) · 412 unmodified lines
623607
624608 case EXP_REGEXP:
625609 emitline(J, F, exp);
626− emit(J, F, OP_NEWREGEXP);
627− emitarg(J, F, addstring(J, F, exp->string));
610+ emitstring(J, F, OP_NEWREGEXP, exp->string);
628611 emitarg(J, F, exp->number);
629612 break;
630613
jscompile.h+0−6
@@ -123,12 +123,6 @@ struct js_Function · 122 unmodified lines
123123 js_Function **funtab;
124124 int funcap, funlen;
125125
126− double *numtab;
127− int numcap, numlen;
128−
129− const char **strtab;
130− int strcap, strlen;
131−
132126 const char **vartab;
133127 int varcap, varlen;
134128
jsdump.c+14−5
@@ -781,6 +781,8 @@ void jsC_dumpfunction(js_State *J, js_Function *F) · 780 unmodified lines
781781 {
782782 js_Instruction *p = F->code;
783783 js_Instruction *end = F->code + F->codelen;
784+ char *s;
785+ double n;
784786 int i;
785787
786788 minify = 0;
@@ -807,16 +809,21 @@ void jsC_dumpfunction(js_State *J, js_Function *F) · 20 unmodified lines
807809 printf(" %ld", (long)((*p++) - 32768));
808810 break;
809811 case OP_NUMBER:
810− printf(" %.9g", F->numtab[*p++]);
812+ memcpy(&n, p, sizeof(n));
813+ p += sizeof(n) / sizeof(*p);
814+ printf(" %.9g", n);
811815 break;
812816 case OP_STRING:
817+ memcpy(&s, p, sizeof(s));
818+ p += sizeof(s) / sizeof(*p);
813819 pc(' ');
814− pstr(F->strtab[*p++]);
820+ pstr(s);
815821 break;
816822 case OP_NEWREGEXP:
817823 pc(' ');
818− pregexp(F->strtab[p[0]], p[1]);
819− p += 2;
824+ memcpy(&s, p, sizeof(s));
825+ p += sizeof(s) / sizeof(*p);
826+ pregexp(s, *p++);
820827 break;
821828
822829 case OP_GETVAR:
@@ -827,8 +834,10 @@ void jsC_dumpfunction(js_State *J, js_Function *F) · 4 unmodified lines
827834 case OP_SETPROP_S:
828835 case OP_DELPROP_S:
829836 case OP_CATCH:
837+ memcpy(&s, p, sizeof(s));
838+ p += sizeof(s) / sizeof(*p);
830839 pc(' ');
831− ps(F->strtab[*p++]);
840+ ps(s);
832841 break;
833842
834843 case OP_GETLOCAL:
jsgc.c+0−2
@@ -13,8 +13,6 @@ static void jsG_freeenvironment(js_State *J, js_Environment *env) · 12 unmodified lines
1313 static void jsG_freefunction(js_State *J, js_Function *fun)
1414 {
1515 js_free(J, fun->funtab);
16− js_free(J, fun->numtab);
17− js_free(J, fun->strtab);
1816 js_free(J, fun->vartab);
1917 js_free(J, fun->code);
2018 js_free(J, fun);
jsrun.c+33−14
@@ -1314,8 +1314,6 @@ void js_trap(js_State *J, int pc) · 1313 unmodified lines
13141314 static void jsR_run(js_State *J, js_Function *F)
13151315 {
13161316 js_Function **FT = F->funtab;
1317− double *NT = F->numtab;
1318− const char **ST = F->strtab;
13191317 const char **VT = F->vartab-1;
13201318 int lightweight = F->lightweight;
13211319 js_Instruction *pcstart = F->code;
@@ -1335,6 +1333,10 @@ static void jsR_run(js_State *J, js_Function *F) · 13 unmodified lines
13351333 savestrict = J->strict;
13361334 J->strict = F->strict;
13371335
1336+#define READSTRING() \
1337+ memcpy(&str, pc, sizeof(str)); \
1338+ pc += sizeof(str) / sizeof(*pc)
1339+
13381340 while (1) {
13391341 if (J->gccounter > J->gcthresh)
13401342 js_gc(J, 0);
@@ -1351,14 +1353,28 @@ static void jsR_run(js_State *J, js_Function *F) · 10 unmodified lines
13511353 case OP_ROT3: js_rot3(J); break;
13521354 case OP_ROT4: js_rot4(J); break;
13531355
1354− case OP_INTEGER: js_pushnumber(J, *pc++ - 32768); break;
1355− case OP_NUMBER: js_pushnumber(J, NT[*pc++]); break;
1356− case OP_STRING: js_pushliteral(J, ST[*pc++]); break;
1356+ case OP_INTEGER:
1357+ js_pushnumber(J, *pc++ - 32768);
1358+ break;
1359+
1360+ case OP_NUMBER:
1361+ memcpy(&x, pc, sizeof(x));
1362+ pc += sizeof(x) / sizeof(*pc);
1363+ js_pushnumber(J, x);
1364+ break;
1365+
1366+ case OP_STRING:
1367+ READSTRING();
1368+ js_pushliteral(J, str);
1369+ break;
13571370
13581371 case OP_CLOSURE: js_newfunction(J, FT[*pc++], J->E); break;
13591372 case OP_NEWOBJECT: js_newobject(J); break;
13601373 case OP_NEWARRAY: js_newarray(J); break;
1361− case OP_NEWREGEXP: js_newregexp(J, ST[pc[0]], pc[1]); pc += 2; break;
1374+ case OP_NEWREGEXP:
1375+ READSTRING();
1376+ js_newregexp(J, str, *pc++);
1377+ break;
13621378
13631379 case OP_UNDEF: js_pushundefined(J); break;
13641380 case OP_NULL: js_pushnull(J); break;
@@ -1410,22 +1426,25 @@ static void jsR_run(js_State *J, js_Function *F) · 45 unmodified lines
14101426 break;
14111427
14121428 case OP_GETVAR:
1413− str = ST[*pc++];
1429+ READSTRING();
14141430 if (!js_hasvar(J, str))
14151431 js_referenceerror(J, "'%s' is not defined", str);
14161432 break;
14171433
14181434 case OP_HASVAR:
1419− if (!js_hasvar(J, ST[*pc++]))
1435+ READSTRING();
1436+ if (!js_hasvar(J, str))
14201437 js_pushundefined(J);
14211438 break;
14221439
14231440 case OP_SETVAR:
1424− js_setvar(J, ST[*pc++]);
1441+ READSTRING();
1442+ js_setvar(J, str);
14251443 break;
14261444
14271445 case OP_DELVAR:
1428− b = js_delvar(J, ST[*pc++]);
1446+ READSTRING();
1447+ b = js_delvar(J, str);
14291448 js_pushboolean(J, b);
14301449 break;
14311450
@@ -1471,7 +1490,7 @@ static void jsR_run(js_State *J, js_Function *F) · 39 unmodified lines
14711490 break;
14721491
14731492 case OP_GETPROP_S:
1474− str = ST[*pc++];
1493+ READSTRING();
14751494 obj = js_toobject(J, -1);
14761495 jsR_getproperty(J, obj, str);
14771496 js_rot2pop1(J);
@@ -1486,7 +1505,7 @@ static void jsR_run(js_State *J, js_Function *F) · 8 unmodified lines
14861505 break;
14871506
14881507 case OP_SETPROP_S:
1489− str = ST[*pc++];
1508+ READSTRING();
14901509 obj = js_toobject(J, -2);
14911510 transient = !js_isobject(J, -2);
14921511 jsR_setproperty(J, obj, str, transient);
@@ -1502,7 +1521,7 @@ static void jsR_run(js_State *J, js_Function *F) · 9 unmodified lines
15021521 break;
15031522
15041523 case OP_DELPROP_S:
1505− str = ST[*pc++];
1524+ READSTRING();
15061525 obj = js_toobject(J, -1);
15071526 b = jsR_delproperty(J, obj, str);
15081527 js_pop(J, 1);
@@ -1738,7 +1757,7 @@ static void jsR_run(js_State *J, js_Function *F) · 229 unmodified lines
17381757 break;
17391758
17401759 case OP_CATCH:
1741− str = ST[*pc++];
1760+ READSTRING();
17421761 obj = jsV_newobject(J, JS_COBJECT, NULL);
17431762 js_pushobject(J, obj);
17441763 js_rot2(J);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t