瀏覽代碼

Avoid binary creation for strings if unneeded

pull/195/head
Jose M Perez 5 年之前
父節點
當前提交
e476e6042e
共有 1 個檔案被更改,包括 23 行新增11 行删除
  1. +23
    -11
      c_src/decoder.c

+ 23
- 11
c_src/decoder.c 查看文件

@ -236,7 +236,9 @@ dec_string(Decoder* d, ERL_NIF_TERM* value)
int hi; int hi;
int lo; int lo;
char* chrbuf = NULL; char* chrbuf = NULL;
char buf[4]; // Substitute for chrbuf when no term is needed
int chrpos; int chrpos;
int chrpos_increment;
if(d->p[d->i] != '\"') { if(d->p[d->i] != '\"') {
return 0; return 0;
@ -347,12 +349,22 @@ parse:
lo = 0; lo = 0;
ulen = (d->i - 1) - st - num_escapes; ulen = (d->i - 1) - st - num_escapes;
chrbuf = (char*) enif_make_new_binary(d->env, ulen, value);
chrpos = 0;
if(level_allows_terms(d)) {
chrbuf = (char*) enif_make_new_binary(d->env, ulen, value);
chrpos_increment = 1;
chrpos = -1;
} else {
// No term is created, but the string is still validated
// (Thus the chrpos_increment = 0, so we overwrite buf)
chrbuf = &buf[0];
chrpos_increment = 0;
chrpos = 0;
}
ui = st; ui = st;
while(ui < d->i - 1) { while(ui < d->i - 1) {
chrpos += chrpos_increment;
if(d->p[ui] != '\\') { if(d->p[ui] != '\\') {
chrbuf[chrpos++] = d->p[ui++];
chrbuf[chrpos] = d->p[ui++];
continue; continue;
} }
ui++; ui++;
@ -360,27 +372,27 @@ parse:
case '\"': case '\"':
case '\\': case '\\':
case '/': case '/':
chrbuf[chrpos++] = d->p[ui];
chrbuf[chrpos] = d->p[ui];
ui++; ui++;
break; break;
case 'b': case 'b':
chrbuf[chrpos++] = '\b';
chrbuf[chrpos] = '\b';
ui++; ui++;
break; break;
case 'f': case 'f':
chrbuf[chrpos++] = '\f';
chrbuf[chrpos] = '\f';
ui++; ui++;
break; break;
case 'n': case 'n':
chrbuf[chrpos++] = '\n';
chrbuf[chrpos] = '\n';
ui++; ui++;
break; break;
case 'r': case 'r':
chrbuf[chrpos++] = '\r';
chrbuf[chrpos] = '\r';
ui++; ui++;
break; break;
case 't': case 't':
chrbuf[chrpos++] = '\t';
chrbuf[chrpos] = '\t';
ui++; ui++;
break; break;
case 'u': case 'u':
@ -399,11 +411,11 @@ parse:
} else { } else {
ui += 4; ui += 4;
} }
hi = unicode_to_utf8(hi, (unsigned char*) chrbuf+chrpos);
hi = unicode_to_utf8(hi, (unsigned char*) &chrbuf[chrpos]);
if(hi < 0) { if(hi < 0) {
return 0; return 0;
} }
chrpos += hi;
chrpos += (hi-1) * chrpos_increment;
break; break;
default: default:
return 0; return 0;

Loading…
取消
儲存