MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add inline functions for performance improvements

+82 -49
+1 -1
meson.build
··· 96 96 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 97 97 98 98 version_conf = configuration_data() 99 - version_conf.set('ANT_VERSION', '0.3.2.17') 99 + version_conf.set('ANT_VERSION', '0.3.2.18') 100 100 version_conf.set('ANT_GIT_HASH', git_hash) 101 101 version_conf.set('ANT_BUILD_DATE', build_date) 102 102
+81 -48
src/ant.c
··· 527 527 return (data & PROPREF_STACK_FLAG) ? 0 : ((data >> PROPREF_KEY_SHIFT) & PROPREF_OFF_MASK); 528 528 } 529 529 530 - static jsoff_t offtolen(jsoff_t off) { return (off >> 2) - 1; } 531 - static jsoff_t align32(jsoff_t v) { return ((v + 3) >> 2) << 2; } 530 + static inline jsoff_t offtolen(jsoff_t off) { return (off >> 2) - 1; } 531 + static inline jsoff_t align32(jsoff_t v) { return (v + 3) & ~3U; } 532 532 533 533 static void saveoff(struct js *js, jsoff_t off, jsoff_t val) { 534 534 memcpy(&js->mem[off], &val, sizeof(val)); ··· 3293 3293 static inline jsoff_t esize(jsoff_t w) { 3294 3294 jsoff_t cleaned = w & ~FLAGMASK; 3295 3295 switch (cleaned & 3U) { 3296 - case T_OBJ: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t)); 3297 - case T_PROP: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t) + sizeof(jsval_t)); 3298 - case T_STR: return (jsoff_t) (sizeof(jsoff_t) + align32(cleaned >> 2U)); 3299 - default: return (jsoff_t) ~0U; 3296 + case T_OBJ: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t)); 3297 + case T_PROP: return (jsoff_t) (sizeof(jsoff_t) + sizeof(jsoff_t) + sizeof(jsval_t)); 3298 + case T_STR: return (jsoff_t) (sizeof(jsoff_t) + align32(cleaned >> 2U)); 3299 + default: return (jsoff_t) ~0U; 3300 3300 } 3301 - } 3302 - 3303 - static bool is_mem_entity(uint8_t t) { 3304 - return t == T_OBJ || t == T_PROP || t == T_STR || t == T_FUNC || t == T_ARR || t == T_PROMISE; 3305 3301 } 3306 3302 3307 3303 static int is_unicode_space(const unsigned char *p, jsoff_t remaining, bool *is_line_term) { ··· 3321 3317 return 0; 3322 3318 } 3323 3319 3324 - static jsoff_t skiptonext(const char *code, jsoff_t len, jsoff_t n, bool *had_newline) { 3325 - if (had_newline) *had_newline = false; 3326 - if (n == 0 && len >= 2 && code[0] == '#' && code[1] == '!') { 3327 - for (n = 2; n < len && code[n] != '\n'; n++); 3328 - if (had_newline && n < len && code[n] == '\n') *had_newline = true; 3320 + enum { C_0 = 0, C_SPC, C_NL, C_SL, C_HI }; 3321 + 3322 + static const uint8_t cc[128] = { 3323 + 0,0,0,0,0,0,0,0,0,C_SPC,C_NL,C_SPC,C_SPC,C_SPC,0,0, 3324 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3325 + C_SPC,0,0,0,0,0,0,0,0,0,0,0,0,0,0,C_SL, 3326 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3327 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3328 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3329 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3330 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3331 + }; 3332 + 3333 + static jsoff_t skiptonext(const char *code, jsoff_t len, jsoff_t n, bool *nl) { 3334 + static const void *D[] = { &&L0, &&LS, &&LN, &&LSL, &&LH }; 3335 + bool saw_nl = false; 3336 + unsigned char c; 3337 + 3338 + const char *p = code + n; 3339 + const char *end = code + len; 3340 + 3341 + if (__builtin_expect(p == code && end - p >= 2 && p[0] == '#' && p[1] == '!', 0)) { 3342 + for (p += 2; p < end && *p != '\n'; p++); 3343 + if (p < end) { saw_nl = true; p++; } 3344 + } 3345 + 3346 + if (__builtin_expect(p >= end, 0)) goto L0; 3347 + c = (unsigned char)*p; 3348 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3349 + 3350 + LS: 3351 + p++; 3352 + if (__builtin_expect(p >= end, 0)) goto L0; 3353 + c = (unsigned char)*p; 3354 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3355 + 3356 + LN: 3357 + saw_nl = true; 3358 + p++; 3359 + if (__builtin_expect(p >= end, 0)) goto L0; 3360 + c = (unsigned char)*p; 3361 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3362 + 3363 + LSL: 3364 + if (p + 1 >= end) goto L0; 3365 + if (p[1] == '/') { 3366 + for (p += 2; p < end && *p != '\n'; p++); 3367 + if (p < end) { saw_nl = true; p++; } 3368 + if (__builtin_expect(p >= end, 0)) goto L0; 3369 + c = (unsigned char)*p; 3370 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3329 3371 } 3330 - while (n < len) { 3331 - unsigned char c = (unsigned char)code[n]; 3332 - if (c <= 0x7F) { 3333 - if (c == ' ' || c == '\t' || c == '\r' || c == '\f' || c == '\v') { 3334 - n++; 3335 - } else if (c == '\n') { 3336 - if (had_newline) *had_newline = true; 3337 - n++; 3338 - } else if (c == '/' && n + 1 < len) { 3339 - if (code[n + 1] == '/') { 3340 - for (n += 2; n < len && code[n] != '\n';) n++; 3341 - if (had_newline && n < len && code[n] == '\n') *had_newline = true; 3342 - } else if (code[n + 1] == '*' && n + 3 < len) { 3343 - for (n += 4; n < len && (code[n - 2] != '*' || code[n - 1] != '/');) { 3344 - if (had_newline && code[n] == '\n') *had_newline = true; 3345 - n++; 3346 - } 3347 - } else { 3348 - break; 3349 - } 3350 - } else { 3351 - break; 3352 - } 3353 - } else { 3354 - bool is_line_term = false; 3355 - int ulen = is_unicode_space((const unsigned char *)&code[n], len - n, &is_line_term); 3356 - if (ulen > 0) { 3357 - if (had_newline && is_line_term) *had_newline = true; 3358 - n += ulen; 3359 - } else { 3360 - break; 3361 - } 3372 + if (p[1] == '*') { 3373 + for (p += 2; p + 1 < end; p++) { 3374 + if (*p == '*' && p[1] == '/') { p += 2; break; } 3375 + if (*p == '\n') saw_nl = true; 3362 3376 } 3377 + if (__builtin_expect(p >= end, 0)) goto L0; 3378 + c = (unsigned char)*p; 3379 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3363 3380 } 3364 - return n; 3381 + goto L0; 3382 + 3383 + LH: { 3384 + bool lt; 3385 + int u = is_unicode_space((const unsigned char *)p, end - p, &lt); 3386 + if (u > 0) { 3387 + if (lt) saw_nl = true; 3388 + p += u; 3389 + if (__builtin_expect(p >= end, 0)) goto L0; 3390 + c = (unsigned char)*p; 3391 + goto *D[c & 0x80 ? C_HI : cc[c]]; 3392 + } 3393 + } 3394 + 3395 + L0: 3396 + if (nl) *nl = saw_nl; 3397 + return p - code; 3365 3398 } 3366 3399 3367 3400 static bool streq(const char *buf, size_t len, const char *p, size_t n) {