@@ -494,11 +494,6 @@ class HermesRuntimeImpl final : public HermesRuntime,
494
494
return ::hermes::vm::Handle <::hermes::vm::JSObject>::vmcast (&phv (obj));
495
495
}
496
496
497
- static ::hermes::vm::Handle <::hermes::vm::JSArray> arrayHandle (
498
- const jsi::Array &arr) {
499
- return ::hermes::vm::Handle <::hermes::vm::JSArray>::vmcast (&phv (arr));
500
- }
501
-
502
497
static ::hermes::vm::Handle <::hermes::vm::JSArrayBuffer> arrayBufferHandle (
503
498
const jsi::ArrayBuffer &arr) {
504
499
return ::hermes::vm::Handle <::hermes::vm::JSArrayBuffer>::vmcast (&phv (arr));
@@ -2192,7 +2187,12 @@ void HermesRuntimeImpl::setPropertyValue(
2192
2187
}
2193
2188
2194
2189
bool HermesRuntimeImpl::isArray (const jsi::Object &obj) const {
2195
- return vm::vmisa<vm::JSArray>(phv (obj));
2190
+ if (vm::vmisa<vm::JSArray>(phv (obj))) {
2191
+ return true ;
2192
+ }
2193
+ auto cr = vm::isArray (runtime_, vm::vmcast<vm::JSObject>(phv (obj)));
2194
+ const_cast <HermesRuntimeImpl *>(this )->checkStatus (cr.getStatus ());
2195
+ return *cr;
2196
2196
}
2197
2197
2198
2198
bool HermesRuntimeImpl::isArrayBuffer (const jsi::Object &obj) const {
@@ -2291,7 +2291,26 @@ jsi::ArrayBuffer HermesRuntimeImpl::createArrayBuffer(
2291
2291
}
2292
2292
2293
2293
size_t HermesRuntimeImpl::size (const jsi::Array &arr) {
2294
- return vm::JSArray::getLength (*arrayHandle (arr), runtime_);
2294
+ if (LLVM_LIKELY (vm::vmisa<vm::JSArray>(phv (arr)))) {
2295
+ return vm::JSArray::getLength (vm::vmcast<vm::JSArray>(phv (arr)), runtime_);
2296
+ }
2297
+
2298
+ vm::GCScope gcScope (runtime_);
2299
+ struct : vm::Locals {
2300
+ vm::PinnedValue<> lenProp;
2301
+ } lv;
2302
+ vm::LocalsRAII lraii{runtime_, &lv};
2303
+ auto cr = vm::JSObject::getNamed_RJS (
2304
+ handle (arr),
2305
+ runtime_,
2306
+ vm::Predefined::getSymbolID (vm::Predefined::length));
2307
+ checkStatus (cr.getStatus ());
2308
+
2309
+ lv.lenProp = std::move (*cr);
2310
+ auto lenRes = toLength (runtime_, lv.lenProp );
2311
+ checkStatus (lenRes.getStatus ());
2312
+
2313
+ return lenRes->getNumber ();
2295
2314
}
2296
2315
2297
2316
size_t HermesRuntimeImpl::size (const jsi::ArrayBuffer &arr) {
@@ -2316,7 +2335,7 @@ jsi::Value HermesRuntimeImpl::getValueAtIndex(const jsi::Array &arr, size_t i) {
2316
2335
}
2317
2336
2318
2337
auto res = vm::JSObject::getComputed_RJS (
2319
- arrayHandle (arr),
2338
+ handle (arr),
2320
2339
runtime_,
2321
2340
runtime_.makeHandle (vm::HermesValue::encodeTrustedNumberValue (i)));
2322
2341
checkStatus (res.getStatus ());
@@ -2335,7 +2354,7 @@ void HermesRuntimeImpl::setValueAtIndexImpl(
2335
2354
}
2336
2355
2337
2356
auto res = vm::JSObject::putComputed_RJS (
2338
- arrayHandle (arr),
2357
+ handle (arr),
2339
2358
runtime_,
2340
2359
runtime_.makeHandle (vm::HermesValue::encodeTrustedNumberValue (i)),
2341
2360
vmHandleFromValue (value));
0 commit comments