static bool AstDecodeGenerateName(AstDecodeContext& c, const AstName& prefix, uint32_t index, AstName* name) { if (!c.generateNames) { *name = AstName(); return true; } AstVector<char16_t> result(c.lifo); if (!result.append(prefix.begin(), prefix.length())) return false; uint32_t tmp = index; do { if (!result.append(MOZ_UTF16('0'))) return false; tmp /= 10; } while (tmp); if (index) { char16_t* p = result.end(); for (tmp = index; tmp; tmp /= 10) *(--p) = MOZ_UTF16('0' + (tmp % 10)); } size_t length = result.length(); char16_t* begin = result.extractOrCopyRawBuffer(); if (!begin) return false; *name = AstName(begin, length); return true; }
static bool RenderEscapedString(WasmRenderContext& c, const AstName& s) { size_t length = s.length(); const char16_t* p = s.begin(); for (size_t i = 0; i < length; i++) { char16_t byte = p[i]; switch (byte) { case '\n': if (!c.buffer.append("\\n")) return false; break; case '\r': if (!c.buffer.append("\\0d")) return false; break; case '\t': if (!c.buffer.append("\\t")) return false; break; case '\f': if (!c.buffer.append("\\0c")) return false; break; case '\b': if (!c.buffer.append("\\08")) return false; break; case '\\': if (!c.buffer.append("\\\\")) return false; break; case '"' : if (!c.buffer.append("\\\"")) return false; break; case '\'': if (!c.buffer.append("\\'")) return false; break; default: if (byte >= 32 && byte < 127) { if (!c.buffer.append((char)byte)) return false; } else { char digit1 = byte / 16, digit2 = byte % 16; if (!c.buffer.append("\\")) return false; if (!c.buffer.append((char)(digit1 < 10 ? digit1 + '0' : digit1 + 'a' - 10))) return false; if (!c.buffer.append((char)(digit2 < 10 ? digit2 + '0' : digit2 + 'a' - 10))) return false; } break; } } return true; }
static bool RenderName(WasmRenderContext& c, const AstName& name) { return c.buffer.append(name.begin(), name.end()); }