From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS12876 163.172.0.0/16 X-Spam-Status: No, score=-2.6 required=3.0 tests=BAYES_00,RCVD_IN_MSPIKE_BL, RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (tor-exit-readme.memcpy.io [163.172.67.180]) by dcvr.yhbt.net (Postfix) with ESMTP id D636D207BD for ; Wed, 19 Apr 2017 22:30:33 +0000 (UTC) From: Eric Wong To: kcar-public@bogomips.org Subject: [PATCH 1/7] introduce new str_new_dd_freeze internal function Date: Wed, 19 Apr 2017 22:30:19 +0000 Message-Id: <20170419223025.8093-2-e@80x24.org> In-Reply-To: <20170419223025.8093-1-e@80x24.org> References: <20170419223025.8093-1-e@80x24.org> List-Id: This seems like it will be a common pattern to create and immediately dedupe a string. In the future, we may be able to save some memory by eliding temporary object creation or releasing heap memory via rb_str_resize(..., 0) --- ext/kcar/kcar.rl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/kcar/kcar.rl b/ext/kcar/kcar.rl index cbcfa97..79f65db 100644 --- a/ext/kcar/kcar.rl +++ b/ext/kcar/kcar.rl @@ -106,6 +106,11 @@ static VALUE str_dd_freeze(VALUE str) return str; } +static VALUE str_new_dd_freeze(const char *ptr, long len) +{ + return str_dd_freeze(rb_str_new(ptr, len)); +} + static VALUE stripped_str_new(const char *str, long len) { long end; @@ -161,7 +166,7 @@ status_phrase(struct http_parser *hp, VALUE hdr, const char *ptr, size_t len) { long nr; - hp->status = str_dd_freeze(rb_str_new(ptr, len)); + hp->status = str_new_dd_freeze(ptr, len); /* RSTRING_PTR is null terminated, ptr is not */ nr = strtol(RSTRING_PTR(hp->status), NULL, 10); @@ -238,7 +243,7 @@ static void write_value(VALUE hdr, struct http_parser *hp, vlen = LEN(mark, p); VALIDATE_MAX_LENGTH(vlen, FIELD_VALUE); VALIDATE_MAX_LENGTH(flen, FIELD_NAME); - f = str_dd_freeze(rb_str_new(fptr, (long)flen)); + f = str_new_dd_freeze(fptr, (long)flen); v = stripped_str_new(vptr, (long)vlen); /* needs more tests for error-checking here */ -- EW