1*fa88aeb8STomasz Sapeta // Copyright 2022-present 650 Industries. All rights reserved. 2*fa88aeb8STomasz Sapeta 3*fa88aeb8STomasz Sapeta #include "JSIUtils.h" 4*fa88aeb8STomasz Sapeta #include "LazyObject.h" 5*fa88aeb8STomasz Sapeta 6*fa88aeb8STomasz Sapeta namespace expo { 7*fa88aeb8STomasz Sapeta 8*fa88aeb8STomasz Sapeta LazyObject::LazyObject(const LazyObjectInitializer initializer) : initializer(initializer) {} 9*fa88aeb8STomasz Sapeta 10*fa88aeb8STomasz Sapeta LazyObject::~LazyObject() { 11*fa88aeb8STomasz Sapeta backedObject = nullptr; 12*fa88aeb8STomasz Sapeta } 13*fa88aeb8STomasz Sapeta 14*fa88aeb8STomasz Sapeta jsi::Value LazyObject::get(jsi::Runtime &runtime, const jsi::PropNameID &name) { 15*fa88aeb8STomasz Sapeta if (!backedObject) { 16*fa88aeb8STomasz Sapeta if (name.utf8(runtime) == "$$typeof") { 17*fa88aeb8STomasz Sapeta // React Native asks for this property for some reason, we can just ignore it. 18*fa88aeb8STomasz Sapeta return jsi::Value::undefined(); 19*fa88aeb8STomasz Sapeta } 20*fa88aeb8STomasz Sapeta backedObject = initializer(runtime); 21*fa88aeb8STomasz Sapeta } 22*fa88aeb8STomasz Sapeta return backedObject ? backedObject->getProperty(runtime, name) : jsi::Value::undefined(); 23*fa88aeb8STomasz Sapeta } 24*fa88aeb8STomasz Sapeta 25*fa88aeb8STomasz Sapeta void LazyObject::set(jsi::Runtime &runtime, const jsi::PropNameID &name, const jsi::Value &value) { 26*fa88aeb8STomasz Sapeta if (!backedObject) { 27*fa88aeb8STomasz Sapeta backedObject = initializer(runtime); 28*fa88aeb8STomasz Sapeta } 29*fa88aeb8STomasz Sapeta if (backedObject) { 30*fa88aeb8STomasz Sapeta backedObject->setProperty(runtime, name, value); 31*fa88aeb8STomasz Sapeta } 32*fa88aeb8STomasz Sapeta } 33*fa88aeb8STomasz Sapeta 34*fa88aeb8STomasz Sapeta std::vector<jsi::PropNameID> LazyObject::getPropertyNames(jsi::Runtime &runtime) { 35*fa88aeb8STomasz Sapeta if (!backedObject) { 36*fa88aeb8STomasz Sapeta backedObject = initializer(runtime); 37*fa88aeb8STomasz Sapeta } 38*fa88aeb8STomasz Sapeta if (backedObject) { 39*fa88aeb8STomasz Sapeta jsi::Array propertyNames = backedObject->getPropertyNames(runtime); 40*fa88aeb8STomasz Sapeta return jsiArrayToPropNameIdsVector(runtime, propertyNames); 41*fa88aeb8STomasz Sapeta } 42*fa88aeb8STomasz Sapeta return {}; 43*fa88aeb8STomasz Sapeta } 44*fa88aeb8STomasz Sapeta 45*fa88aeb8STomasz Sapeta } // namespace expo 46