@@ -1114,17 +1114,99 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_lastIndexOfBody(JSC:
11141114static inline JSC::EncodedJSValue jsBufferPrototypeFunction_swap16Body (JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSArrayBufferView>::ClassParameter castedThis)
11151115{
11161116 auto & vm = JSC::getVM (lexicalGlobalObject);
1117- return JSC::JSValue::encode (jsUndefined ());
1117+ auto scope = DECLARE_THROW_SCOPE (vm);
1118+
1119+ constexpr int elemSize = 2 ;
1120+ int64_t length = static_cast <int64_t >(castedThis->byteLength ());
1121+ if (length % elemSize != 0 ) {
1122+ throwRangeError (lexicalGlobalObject, scope, " Buffer size must be a multiple of 16-bits" _s);
1123+ return JSC::JSValue::encode (jsUndefined ());
1124+ }
1125+
1126+ if (UNLIKELY (castedThis->isDetached ())) {
1127+ throwVMTypeError (lexicalGlobalObject, scope, " Buffer is detached" _s);
1128+ return JSValue::encode (jsUndefined ());
1129+ }
1130+
1131+ uint8_t * typedVector = castedThis->typedVector ();
1132+
1133+ for (size_t elem = 0 ; elem < length; elem += elemSize) {
1134+ const size_t right = elem + 1 ;
1135+
1136+ uint8_t temp = typedVector[elem];
1137+ typedVector[elem] = typedVector[right];
1138+ typedVector[right] = temp;
1139+ }
1140+
1141+ return JSC::JSValue::encode (castedThis);
11181142}
11191143static inline JSC::EncodedJSValue jsBufferPrototypeFunction_swap32Body (JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSArrayBufferView>::ClassParameter castedThis)
11201144{
11211145 auto & vm = JSC::getVM (lexicalGlobalObject);
1122- return JSC::JSValue::encode (jsUndefined ());
1146+ auto scope = DECLARE_THROW_SCOPE (vm);
1147+
1148+ constexpr int elemSize = 4 ;
1149+ int64_t length = static_cast <int64_t >(castedThis->byteLength ());
1150+ if (length % elemSize != 0 ) {
1151+ throwRangeError (lexicalGlobalObject, scope, " Buffer size must be a multiple of 32-bits" _s);
1152+ return JSC::JSValue::encode (jsUndefined ());
1153+ }
1154+
1155+ if (UNLIKELY (castedThis->isDetached ())) {
1156+ throwVMTypeError (lexicalGlobalObject, scope, " Buffer is detached" _s);
1157+ return JSValue::encode (jsUndefined ());
1158+ }
1159+
1160+ uint8_t * typedVector = castedThis->typedVector ();
1161+
1162+ constexpr size_t swaps = elemSize/2 ;
1163+ for (size_t elem = 0 ; elem < length; elem += elemSize) {
1164+ const size_t right = elem + elemSize - 1 ;
1165+ for (size_t k = 0 ; k < swaps; k++) {
1166+ const size_t i = right - k;
1167+ const size_t j = elem + k;
1168+
1169+ uint8_t temp = typedVector[i];
1170+ typedVector[i] = typedVector[j];
1171+ typedVector[j] = temp;
1172+ }
1173+ }
1174+
1175+ return JSC::JSValue::encode (castedThis);
11231176}
11241177static inline JSC::EncodedJSValue jsBufferPrototypeFunction_swap64Body (JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSArrayBufferView>::ClassParameter castedThis)
11251178{
11261179 auto & vm = JSC::getVM (lexicalGlobalObject);
1127- return JSC::JSValue::encode (jsUndefined ());
1180+ auto scope = DECLARE_THROW_SCOPE (vm);
1181+
1182+ constexpr size_t elemSize = 8 ;
1183+ int64_t length = static_cast <int64_t >(castedThis->byteLength ());
1184+ if (length % elemSize != 0 ) {
1185+ throwRangeError (lexicalGlobalObject, scope, " Buffer size must be a multiple of 64-bits" _s);
1186+ return JSC::JSValue::encode (jsUndefined ());
1187+ }
1188+
1189+ if (UNLIKELY (castedThis->isDetached ())) {
1190+ throwVMTypeError (lexicalGlobalObject, scope, " Buffer is detached" _s);
1191+ return JSValue::encode (jsUndefined ());
1192+ }
1193+
1194+ uint8_t * typedVector = castedThis->typedVector ();
1195+
1196+ constexpr size_t swaps = elemSize/2 ;
1197+ for (size_t elem = 0 ; elem < length; elem += elemSize) {
1198+ const size_t right = elem + elemSize - 1 ;
1199+ for (size_t k = 0 ; k < swaps; k++) {
1200+ const size_t i = right - k;
1201+ const size_t j = elem + k;
1202+
1203+ uint8_t temp = typedVector[i];
1204+ typedVector[i] = typedVector[j];
1205+ typedVector[j] = temp;
1206+ }
1207+ }
1208+
1209+ return JSC::JSValue::encode (castedThis);
11281210}
11291211
11301212static inline JSC::EncodedJSValue jsBufferPrototypeFunction_toStringBody (JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSArrayBufferView>::ClassParameter castedThis)
0 commit comments