diff options
author | 2022-09-14 04:12:32 -0700 | |
---|---|---|
committer | 2022-09-14 04:12:32 -0700 | |
commit | 7bfa302b75c2450a872dc6b5de0002a9c7959ea9 (patch) | |
tree | c01a806611a0cbff3c47cfb9bc098d14e7d1667c /src/bun.js/bindings/ZigGeneratedCode.cpp | |
parent | 0935ab14d6cad3a3c80bee5b585381cfbbe74699 (diff) | |
download | bun-7bfa302b75c2450a872dc6b5de0002a9c7959ea9.tar.gz bun-7bfa302b75c2450a872dc6b5de0002a9c7959ea9.tar.zst bun-7bfa302b75c2450a872dc6b5de0002a9c7959ea9.zip |
Make `crypto.getRandomValues()` faster + fix > 1 byte/element typed arrays
Fix crypto.getRandomValues() with > 1 byte element typed arrays
Fixes https://github.com/oven-sh/bun/issues/1237
Diffstat (limited to 'src/bun.js/bindings/ZigGeneratedCode.cpp')
-rw-r--r-- | src/bun.js/bindings/ZigGeneratedCode.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ZigGeneratedCode.cpp b/src/bun.js/bindings/ZigGeneratedCode.cpp index 25ed067a2..dcd986780 100644 --- a/src/bun.js/bindings/ZigGeneratedCode.cpp +++ b/src/bun.js/bindings/ZigGeneratedCode.cpp @@ -573,5 +573,87 @@ extern "C" void Reader__f64__put(JSC::JSGlobalObject *globalObject, JSC::Encoded } + +extern "C" JSC_DECLARE_HOST_FUNCTION(Crypto__getRandomValues__slowpathWrapper); +extern "C" JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(Crypto__getRandomValues__fastpathWrapper, EncodedJSValue, (JSC::JSGlobalObject* lexicalGlobalObject, void* thisValue, JSC::JSUint8Array*)); + +JSC_DEFINE_JIT_OPERATION(Crypto__getRandomValues__fastpathWrapper, EncodedJSValue, (JSC::JSGlobalObject* lexicalGlobalObject, void* thisValue, JSC::JSUint8Array* arg1)) { +VM& vm = JSC::getVM(lexicalGlobalObject); +IGNORE_WARNINGS_BEGIN("frame-address") +CallFrame* callFrame = DECLARE_CALL_FRAME(vm); +IGNORE_WARNINGS_END +JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame); +return Crypto__getRandomValues__fastpath(lexicalGlobalObject, thisValue, arg1); +} +JSC_DEFINE_HOST_FUNCTION(Crypto__getRandomValues__slowpathWrapper, (JSC::JSGlobalObject *globalObject, JSC::CallFrame* frame)) { + return Crypto__getRandomValues__slowpath(globalObject, JSValue::encode(frame->thisValue()), reinterpret_cast<JSC::EncodedJSValue*>(frame->addressOfArgumentsStart()), frame->argumentCount()); +} + +extern "C" void Crypto__getRandomValues__put(JSC::JSGlobalObject *globalObject, JSC::EncodedJSValue value) { + JSC::JSObject *thisObject = JSC::jsCast<JSC::JSObject *>(JSC::JSValue::decode(value)); + static const JSC::DOMJIT::Signature DOMJIT_getRandomValues_signature( + Crypto__getRandomValues__fastpathWrapper, + thisObject->classInfo(), + JSC::DOMJIT::Effect::forReadWrite(JSC::DOMJIT::HeapRange::top(), JSC::DOMJIT::HeapRange::top()), + JSC::SpecHeapTop, + JSC::SpecUint8Array + ); + JSFunction* function = JSFunction::create( + globalObject->vm(), + globalObject, + 1, + String("getRandomValues"_s), + Crypto__getRandomValues__slowpathWrapper, ImplementationVisibility::Public, NoIntrinsic, Crypto__getRandomValues__slowpathWrapper, + &DOMJIT_getRandomValues_signature + ); + thisObject->putDirect( + globalObject->vm(), + Identifier::fromString(globalObject->vm(), "getRandomValues"_s), + function, + JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DOMJITFunction | 0 + ); +} + + + +extern "C" JSC_DECLARE_HOST_FUNCTION(Crypto__randomUUID__slowpathWrapper); +extern "C" JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(Crypto__randomUUID__fastpathWrapper, EncodedJSValue, (JSC::JSGlobalObject* lexicalGlobalObject, void* thisValue)); + +JSC_DEFINE_JIT_OPERATION(Crypto__randomUUID__fastpathWrapper, EncodedJSValue, (JSC::JSGlobalObject* lexicalGlobalObject, void* thisValue)) { +VM& vm = JSC::getVM(lexicalGlobalObject); +IGNORE_WARNINGS_BEGIN("frame-address") +CallFrame* callFrame = DECLARE_CALL_FRAME(vm); +IGNORE_WARNINGS_END +JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame); +return Crypto__randomUUID__fastpath(lexicalGlobalObject, thisValue); +} +JSC_DEFINE_HOST_FUNCTION(Crypto__randomUUID__slowpathWrapper, (JSC::JSGlobalObject *globalObject, JSC::CallFrame* frame)) { + return Crypto__randomUUID__slowpath(globalObject, JSValue::encode(frame->thisValue()), reinterpret_cast<JSC::EncodedJSValue*>(frame->addressOfArgumentsStart()), frame->argumentCount()); +} + +extern "C" void Crypto__randomUUID__put(JSC::JSGlobalObject *globalObject, JSC::EncodedJSValue value) { + JSC::JSObject *thisObject = JSC::jsCast<JSC::JSObject *>(JSC::JSValue::decode(value)); + static const JSC::DOMJIT::Signature DOMJIT_randomUUID_signature( + Crypto__randomUUID__fastpathWrapper, + thisObject->classInfo(), + JSC::DOMJIT::Effect::forReadWrite(JSC::DOMJIT::HeapRange::top(), JSC::DOMJIT::HeapRange::top()), + JSC::SpecString); + JSFunction* function = JSFunction::create( + globalObject->vm(), + globalObject, + 0, + String("randomUUID"_s), + Crypto__randomUUID__slowpathWrapper, ImplementationVisibility::Public, NoIntrinsic, Crypto__randomUUID__slowpathWrapper, + &DOMJIT_randomUUID_signature + ); + thisObject->putDirect( + globalObject->vm(), + Identifier::fromString(globalObject->vm(), "randomUUID"_s), + function, + JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DOMJITFunction | 0 + ); +} + + /* -- END DOMCall DEFINITIONS-- */ |