1 // Copyright 2022-present 650 Industries. All rights reserved. 2 3 #include "JSIUtils.h" 4 5 namespace expo::common { 6 7 std::vector<jsi::PropNameID> jsiArrayToPropNameIdsVector(jsi::Runtime &runtime, const jsi::Array &array) { 8 size_t size = array.size(runtime); 9 std::vector<jsi::PropNameID> vector; 10 11 vector.reserve(size); 12 13 for (size_t i = 0; i < size; i++) { 14 jsi::String name = array.getValueAtIndex(runtime, i).getString(runtime); 15 vector.push_back(jsi::PropNameID::forString(runtime, name)); 16 } 17 return vector; 18 } 19 20 void definePropertyOnJSIObject( 21 jsi::Runtime &runtime, 22 jsi::Object *jsthis, 23 const char *name, 24 jsi::Object descriptor 25 ) { 26 jsi::Object global = runtime.global(); 27 jsi::Object objectClass = global.getPropertyAsObject(runtime, "Object"); 28 jsi::Function definePropertyFunction = objectClass.getPropertyAsFunction( 29 runtime, 30 "defineProperty" 31 ); 32 33 // This call is basically the same as `Object.defineProperty(object, name, descriptor)` in JS 34 definePropertyFunction.callWithThis(runtime, objectClass, { 35 jsi::Value(runtime, *jsthis), 36 jsi::String::createFromUtf8(runtime, name), 37 std::move(descriptor), 38 }); 39 } 40 41 } // namespace expo::common 42