lib/strings/dup: rt.malloc → alloc([], n)! slice form

Pilot for task #8 (runtime-N alloc API). `alloc([], n)!` yields a
slice with cap=n, len=0; explicit `buf.len = s.len;` lifts the len
before the fromutf8_unsafe reinterpret. Same shape as
ref/hare/strings/dup.ha:15 modulo ww not yet having `append`
(task #36) — open-coded byte loop in lieu of static-append.

Verified 132/132 + 995_self_rebuild byte-identity. Pattern is the
template for the next α-category sites (concat/join/lpad/rpad/...).
This commit is contained in:
2026-05-20 23:38:03 +09:00
parent a376ec89eb
commit 4c07ef0552
4 changed files with 12 additions and 16 deletions

View File

@@ -99,12 +99,11 @@ export fn dup(s: str) str = {
r.ptr = nil;
r.len = 0;
if (s.len == 0) { return r; };
let buf: *u8 = rt.malloc(s.len: u64): *u8;
let buf: []u8 = alloc([], s.len: u64)!;
let i: i32 = 0;
for (i < s.len) { buf[i] = s[i]; i += 1; };
r.ptr = buf;
r.len = s.len;
return r;
buf.len = s.len;
return fromutf8_unsafe(buf);
};
// dupall — fresh `[]str` whose elements are independent copies of

View File

@@ -1938,12 +1938,11 @@ export fn dup(s: str) str = {
r.ptr = nil;
r.len = 0;
if (s.len == 0) { return r; };
let buf: *u8 = rt.malloc(s.len: u64): *u8;
let buf: []u8 = alloc([], s.len: u64)!;
let i: i32 = 0;
for (i < s.len) { buf[i] = s[i]; i += 1; };
r.ptr = buf;
r.len = s.len;
return r;
buf.len = s.len;
return fromutf8_unsafe(buf);
};
// dupall — fresh `[]str` whose elements are independent copies of

View File

@@ -1938,12 +1938,11 @@ export fn dup(s: str) str = {
r.ptr = nil;
r.len = 0;
if (s.len == 0) { return r; };
let buf: *u8 = rt.malloc(s.len: u64): *u8;
let buf: []u8 = alloc([], s.len: u64)!;
let i: i32 = 0;
for (i < s.len) { buf[i] = s[i]; i += 1; };
r.ptr = buf;
r.len = s.len;
return r;
buf.len = s.len;
return fromutf8_unsafe(buf);
};
// dupall — fresh `[]str` whose elements are independent copies of

View File

@@ -1828,12 +1828,11 @@ export fn dup(s: str) str = {
r.ptr = nil;
r.len = 0;
if (s.len == 0) { return r; };
let buf: *u8 = rt.malloc(s.len: u64): *u8;
let buf: []u8 = alloc([], s.len: u64)!;
let i: i32 = 0;
for (i < s.len) { buf[i] = s[i]; i += 1; };
r.ptr = buf;
r.len = s.len;
return r;
buf.len = s.len;
return fromutf8_unsafe(buf);
};
// dupall — fresh `[]str` whose elements are independent copies of