aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules7
-rw-r--r--Makefile18
-rw-r--r--src/bun.js/bindings/OnigurumaRegExp.cpp804
-rw-r--r--src/bun.js/bindings/OnigurumaRegExp.h47
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp19
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.h5
-rw-r--r--src/bun.js/bindings/headers-cpp.h2
-rw-r--r--src/bun.js/bindings/headers.h2
-rw-r--r--src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h1
-rw-r--r--src/bun.js/bindings/webcore/DOMIsoSubspaces.h1
-rw-r--r--src/bun.js/builtins/WebCoreJSBuiltinInternals.cpp5
-rw-r--r--src/bun.js/builtins/WebCoreJSBuiltins.cpp2
-rw-r--r--src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ByteLengthQueuingStrategyBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/CountQueuingStrategyBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/JSBufferPrototypeBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.cpp672
-rw-r--r--src/bun.js/builtins/cpp/OnigurumaRegExpPrototypeBuiltins.h201
-rw-r--r--src/bun.js/builtins/cpp/ProcessObjectBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ProcessObjectBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableByteStreamControllerBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableByteStreamInternalsBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBYOBReaderBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBYOBRequestBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBuiltins.cpp101
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamBuiltins.h10
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamDefaultControllerBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.cpp11
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamDefaultReaderBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/StreamInternalsBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/StreamInternalsBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamDefaultControllerBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/TransformStreamInternalsBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/WebCoreJSBuiltinInternals.h3
-rw-r--r--src/bun.js/builtins/cpp/WebCoreJSBuiltins.h5
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamDefaultControllerBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamDefaultWriterBuiltins.h1
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.cpp1
-rw-r--r--src/bun.js/builtins/cpp/WritableStreamInternalsBuiltins.h1
-rw-r--r--src/bun.js/builtins/js/OnigurumaRegExpPrototype.js583
m---------src/deps/oniguruma0
-rw-r--r--src/js_ast.zig17
-rw-r--r--src/js_printer.zig50
-rw-r--r--test/bun.js/oniguruma-regexp.test.ts356
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
diff --git a/Makefile b/Makefile
index b5ebdf37a..1e612c7e2 100644
--- a/Makefile
+++ b/Makefile
@@ -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