diff options
63 files changed, 2834 insertions, 127 deletions
diff --git a/.gitmodules b/.gitmodules index f26f6e2f6..231555d2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -69,3 +69,10 @@ ignore = dirty depth = 1 shallow = true fetchRecurseSubmodules = false +[submodule "src/deps/oniguruma"] +path = src/deps/oniguruma +url = https://github.com/kkos/oniguruma +ignore = dirty +depth = 1 +shallow = true +fetchRecurseSubmodules = false @@ -394,7 +394,8 @@ MINIMUM_ARCHIVE_FILES = -L$(BUN_DEPS_OUT_DIR) \ -lssl \ -lcrypto \ -llolhtml \ - $(BUN_DEPS_OUT_DIR)/libbacktrace.a + $(BUN_DEPS_OUT_DIR)/libbacktrace.a \ + $(BUN_DEPS_OUT_DIR)/libonig.a ARCHIVE_FILES_WITHOUT_LIBCRYPTO = $(MINIMUM_ARCHIVE_FILES) \ -larchive \ @@ -483,9 +484,13 @@ builtins: ## to generate builtins $(shell which python || which python2) $(realpath $(WEBKIT_DIR)/Source/JavaScriptCore/Scripts/generate-js-builtins.py) -i $(realpath src)/bun.js/builtins/js -o $(realpath src)/bun.js/builtins/cpp --framework WebCore --force $(shell which python || which python2) $(realpath $(WEBKIT_DIR)/Source/JavaScriptCore/Scripts/generate-js-builtins.py) -i $(realpath src)/bun.js/builtins/js -o $(realpath src)/bun.js/builtins/cpp --framework WebCore --wrappers-only rm -rf /tmp/1.h src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h.1 - echo -e '// clang-format off\nnamespace Zig { class GlobalObject; }' >> /tmp/1.h + echo -e '// clang-format off\nnamespace Zig { class GlobalObject; }\n#include "root.h"\n' >> /tmp/1.h cat /tmp/1.h src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h > src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h.1 mv src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h.1 src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h + rm -rf /tmp/1.h src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h.1 + echo -e '// clang-format off\nnamespace Zig { class GlobalObject; }\n#include "root.h"\n' >> /tmp/1.h + cat /tmp/1.h src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.cpp > src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.cpp.1 + mv src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.cpp.1 src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.cpp $(SED) -i -e 's/class JSDOMGlobalObject/using JSDOMGlobalObject = Zig::GlobalObject/' src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h # this is the one we actually build mv src/bun.js/builtins/cpp/*JSBuiltin*.cpp src/bun.js/builtins @@ -494,7 +499,7 @@ builtins: ## to generate builtins generate-builtins: builtins .PHONY: tinycc -vendor-without-check: npm-install node-fallbacks runtime_js fallback_decoder bun_error mimalloc picohttp zlib boringssl libarchive libbacktrace lolhtml usockets uws base64 tinycc +vendor-without-check: npm-install node-fallbacks runtime_js fallback_decoder bun_error mimalloc picohttp zlib boringssl libarchive libbacktrace lolhtml usockets uws base64 tinycc oniguruma BUN_TYPES_REPO_PATH ?= $(realpath ../bun-types) @@ -548,6 +553,13 @@ libbacktrace: make -j$(CPUS) && \ cp ./.libs/libbacktrace.a $(BUN_DEPS_OUT_DIR)/libbacktrace.a +.PHONY: oniguruma +oniguruma: + cd $(BUN_DEPS_DIR)/oniguruma && \ + autoreconf -vfi && \ + CFLAGS="$(CFLAGS)" CC=$(CC) ./configure && \ + make -j${CPUS} && \ + cp ./src/.libs/libonig.a $(BUN_DEPS_OUT_DIR)/libonig.a sqlite: diff --git a/src/bun.js/bindings/OnigurumaRegExp.cpp b/src/bun.js/bindings/OnigurumaRegExp.cpp new file mode 100644 index 000000000..b49717b05 --- /dev/null +++ b/src/bun.js/bindings/OnigurumaRegExp.cpp @@ -0,0 +1,804 @@ +#include "OnigurumaRegExp.h" + +#include "ZigGlobalObject.h" +#define ONIG_ESCAPE_UCHAR_COLLISION +#include "oniguruma/src/oniguruma.h" + +using namespace JSC; +using namespace WebCore; + +#include "WebCoreJSClientData.h" + +extern "C" EncodedJSValue jsFunctionGetOnigurumaRegExpConstructor(JSGlobalObject * lexicalGlobalObject, EncodedJSValue thisValue, PropertyName attributeName) +{ + auto& vm = lexicalGlobalObject->vm(); + Zig::GlobalObject *globalObject = reinterpret_cast<Zig::GlobalObject*>(lexicalGlobalObject); + return JSValue::encode(globalObject->OnigurumaRegExpConstructor()); +} + +namespace Zig { + +static WTF::String to16Bit(ASCIILiteral str) +{ + return WTF::String::make16BitFrom8BitSource(str.characters8(), str.length()); +} + +static WTF::String to16Bit(JSC::JSString* str, JSC::JSGlobalObject *globalObject) { + if (!str->is8Bit() || str->length() == 0) { + return str->value(globalObject); + } + + auto value = str->value(globalObject); + return WTF::String::make16BitFrom8BitSource(value.characters8(), value.length()); +} + + +static WTF::String to16Bit(JSValue jsValue, JSC::JSGlobalObject *globalObject, ASCIILiteral defaultValue) { + if (!jsValue || jsValue.isUndefinedOrNull()) { + return to16Bit(defaultValue); + } + + auto *jsString = jsValue.toString(globalObject); + if (jsString->length() == 0) { + return to16Bit(defaultValue); + } + + return to16Bit(jsString, globalObject); +} + +static inline bool is16BitLineTerminator(UChar c) +{ + return c == '\r' || c == '\n' || (c & ~1) == 0x2028; +} + +static inline WTF::String escapedPattern(const WTF::String& pattern, const UChar* characters, size_t length) +{ + bool previousCharacterWasBackslash = false; + bool inBrackets = false; + bool shouldEscape = false; + + // 15.10.6.4 specifies that RegExp.prototype.toString must return '/' + source + '/', + // and also states that the result must be a valid RegularExpressionLiteral. '//' is + // not a valid RegularExpressionLiteral (since it is a single line comment), and hence + // source cannot ever validly be "". If the source is empty, return a different Pattern + // that would match the same thing. + if (!length) + return "(?:)"_s; + + // early return for strings that don't contain a forwards slash and LineTerminator + for (unsigned i = 0; i < length; ++i) { + UChar ch = characters[i]; + if (!previousCharacterWasBackslash) { + if (inBrackets) { + if (ch == ']') + inBrackets = false; + } else { + if (ch == '/') { + shouldEscape = true; + break; + } + if (ch == '[') + inBrackets = true; + } + } + + if (is16BitLineTerminator(ch)) { + shouldEscape = true; + break; + } + + if (previousCharacterWasBackslash) + previousCharacterWasBackslash = false; + else + previousCharacterWasBackslash = ch == '\\'; + } + + if (!shouldEscape) + return pattern; + + previousCharacterWasBackslash = false; + inBrackets = false; + StringBuilder result; + for (unsigned i = 0; i < length; ++i) { + UChar ch = characters[i]; + if (!previousCharacterWasBackslash) { + if (inBrackets) { + if (ch == ']') + inBrackets = false; + } else { + if (ch == '/') + result.append('\\'); + else if (ch == '[') + inBrackets = true; + } + } + + // escape LineTerminator + if (is16BitLineTerminator(ch)) { + if (!previousCharacterWasBackslash) { + result.append('\\'); + } + + if (ch == '\n') { + result.append('n'); + } + else if (ch == '\r') { + result.append('r'); + } + else if (ch == 0x2028) { + result.append("u2028"); + } + else { + result.append("u2029"); + } + } else + result.append(ch); + + if (previousCharacterWasBackslash) + previousCharacterWasBackslash = false; + else + previousCharacterWasBackslash = ch == '\\'; + } + + return result.toString(); +} + +WTF::String sortRegExpFlags(WTF::String flagsString) { + WTF::Vector<UChar> flags = {'d', 'g', 'i', 'm', 's', 'u', 'y'}; + WTF::StringBuilder result; + + for (auto flag : flags) { + if (flagsString.contains(flag)) { + result.append(flag); + } + } + + return result.toString(); +} + +bool validateRegExpFlags(WTF::StringView flags){ + std::map<char16_t, bool> flagsAllowed = {{'g', false}, {'i', false}, {'m', false}, {'s', false}, {'u', false}, {'y', false}, {'d', false}}; + for (auto flag : flags.codeUnits()) { + auto flagItr = flagsAllowed.find(flag); + if (flagItr == flagsAllowed.end() || flagItr->second) { + return false; + } + flagItr->second = true; + } + + return true; +} + +class OnigurumaRegExpPrototype final : public JSC::JSNonFinalObject { + public: + using Base = JSC::JSNonFinalObject; + + static OnigurumaRegExpPrototype* create(JSC::VM& vm, JSGlobalObject* globalObject, JSC::Structure* structure) + { + OnigurumaRegExpPrototype* ptr = new (NotNull, JSC::allocateCell<OnigurumaRegExpPrototype>(vm)) OnigurumaRegExpPrototype(vm, globalObject, structure); + ptr->finishCreation(vm, globalObject); + return ptr; + } + + DECLARE_INFO; + template<typename CellType, JSC::SubspaceAccess> + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + return &vm.plainObjectSpace(); + } + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) + { + return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); + } + + private: + OnigurumaRegExpPrototype(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure) + : Base(vm, structure) + { + } + + void finishCreation(JSC::VM&, JSC::JSGlobalObject*); + }; + + + +class OnigurumaRegEx final : public JSC::JSDestructibleObject { +public: + using Base = JSC::JSDestructibleObject; + + static OnigurumaRegEx* create(JSC::VM& vm, JSGlobalObject* globalObject, JSC::Structure* structure) + { + OnigurumaRegEx* ptr = new (NotNull, JSC::allocateCell<OnigurumaRegEx>(vm)) OnigurumaRegEx(vm, globalObject, structure); + ptr->finishCreation(vm); + return ptr; + } + + static OnigurumaRegEx* create(JSC::JSGlobalObject* globalObject, WTF::String&& pattern, WTF::String&& flags, regex_t* regExpCode) { + auto *structure = reinterpret_cast<Zig::GlobalObject*>(globalObject)->OnigurumaRegExpStructure(); + auto *object = create(globalObject->vm(), globalObject, structure); + object->m_flagsString = WTFMove(flags); + object->m_patternString = WTFMove(pattern); + object->m_onigurumaRegExp = regExpCode; + + return object; + } + + + DECLARE_EXPORT_INFO; + template<typename, JSC::SubspaceAccess mode> static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + if constexpr (mode == JSC::SubspaceAccess::Concurrently) + return nullptr; + + return WebCore::subspaceForImpl<OnigurumaRegEx, UseCustomHeapCellType::No>( + vm, + [](auto& spaces) { return spaces.m_clientSubspaceForOnigurumaRegExp.get(); }, + [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForOnigurumaRegExp = WTFMove(space); }, + [](auto& spaces) { return spaces.m_subspaceForOnigurumaRegExp.get(); }, + [](auto& spaces, auto&& space) { spaces.m_subspaceForOnigurumaRegExp = WTFMove(space); }); + + } + + static void destroy(JSC::JSCell* cell) { + static_cast<OnigurumaRegEx*>(cell)->OnigurumaRegEx::~OnigurumaRegEx(); + } + + ~OnigurumaRegEx() { + if (m_onigurumaRegExp) { + onig_free(m_onigurumaRegExp); + } + } + + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) + { + return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(RegExpObjectType, StructureFlags), info()); + } + + // static void analyzeHeap(JSCell*, JSC::HeapAnalyzer&); + + const WTF::String& flagsString() const { return m_flagsString; } + void setFlagsString(const WTF::String& flagsString) { m_flagsString = flagsString; } + const WTF::String& patternString() const { return m_patternString; } + void setPatternString(const WTF::String& patternString) { m_patternString = patternString; } + + regex_t* m_onigurumaRegExp = NULL; + int32_t m_lastIndex = 0; + +private: + OnigurumaRegEx(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure) + : Base(vm, structure) + { + } + + void finishCreation(JSC::VM&) { + Base::finishCreation(vm()); + + } + + WTF::String m_patternString = {}; + WTF::String m_flagsString = {}; + +}; + +const ClassInfo OnigurumaRegExpConstructor::s_info = { "Function"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(OnigurumaRegExpConstructor) }; +const ClassInfo OnigurumaRegExpPrototype::s_info = { "Object"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(OnigurumaRegExpPrototype) }; +const ClassInfo OnigurumaRegEx::s_info = { "RegExp"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(OnigurumaRegEx) }; + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterGlobal, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('g'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterDotAll, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('s'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterHasIndices, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('d'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterIgnoreCase, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('i'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterMultiline, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('m'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterSticky, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('y'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterUnicode, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (UNLIKELY(!thisValue)) { + return JSValue::encode(jsUndefined()); + } + return JSValue::encode(jsBoolean(thisValue->flagsString().contains('u'))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterSource, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (!thisValue) + return JSValue::encode(jsUndefined()); + + return JSValue::encode(jsString(globalObject->vm(), escapedPattern(thisValue->patternString(), thisValue->patternString().characters16(), thisValue->patternString().length()))); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterFlags, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + if (!thisValue) + return JSValue::encode(jsUndefined()); + + return JSValue::encode(jsString(globalObject->vm(), thisValue->flagsString())); +} + +JSC_DEFINE_CUSTOM_GETTER(onigurumaRegExpProtoGetterLastIndex, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + return JSValue::encode(jsNumber(thisValue->m_lastIndex)); +} + +JSC_DEFINE_CUSTOM_SETTER(onigurumaRegExpProtoSetterLastIndex, (JSGlobalObject *globalObject, EncodedJSValue encodedThis, EncodedJSValue encodedValue, PropertyName)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(JSValue::decode(encodedThis)); + auto throwScope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSValue value = JSValue::decode(encodedValue); + if (!value.isAnyInt()) { + throwException(globalObject, throwScope, createTypeError(globalObject, "lastIndex must be an integer"_s)); + return false; + } + int32_t lastIndex = value.toInt32(globalObject); + thisValue->m_lastIndex = lastIndex; + return true; +} + +// compile is deprecated +JSC_DEFINE_HOST_FUNCTION(onigurumaRegExpProtoFuncCompile, (JSGlobalObject *globalObject, JSC::CallFrame *callFrame)) +{ + VM& vm = globalObject->vm(); + auto scope = DECLARE_CATCH_SCOPE(vm); + auto throwScope = DECLARE_THROW_SCOPE(vm); + + JSValue thisValue = callFrame->thisValue(); + auto *thisRegExp = jsDynamicCast<OnigurumaRegEx*>(callFrame->thisValue()); + if (UNLIKELY(!thisRegExp)) + return JSValue::encode(jsUndefined()); + + if (thisRegExp->globalObject() != globalObject) { + throwScope.throwException(globalObject, createTypeError(globalObject, makeString("RegExp.prototype.compile function's Realm must be the same to |this| RegExp object"_s))); + return JSValue::encode({}); + } + + JSValue arg0 = callFrame->argument(0); + JSValue arg1 = callFrame->argument(1); + + if (auto* regExpObject = jsDynamicCast<OnigurumaRegEx*>(arg0)) { + if (!arg1.isUndefined()) { + throwScope.throwException(globalObject, createTypeError(globalObject, makeString("Cannot supply flags when constructing one RegExp from another."_s))); + return JSValue::encode({}); + } + thisRegExp->setPatternString(regExpObject->patternString()); + thisRegExp->setFlagsString(regExpObject->flagsString()); + } else { + WTF::String newPatternString = to16Bit(arg0, globalObject, "(?:)"_s); + RETURN_IF_EXCEPTION(scope, {}); + + WTF::String newFlagsString = to16Bit(arg1, globalObject, ""_s); + RETURN_IF_EXCEPTION(scope, {}); + + if (!validateRegExpFlags(newFlagsString)) { + throwScope.throwException(globalObject, createSyntaxError(globalObject, makeString("Invalid flags supplied to RegExp constructor."_s))); + return JSValue::encode({}); + } + + newFlagsString = sortRegExpFlags(newFlagsString); + + thisRegExp->setPatternString(newPatternString); + thisRegExp->setFlagsString(newFlagsString); + } + + OnigEncoding encoding = ONIG_ENCODING_UTF16_LE; + onig_initialize(&encoding, 1); + + OnigOptionType options = 0; + if (thisRegExp->flagsString().contains('i')) { + options |= ONIG_OPTION_IGNORECASE; + } + if (thisRegExp->flagsString().contains('m')) { + options |= ONIG_OPTION_MULTILINE; + } else { + options |= ONIG_OPTION_SINGLELINE; + } + if (thisRegExp->flagsString().contains('s')) { + options |= ONIG_OPTION_MULTILINE; + } + + OnigErrorInfo errorInfo = { 0 }; + regex_t* onigRegExp = NULL; + int errorCode = onig_new( + &onigRegExp, + reinterpret_cast<const OnigUChar*>(thisRegExp->patternString().characters16()), + reinterpret_cast<const OnigUChar*>(thisRegExp->patternString().characters16() + thisRegExp->patternString().length()), + options, + ONIG_ENCODING_UTF16_LE, + ONIG_SYNTAX_DEFAULT, + &errorInfo + ); + + if (errorCode != ONIG_NORMAL) { + OnigUChar errorBuff[ONIG_MAX_ERROR_MESSAGE_LEN] = { 0 }; + int length = onig_error_code_to_str(errorBuff, errorCode, &errorInfo); + WTF::StringBuilder errorMessage; + errorMessage.append("Invalid regular expression: "_s); + if (length < 0) { + errorMessage.append("An unknown error occurred."_s); + } else { + errorMessage.appendCharacters(errorBuff, length); + } + throwScope.throwException(globalObject, createSyntaxError(globalObject, errorMessage.toString())); + return JSValue::encode({}); + } + + if (thisRegExp->m_onigurumaRegExp) { + onig_free(thisRegExp->m_onigurumaRegExp); + } + + thisRegExp->m_onigurumaRegExp = onigRegExp; + thisRegExp->m_lastIndex = 0; + + return JSValue::encode(jsUndefined()); +} + +JSC_DEFINE_HOST_FUNCTION(onigurumaRegExpProtoFuncTest, (JSGlobalObject *globalObject, JSC::CallFrame *callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(callFrame->thisValue()); + if (!thisValue) + return JSValue::encode(jsUndefined()); + + JSValue arg = callFrame->argument(0); + if (!arg.isString()) { + scope.throwException(globalObject, createTypeError(globalObject, "Argument 0 of RegExp.prototype.test must be a string"_s)); + return JSValue::encode(jsBoolean(false)); + } + + WTF::String string = to16Bit(arg, globalObject, ""_s); + RETURN_IF_EXCEPTION(scope, JSValue::encode({})); + + OnigRegion *region = onig_region_new(); + + const OnigUChar* end = reinterpret_cast<const OnigUChar*>(string.characters16() + string.length()); + const OnigUChar* start = reinterpret_cast<const OnigUChar*>(string.characters16() + thisValue->m_lastIndex); + const OnigUChar* range = end; + + if (thisValue->m_lastIndex >= string.length()) { + onig_region_free(region, 1); + thisValue->m_lastIndex = 0; + return JSValue::encode(jsBoolean(false)); + } + + int result = onig_search( + thisValue->m_onigurumaRegExp, + reinterpret_cast<const OnigUChar*>(string.characters16()), + end, + start, + range, + region, + ONIG_OPTION_DEFAULT + ); + + if (result < 0) { + thisValue->m_lastIndex = 0; + onig_region_free(region, 1); + return JSValue::encode(jsBoolean(false)); + } + + if (thisValue->flagsString().contains('y') && region->beg[0] != thisValue->m_lastIndex) { + onig_region_free(region, 1); + return JSValue::encode(jsBoolean(false)); + } + + if (thisValue->flagsString().contains('g')) { + thisValue->m_lastIndex = region->end[0] / 2; + } else { + thisValue->m_lastIndex = 0; + } + + onig_region_free(region, 1); + + return JSValue::encode(jsBoolean(true)); +} + +JSC_DEFINE_HOST_FUNCTION(onigurumaRegExpProtoFuncExec, (JSGlobalObject *globalObject ,JSC::CallFrame *callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + auto throwScope = DECLARE_THROW_SCOPE(vm); + + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(callFrame->thisValue()); + if (!thisValue) + return JSValue::encode(jsUndefined()); + + JSValue arg = callFrame->argument(0); + if (!arg || arg.isUndefinedOrNull()) { + thisValue->m_lastIndex = 0; + return JSValue::encode(jsNull()); + } + + WTF::String string = to16Bit(arg, globalObject, ""_s); + RETURN_IF_EXCEPTION(scope, JSValue::encode({})); + + OnigRegion *region = onig_region_new(); + + const OnigUChar* end = reinterpret_cast<const OnigUChar*>(string.characters16() + string.length()); + const OnigUChar* start = reinterpret_cast<const OnigUChar*>(string.characters16() + thisValue->m_lastIndex); + const OnigUChar* range = end; + + int result = onig_search( + thisValue->m_onigurumaRegExp, + reinterpret_cast<const OnigUChar*>(string.characters16()), + end, + start, + range, + region, + ONIG_OPTION_DEFAULT + ); + + if (result < 0) { + onig_region_free(region, 1); + thisValue->m_lastIndex = 0; + return JSValue::encode(jsNull()); + } + + JSArray *array = constructEmptyArray(globalObject, nullptr, 0); + RETURN_IF_EXCEPTION(scope, JSValue::encode({})); + JSArray *indicesArray = constructEmptyArray(globalObject, nullptr, 0); + RETURN_IF_EXCEPTION(scope, JSValue::encode({})); + + array->putDirect(vm, vm.propertyNames->index, jsNumber(region->beg[0] / 2)); + array->putDirect(vm, vm.propertyNames->input, jsString(vm, string)); + array->putDirect(vm, vm.propertyNames->groups, jsUndefined()); + + for (int i = 0; i < region->num_regs; i++) { + size_t outStringLen = (region->end[i] / 2) - (region->beg[i] / 2); + UChar *ptr; + WTF::String outString; + if (outStringLen > 0) { + outString = WTF::String::createUninitialized(static_cast<unsigned int>(outStringLen), ptr); + if (UNLIKELY(!ptr)) { + throwOutOfMemoryError(globalObject, scope); + onig_region_free(region, 1); + return JSValue::encode(jsNull()); + } + + memcpy(ptr, (region->beg[i] / 2) + string.characters16(), outStringLen * sizeof(UChar)); + } + + array->putDirectIndex(globalObject, i, jsString(vm, outString)); + + JSArray *indices = constructEmptyArray(globalObject, nullptr, 0); + RETURN_IF_EXCEPTION(scope, JSValue::encode({})); + indices->putDirectIndex(globalObject, 0, jsNumber(region->beg[i] / 2)); + indices->putDirectIndex(globalObject, 1, jsNumber(region->end[i] / 2)); + indicesArray->putDirectIndex(globalObject, i, indices); + } + + if (thisValue->flagsString().contains('d')) { + array->putDirect(vm, vm.propertyNames->indices, indicesArray); + } + + if (thisValue->flagsString().contains('g')) { + thisValue->m_lastIndex = region->end[0] / 2; + } else { + thisValue->m_lastIndex = 0; + } + + onig_region_free(region, 1); + + return JSValue::encode(array); +} + +JSC_DEFINE_HOST_FUNCTION(onigurumaRegExpProtoFuncToString, (JSGlobalObject *globalObject ,JSC::CallFrame *callFrame)) +{ + auto *thisValue = jsDynamicCast<OnigurumaRegEx*>(callFrame->thisValue()); + if (!thisValue) + return JSValue::encode(jsUndefined()); + + WTF::String patternString = escapedPattern(thisValue->patternString(), thisValue->patternString().characters16(), thisValue->patternString().length()); + WTF::String flagsString = thisValue->flagsString(); + + WTF::StringBuilder source; + source.append("/"_s); + source.append(patternString); + source.append("/"_s); + source.append(flagsString); + + return JSValue::encode(jsString(globalObject->vm(), source.toString())); +} + +void OnigurumaRegExpPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject) +{ + Base::finishCreation(vm); + ASSERT(inherits(info())); + this->putDirectNativeFunction(vm, globalObject, PropertyName(vm.propertyNames->compile), 2, onigurumaRegExpProtoFuncCompile, ImplementationVisibility::Public, NoIntrinsic, static_cast<unsigned>(0)); + this->putDirectNativeFunction(vm, globalObject, PropertyName(vm.propertyNames->exec), 1, onigurumaRegExpProtoFuncExec, ImplementationVisibility::Public, NoIntrinsic, static_cast<unsigned>(0)); + this->putDirectNativeFunction(vm, globalObject, PropertyName(vm.propertyNames->toString), 0, onigurumaRegExpProtoFuncToString, ImplementationVisibility::Public, NoIntrinsic, static_cast<unsigned>(0)); + this->putDirectCustomAccessor(vm, vm.propertyNames->global, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterGlobal, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->dotAll, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterDotAll, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->hasIndices, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterHasIndices, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->ignoreCase, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterIgnoreCase, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->multiline, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterMultiline, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->sticky, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterSticky, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->unicode, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterUnicode, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->source, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterSource, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->flags, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterFlags, nullptr), 0 | PropertyAttribute::CustomAccessor | PropertyAttribute::ReadOnly); + this->putDirectCustomAccessor(vm, vm.propertyNames->lastIndex, JSC::CustomGetterSetter::create(vm, onigurumaRegExpProtoGetterLastIndex, onigurumaRegExpProtoSetterLastIndex), 0 | PropertyAttribute::CustomAccessor);; + this->putDirectNativeFunction(vm, globalObject, PropertyName(vm.propertyNames->test), 1, onigurumaRegExpProtoFuncTest, ImplementationVisibility::Public, NoIntrinsic, static_cast<unsigned>(0)); + + this->putDirectBuiltinFunction(vm, globalObject, vm.propertyNames->matchSymbol, onigurumaRegExpPrototypeMatchCodeGenerator(vm), static_cast<unsigned>(0)); + this->putDirectBuiltinFunction(vm, globalObject, vm.propertyNames->matchAllSymbol, onigurumaRegExpPrototypeMatchAllCodeGenerator(vm), static_cast<unsigned>(0)); + this->putDirectBuiltinFunction(vm, globalObject, vm.propertyNames->replaceSymbol, onigurumaRegExpPrototypeReplaceCodeGenerator(vm), static_cast<unsigned>(0)); + this->putDirectBuiltinFunction(vm, globalObject, vm.propertyNames->searchSymbol, onigurumaRegExpPrototypeSearchCodeGenerator(vm), static_cast<unsigned>(0)); + this->putDirectBuiltinFunction(vm, globalObject, vm.propertyNames->splitSymbol, onigurumaRegExpPrototypeSplitCodeGenerator(vm), static_cast<unsigned>(0)); +} + +JSC::Structure* OnigurumaRegExpConstructor::createClassStructure(JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) +{ + JSC::VM& vm = globalObject->vm(); + return OnigurumaRegEx::createStructure( + vm, + globalObject, + prototype + ); +} +JSC::JSObject* OnigurumaRegExpConstructor::createPrototype(JSC::JSGlobalObject* globalObject) +{ + return OnigurumaRegExpPrototype::create(globalObject->vm(), globalObject, OnigurumaRegExpPrototype::createStructure(globalObject->vm(), globalObject, globalObject->objectPrototype())); +} + + +void OnigurumaRegExpConstructor::finishCreation(VM &vm, JSValue prototype) +{ + + Base::finishCreation(vm, 0, "RegExp"_s, PropertyAdditionMode::WithoutStructureTransition); + putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, PropertyAttribute::DontEnum | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + ASSERT(inherits(info())); +} + +OnigurumaRegExpConstructor* OnigurumaRegExpConstructor::create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure, JSValue prototype) +{ + OnigurumaRegExpConstructor* ptr = new (NotNull, JSC::allocateCell<OnigurumaRegExpConstructor>(vm)) OnigurumaRegExpConstructor(vm, structure, construct); + ptr->finishCreation(vm, prototype); + return ptr; +} + +static JSC::EncodedJSValue constructOrCall(Zig::GlobalObject *globalObject, JSValue arg0, JSValue arg1) +{ + auto &vm = globalObject->vm(); + auto scope = DECLARE_CATCH_SCOPE(vm); + auto throwScope = DECLARE_THROW_SCOPE(vm); + + WTF::String patternString = to16Bit(arg0, globalObject, "(?:)"_s); + RETURN_IF_EXCEPTION(scope, {}); + + WTF::String flagsString = to16Bit(arg1, globalObject, ""_s); + RETURN_IF_EXCEPTION(scope, {}); + + if(!validateRegExpFlags(flagsString)) { + throwScope.throwException(globalObject, createSyntaxError(globalObject, makeString("Invalid flags supplied to RegExp constructor."_s))); + return JSValue::encode({}); + } + + flagsString = sortRegExpFlags(flagsString); + + OnigEncoding encoding = ONIG_ENCODING_UTF16_LE; + onig_initialize(&encoding, 1); + + OnigOptionType options = 0; + if (flagsString.contains('i')) { + options |= ONIG_OPTION_IGNORECASE; + } + if (flagsString.contains('m')) { + options |= ONIG_OPTION_MULTILINE; + } else { + options |= ONIG_OPTION_SINGLELINE; + } + if (flagsString.contains('s')) { + options |= ONIG_OPTION_MULTILINE; + } + + OnigErrorInfo errorInfo = { 0 }; + regex_t* onigRegExp = NULL; + int errorCode = onig_new( + &onigRegExp, + reinterpret_cast<const OnigUChar*>(patternString.characters16()), + reinterpret_cast<const OnigUChar*>(patternString.characters16() + patternString.length()), + options, + ONIG_ENCODING_UTF16_LE, + ONIG_SYNTAX_DEFAULT, + &errorInfo + ); + + if (errorCode != ONIG_NORMAL) { + OnigUChar errorBuff[ONIG_MAX_ERROR_MESSAGE_LEN] = { 0 }; + int length = onig_error_code_to_str(errorBuff, errorCode, &errorInfo); + WTF::StringBuilder errorMessage; + errorMessage.append("Invalid regular expression: "_s); + if (length < 0) { + errorMessage.append("An unknown error occurred."_s); + } else { + errorMessage.appendCharacters(errorBuff, length); + } + throwScope.throwException(globalObject, createSyntaxError(globalObject, errorMessage.toString())); + return JSValue::encode({}); + } + + RETURN_IF_EXCEPTION(scope, {}); + + OnigurumaRegEx *result = OnigurumaRegEx::create(globalObject, WTFMove(patternString), WTFMove(flagsString), onigRegExp); + + return JSValue::encode(result); +} + +JSC::EncodedJSValue JSC_HOST_CALL_ATTRIBUTES OnigurumaRegExpConstructor::construct(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame) +{ + Zig::GlobalObject *globalObject = reinterpret_cast<Zig::GlobalObject*>(lexicalGlobalObject); + JSC::VM &vm = globalObject->vm(); + JSObject* newTarget = asObject(callFrame->newTarget()); + auto* constructor = globalObject->OnigurumaRegExpConstructor(); + Structure* structure = globalObject->OnigurumaRegExpStructure(); + if (constructor != newTarget) { + auto scope = DECLARE_THROW_SCOPE(vm); + + auto* functionGlobalObject = reinterpret_cast<Zig::GlobalObject*>( + // ShadowRealm functions belong to a different global object. + getFunctionRealm(globalObject, newTarget) + ); + RETURN_IF_EXCEPTION(scope, {}); + structure = InternalFunction::createSubclassStructure( + globalObject, + newTarget, + functionGlobalObject->OnigurumaRegExpStructure() + ); + } + + return constructOrCall(globalObject, callFrame->argument(0), callFrame->argument(1)); +} + +} diff --git a/src/bun.js/bindings/OnigurumaRegExp.h b/src/bun.js/bindings/OnigurumaRegExp.h new file mode 100644 index 000000000..846ca6357 --- /dev/null +++ b/src/bun.js/bindings/OnigurumaRegExp.h @@ -0,0 +1,47 @@ +#pragma once + +#include "root.h" +#include "BunBuiltinNames.h" +#include "BunClientData.h" +#include "ZigGlobalObject.h" +#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h" + +extern "C" JSC::EncodedJSValue jsFunctionGetOnigurumaRegExpConstructor(JSC::JSGlobalObject * lexicalGlobalObject, JSC::EncodedJSValue thisValue, JSC::PropertyName attributeName); + +namespace Zig { + +using namespace JSC; +using namespace WebCore; + +class OnigurumaRegExpConstructor final : public JSC::InternalFunction { +public: + using Base = JSC::InternalFunction; + static OnigurumaRegExpConstructor* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure, JSValue prototype); + + // Must be defined for each specialization class. + static JSC::EncodedJSValue JSC_HOST_CALL_ATTRIBUTES construct(JSC::JSGlobalObject*, JSC::CallFrame*); + DECLARE_EXPORT_INFO; + + static JSC::Structure* createClassStructure(JSC::JSGlobalObject*, JSC::JSValue prototype); + static JSC::JSObject* createPrototype(JSC::JSGlobalObject*); + + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) + { + return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::InternalFunctionType, StructureFlags), info()); + } + + +private: + OnigurumaRegExpConstructor(JSC::VM& vm, JSC::Structure* structure, JSC::NativeFunction nativeFunction) + : Base(vm, structure, nativeFunction, nativeFunction) + + { + } + + + void finishCreation(JSC::VM&, JSValue prototype); +}; + + + +}
\ No newline at end of file diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 85b3c27ee..e69163043 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -163,6 +163,8 @@ using JSBuffer = WebCore::JSBuffer; #include "DOMJITHelpers.h" #include <JavaScriptCore/DFGAbstractHeap.h> +#include "OnigurumaRegExp.h" + #ifdef __APPLE__ #include <sys/sysctl.h> #else @@ -2076,6 +2078,17 @@ void GlobalObject::finishCreation(VM& vm) init.setConstructor(constructor); }); + m_OnigurumaRegExpClassStructure.initLater( + [](LazyClassStructure::Initializer& init) { + auto* prototype = OnigurumaRegExpConstructor::createPrototype(init.global); + auto* structure = OnigurumaRegExpConstructor::createClassStructure(init.global, prototype); + auto* constructor = OnigurumaRegExpConstructor::create( + init.vm, init.global, OnigurumaRegExpConstructor::createStructure(init.vm, init.global, init.global->functionPrototype()), prototype); + init.setPrototype(prototype); + init.setStructure(structure); + init.setConstructor(constructor); + }); + m_JSStringDecoderClassStructure.initLater( [](LazyClassStructure::Initializer& init) { auto* prototype = JSStringDecoderPrototype::create( @@ -2542,6 +2555,11 @@ void GlobalObject::installAPIGlobals(JSClassRef* globals, int count, JSC::VM& vm } { + JSC::Identifier identifier = JSC::Identifier::fromString(vm, "OnigurumaRegExp"_s); + object->putDirectCustomAccessor(vm, identifier, JSC::CustomGetterSetter::create(vm, jsFunctionGetOnigurumaRegExpConstructor, nullptr), JSC::PropertyAttribute::CustomAccessor | 0); + } + + { JSC::Identifier identifier = JSC::Identifier::fromString(vm, "stringHashCode"_s); object->putDirectNativeFunction(vm, this, identifier, 1, functionHashCode, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DontDelete | 0); @@ -2668,6 +2686,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) thisObject->m_JSHTTPResponseSinkClassStructure.visit(visitor); thisObject->m_JSHTTPSResponseSinkClassStructure.visit(visitor); thisObject->m_JSFileSinkClassStructure.visit(visitor); + thisObject->m_OnigurumaRegExpClassStructure.visit(visitor); visitor.append(thisObject->m_JSBufferSetterValue); visitor.append(thisObject->m_JSTextEncoderSetterValue); diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index 4a003fc60..8c0cc4796 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -209,6 +209,10 @@ public: JSC::JSObject* JSReadableState() { return m_JSReadableStateClassStructure.constructorInitializedOnMainThread(this); } JSC::JSValue JSReadableStatePrototype() { return m_JSReadableStateClassStructure.prototypeInitializedOnMainThread(this); } + JSC::Structure* OnigurumaRegExpStructure() { return m_OnigurumaRegExpClassStructure.getInitializedOnMainThread(this); } + JSC::JSValue OnigurumaRegExpPrototype() { return m_OnigurumaRegExpClassStructure.prototypeInitializedOnMainThread(this); } + JSC::JSObject* OnigurumaRegExpConstructor() { return m_OnigurumaRegExpClassStructure.constructorInitializedOnMainThread(this); } + JSC::JSMap* readableStreamNativeMap() { return m_lazyReadableStreamPrototypeMap.getInitializedOnMainThread(this); } JSC::JSMap* requireMap() { return m_requireMap.getInitializedOnMainThread(this); } JSC::JSObject* encodeIntoObjectPrototype() { return m_encodeIntoObjectPrototype.getInitializedOnMainThread(this); } @@ -399,6 +403,7 @@ private: LazyClassStructure m_JSBufferListClassStructure; LazyClassStructure m_JSStringDecoderClassStructure; LazyClassStructure m_JSReadableStateClassStructure; + LazyClassStructure m_OnigurumaRegExpClassStructure; LazyProperty<JSGlobalObject, JSObject> m_navigatorObject; diff --git a/src/bun.js/bindings/headers-cpp.h b/src/bun.js/bindings/headers-cpp.h index 0bc56c8d0..b0e3128dd 100644 --- a/src/bun.js/bindings/headers-cpp.h +++ b/src/bun.js/bindings/headers-cpp.h @@ -1,4 +1,4 @@ -//-- AUTOGENERATED FILE -- 1666012803 +//-- AUTOGENERATED FILE -- 1665449441 // clang-format off #pragma once diff --git a/src/bun.js/bindings/headers.h b/src/bun.js/bindings/headers.h index 9ab48f4fb..6e24d2e08 100644 --- a/src/bun.js/bindings/headers.h +++ b/src/bun.js/bindings/headers.h @@ -1,5 +1,5 @@ // clang-format off -//-- AUTOGENERATED FILE -- 1666012803 +//-- AUTOGENERATED FILE -- 1665449441 #pragma once #include <stddef.h> diff --git a/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h b/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h index 8f976919c..1477cc4b2 100644 --- a/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h +++ b/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h @@ -29,6 +29,7 @@ public: std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForStringDecoder; std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForReadableState; std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForPendingVirtualModuleResult; + std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForOnigurumaRegExp; #include "ZigGeneratedClasses+DOMClientIsoSubspaces.h" /* --- bun --- */ diff --git a/src/bun.js/bindings/webcore/DOMIsoSubspaces.h b/src/bun.js/bindings/webcore/DOMIsoSubspaces.h index 98d7de159..e1e9a35c3 100644 --- a/src/bun.js/bindings/webcore/DOMIsoSubspaces.h +++ b/src/bun.js/bindings/webcore/DOMIsoSubspaces.h @@ -29,6 +29,7 @@ public: std::unique_ptr<IsoSubspace> m_subspaceForStringDecoder; std::unique_ptr<IsoSubspace> m_subspaceForReadableState; std::unique_ptr<IsoSubspace> m_subspaceForPendingVirtualModuleResult; + std::unique_ptr<IsoSubspace> m_subspaceForOnigurumaRegExp; #include "ZigGeneratedClasses+DOMIsoSubspaces.h" /*-- BUN --*/ diff --git a/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp b/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp index 159e2f45b..93e13369a 100644 --- a/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp +++ b/src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp @@ -1,9 +1,14 @@ +// clang-format off +namespace Zig { class GlobalObject; } +#include "root.h" + /* * Copyright (c) 2015 Igalia * Copyright (c) 2015 Igalia S.L. * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/WebCoreJSBuiltins.cpp b/src/bun.js/builtins/WebCoreJSBuiltins.cpp index cf5345346..eedab6754 100644 --- a/src/bun.js/builtins/WebCoreJSBuiltins.cpp +++ b/src/bun.js/builtins/WebCoreJSBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * @@ -38,6 +39,7 @@ #include "ImportMetaObjectBuiltins.cpp" #include "JSBufferConstructorBuiltins.cpp" #include "JSBufferPrototypeBuiltins.cpp" +#include "OnigurumaRegExpPrototypeBuiltins.cpp" #include "ProcessObjectBuiltins.cpp" #include "ReadableByteStreamControllerBuiltins.cpp" #include "ReadableByteStreamInternalsBuiltins.cpp" diff --git a/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.cpp b/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.cpp index 3bec31ac7..fac21b4ec 100644 --- a/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.h b/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.h index fc56f2911..b86a05c27 100644 --- a/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.h +++ b/src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.cpp b/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.cpp index ed428601a..82aaefddb 100644 --- a/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.cpp +++ b/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.h b/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.h index 06811f00a..a05d5c9b8 100644 --- a/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.h +++ b/src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp index 360168176..75a52c699 100644 --- a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.h b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.h index 5cc424ec8..f3182273c 100644 --- a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.h +++ b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp index ed14b6699..1ec885ee0 100644 --- a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp +++ b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.h b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.h index f9181b402..67670d715 100644 --- a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.h +++ b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.cpp b/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.cpp index 67a829d74..d1d9231e7 100644 --- a/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.cpp +++ b/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.h b/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.h index 8b85e9f23..f17f22dbb 100644 --- a/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.h +++ b/src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.cpp b/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.cpp new file mode 100644 index 000000000..cf55745b1 --- /dev/null +++ b/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.cpp @@ -0,0 +1,672 @@ +/* + * Copyright (c) 2015 Igalia + * Copyright (c) 2015 Igalia S.L. + * Copyright (c) 2015 Igalia. + * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. + * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. + * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. + * Copyright (c) 2022 Codeblog Corp. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// DO NOT EDIT THIS FILE. It is automatically generated from JavaScript files for +// builtins by the script: Source/JavaScriptCore/Scripts/generate-js-builtins.py + +#include "config.h" +#include "OnigurumaRegExpPrototypeBuiltins.h" + +#include "WebCoreJSClientData.h" +#include <JavaScriptCore/HeapInlines.h> +#include <JavaScriptCore/IdentifierInlines.h> +#include <JavaScriptCore/ImplementationVisibility.h> +#include <JavaScriptCore/Intrinsic.h> +#include <JavaScriptCore/JSCJSValueInlines.h> +#include <JavaScriptCore/JSCellInlines.h> +#include <JavaScriptCore/StructureInlines.h> +#include <JavaScriptCore/VM.h> + +namespace WebCore { + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeAdvanceStringIndexCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeAdvanceStringIndexCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeAdvanceStringIndexCodeImplementationVisibility = JSC::ImplementationVisibility::Private; +const int s_onigurumaRegExpPrototypeAdvanceStringIndexCodeLength = 427; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeAdvanceStringIndexCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeAdvanceStringIndexCode = + "(function (string, index, unicode)\n" \ + "{\n" \ + " //\n" \ + " \"use strict\";\n" \ + "\n" \ + " if (!unicode)\n" \ + " return index + 1;\n" \ + "\n" \ + " if (index + 1 >= string.length)\n" \ + " return index + 1;\n" \ + "\n" \ + " var first = string.@charCodeAt(index);\n" \ + " if (first < 0xD800 || first > 0xDBFF)\n" \ + " return index + 1;\n" \ + "\n" \ + " var second = string.@charCodeAt(index + 1);\n" \ + " if (second < 0xDC00 || second > 0xDFFF)\n" \ + " return index + 1;\n" \ + "\n" \ + " return index + 2;\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchSlowCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchSlowCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchSlowCodeImplementationVisibility = JSC::ImplementationVisibility::Private; +const int s_onigurumaRegExpPrototypeMatchSlowCodeLength = 796; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeMatchSlowCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeMatchSlowCode = + "(function (regexp, str)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " if (!regexp.global)\n" \ + " return regexp.exec(str);\n" \ + " \n" \ + " var unicode = regexp.unicode;\n" \ + " regexp.lastIndex = 0;\n" \ + " var resultList = [];\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " //\n" \ + " var maximumReasonableMatchSize = 100000000;\n" \ + "\n" \ + " while (true) {\n" \ + " var result = regexp.exec(str);\n" \ + " \n" \ + " if (result === null) {\n" \ + " if (resultList.length === 0)\n" \ + " return null;\n" \ + " return resultList;\n" \ + " }\n" \ + "\n" \ + " if (resultList.length > maximumReasonableMatchSize)\n" \ + " @throwOutOfMemoryError();\n" \ + "\n" \ + " var resultString = @toString(result[0]);\n" \ + "\n" \ + " if (!resultString.length)\n" \ + " regexp.lastIndex = @advanceStringIndex(str, regexp.lastIndex, unicode);\n" \ + "\n" \ + " @arrayPush(resultList, resultString);\n" \ + " }\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeMatchCodeLength = 225; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeMatchCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeMatchCode = + "(function (strArg)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " if (!@isObject(this))\n" \ + " @throwTypeError(\"RegExp.prototype.@@match requires that |this| be an Object\");\n" \ + "\n" \ + " var str = @toString(strArg);\n" \ + "\n" \ + " return @matchSlow(this, str);\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchAllCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchAllCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchAllCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeMatchAllCodeLength = 2928; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeMatchAllCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeMatchAllCode = + "(function (strArg)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " var regExp = this;\n" \ + " if (!@isObject(regExp)) {\n" \ + " @throwTypeError(\"RegExp.prototype.@@matchAll requires |this| to be an Object\");\n" \ + " }\n" \ + "\n" \ + " var string = @toString(strArg);\n" \ + "\n" \ + " var Matcher = @speciesConstructor(regExp, @Bun.OnigurumaRegExp);\n" \ + "\n" \ + " var flags = @toString(regExp.flags);\n" \ + " var matcher = new Matcher(regExp.source, flags);\n" \ + " matcher.lastIndex = @toLength(regExp.lastIndex);\n" \ + "\n" \ + " var global = @stringIncludesInternal.@call(flags, \"g\");\n" \ + " var fullUnicode = @stringIncludesInternal.@call(flags, \"u\");\n" \ + "\n" \ + " var iterator = globalThis.Symbol.iterator;\n" \ + "\n" \ + " var RegExpStringIterator = class RegExpStringIterator {\n" \ + " constructor(regExp, string, global, fullUnicode)\n" \ + " {\n" \ + " \n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorRegExp\", regExp);\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorString\", string);\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorGlobal\", global);\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorUnicode\", fullUnicode);\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorDone\", false);\n" \ + " }\n" \ + "\n" \ + " next() {\n" \ + " \"use strict\";\n" \ + " if (!@isObject(this)) {\n" \ + " @throwTypeError(\"%RegExpStringIteratorPrototype%.next requires |this| to be an Object\");\n" \ + " }\n" \ + " \n" \ + " var done = @getByIdDirectPrivate(this, \"regExpStringIteratorDone\");\n" \ + " if (done === @undefined) {\n" \ + " @throwTypeError(\"%RegExpStringIteratorPrototype%.next requires |this| to be an RegExp String Iterator instance\");\n" \ + " }\n" \ + " \n" \ + " if (done) {\n" \ + " return { value: @undefined, done: true };\n" \ + " }\n" \ + " \n" \ + " var regExp = @getByIdDirectPrivate(this, \"regExpStringIteratorRegExp\");\n" \ + " var string = @getByIdDirectPrivate(this, \"regExpStringIteratorString\");\n" \ + " var global = @getByIdDirectPrivate(this, \"regExpStringIteratorGlobal\");\n" \ + " var fullUnicode = @getByIdDirectPrivate(this, \"regExpStringIteratorUnicode\");\n" \ + " var match = regExp.exec(string);\n" \ + " if (match === null) {\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorDone\", true);\n" \ + " return { value: @undefined, done: true };\n" \ + " }\n" \ + " \n" \ + " if (global) {\n" \ + " var matchStr = @toString(match[0]);\n" \ + " if (matchStr === \"\") {\n" \ + " var thisIndex = @toLength(regExp.lastIndex);\n" \ + " regExp.lastIndex = @advanceStringIndex(string, thisIndex, fullUnicode);\n" \ + " }\n" \ + " } else\n" \ + " @putByIdDirectPrivate(this, \"regExpStringIteratorDone\", true);\n" \ + " \n" \ + " return { value: match, done: false };\n" \ + " }\n" \ + "\n" \ + " [iterator]() {\n" \ + " return this;\n" \ + " }\n" \ + "\n" \ + " };\n" \ + "\n" \ + " return new RegExpStringIterator(matcher, string, global, fullUnicode);\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeGetSubstitutionCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeGetSubstitutionCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeGetSubstitutionCodeImplementationVisibility = JSC::ImplementationVisibility::Private; +const int s_onigurumaRegExpPrototypeGetSubstitutionCodeLength = 3603; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeGetSubstitutionCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeGetSubstitutionCode = + "(function (matched, str, position, captures, namedCaptures, replacement)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " var matchLength = matched.length;\n" \ + " var stringLength = str.length;\n" \ + " var tailPos = position + matchLength;\n" \ + " var m = captures.length;\n" \ + " var replacementLength = replacement.length;\n" \ + " var result = \"\";\n" \ + " var lastStart = 0;\n" \ + "\n" \ + " for (var start = 0; start = @stringIndexOfInternal.@call(replacement, \"$\", lastStart), start !== -1; lastStart = start) {\n" \ + " if (start - lastStart > 0)\n" \ + " result = result + @stringSubstring.@call(replacement, lastStart, start);\n" \ + " start++;\n" \ + " if (start >= replacementLength)\n" \ + " result = result + \"$\";\n" \ + " else {\n" \ + " var ch = replacement[start];\n" \ + " switch (ch)\n" \ + " {\n" \ + " case \"$\":\n" \ + " result = result + \"$\";\n" \ + " start++;\n" \ + " break;\n" \ + " case \"&\":\n" \ + " result = result + matched;\n" \ + " start++;\n" \ + " break;\n" \ + " case \"`\":\n" \ + " if (position > 0)\n" \ + " result = result + @stringSubstring.@call(str, 0, position);\n" \ + " start++;\n" \ + " break;\n" \ + " case \"'\":\n" \ + " if (tailPos < stringLength)\n" \ + " result = result + @stringSubstring.@call(str, tailPos);\n" \ + " start++;\n" \ + " break;\n" \ + " case \"<\":\n" \ + " if (namedCaptures !== @undefined) {\n" \ + " var groupNameStartIndex = start + 1;\n" \ + " var groupNameEndIndex = @stringIndexOfInternal.@call(replacement, \">\", groupNameStartIndex);\n" \ + " if (groupNameEndIndex !== -1) {\n" \ + " var groupName = @stringSubstring.@call(replacement, groupNameStartIndex, groupNameEndIndex);\n" \ + " var capture = namedCaptures[groupName];\n" \ + " if (capture !== @undefined)\n" \ + " result = result + @toString(capture);\n" \ + "\n" \ + " start = groupNameEndIndex + 1;\n" \ + " break;\n" \ + " }\n" \ + " }\n" \ + "\n" \ + " result = result + \"$<\";\n" \ + " start++;\n" \ + " break;\n" \ + " default:\n" \ + " var chCode = ch.@charCodeAt(0);\n" \ + " if (chCode >= 0x30 && chCode <= 0x39) {\n" \ + " var originalStart = start - 1;\n" \ + " start++;\n" \ + "\n" \ + " var n = chCode - 0x30;\n" \ + " if (n > m) {\n" \ + " result = result + @stringSubstring.@call(replacement, originalStart, start);\n" \ + " break;\n" \ + " }\n" \ + "\n" \ + " if (start < replacementLength) {\n" \ + " var nextChCode = replacement.@charCodeAt(start);\n" \ + " if (nextChCode >= 0x30 && nextChCode <= 0x39) {\n" \ + " var nn = 10 * n + nextChCode - 0x30;\n" \ + " if (nn <= m) {\n" \ + " n = nn;\n" \ + " start++;\n" \ + " }\n" \ + " }\n" \ + " }\n" \ + "\n" \ + " if (n == 0) {\n" \ + " result = result + @stringSubstring.@call(replacement, originalStart, start);\n" \ + " break;\n" \ + " }\n" \ + "\n" \ + " var capture = captures[n - 1];\n" \ + " if (capture !== @undefined)\n" \ + " result = result + capture;\n" \ + " } else\n" \ + " result = result + \"$\";\n" \ + " break;\n" \ + " }\n" \ + " }\n" \ + " }\n" \ + "\n" \ + " return result + @stringSubstring.@call(replacement, lastStart);\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeReplaceCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeReplaceCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeReplaceCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeReplaceCodeLength = 3208; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeReplaceCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeReplaceCode = + "(function (strArg, replace)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " if (!@isObject(this))\n" \ + " @throwTypeError(\"RegExp.prototype.@@replace requires that |this| be an Object\");\n" \ + "\n" \ + " var regexp = this;\n" \ + "\n" \ + " var str = @toString(strArg);\n" \ + " var stringLength = str.length;\n" \ + " var functionalReplace = @isCallable(replace);\n" \ + "\n" \ + " if (!functionalReplace)\n" \ + " replace = @toString(replace);\n" \ + "\n" \ + " var global = regexp.global;\n" \ + " var unicode = false;\n" \ + "\n" \ + " if (global) {\n" \ + " unicode = regexp.unicode;\n" \ + " regexp.lastIndex = 0;\n" \ + " }\n" \ + "\n" \ + " var resultList = [];\n" \ + " var result;\n" \ + " var done = false;\n" \ + " while (!done) {\n" \ + " result = regexp.exec(str);\n" \ + "\n" \ + " if (result === null)\n" \ + " done = true;\n" \ + " else {\n" \ + " @arrayPush(resultList, result);\n" \ + " if (!global)\n" \ + " done = true;\n" \ + " else {\n" \ + " var matchStr = @toString(result[0]);\n" \ + "\n" \ + " if (!matchStr.length) {\n" \ + " var thisIndex = @toLength(regexp.lastIndex);\n" \ + " regexp.lastIndex = @advanceStringIndex(str, thisIndex, unicode);\n" \ + " }\n" \ + " }\n" \ + " }\n" \ + " }\n" \ + "\n" \ + " var accumulatedResult = \"\";\n" \ + " var nextSourcePosition = 0;\n" \ + "\n" \ + " for (var i = 0, resultListLength = resultList.length; i < resultListLength; ++i) {\n" \ + " var result = resultList[i];\n" \ + " var nCaptures = result.length - 1;\n" \ + " if (nCaptures < 0)\n" \ + " nCaptures = 0;\n" \ + " var matched = @toString(result[0]);\n" \ + " var matchLength = matched.length;\n" \ + " var position = @toIntegerOrInfinity(result.index);\n" \ + " position = (position > stringLength) ? stringLength : position;\n" \ + " position = (position < 0) ? 0 : position;\n" \ + "\n" \ + " var captures = [];\n" \ + " for (var n = 1; n <= nCaptures; n++) {\n" \ + " var capN = result[n];\n" \ + " if (capN !== @undefined)\n" \ + " capN = @toString(capN);\n" \ + " @arrayPush(captures, capN);\n" \ + " }\n" \ + "\n" \ + " var replacement;\n" \ + " var namedCaptures = result.groups;\n" \ + "\n" \ + " if (functionalReplace) {\n" \ + " var replacerArgs = [ matched ];\n" \ + " for (var j = 0; j < captures.length; j++)\n" \ + " @arrayPush(replacerArgs, captures[j]);\n" \ + "\n" \ + " @arrayPush(replacerArgs, position);\n" \ + " @arrayPush(replacerArgs, str);\n" \ + "\n" \ + " if (namedCaptures !== @undefined)\n" \ + " @arrayPush(replacerArgs, namedCaptures);\n" \ + "\n" \ + " var replValue = replace.@apply(@undefined, replacerArgs);\n" \ + " replacement = @toString(replValue);\n" \ + " } else {\n" \ + " if (namedCaptures !== @undefined)\n" \ + " namedCaptures = @toObject(namedCaptures, \"RegExp.prototype[Symbol.replace] requires 'groups' property of a match not be null\");\n" \ + "\n" \ + " replacement = @getSubstitution(matched, str, position, captures, namedCaptures, replace);\n" \ + " }\n" \ + "\n" \ + " if (position >= nextSourcePosition) {\n" \ + " accumulatedResult = accumulatedResult + @stringSubstring.@call(str, nextSourcePosition, position) + replacement;\n" \ + " nextSourcePosition = position + matchLength;\n" \ + " }\n" \ + " }\n" \ + "\n" \ + " if (nextSourcePosition >= stringLength)\n" \ + " return accumulatedResult;\n" \ + "\n" \ + " return accumulatedResult + @stringSubstring.@call(str, nextSourcePosition);\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeSearchCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeSearchCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeSearchCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeSearchCodeLength = 631; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeSearchCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeSearchCode = + "(function (strArg)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " var regexp = this;\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " if (!@isObject(this))\n" \ + " @throwTypeError(\"RegExp.prototype.@@search requires that |this| be an Object\");\n" \ + "\n" \ + " //\n" \ + " var str = @toString(strArg)\n" \ + "\n" \ + " //\n" \ + " var previousLastIndex = regexp.lastIndex;\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " if (!@sameValue(previousLastIndex, 0))\n" \ + " regexp.lastIndex = 0;\n" \ + "\n" \ + " //\n" \ + " var result = regexp.exec(str);\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " //\n" \ + " if (!@sameValue(regexp.lastIndex, previousLastIndex))\n" \ + " regexp.lastIndex = previousLastIndex;\n" \ + "\n" \ + " //\n" \ + " if (result === null)\n" \ + " return -1;\n" \ + "\n" \ + " //\n" \ + " return result.index;\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeSplitCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeSplitCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeSplitCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeSplitCodeLength = 2926; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeSplitCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeSplitCode = + "(function (string, limit)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " if (!@isObject(this))\n" \ + " @throwTypeError(\"RegExp.prototype.@@split requires that |this| be an Object\");\n" \ + " var regexp = this;\n" \ + "\n" \ + " //\n" \ + " var str = @toString(string);\n" \ + "\n" \ + " //\n" \ + " var speciesConstructor = @speciesConstructor(regexp, @RegExp);\n" \ + "\n" \ + " //\n" \ + " var flags = @toString(regexp.flags);\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " var unicodeMatching = @stringIncludesInternal.@call(flags, \"u\");\n" \ + " //\n" \ + " //\n" \ + " var newFlags = @stringIncludesInternal.@call(flags, \"y\") ? flags : flags + \"y\";\n" \ + "\n" \ + " //\n" \ + " var splitter = new speciesConstructor(regexp.source, newFlags);\n" \ + "\n" \ + " //\n" \ + " //\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " var result = [];\n" \ + "\n" \ + " //\n" \ + " limit = (limit === @undefined) ? 0xffffffff : limit >>> 0;\n" \ + "\n" \ + " //\n" \ + " if (!limit)\n" \ + " return result;\n" \ + "\n" \ + " //\n" \ + " var size = str.length;\n" \ + "\n" \ + " //\n" \ + " if (!size) {\n" \ + " //\n" \ + " var z = splitter.exec(str);\n" \ + " //\n" \ + " if (z !== null)\n" \ + " return result;\n" \ + " //\n" \ + " @putByValDirect(result, 0, str);\n" \ + " //\n" \ + " return result;\n" \ + " }\n" \ + "\n" \ + " //\n" \ + " var position = 0;\n" \ + " //\n" \ + " var matchPosition = 0;\n" \ + "\n" \ + " //\n" \ + " while (matchPosition < size) {\n" \ + " //\n" \ + " splitter.lastIndex = matchPosition;\n" \ + " //\n" \ + " var matches = splitter.exec(str);\n" \ + " //\n" \ + " if (matches === null)\n" \ + " matchPosition = @advanceStringIndex(str, matchPosition, unicodeMatching);\n" \ + " //\n" \ + " else {\n" \ + " //\n" \ + " var endPosition = @toLength(splitter.lastIndex);\n" \ + " //\n" \ + " endPosition = (endPosition <= size) ? endPosition : size;\n" \ + " //\n" \ + " if (endPosition === position)\n" \ + " matchPosition = @advanceStringIndex(str, matchPosition, unicodeMatching);\n" \ + " //\n" \ + " else {\n" \ + " //\n" \ + " var subStr = @stringSubstring.@call(str, position, matchPosition);\n" \ + " //\n" \ + " //\n" \ + " @arrayPush(result, subStr);\n" \ + " //\n" \ + " if (result.length == limit)\n" \ + " return result;\n" \ + "\n" \ + " //\n" \ + " position = endPosition;\n" \ + " //\n" \ + " //\n" \ + " var numberOfCaptures = matches.length > 1 ? matches.length - 1 : 0;\n" \ + "\n" \ + " //\n" \ + " var i = 1;\n" \ + " //\n" \ + " while (i <= numberOfCaptures) {\n" \ + " //\n" \ + " var nextCapture = matches[i];\n" \ + " //\n" \ + " //\n" \ + " @arrayPush(result, nextCapture);\n" \ + " //\n" \ + " if (result.length == limit)\n" \ + " return result;\n" \ + " //\n" \ + " i++;\n" \ + " }\n" \ + " //\n" \ + " matchPosition = position;\n" \ + " }\n" \ + " }\n" \ + " }\n" \ + " //\n" \ + " var remainingStr = @stringSubstring.@call(str, position, size);\n" \ + " //\n" \ + " @arrayPush(result, remainingStr);\n" \ + " //\n" \ + " return result;\n" \ + "})\n" \ +; + +const JSC::ConstructAbility s_onigurumaRegExpPrototypeTestCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_onigurumaRegExpPrototypeTestCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeTestCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_onigurumaRegExpPrototypeTestCodeLength = 452; +static const JSC::Intrinsic s_onigurumaRegExpPrototypeTestCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_onigurumaRegExpPrototypeTestCode = + "(function (strArg)\n" \ + "{\n" \ + " \"use strict\";\n" \ + "\n" \ + " var regexp = this;\n" \ + "\n" \ + " if (regexp.test == @Bun.OnigurumaRegExp.prototype.test) {\n" \ + " return regexp.test(strArg);\n" \ + " }\n" \ + "\n" \ + " //\n" \ + " //\n" \ + " if (!@isObject(regexp))\n" \ + " @throwTypeError(\"RegExp.prototype.test requires that |this| be an Object\");\n" \ + "\n" \ + " //\n" \ + " var str = @toString(strArg);\n" \ + "\n" \ + " //\n" \ + " var match = regexp.exec(str);\n" \ + "\n" \ + " //\n" \ + " if (match !== null)\n" \ + " return true;\n" \ + " return false;\n" \ + "})\n" \ +; + + +#define DEFINE_BUILTIN_GENERATOR(codeName, functionName, overriddenName, argumentCount) \ +JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \ +{\ + JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \ + return clientData->builtinFunctions().onigurumaRegExpPrototypeBuiltins().codeName##Executable()->link(vm, nullptr, clientData->builtinFunctions().onigurumaRegExpPrototypeBuiltins().codeName##Source(), std::nullopt, s_##codeName##Intrinsic); \ +} +WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) +#undef DEFINE_BUILTIN_GENERATOR + + +} // namespace WebCore diff --git a/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.h b/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.h new file mode 100644 index 000000000..d8d17d14d --- /dev/null +++ b/src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.h @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015 Igalia + * Copyright (c) 2015 Igalia S.L. + * Copyright (c) 2015 Igalia. + * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. + * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. + * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. + * Copyright (c) 2022 Codeblog Corp. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// DO NOT EDIT THIS FILE. It is automatically generated from JavaScript files for +// builtins by the script: Source/JavaScriptCore/Scripts/generate-js-builtins.py + +#pragma once + +#include <JavaScriptCore/BuiltinUtils.h> +#include <JavaScriptCore/Identifier.h> +#include <JavaScriptCore/JSFunction.h> +#include <JavaScriptCore/UnlinkedFunctionExecutable.h> + +namespace JSC { +class FunctionExecutable; +} + +namespace WebCore { + +/* OnigurumaRegExpPrototype */ +extern const char* const s_onigurumaRegExpPrototypeAdvanceStringIndexCode; +extern const int s_onigurumaRegExpPrototypeAdvanceStringIndexCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeAdvanceStringIndexCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeAdvanceStringIndexCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeAdvanceStringIndexCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeMatchSlowCode; +extern const int s_onigurumaRegExpPrototypeMatchSlowCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchSlowCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchSlowCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchSlowCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeMatchCode; +extern const int s_onigurumaRegExpPrototypeMatchCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeMatchAllCode; +extern const int s_onigurumaRegExpPrototypeMatchAllCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeMatchAllCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeMatchAllCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeMatchAllCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeGetSubstitutionCode; +extern const int s_onigurumaRegExpPrototypeGetSubstitutionCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeGetSubstitutionCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeGetSubstitutionCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeGetSubstitutionCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeReplaceCode; +extern const int s_onigurumaRegExpPrototypeReplaceCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeReplaceCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeReplaceCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeReplaceCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeSearchCode; +extern const int s_onigurumaRegExpPrototypeSearchCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeSearchCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeSearchCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeSearchCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeSplitCode; +extern const int s_onigurumaRegExpPrototypeSplitCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeSplitCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeSplitCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeSplitCodeImplementationVisibility; +extern const char* const s_onigurumaRegExpPrototypeTestCode; +extern const int s_onigurumaRegExpPrototypeTestCodeLength; +extern const JSC::ConstructAbility s_onigurumaRegExpPrototypeTestCodeConstructAbility; +extern const JSC::ConstructorKind s_onigurumaRegExpPrototypeTestCodeConstructorKind; +extern const JSC::ImplementationVisibility s_onigurumaRegExpPrototypeTestCodeImplementationVisibility; + +#define WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_DATA(macro) \ + macro(advanceStringIndex, onigurumaRegExpPrototypeAdvanceStringIndex, 3) \ + macro(matchSlow, onigurumaRegExpPrototypeMatchSlow, 2) \ + macro(match, onigurumaRegExpPrototypeMatch, 1) \ + macro(matchAll, onigurumaRegExpPrototypeMatchAll, 1) \ + macro(getSubstitution, onigurumaRegExpPrototypeGetSubstitution, 6) \ + macro(replace, onigurumaRegExpPrototypeReplace, 2) \ + macro(search, onigurumaRegExpPrototypeSearch, 1) \ + macro(split, onigurumaRegExpPrototypeSplit, 2) \ + macro(test, onigurumaRegExpPrototypeTest, 1) \ + +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_ADVANCESTRINGINDEX 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_MATCHSLOW 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_MATCH 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_MATCHALL 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_GETSUBSTITUTION 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_REPLACE 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_SEARCH 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_SPLIT 1 +#define WEBCORE_BUILTIN_ONIGURUMAREGEXPPROTOTYPE_TEST 1 + +#define WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(macro) \ + macro(onigurumaRegExpPrototypeAdvanceStringIndexCode, advanceStringIndex, ASCIILiteral(), s_onigurumaRegExpPrototypeAdvanceStringIndexCodeLength) \ + macro(onigurumaRegExpPrototypeMatchSlowCode, matchSlow, ASCIILiteral(), s_onigurumaRegExpPrototypeMatchSlowCodeLength) \ + macro(onigurumaRegExpPrototypeMatchCode, match, "[Symbol.match]"_s, s_onigurumaRegExpPrototypeMatchCodeLength) \ + macro(onigurumaRegExpPrototypeMatchAllCode, matchAll, "[Symbol.matchAll]"_s, s_onigurumaRegExpPrototypeMatchAllCodeLength) \ + macro(onigurumaRegExpPrototypeGetSubstitutionCode, getSubstitution, ASCIILiteral(), s_onigurumaRegExpPrototypeGetSubstitutionCodeLength) \ + macro(onigurumaRegExpPrototypeReplaceCode, replace, "[Symbol.replace]"_s, s_onigurumaRegExpPrototypeReplaceCodeLength) \ + macro(onigurumaRegExpPrototypeSearchCode, search, "[Symbol.search]"_s, s_onigurumaRegExpPrototypeSearchCodeLength) \ + macro(onigurumaRegExpPrototypeSplitCode, split, "[Symbol.split]"_s, s_onigurumaRegExpPrototypeSplitCodeLength) \ + macro(onigurumaRegExpPrototypeTestCode, test, ASCIILiteral(), s_onigurumaRegExpPrototypeTestCodeLength) \ + +#define WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_FUNCTION_NAME(macro) \ + macro(advanceStringIndex) \ + macro(getSubstitution) \ + macro(match) \ + macro(matchAll) \ + macro(matchSlow) \ + macro(replace) \ + macro(search) \ + macro(split) \ + macro(test) \ + +#define DECLARE_BUILTIN_GENERATOR(codeName, functionName, overriddenName, argumentCount) \ + JSC::FunctionExecutable* codeName##Generator(JSC::VM&); + +WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(DECLARE_BUILTIN_GENERATOR) +#undef DECLARE_BUILTIN_GENERATOR + +class OnigurumaRegExpPrototypeBuiltinsWrapper : private JSC::WeakHandleOwner { +public: + explicit OnigurumaRegExpPrototypeBuiltinsWrapper(JSC::VM& vm) + : m_vm(vm) + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_FUNCTION_NAME(INITIALIZE_BUILTIN_NAMES) +#define INITIALIZE_BUILTIN_SOURCE_MEMBERS(name, functionName, overriddenName, length) , m_##name##Source(JSC::makeSource(StringImpl::createWithoutCopying(s_##name, length), { })) + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(INITIALIZE_BUILTIN_SOURCE_MEMBERS) +#undef INITIALIZE_BUILTIN_SOURCE_MEMBERS + { + } + +#define EXPOSE_BUILTIN_EXECUTABLES(name, functionName, overriddenName, length) \ + JSC::UnlinkedFunctionExecutable* name##Executable(); \ + const JSC::SourceCode& name##Source() const { return m_##name##Source; } + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(EXPOSE_BUILTIN_EXECUTABLES) +#undef EXPOSE_BUILTIN_EXECUTABLES + + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR) + + void exportNames(); + +private: + JSC::VM& m_vm; + + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_NAMES) + +#define DECLARE_BUILTIN_SOURCE_MEMBERS(name, functionName, overriddenName, length) \ + JSC::SourceCode m_##name##Source;\ + JSC::Weak<JSC::UnlinkedFunctionExecutable> m_##name##Executable; + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(DECLARE_BUILTIN_SOURCE_MEMBERS) +#undef DECLARE_BUILTIN_SOURCE_MEMBERS + +}; + +#define DEFINE_BUILTIN_EXECUTABLES(name, functionName, overriddenName, length) \ +inline JSC::UnlinkedFunctionExecutable* OnigurumaRegExpPrototypeBuiltinsWrapper::name##Executable() \ +{\ + if (!m_##name##Executable) {\ + JSC::Identifier executableName = functionName##PublicName();\ + if (overriddenName)\ + executableName = JSC::Identifier::fromString(m_vm, overriddenName);\ + m_##name##Executable = JSC::Weak<JSC::UnlinkedFunctionExecutable>(JSC::createBuiltinExecutable(m_vm, m_##name##Source, executableName, s_##name##ImplementationVisibility, s_##name##ConstructorKind, s_##name##ConstructAbility), this, &m_##name##Executable);\ + }\ + return m_##name##Executable.get();\ +} +WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_CODE(DEFINE_BUILTIN_EXECUTABLES) +#undef DEFINE_BUILTIN_EXECUTABLES + +inline void OnigurumaRegExpPrototypeBuiltinsWrapper::exportNames() +{ +#define EXPORT_FUNCTION_NAME(name) m_vm.propertyNames->appendExternalName(name##PublicName(), name##PrivateName()); + WEBCORE_FOREACH_ONIGURUMAREGEXPPROTOTYPE_BUILTIN_FUNCTION_NAME(EXPORT_FUNCTION_NAME) +#undef EXPORT_FUNCTION_NAME +} + +} // namespace WebCore diff --git a/src/bun.js/builtins/cpp/ProcessObjectBuiltins.cpp b/src/bun.js/builtins/cpp/ProcessObjectBuiltins.cpp index 18463bb9d..0a0389ca3 100644 --- a/src/bun.js/builtins/cpp/ProcessObjectBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ProcessObjectBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ProcessObjectBuiltins.h b/src/bun.js/builtins/cpp/ProcessObjectBuiltins.h index da852b83e..b48359479 100644 --- a/src/bun.js/builtins/cpp/ProcessObjectBuiltins.h +++ b/src/bun.js/builtins/cpp/ProcessObjectBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.cpp index 3b38a593b..e5f3b348e 100644 --- a/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.h b/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.h index 2e19b9d21..b3ed9b51a 100644 --- a/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.cpp index f1732e48e..087291d8e 100644 --- a/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.h b/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.h index 06ee280bf..87afb3da2 100644 --- a/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.cpp index 46dcf7f4e..246d7b241 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.h index c1d1a4c7f..94969b6e1 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.cpp index 5e0cf16d4..52b56f01a 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.h index a5549ad98..91d764366 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamBuiltins.cpp index 03dcd26cb..cd14a15ea 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * @@ -211,106 +212,6 @@ const char* const s_readableStreamReadableStreamToBlobCode = "})\n" \ ; -const JSC::ConstructAbility s_readableStreamReadableStreamToNodeReadableCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; -const JSC::ConstructorKind s_readableStreamReadableStreamToNodeReadableCodeConstructorKind = JSC::ConstructorKind::None; -const JSC::ImplementationVisibility s_readableStreamReadableStreamToNodeReadableCodeImplementationVisibility = JSC::ImplementationVisibility::Private; -const int s_readableStreamReadableStreamToNodeReadableCodeLength = 2476; -static const JSC::Intrinsic s_readableStreamReadableStreamToNodeReadableCodeIntrinsic = JSC::NoIntrinsic; -const char* const s_readableStreamReadableStreamToNodeReadableCode = - "(function (stream) {\n" \ - " \"use strict\";\n" \ - " var {Readable} = @require(\"node:stream\");\n" \ - "\n" \ - " var Prototype = class ReadableNodeStream extends Readable {\n" \ - " #reader;\n" \ - " #stream;\n" \ - " #pushed;\n" \ - " #boundOnData;\n" \ - " #scheduledRead;\n" \ - " constructor(stream) {\n" \ - " super();\n" \ - " this.#stream = stream;\n" \ - " this.#reader = @undefined;\n" \ - " this.#pushed = [];\n" \ - " this.#boundOnData = (result) => this.#onData(result);\n" \ - " this.#scheduledRead = false;\n" \ - " }\n" \ - "\n" \ - " _read(size = 0) {\n" \ - " if (!this.#reader) {\n" \ - " this.#reader = this.#stream.getReader();\n" \ - " }\n" \ - "\n" \ - " const pushed = this.#pushed;\n" \ - " const pending = pushed.length;\n" \ - " for (let i = 0; i < pending; i++) {\n" \ - " if (!this.push(pushed[i])) {\n" \ - " pushed.splice(0, i);\n" \ - " return;\n" \ - " }\n" \ - " }\n" \ - "\n" \ - " this.#scheduleRead();\n" \ - " }\n" \ - "\n" \ - " #handleData(value) {\n" \ - " var i = 0;\n" \ - " const expectedCount = this.#pushed.length;\n" \ - " var pushed = this.#pushed;\n" \ - " try {\n" \ - " for (i; i < expectedCount; i++) {\n" \ - " var item = pushed[i];\n" \ - " if (!this.push(item)) {\n" \ - " return false;\n" \ - " }\n" \ - " }\n" \ - " } catch(e) {\n" \ - " this.error(e);\n" \ - " return false;\n" \ - " } finally {\n" \ - " this.#pushed.splice(0, i);\n" \ - " if (this.#pushed.length > 0) {\n" \ - " this.#pushed.push(...value);\n" \ - " return false;\n" \ - " }\n" \ - "\n" \ - " }\n" \ - "\n" \ - " const valueLength = value.length;\n" \ - " for (i = 0; i < valueLength; i++) {\n" \ - " if (!this.push(value[i])) {\n" \ - " this.#pushed.push(...value.slice(i));\n" \ - " return false;\n" \ - " }\n" \ - " }\n" \ - "\n" \ - " return true;\n" \ - " }\n" \ - "\n" \ - " #onData({done, value}) {\n" \ - " this.#scheduledRead = false;\n" \ - "\n" \ - " if (done) {\n" \ - " this.destroy(@undefined);\n" \ - " return;\n" \ - " }\n" \ - "\n" \ - " if (!this.#handleData(value)) {\n" \ - " return;\n" \ - " }\n" \ - "\n" \ - " this.#scheduleRead();\n" \ - " }\n" \ - "\n" \ - " #scheduleRead() {\n" \ - " if (this.#scheduledRead) return;\n" \ - " this.#scheduledRead = true;\n" \ - " this.#reader.readMany().@then(this.#onData, this.error);\n" \ - " }\n" \ - " };\n" \ - "})\n" \ -; - const JSC::ConstructAbility s_readableStreamConsumeReadableStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_readableStreamConsumeReadableStreamCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_readableStreamConsumeReadableStreamCodeImplementationVisibility = JSC::ImplementationVisibility::Private; diff --git a/src/bun.js/builtins/cpp/ReadableStreamBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamBuiltins.h index 503cdfd97..a51da4f44 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * @@ -77,11 +78,6 @@ extern const int s_readableStreamReadableStreamToBlobCodeLength; extern const JSC::ConstructAbility s_readableStreamReadableStreamToBlobCodeConstructAbility; extern const JSC::ConstructorKind s_readableStreamReadableStreamToBlobCodeConstructorKind; extern const JSC::ImplementationVisibility s_readableStreamReadableStreamToBlobCodeImplementationVisibility; -extern const char* const s_readableStreamReadableStreamToNodeReadableCode; -extern const int s_readableStreamReadableStreamToNodeReadableCodeLength; -extern const JSC::ConstructAbility s_readableStreamReadableStreamToNodeReadableCodeConstructAbility; -extern const JSC::ConstructorKind s_readableStreamReadableStreamToNodeReadableCodeConstructorKind; -extern const JSC::ImplementationVisibility s_readableStreamReadableStreamToNodeReadableCodeImplementationVisibility; extern const char* const s_readableStreamConsumeReadableStreamCode; extern const int s_readableStreamConsumeReadableStreamCodeLength; extern const JSC::ConstructAbility s_readableStreamConsumeReadableStreamCodeConstructAbility; @@ -145,7 +141,6 @@ extern const JSC::ImplementationVisibility s_readableStreamLazyAsyncIteratorCode macro(readableStreamToArrayBuffer, readableStreamReadableStreamToArrayBuffer, 1) \ macro(readableStreamToJSON, readableStreamReadableStreamToJSON, 1) \ macro(readableStreamToBlob, readableStreamReadableStreamToBlob, 1) \ - macro(readableStreamToNodeReadable, readableStreamReadableStreamToNodeReadable, 1) \ macro(consumeReadableStream, readableStreamConsumeReadableStream, 3) \ macro(createEmptyReadableStream, readableStreamCreateEmptyReadableStream, 0) \ macro(createNativeReadableStream, readableStreamCreateNativeReadableStream, 3) \ @@ -164,7 +159,6 @@ extern const JSC::ImplementationVisibility s_readableStreamLazyAsyncIteratorCode #define WEBCORE_BUILTIN_READABLESTREAM_READABLESTREAMTOARRAYBUFFER 1 #define WEBCORE_BUILTIN_READABLESTREAM_READABLESTREAMTOJSON 1 #define WEBCORE_BUILTIN_READABLESTREAM_READABLESTREAMTOBLOB 1 -#define WEBCORE_BUILTIN_READABLESTREAM_READABLESTREAMTONODEREADABLE 1 #define WEBCORE_BUILTIN_READABLESTREAM_CONSUMEREADABLESTREAM 1 #define WEBCORE_BUILTIN_READABLESTREAM_CREATEEMPTYREADABLESTREAM 1 #define WEBCORE_BUILTIN_READABLESTREAM_CREATENATIVEREADABLESTREAM 1 @@ -184,7 +178,6 @@ extern const JSC::ImplementationVisibility s_readableStreamLazyAsyncIteratorCode macro(readableStreamReadableStreamToArrayBufferCode, readableStreamToArrayBuffer, ASCIILiteral(), s_readableStreamReadableStreamToArrayBufferCodeLength) \ macro(readableStreamReadableStreamToJSONCode, readableStreamToJSON, ASCIILiteral(), s_readableStreamReadableStreamToJSONCodeLength) \ macro(readableStreamReadableStreamToBlobCode, readableStreamToBlob, ASCIILiteral(), s_readableStreamReadableStreamToBlobCodeLength) \ - macro(readableStreamReadableStreamToNodeReadableCode, readableStreamToNodeReadable, ASCIILiteral(), s_readableStreamReadableStreamToNodeReadableCodeLength) \ macro(readableStreamConsumeReadableStreamCode, consumeReadableStream, ASCIILiteral(), s_readableStreamConsumeReadableStreamCodeLength) \ macro(readableStreamCreateEmptyReadableStreamCode, createEmptyReadableStream, ASCIILiteral(), s_readableStreamCreateEmptyReadableStreamCodeLength) \ macro(readableStreamCreateNativeReadableStreamCode, createNativeReadableStream, ASCIILiteral(), s_readableStreamCreateNativeReadableStreamCodeLength) \ @@ -212,7 +205,6 @@ extern const JSC::ImplementationVisibility s_readableStreamLazyAsyncIteratorCode macro(readableStreamToArrayBuffer) \ macro(readableStreamToBlob) \ macro(readableStreamToJSON) \ - macro(readableStreamToNodeReadable) \ macro(readableStreamToText) \ macro(tee) \ macro(values) \ diff --git a/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.cpp index 185d6cdee..2e9b3f231 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.h index 5ae59810a..3dda64a21 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.cpp index b1914d83d..df58f2ab0 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * @@ -93,7 +94,7 @@ const char* const s_readableStreamDefaultReaderCancelCode = const JSC::ConstructAbility s_readableStreamDefaultReaderReadManyCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_readableStreamDefaultReaderReadManyCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_readableStreamDefaultReaderReadManyCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_readableStreamDefaultReaderReadManyCodeLength = 4130; +const int s_readableStreamDefaultReaderReadManyCodeLength = 4212; static const JSC::Intrinsic s_readableStreamDefaultReaderReadManyCodeIntrinsic = JSC::NoIntrinsic; const char* const s_readableStreamDefaultReaderReadManyCode = "(function ()\n" \ @@ -120,10 +121,16 @@ const char* const s_readableStreamDefaultReaderReadManyCode = " var queue = @getByIdDirectPrivate(controller, \"queue\");\n" \ " \n" \ " if (!queue) {\n" \ + " //\n" \ + " //\n" \ " return controller.@pull(\n" \ " controller\n" \ " ).@then(\n" \ - " ({done, value}) => (done ? { done: true, value: [], size: 0 } : { value: [value], size: 1, done: false }));\n" \ + " ({done, value}) => (\n" \ + " done ? \n" \ + " { done: true, value: [], size: 0 } : \n" \ + " { value: [value], size: 1, done: false }\n" \ + " ));\n" \ " }\n" \ "\n" \ " const content = queue.content;\n" \ diff --git a/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.h index b883be6b8..b3b9aed91 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp index f1cc09349..8f3caa3a2 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.h b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.h index a617260be..39b8e8b0d 100644 --- a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/StreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/StreamInternalsBuiltins.cpp index 65fe8a753..685fe4507 100644 --- a/src/bun.js/builtins/cpp/StreamInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/StreamInternalsBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/StreamInternalsBuiltins.h b/src/bun.js/builtins/cpp/StreamInternalsBuiltins.h index 089992d77..6e3315a08 100644 --- a/src/bun.js/builtins/cpp/StreamInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/StreamInternalsBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamBuiltins.cpp b/src/bun.js/builtins/cpp/TransformStreamBuiltins.cpp index 82319d8b9..bb276fc34 100644 --- a/src/bun.js/builtins/cpp/TransformStreamBuiltins.cpp +++ b/src/bun.js/builtins/cpp/TransformStreamBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamBuiltins.h b/src/bun.js/builtins/cpp/TransformStreamBuiltins.h index 8547fd350..f299a0659 100644 --- a/src/bun.js/builtins/cpp/TransformStreamBuiltins.h +++ b/src/bun.js/builtins/cpp/TransformStreamBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.cpp b/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.cpp index aae09e51d..7a30763d3 100644 --- a/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.cpp +++ b/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.h b/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.h index a38e0111e..e837fc8c7 100644 --- a/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.h +++ b/src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.cpp index 2a0c48fa3..0f09ce57e 100644 --- a/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.h b/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.h index 4850ac1fb..90768e1b6 100644 --- a/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h index f4fca9b94..e843b7136 100644 --- a/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h +++ b/src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h @@ -1,11 +1,14 @@ // clang-format off namespace Zig { class GlobalObject; } +#include "root.h" + /* * Copyright (c) 2015 Igalia * Copyright (c) 2015 Igalia S.L. * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h b/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h index 12e9719d3..714be8e4f 100644 --- a/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h +++ b/src/bun.js/builtins/cpp/WebCoreJSBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * @@ -40,6 +41,7 @@ #include "ImportMetaObjectBuiltins.h" #include "JSBufferConstructorBuiltins.h" #include "JSBufferPrototypeBuiltins.h" +#include "OnigurumaRegExpPrototypeBuiltins.h" #include "ProcessObjectBuiltins.h" #include "ReadableByteStreamControllerBuiltins.h" #include "ReadableByteStreamInternalsBuiltins.h" @@ -69,6 +71,7 @@ public: , m_importMetaObjectBuiltins(m_vm) , m_jsBufferConstructorBuiltins(m_vm) , m_jsBufferPrototypeBuiltins(m_vm) + , m_onigurumaRegExpPrototypeBuiltins(m_vm) , m_processObjectBuiltins(m_vm) , m_readableByteStreamControllerBuiltins(m_vm) , m_readableByteStreamInternalsBuiltins(m_vm) @@ -98,6 +101,7 @@ public: ImportMetaObjectBuiltinsWrapper& importMetaObjectBuiltins() { return m_importMetaObjectBuiltins; } JSBufferConstructorBuiltinsWrapper& jsBufferConstructorBuiltins() { return m_jsBufferConstructorBuiltins; } JSBufferPrototypeBuiltinsWrapper& jsBufferPrototypeBuiltins() { return m_jsBufferPrototypeBuiltins; } + OnigurumaRegExpPrototypeBuiltinsWrapper& onigurumaRegExpPrototypeBuiltins() { return m_onigurumaRegExpPrototypeBuiltins; } ProcessObjectBuiltinsWrapper& processObjectBuiltins() { return m_processObjectBuiltins; } ReadableByteStreamControllerBuiltinsWrapper& readableByteStreamControllerBuiltins() { return m_readableByteStreamControllerBuiltins; } ReadableByteStreamInternalsBuiltinsWrapper& readableByteStreamInternalsBuiltins() { return m_readableByteStreamInternalsBuiltins; } @@ -122,6 +126,7 @@ private: ImportMetaObjectBuiltinsWrapper m_importMetaObjectBuiltins; JSBufferConstructorBuiltinsWrapper m_jsBufferConstructorBuiltins; JSBufferPrototypeBuiltinsWrapper m_jsBufferPrototypeBuiltins; + OnigurumaRegExpPrototypeBuiltinsWrapper m_onigurumaRegExpPrototypeBuiltins; ProcessObjectBuiltinsWrapper m_processObjectBuiltins; ReadableByteStreamControllerBuiltinsWrapper m_readableByteStreamControllerBuiltins; ReadableByteStreamInternalsBuiltinsWrapper m_readableByteStreamInternalsBuiltins; diff --git a/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.cpp b/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.cpp index fed47de16..c4d996494 100644 --- a/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.cpp +++ b/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.h b/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.h index 41e5a62ab..e8b90012b 100644 --- a/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.h +++ b/src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.cpp b/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.cpp index 4a2088728..4876aa54a 100644 --- a/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.cpp +++ b/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.h b/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.h index 70d154bcd..cadcb9840 100644 --- a/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.h +++ b/src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.cpp index 73df2027d..e75d0e5dc 100644 --- a/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.cpp +++ b/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.cpp @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.h b/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.h index f38a4ac60..a869ed60f 100644 --- a/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.h +++ b/src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.h @@ -4,6 +4,7 @@ * Copyright (c) 2015 Igalia. * Copyright (c) 2015, 2016 Canon Inc. All rights reserved. * Copyright (c) 2015, 2016, 2017 Canon Inc. + * Copyright (c) 2016, 2018 -2018 Apple Inc. All rights reserved. * Copyright (c) 2016, 2020 Apple Inc. All rights reserved. * Copyright (c) 2022 Codeblog Corp. All rights reserved. * diff --git a/src/bun.js/builtins/js/OnigurumaRegExpPrototype.js b/src/bun.js/builtins/js/OnigurumaRegExpPrototype.js new file mode 100644 index 000000000..e894069f3 --- /dev/null +++ b/src/bun.js/builtins/js/OnigurumaRegExpPrototype.js @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2016-2018 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +@linkTimeConstant +function advanceStringIndex(string, index, unicode) +{ + // This function implements AdvanceStringIndex described in ES6 21.2.5.2.3. + "use strict"; + + if (!unicode) + return index + 1; + + if (index + 1 >= string.length) + return index + 1; + + var first = string.@charCodeAt(index); + if (first < 0xD800 || first > 0xDBFF) + return index + 1; + + var second = string.@charCodeAt(index + 1); + if (second < 0xDC00 || second > 0xDFFF) + return index + 1; + + return index + 2; +} + + +@linkTimeConstant +function matchSlow(regexp, str) +{ + "use strict"; + + if (!regexp.global) + return regexp.exec(str); + + var unicode = regexp.unicode; + regexp.lastIndex = 0; + var resultList = []; + + // FIXME: It would be great to implement a solution similar to what we do in + // RegExpObject::matchGlobal(). It's not clear if this is possible, since this loop has + // effects. https://bugs.webkit.org/show_bug.cgi?id=158145 + var maximumReasonableMatchSize = 100000000; + + while (true) { + var result = regexp.exec(str); + + if (result === null) { + if (resultList.length === 0) + return null; + return resultList; + } + + if (resultList.length > maximumReasonableMatchSize) + @throwOutOfMemoryError(); + + var resultString = @toString(result[0]); + + if (!resultString.length) + regexp.lastIndex = @advanceStringIndex(str, regexp.lastIndex, unicode); + + @arrayPush(resultList, resultString); + } +} + +@overriddenName="[Symbol.match]" +function match(strArg) +{ + "use strict"; + + if (!@isObject(this)) + @throwTypeError("RegExp.prototype.@@match requires that |this| be an Object"); + + var str = @toString(strArg); + + return @matchSlow(this, str); +} + +@overriddenName="[Symbol.matchAll]" +function matchAll(strArg) +{ + "use strict"; + + var regExp = this; + if (!@isObject(regExp)) { + @throwTypeError("RegExp.prototype.@@matchAll requires |this| to be an Object"); + } + + var string = @toString(strArg); + + var Matcher = @speciesConstructor(regExp, @Bun.OnigurumaRegExp); + + var flags = @toString(regExp.flags); + var matcher = new Matcher(regExp.source, flags); + matcher.lastIndex = @toLength(regExp.lastIndex); + + var global = @stringIncludesInternal.@call(flags, "g"); + var fullUnicode = @stringIncludesInternal.@call(flags, "u"); + + var iterator = globalThis.Symbol.iterator; + + var RegExpStringIterator = class RegExpStringIterator { + constructor(regExp, string, global, fullUnicode) + { + + @putByIdDirectPrivate(this, "regExpStringIteratorRegExp", regExp); + @putByIdDirectPrivate(this, "regExpStringIteratorString", string); + @putByIdDirectPrivate(this, "regExpStringIteratorGlobal", global); + @putByIdDirectPrivate(this, "regExpStringIteratorUnicode", fullUnicode); + @putByIdDirectPrivate(this, "regExpStringIteratorDone", false); + } + + next() { + "use strict"; + if (!@isObject(this)) { + @throwTypeError("%RegExpStringIteratorPrototype%.next requires |this| to be an Object"); + } + + var done = @getByIdDirectPrivate(this, "regExpStringIteratorDone"); + if (done === @undefined) { + @throwTypeError("%RegExpStringIteratorPrototype%.next requires |this| to be an RegExp String Iterator instance"); + } + + if (done) { + return { value: @undefined, done: true }; + } + + var regExp = @getByIdDirectPrivate(this, "regExpStringIteratorRegExp"); + var string = @getByIdDirectPrivate(this, "regExpStringIteratorString"); + var global = @getByIdDirectPrivate(this, "regExpStringIteratorGlobal"); + var fullUnicode = @getByIdDirectPrivate(this, "regExpStringIteratorUnicode"); + var match = regExp.exec(string); + if (match === null) { + @putByIdDirectPrivate(this, "regExpStringIteratorDone", true); + return { value: @undefined, done: true }; + } + + if (global) { + var matchStr = @toString(match[0]); + if (matchStr === "") { + var thisIndex = @toLength(regExp.lastIndex); + regExp.lastIndex = @advanceStringIndex(string, thisIndex, fullUnicode); + } + } else + @putByIdDirectPrivate(this, "regExpStringIteratorDone", true); + + return { value: match, done: false }; + } + + [iterator]() { + return this; + } + + }; + + return new RegExpStringIterator(matcher, string, global, fullUnicode); +} + +@linkTimeConstant +function getSubstitution(matched, str, position, captures, namedCaptures, replacement) +{ + "use strict"; + + var matchLength = matched.length; + var stringLength = str.length; + var tailPos = position + matchLength; + var m = captures.length; + var replacementLength = replacement.length; + var result = ""; + var lastStart = 0; + + for (var start = 0; start = @stringIndexOfInternal.@call(replacement, "$", lastStart), start !== -1; lastStart = start) { + if (start - lastStart > 0) + result = result + @stringSubstring.@call(replacement, lastStart, start); + start++; + if (start >= replacementLength) + result = result + "$"; + else { + var ch = replacement[start]; + switch (ch) + { + case "$": + result = result + "$"; + start++; + break; + case "&": + result = result + matched; + start++; + break; + case "`": + if (position > 0) + result = result + @stringSubstring.@call(str, 0, position); + start++; + break; + case "'": + if (tailPos < stringLength) + result = result + @stringSubstring.@call(str, tailPos); + start++; + break; + case "<": + if (namedCaptures !== @undefined) { + var groupNameStartIndex = start + 1; + var groupNameEndIndex = @stringIndexOfInternal.@call(replacement, ">", groupNameStartIndex); + if (groupNameEndIndex !== -1) { + var groupName = @stringSubstring.@call(replacement, groupNameStartIndex, groupNameEndIndex); + var capture = namedCaptures[groupName]; + if (capture !== @undefined) + result = result + @toString(capture); + + start = groupNameEndIndex + 1; + break; + } + } + + result = result + "$<"; + start++; + break; + default: + var chCode = ch.@charCodeAt(0); + if (chCode >= 0x30 && chCode <= 0x39) { + var originalStart = start - 1; + start++; + + var n = chCode - 0x30; + if (n > m) { + result = result + @stringSubstring.@call(replacement, originalStart, start); + break; + } + + if (start < replacementLength) { + var nextChCode = replacement.@charCodeAt(start); + if (nextChCode >= 0x30 && nextChCode <= 0x39) { + var nn = 10 * n + nextChCode - 0x30; + if (nn <= m) { + n = nn; + start++; + } + } + } + + if (n == 0) { + result = result + @stringSubstring.@call(replacement, originalStart, start); + break; + } + + var capture = captures[n - 1]; + if (capture !== @undefined) + result = result + capture; + } else + result = result + "$"; + break; + } + } + } + + return result + @stringSubstring.@call(replacement, lastStart); +} + +@overriddenName="[Symbol.replace]" +function replace(strArg, replace) +{ + "use strict"; + + if (!@isObject(this)) + @throwTypeError("RegExp.prototype.@@replace requires that |this| be an Object"); + + var regexp = this; + + var str = @toString(strArg); + var stringLength = str.length; + var functionalReplace = @isCallable(replace); + + if (!functionalReplace) + replace = @toString(replace); + + var global = regexp.global; + var unicode = false; + + if (global) { + unicode = regexp.unicode; + regexp.lastIndex = 0; + } + + var resultList = []; + var result; + var done = false; + while (!done) { + result = regexp.exec(str); + + if (result === null) + done = true; + else { + @arrayPush(resultList, result); + if (!global) + done = true; + else { + var matchStr = @toString(result[0]); + + if (!matchStr.length) { + var thisIndex = @toLength(regexp.lastIndex); + regexp.lastIndex = @advanceStringIndex(str, thisIndex, unicode); + } + } + } + } + + var accumulatedResult = ""; + var nextSourcePosition = 0; + + for (var i = 0, resultListLength = resultList.length; i < resultListLength; ++i) { + var result = resultList[i]; + var nCaptures = result.length - 1; + if (nCaptures < 0) + nCaptures = 0; + var matched = @toString(result[0]); + var matchLength = matched.length; + var position = @toIntegerOrInfinity(result.index); + position = (position > stringLength) ? stringLength : position; + position = (position < 0) ? 0 : position; + + var captures = []; + for (var n = 1; n <= nCaptures; n++) { + var capN = result[n]; + if (capN !== @undefined) + capN = @toString(capN); + @arrayPush(captures, capN); + } + + var replacement; + var namedCaptures = result.groups; + + if (functionalReplace) { + var replacerArgs = [ matched ]; + for (var j = 0; j < captures.length; j++) + @arrayPush(replacerArgs, captures[j]); + + @arrayPush(replacerArgs, position); + @arrayPush(replacerArgs, str); + + if (namedCaptures !== @undefined) + @arrayPush(replacerArgs, namedCaptures); + + var replValue = replace.@apply(@undefined, replacerArgs); + replacement = @toString(replValue); + } else { + if (namedCaptures !== @undefined) + namedCaptures = @toObject(namedCaptures, "RegExp.prototype[Symbol.replace] requires 'groups' property of a match not be null"); + + replacement = @getSubstitution(matched, str, position, captures, namedCaptures, replace); + } + + if (position >= nextSourcePosition) { + accumulatedResult = accumulatedResult + @stringSubstring.@call(str, nextSourcePosition, position) + replacement; + nextSourcePosition = position + matchLength; + } + } + + if (nextSourcePosition >= stringLength) + return accumulatedResult; + + return accumulatedResult + @stringSubstring.@call(str, nextSourcePosition); +} + +// 21.2.5.9 RegExp.prototype[@@search] (string) +@overriddenName="[Symbol.search]" +function search(strArg) +{ + "use strict"; + + var regexp = this; + + // 1. Let rx be the this value. + // 2. If Type(rx) is not Object, throw a TypeError exception. + if (!@isObject(this)) + @throwTypeError("RegExp.prototype.@@search requires that |this| be an Object"); + + // 3. Let S be ? ToString(string). + var str = @toString(strArg) + + // 4. Let previousLastIndex be ? Get(rx, "lastIndex"). + var previousLastIndex = regexp.lastIndex; + + // 5. If SameValue(previousLastIndex, 0) is false, then + // 5.a. Perform ? Set(rx, "lastIndex", 0, true). + if (!@sameValue(previousLastIndex, 0)) + regexp.lastIndex = 0; + + // 6. Let result be ? RegExpExec(rx, S). + var result = regexp.exec(str); + + // 7. Let currentLastIndex be ? Get(rx, "lastIndex"). + // 8. If SameValue(currentLastIndex, previousLastIndex) is false, then + // 8.a. Perform ? Set(rx, "lastIndex", previousLastIndex, true). + if (!@sameValue(regexp.lastIndex, previousLastIndex)) + regexp.lastIndex = previousLastIndex; + + // 9. If result is null, return -1. + if (result === null) + return -1; + + // 10. Return ? Get(result, "index"). + return result.index; +} + +// ES 21.2.5.11 RegExp.prototype[@@split](string, limit) +@overriddenName="[Symbol.split]" +function split(string, limit) +{ + "use strict"; + + // 1. Let rx be the this value. + // 2. If Type(rx) is not Object, throw a TypeError exception. + if (!@isObject(this)) + @throwTypeError("RegExp.prototype.@@split requires that |this| be an Object"); + var regexp = this; + + // 3. Let S be ? ToString(string). + var str = @toString(string); + + // 4. Let C be ? SpeciesConstructor(rx, %RegExp%). + var speciesConstructor = @speciesConstructor(regexp, @RegExp); + + // 5. Let flags be ? ToString(? Get(rx, "flags")). + var flags = @toString(regexp.flags); + + // 6. If flags contains "u", var unicodeMatching be true. + // 7. Else, let unicodeMatching be false. + var unicodeMatching = @stringIncludesInternal.@call(flags, "u"); + // 8. If flags contains "y", var newFlags be flags. + // 9. Else, let newFlags be the string that is the concatenation of flags and "y". + var newFlags = @stringIncludesInternal.@call(flags, "y") ? flags : flags + "y"; + + // 10. Let splitter be ? Construct(C, « rx, newFlags »). + var splitter = new speciesConstructor(regexp.source, newFlags); + + // We need to check again for RegExp subclasses that will fail the speciesConstructor test + // but can still use the fast path after we invoke the constructor above. + + // 11. Let A be ArrayCreate(0). + // 12. Let lengthA be 0. + var result = []; + + // 13. If limit is undefined, let lim be 2^32-1; else var lim be ? ToUint32(limit). + limit = (limit === @undefined) ? 0xffffffff : limit >>> 0; + + // 16. If lim = 0, return A. + if (!limit) + return result; + + // 14. [Defered from above] Let size be the number of elements in S. + var size = str.length; + + // 17. If size = 0, then + if (!size) { + // a. Let z be ? RegExpExec(splitter, S). + var z = splitter.exec(str); + // b. If z is not null, return A. + if (z !== null) + return result; + // c. Perform ! CreateDataProperty(A, "0", S). + @putByValDirect(result, 0, str); + // d. Return A. + return result; + } + + // 15. [Defered from above] Let p be 0. + var position = 0; + // 18. Let q be p. + var matchPosition = 0; + + // 19. Repeat, while q < size + while (matchPosition < size) { + // a. Perform ? Set(splitter, "lastIndex", q, true). + splitter.lastIndex = matchPosition; + // b. Let z be ? RegExpExec(splitter, S). + var matches = splitter.exec(str); + // c. If z is null, let q be AdvanceStringIndex(S, q, unicodeMatching). + if (matches === null) + matchPosition = @advanceStringIndex(str, matchPosition, unicodeMatching); + // d. Else z is not null, + else { + // i. Let e be ? ToLength(? Get(splitter, "lastIndex")). + var endPosition = @toLength(splitter.lastIndex); + // ii. Let e be min(e, size). + endPosition = (endPosition <= size) ? endPosition : size; + // iii. If e = p, let q be AdvanceStringIndex(S, q, unicodeMatching). + if (endPosition === position) + matchPosition = @advanceStringIndex(str, matchPosition, unicodeMatching); + // iv. Else e != p, + else { + // 1. Let T be a String value equal to the substring of S consisting of the elements at indices p (inclusive) through q (exclusive). + var subStr = @stringSubstring.@call(str, position, matchPosition); + // 2. Perform ! CreateDataProperty(A, ! ToString(lengthA), T). + // 3. Let lengthA be lengthA + 1. + @arrayPush(result, subStr); + // 4. If lengthA = lim, return A. + if (result.length == limit) + return result; + + // 5. Let p be e. + position = endPosition; + // 6. Let numberOfCaptures be ? ToLength(? Get(z, "length")). + // 7. Let numberOfCaptures be max(numberOfCaptures-1, 0). + var numberOfCaptures = matches.length > 1 ? matches.length - 1 : 0; + + // 8. Let i be 1. + var i = 1; + // 9. Repeat, while i <= numberOfCaptures, + while (i <= numberOfCaptures) { + // a. Let nextCapture be ? Get(z, ! ToString(i)). + var nextCapture = matches[i]; + // b. Perform ! CreateDataProperty(A, ! ToString(lengthA), nextCapture). + // d. Let lengthA be lengthA + 1. + @arrayPush(result, nextCapture); + // e. If lengthA = lim, return A. + if (result.length == limit) + return result; + // c. Let i be i + 1. + i++; + } + // 10. Let q be p. + matchPosition = position; + } + } + } + // 20. Let T be a String value equal to the substring of S consisting of the elements at indices p (inclusive) through size (exclusive). + var remainingStr = @stringSubstring.@call(str, position, size); + // 21. Perform ! CreateDataProperty(A, ! ToString(lengthA), T). + @arrayPush(result, remainingStr); + // 22. Return A. + return result; +} + +// ES 21.2.5.13 RegExp.prototype.test(string) +function test(strArg) +{ + "use strict"; + + var regexp = this; + + if (regexp.test == @Bun.OnigurumaRegExp.prototype.test) { + return regexp.test(strArg); + } + + // 1. Let R be the this value. + // 2. If Type(R) is not Object, throw a TypeError exception. + if (!@isObject(regexp)) + @throwTypeError("RegExp.prototype.test requires that |this| be an Object"); + + // 3. Let string be ? ToString(S). + var str = @toString(strArg); + + // 4. Let match be ? RegExpExec(R, string). + var match = regexp.exec(str); + + // 5. If match is not null, return true; else return false. + if (match !== null) + return true; + return false; +} diff --git a/src/deps/oniguruma b/src/deps/oniguruma new file mode 160000 +Subproject 0be69456f20278740a0db8418ba45c1a08e15a2 diff --git a/src/js_ast.zig b/src/js_ast.zig index 90e3f2a9c..f3d941251 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -1849,6 +1849,23 @@ pub const E = struct { pub var empty = RegExp{ .value = "" }; + pub fn usesLookBehindAssertion(this: *const RegExp) bool { + var pat = this.pattern(); + while (pat.len > 0) { + const start = strings.indexOfChar(pat, '?') orelse return false; + if (start == 0) return false; + const l_paren = pat[start - 1]; + if (l_paren != '(' or pat.len < start + 1) return false; + const op = pat[start + 1]; + if (op == '<' or op == '=' or op == '!') { + return true; + } + pat = pat[start + 1 ..]; + } + + return false; + } + pub fn pattern(this: RegExp) string { // rewind until we reach the /foo/gim diff --git a/src/js_printer.zig b/src/js_printer.zig index 343911baf..08064c6e3 100644 --- a/src/js_printer.zig +++ b/src/js_printer.zig @@ -2085,17 +2085,7 @@ pub fn NewPrinter( p.print("`"); }, .e_reg_exp => |e| { - const n = p.writer.written; - - // Avoid forming a single-line comment - if (n > 0 and p.writer.prevChar() == '/') { - p.print(" "); - } - - p.print(e.value); - - // Need a space before the next identifier to avoid it turning into flags - p.prev_reg_exp_end = p.writer.written; + p.printRegExpLiteral(e); }, .e_big_int => |e| { p.printSpaceBeforeIdentifier(); @@ -2492,6 +2482,44 @@ pub fn NewPrinter( } } + pub fn printRegExpLiteral(p: *Printer, e: *const E.RegExp) void { + const n = p.writer.written; + + // Avoid forming a single-line comment + if (n > 0 and p.writer.prevChar() == '/') { + p.print(" "); + } + + if (comptime is_bun_platform) { + if (e.value.len > 2 and e.usesLookBehindAssertion()) { + p.print("(new globalThis.Bun.OnigurumaRegExp("); + const pattern = e.pattern(); + const flags = e.flags(); + std.debug.assert(pattern.len > 0); + var buf = bun.default_allocator.alloc(u16, strings.elementLengthUTF8IntoUTF16([]const u8, pattern)) catch unreachable; + defer bun.default_allocator.free(buf); + const buf_len = std.unicode.utf8ToUtf16Le(buf, pattern) catch unreachable; + std.debug.assert(buf_len == buf.len); + const q = p.bestQuoteCharForString(buf, true); + p.print(q); + p.printQuotedUTF16(buf, q); + p.print(q); + if (flags.len > 0) { + p.print(", "); + p.printQuotedUTF8(flags, true); + } + p.print("))"); + } else { + p.print(e.value); + } + } else { + p.print(e.value); + } + + // Need a space before the next identifier to avoid it turning into flags + p.prev_reg_exp_end = p.writer.written; + } + pub fn printProperty(p: *Printer, item: G.Property) void { if (comptime !is_json) { if (item.kind == .spread) { diff --git a/test/bun.js/oniguruma-regexp.test.ts b/test/bun.js/oniguruma-regexp.test.ts new file mode 100644 index 000000000..3b98e92d8 --- /dev/null +++ b/test/bun.js/oniguruma-regexp.test.ts @@ -0,0 +1,356 @@ +import { OnigurumaRegExp } from 'bun'; +import { expect, it, test } from 'bun:test'; +import { gc as gcTrace } from "./gc"; + + +it("OnigurumaRegExp.prototype.exec()", () => { + let a1 = new OnigurumaRegExp('(foo)', 'gd') + let a1_1 = a1.exec('table football, foosball'); + a1_1 = a1.exec('table football, foosball'); + + let a2 = new RegExp('(foo)', 'dg') + let a2_1 = a2.exec('table football, foosball'); + a2_1 = a2.exec('table football, foosball'); + + expect(a1_1[0]).toBe(a2_1[0]); + expect(a1_1[1]).toBe(a2_1[1]); + expect(a1_1.index).toBe(a2_1.index); + expect(a1_1.input).toBe(a2_1.input); + expect(a1.lastIndex).toBe(a2.lastIndex); + expect(a1_1.groups).toBe(a2_1.groups); + expect(a1_1.indices[0][0]).toBe(a2_1.indices[0][0]); + expect(a1_1.indices[0][1]).toBe(a2_1.indices[0][1]); + expect(a1_1.indices[1][0]).toBe(a2_1.indices[1][0]); + expect(a1_1.indices[1][1]).toBe(a2_1.indices[1][1]); +}); + +test("OnigurumaRegExp flag order", () => { + expect(new OnigurumaRegExp('a', 'gd').toString()).toBe('/a/dg'); + expect(new OnigurumaRegExp('a', 'ydmg').toString()).toBe('/a/dgmy'); +}); + +test("OnigurumaRegExp.prototype.source", () => { + let a1 = new OnigurumaRegExp('(foo)', 'gd') + let a2 = new RegExp('(foo)', 'dg') + expect(a1.source).toBe(a2.source); + + expect(new OnigurumaRegExp('/').source).toBe('\\/'); + expect(new RegExp('/').source).toBe('\\/'); + + expect(new OnigurumaRegExp().source).toBe(new RegExp().source); + expect(new OnigurumaRegExp('').source).toBe(new RegExp('').source); + expect(new OnigurumaRegExp('a').source).toBe(new RegExp('a').source); + expect(new OnigurumaRegExp('a', 'g').source).toBe(new RegExp('a', 'g').source); + expect(new OnigurumaRegExp('/').source).toBe(new RegExp('/').source); + expect(new OnigurumaRegExp('\n').source).toBe(new RegExp('\n').source); + expect(new OnigurumaRegExp('\r').source).toBe(new RegExp('\r').source); +}); + +test("OnigurumaRegExp.prototype.toString()", () => { + expect(new OnigurumaRegExp().toString()).toBe(new RegExp().toString()); + expect(new OnigurumaRegExp('').toString()).toBe(new RegExp('').toString()); + expect(new OnigurumaRegExp('a').toString()).toBe(new RegExp('a').toString()); + expect(new OnigurumaRegExp('a', 'g').toString()).toBe(new RegExp('a', 'g').toString()); + expect(new OnigurumaRegExp('/').toString()).toBe(new RegExp('/').toString()); + expect(new OnigurumaRegExp('\n').toString()).toBe(new RegExp('\n').toString()); + expect(new OnigurumaRegExp('\r').toString()).toBe(new RegExp('\r').toString()); + expect(new OnigurumaRegExp('jf/\.a.,voejpjoajglz;/qwjopeiv\\/\/\\/jpoqaj/Zdkj').toString()).toBe(new RegExp('jf/\.a.,voejpjoajglz;/qwjopeiv\\/\/\\/jpoqaj/Zdkj').toString()); +}); + +test('OnigurumaRegExp flags', () => { + // multiline option + for (const RegExpConstructor of [OnigurumaRegExp, RegExp]) { + expect(new RegExpConstructor('boat').test('sailor\nboat')).toBe(true); + expect(new RegExpConstructor('^boat').test('sailor\nboat')).toBe(false); + expect(new RegExpConstructor('^boat', 'm').test('sailor\nboat')).toBe(true); + } + + // sticky option + for (const RegExpConstructor of [RegExp]) { + let str2 = 'sailor'; + let h3 = new RegExpConstructor('or'); + let h4 = new RegExpConstructor('or', 'y'); + expect(h3.test(str2)).toBe(true); + expect(h4.test(str2)).toBe(false); + let g1 = new RegExpConstructor('sail'); + let g2 = new RegExpConstructor('sail', 'y'); + expect(g1.test(str2)).toBe(true); + expect(g2.test(str2)).toBe(true); + } + + // case insensitive option + for (const RegExpConstructor of [OnigurumaRegExp, RegExp]) { + expect(new RegExpConstructor('Is ThIs SqL?').test('IS THIS SQL?')).toBe(false); + expect(new RegExpConstructor('Is ThIs SqL?', 'i').test('IS THIS SQL?')).toBe(true); + } + + // dotall option + for (const RegExpConstructor of [OnigurumaRegExp, RegExp]) { + expect(new RegExpConstructor('a.b').test('a\nb')).toBe(false); + expect(new RegExpConstructor('a.b', 's').test('a\nb')).toBe(true); + } + + // indices option + for (const RegExpConstructor of [OnigurumaRegExp, RegExp]) { + expect(new RegExpConstructor('a', 'g').exec('a').indices).toBe(undefined); + expect(new RegExpConstructor('a', 'gd').exec('a').index).toBe(0); + expect(new RegExpConstructor('a', 'dg').exec('a').index).toBe(0); + } +}); + +test('OnigurumaRegExp.lastIndex', () => { + for (const RegExpConstructor of [RegExp, OnigurumaRegExp]) { + let a = new RegExpConstructor('foo', 'g'); + expect(a.lastIndex).toBe(0); + a.lastIndex = 1; + expect(a.lastIndex).toBe(1); + a.lastIndex = 0; + expect(a.lastIndex).toBe(0); + a.lastIndex = 1; + expect(a.lastIndex).toBe(1); + a.test('kfjekf'); + expect(a.lastIndex).toBe(0); + a.test('o'); + expect(a.lastIndex).toBe(0); + } + + let p1 = new OnigurumaRegExp('a'); + expect(p1.lastIndex).toBe(0); + p1.lastIndex = 2; + expect(p1.lastIndex).toBe(2); + let p2 = new OnigurumaRegExp('b'); + expect(p2.lastIndex).toBe(0); + p2.lastIndex = 2348; + expect(p2.lastIndex).toBe(2348); + expect(p1.lastIndex).toBe(2); + + for (const RegExpConstructor of [RegExp, OnigurumaRegExp]) { + let a = new RegExpConstructor('foo', 'g'); + a.lastIndex = 33; + expect(a.lastIndex).toBe(33); + a.compile('bar'); + expect(a.lastIndex).toBe(0); + a.lastIndex = 44; + expect(a.lastIndex).toBe(44); + } + + for (const RegExpConstructor of [OnigurumaRegExp]) { + let a = new RegExpConstructor('foo', 'g'); + expect(a.lastIndex).toBe(0); + a.test('kfjekfoofjekf'); + expect(a.lastIndex).toBe(8); + a.test('kejfkjs'); + expect(a.lastIndex).toBe(0); + a.exec('kfjekfoofjekf'); + expect(a.lastIndex).toBe(8); + a.exec('kejfkjs'); + expect(a.lastIndex).toBe(0); + } +}); + +test('OnigurumaRegExp errors', () => { + let r = new OnigurumaRegExp('a', 'igsym'); + let b = new OnigurumaRegExp('l', 'm'); + try { + r.compile(b, 'g'); + } catch (e) { + expect(e.message).toBe('Cannot supply flags when constructing one RegExp from another.'); + } + try { + r.compile('ll', 'a'); + } catch (e) { + expect(e.message).toBe('Invalid flags supplied to RegExp constructor.'); + } + try { + new OnigurumaRegExp('c', 'a'); + } catch (e) { + expect(e.message).toBe('Invalid flags supplied to RegExp constructor.'); + } + const invalidRegExpError = 'Invalid regular expression: '; + try { + new OnigurumaRegExp('?', 'g'); + } catch (e) { + expect(e.message.substring(0, invalidRegExpError.length)).toBe(invalidRegExpError); + } + try { + new OnigurumaRegExp('?'); + } catch (e) { + expect(e.message.substring(0, invalidRegExpError.length)).toBe(invalidRegExpError); + } + try { + r.compile('?', 'g'); + } catch (e) { + expect(e.message.substring(0, invalidRegExpError.length)).toBe(invalidRegExpError); + } + try { + r.compile('?'); + } catch (e) { + expect(e.message.substring(0, invalidRegExpError.length)).toBe(invalidRegExpError); + } + + try { + new OnigurumaRegExp('\\'); + } catch (e) { + expect(e.message.substring(0, invalidRegExpError.length)).toBe(invalidRegExpError); + } +}) + +test('OnigurumaRegExp random', () => { + + expect(new OnigurumaRegExp("love").test("I love JavaScript")).toBe(true); + expect(new RegExp("love").test("I love JavaScript")).toBe(true); + + expect(new OnigurumaRegExp('a').test('sailor')).toBe(true); + expect(new OnigurumaRegExp('or').test('sailor')).toBe(true); + expect(new RegExp('a').test('sailor')).toBe(true); + expect(new RegExp('or').test('sailor')).toBe(true); + + + expect(new OnigurumaRegExp('a').test('a')).toBe(true); + expect(new OnigurumaRegExp('a').test('b')).toBe(false); + expect(new OnigurumaRegExp('a', 'i').test('a')).toBe(true); + expect(new OnigurumaRegExp('a', 'i').test('A')).toBe(true); + expect(new OnigurumaRegExp('a', 'g').test('A')).toBe(false); + expect(new OnigurumaRegExp('A', 'i').test('a')).toBe(true); + expect(new OnigurumaRegExp('A', 'g').test('a')).toBe(false); + expect(new OnigurumaRegExp('afasdfebadf', 'i').test('b')).toBe(false); + + + let r = new OnigurumaRegExp('a', 'g'); + expect(r.source).toBe('a'); + expect(r.flags).toBe('g') + expect(r.toString()).toBe('/a/g'); + + r.compile('b', 'i'); + expect(r.source).toBe('b'); + expect(r.flags).toBe('i'); + expect(r.toString()).toBe('/b/i'); + + let b = new OnigurumaRegExp('l', 'm'); + expect(r.compile(b)).toBe(undefined); + expect(r.source).toBe('l'); + expect(r.flags).toBe('m'); + expect(r.toString()).toBe('/l/m'); + + expect(new OnigurumaRegExp('a', 'd').hasIndices).toBe(true); + expect(new OnigurumaRegExp('a', 'i').hasIndices).toBe(false); + expect(new OnigurumaRegExp('a', 's').dotAll).toBe(true); + expect(new OnigurumaRegExp('a', 'i').dotAll).toBe(false); + expect(new OnigurumaRegExp('a', 'i').ignoreCase).toBe(true); + expect(new OnigurumaRegExp('a', 's').ignoreCase).toBe(false); + expect(new OnigurumaRegExp('a', 'g').global).toBe(true); + expect(new OnigurumaRegExp('a', 's').global).toBe(false); + expect(new OnigurumaRegExp('a', 'm').multiline).toBe(true); + expect(new OnigurumaRegExp('a', 's').multiline).toBe(false); + expect(new OnigurumaRegExp('a', 'y').sticky).toBe(true); + expect(new OnigurumaRegExp('a', 'i').sticky).toBe(false); + expect(new OnigurumaRegExp('a', 'u').unicode).toBe(true); + expect(new OnigurumaRegExp('a', 'd').unicode).toBe(false); + expect(new RegExp('a', 'd').hasIndices).toBe(true); + expect(new RegExp('a', 'i').hasIndices).toBe(false); + expect(new RegExp('a', 's').dotAll).toBe(true); + expect(new RegExp('a', 'i').dotAll).toBe(false); + expect(new RegExp('a', 'i').ignoreCase).toBe(true); + expect(new RegExp('a', 's').ignoreCase).toBe(false); + expect(new RegExp('a', 'g').global).toBe(true); + expect(new RegExp('a', 's').global).toBe(false); + expect(new RegExp('a', 'm').multiline).toBe(true); + expect(new RegExp('a', 's').multiline).toBe(false); + expect(new RegExp('a', 'y').sticky).toBe(true); + expect(new RegExp('a', 'i').sticky).toBe(false); + expect(new RegExp('a', 'u').unicode).toBe(true); + expect(new RegExp('a', 'd').unicode).toBe(false); +}); + + +it("String.prototype.replace", () => { + for (let RegExpConstructor of [OnigurumaRegExp, RegExp]) { + const r = new RegExpConstructor('a', 'g'); + expect('a'.replace(r, 'b')).toBe('b'); + expect('a'.replace(r, () => 'b')).toBe('b'); + expect('a'.replace(r, (match, offset, string) => { + expect(match).toBe('a'); + expect(offset).toBe(0); + expect(string).toBe('a'); + return 'b'; + })).toBe('b'); + } + + expect('aaaaaa'.replace(new OnigurumaRegExp('a', 'g'), 'b')).toBe('bbbbbb'); + expect('aaaaaa'.replace(new OnigurumaRegExp('a'), 'b')).toBe('baaaaa'); + // case sensitive + expect('aaaaaa'.replace(new OnigurumaRegExp('A', 'i'), 'b')).toBe('baaaaa'); + expect('aaaaaa'.replace(new OnigurumaRegExp('A'), 'b')).toBe('aaaaaa'); + + expect('aaaaaa'.replace(new RegExp('a', 'g'), 'b')).toBe('bbbbbb'); + expect('aaaaaa'.replace(new RegExp('a'), 'b')).toBe('baaaaa'); +}); + +it("Strings.prototype.match", () => { + let str = 'The rain in SPAIN stays mainly in the plain'; + for (let RegExpConstructor of [OnigurumaRegExp, RegExp]) { + let r1 = new RegExpConstructor('ain', 'g'); + let m1 = str.match(r1); + expect(m1[0]).toBe('ain'); + expect(m1[1]).toBe('ain'); + expect(m1[2]).toBe('ain'); + + r1.compile('ain', 'ig'); + m1 = str.match(r1); + expect(m1[0]).toBe('ain'); + expect(m1[1]).toBe('AIN'); + expect(m1[2]).toBe('ain'); + expect(m1[3]).toBe('ain'); + } +}); + +it("String.prototype.matchAll", () => { + let str = 'test1test2'; + for (let RegExpConstructor of [RegExp, OnigurumaRegExp]) { + const regexp = new RegExpConstructor('t(e)(st(\d?))', 'g'); + const array = [...str.matchAll(regexp)]; + expect(array[0][0]).toBe('test'); + expect(array[0][1]).toBe('e'); + expect(array[0][2]).toBe('st'); + expect(array[0][3]).toBe(''); + expect(array[1][0]).toBe('test'); + expect(array[1][1]).toBe('e'); + expect(array[1][2]).toBe('st'); + expect(array[1][3]).toBe(''); + } +}); + +it("String.prototype.search", () => { + let str = 'The rain in SPAIN stays mainly in the plain'; + for (let RegExpConstructor of [OnigurumaRegExp, RegExp]) { + let r1 = new RegExpConstructor('ain', 'g'); + expect(str.search(r1)).toBe(5); + r1.compile('ain', 'ig'); + expect(str.search(r1)).toBe(5); + } +}); + +it("String.prototype.split", () => { + let str = 'Hello World. How are you doing?'; + for (let RegExpConstructor of [RegExp, OnigurumaRegExp]) { + let r1 = new RegExpConstructor('\\s', 'g'); + let m1 = str.split(r1); + expect(m1[0]).toBe('Hello'); + expect(m1[1]).toBe('World.'); + expect(m1[2]).toBe('How'); + expect(m1[3]).toBe('are'); + expect(m1[4]).toBe('you'); + expect(m1[5]).toBe('doing?'); + } +}); + +it("lookbehinds", () => { + expect(/\d+(?=%)/.source).toBe('\\d+(?=%)'); + expect(/\d+(?!%)/.source).toBe('\\d+(?!%)'); + expect(/(?<=\$)\d+/.source).toBe('(?<=\\$)\\d+'); + expect(/(?<!\$)\d+/.source).toBe('(?<!\\$)\\d+'); + expect(/h(?=(\w)+)/.source).toBe('h(?=(\\w)+)'); + expect(/(?<=(\w)+)r/.source).toBe("(?<=(\\w)+)r"); + expect(/(?<=(o)d\1)r/.source).toBe('(?<=(o)d\\1)r'); + expect(/(?<=\1d(o))r/.source).toBe('(?<=\\1d(o))r'); +});
\ No newline at end of file |