%PDF- %PDF-
| Direktori : /home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/builtins/ |
| Current File : //home2/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/builtins/wasm-strings.tq |
// Copyright 2023 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file defines the builtins that are installed on the WebAssembly.String
// object.
macro Trap(context: Context, error: constexpr MessageTemplate): never {
runtime::ThrowWasmError(context, SmiConstant(error));
}
transitioning javascript builtin WebAssemblyStringFromWtf16Array(
js-implicit context: Context)(...arguments): JSAny {
try {
const array = Cast<WasmArray>(arguments[0]) otherwise goto IllegalCast;
if (!wasm::IsWord16WasmArrayMap(array.map)) goto IllegalCast;
const start = ChangeNumberToUint32(ToInteger_Inline(arguments[1]));
const end = ChangeNumberToUint32(ToInteger_Inline(arguments[2]));
return wasm::WasmStringNewWtf16Array(array, start, end);
} label IllegalCast deferred {
if (arguments[0] == Null) {
Trap(context, MessageTemplate::kWasmTrapNullDereference);
}
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
const kWtf8: constexpr int31 generates 'unibrow::Utf8Variant::kWtf8';
transitioning javascript builtin WebAssemblyStringFromWtf8Array(
js-implicit context: Context)(...arguments): JSAny {
try {
const array = Cast<WasmArray>(arguments[0]) otherwise goto IllegalCast;
if (!wasm::IsWord8WasmArrayMap(array.map)) goto IllegalCast;
const start = ChangeNumberToUint32(ToInteger_Inline(arguments[1]));
const end = ChangeNumberToUint32(ToInteger_Inline(arguments[2]));
return wasm::WasmStringNewWtf8Array(start, end, array, SmiConstant(kWtf8));
} label IllegalCast deferred {
if (arguments[0] == Null) {
Trap(context, MessageTemplate::kWasmTrapNullDereference);
}
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringToWtf16Array(
js-implicit context: Context)(...arguments): JSAny {
try {
const string = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const array = Cast<WasmArray>(arguments[1]) otherwise goto IllegalCast;
if (!wasm::IsWord16WasmArrayMap(array.map)) goto IllegalCast;
const start = ChangeNumberToUint32(ToInteger_Inline(arguments[2]));
const written = wasm::WasmStringEncodeWtf16Array(string, array, start);
return Convert<Smi>(written);
} label IllegalCast deferred {
if (arguments[1] == Null) {
Trap(context, MessageTemplate::kWasmTrapNullDereference);
}
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringFromCharCode(
js-implicit context: Context)(...arguments): JSAny {
const code = ChangeNumberToUint32(ToInteger_Inline(arguments[0]));
return StringFromSingleCharCode(%RawDownCast<char16>(code & 0xFFFF));
}
transitioning javascript builtin WebAssemblyStringFromCodePoint(
js-implicit context: Context)(...arguments): JSAny {
const code = ToInteger_Inline(arguments[0]);
const codeUint = ChangeNumberToUint32(code);
if (codeUint <= 0xFFFF) {
return StringFromSingleCharCode(%RawDownCast<char16>(codeUint));
}
return runtime::WasmStringFromCodePoint(context, code);
}
transitioning javascript builtin WebAssemblyStringCodePointAt(
js-implicit context: Context)(...arguments): JSAny {
try {
const string = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const index = ChangeNumberToUint32(ToInteger_Inline(arguments[1]));
if (index >= Unsigned(string.length)) goto OOB;
const code: int32 = string::LoadSurrogatePairAt(
string, string.length_intptr, Signed(Convert<uintptr>(index)),
UnicodeEncoding::UTF32);
return Convert<Smi>(code);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
} label OOB deferred {
Trap(context, MessageTemplate::kWasmTrapStringOffsetOutOfBounds);
}
}
transitioning javascript builtin WebAssemblyStringCharCodeAt(
js-implicit context: Context)(...arguments): JSAny {
try {
const string = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const index = ChangeNumberToUint32(ToInteger_Inline(arguments[1]));
if (index >= Unsigned(string.length)) goto OOB;
const code: char16 = StringCharCodeAt(string, Convert<uintptr>(index));
return SmiTag(code);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
} label OOB deferred {
Trap(context, MessageTemplate::kWasmTrapStringOffsetOutOfBounds);
}
}
transitioning javascript builtin WebAssemblyStringLength(
js-implicit context: Context)(...arguments): JSAny {
try {
const string = Cast<String>(arguments[0]) otherwise goto IllegalCast;
return string.length_smi;
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringConcat(
js-implicit context: Context)(...arguments): JSAny {
try {
const first = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const second = Cast<String>(arguments[1]) otherwise goto IllegalCast;
return StringAdd_CheckNone(first, second);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringSubstring(
js-implicit context: Context)(...arguments): JSAny {
try {
const string = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const start = ChangeNumberToUint32(ToInteger_Inline(arguments[1]));
const end = ChangeNumberToUint32(ToInteger_Inline(arguments[2]));
return wasm::WasmStringViewWtf16Slice(string, start, end);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringEquals(
js-implicit context: Context)(...arguments): JSAny {
try {
const a = arguments[0];
const b = arguments[1];
if (a == Null) {
typeswitch (b) {
case (Null): {
return SmiConstant(1);
}
case (String): {
return SmiConstant(0);
}
case (JSAny): {
goto IllegalCast;
}
}
}
const left = Cast<String>(a) otherwise goto IllegalCast;
if (b == Null) return SmiConstant(0);
const right = Cast<String>(b) otherwise goto IllegalCast;
if (TaggedEqual(a, b)) return SmiConstant(1);
if (left.length != right.length) return SmiConstant(0);
if (wasm::StringEqual(kNoContext, left, right, left.length_intptr) ==
True) {
return SmiConstant(1);
}
return SmiConstant(0);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}
transitioning javascript builtin WebAssemblyStringCompare(
js-implicit context: Context)(...arguments): JSAny {
try {
const first = Cast<String>(arguments[0]) otherwise goto IllegalCast;
const second = Cast<String>(arguments[1]) otherwise goto IllegalCast;
return StringCompare(first, second);
} label IllegalCast deferred {
Trap(context, MessageTemplate::kWasmTrapIllegalCast);
}
}