%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/builtins/ |
Current File : /home/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); } }