@@ -156,7 +156,10 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
156156 }
157157 if (!force && Object.prototype.hasOwnProperty.call(globalThis, name)) {
158158 try {
159- cacheGlobal(name, globalThis[name]);
159+ var existingDescriptor = Object.getOwnPropertyDescriptor(globalThis, name);
160+ if (existingDescriptor && Object.prototype.hasOwnProperty.call(existingDescriptor, 'value')) {
161+ cacheGlobal(name, existingDescriptor.value);
162+ }
160163 } catch (_) {
161164 }
162165 return;
@@ -697,6 +700,27 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
697700 });
698701 } catch (_) {
699702 }
703+ try {
704+ Object.defineProperty(constructable, 'new', {
705+ configurable: true,
706+ enumerable: false,
707+ writable: false,
708+ value: function() {
709+ if (arguments.length !== 0) {
710+ throw new Error('new does not take arguments; use invoke for an explicit Objective-C selector.');
711+ }
712+ if (typeof nativeClass.alloc !== 'function') {
713+ throw new Error('Native class cannot be allocated');
714+ }
715+ var instance = nativeClass.alloc();
716+ if (instance && typeof instance.init === 'function') {
717+ return rememberInstanceClass(instance.init());
718+ }
719+ return rememberInstanceClass(instance);
720+ }
721+ });
722+ } catch (_) {
723+ }
700724 try {
701725 Object.defineProperty(constructable, 'caller', {
702726 configurable: true,
@@ -716,6 +740,7 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
716740 } catch (_) {
717741 }
718742 var basePrototypeTarget = {};
743+ var classMembersInstalled = false;
719744 function installClassMembers(target, members, receiverIsClass) {
720745 if (!target || !members || typeof members.length !== 'number') {
721746 return;
@@ -790,8 +815,23 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
790815 }
791816 }
792817 }
793- installClassMembers(constructable, nativeClass.__staticMembers, true);
794- installClassMembers(basePrototypeTarget, nativeClass.__instanceMembers, false);
818+ function installNativeClassMembersIfNeeded() {
819+ if (classMembersInstalled) {
820+ return;
821+ }
822+ classMembersInstalled = true;
823+ installClassMembers(constructable, nativeClass.__staticMembers, true);
824+ installClassMembers(basePrototypeTarget, nativeClass.__instanceMembers, false);
825+ }
826+ try {
827+ Object.defineProperty(constructable, '__nativeApiInstallMembers', {
828+ configurable: true,
829+ enumerable: false,
830+ writable: false,
831+ value: installNativeClassMembersIfNeeded
832+ });
833+ } catch (_) {
834+ }
795835 try {
796836 Object.defineProperty(basePrototypeTarget, 'constructor', {
797837 configurable: true,
@@ -905,6 +945,7 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
905945 });
906946 } catch (_) {
907947 }
948+ var cachedNativeFunctions = typeof Map === 'function' ? new Map() : null;
908949 var wrapper = typeof Proxy === 'function'
909950 ? new Proxy(constructable, {
910951 get: function(target, property, receiver) {
@@ -917,14 +958,36 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
917958 property === 'name') {
918959 return Reflect.get(target, property, receiver);
919960 }
961+ if (cachedNativeFunctions && cachedNativeFunctions.has(property)) {
962+ return cachedNativeFunctions.get(property);
963+ }
920964 var nativeValue = nativeClass[property];
921965 if (nativeValue !== undefined) {
966+ if (typeof nativeValue === 'function') {
967+ if (cachedNativeFunctions) {
968+ cachedNativeFunctions.set(property, nativeValue);
969+ }
970+ try {
971+ Object.defineProperty(target, property, {
972+ configurable: true,
973+ enumerable: false,
974+ writable: false,
975+ value: nativeValue
976+ });
977+ } catch (_) {
978+ }
979+ }
922980 return nativeValue;
923981 }
924982 var reflected = Reflect.get(target, property, receiver);
925983 if (reflected !== undefined || property in target) {
926984 return reflected;
927985 }
986+ installNativeClassMembersIfNeeded();
987+ reflected = Reflect.get(target, property, receiver);
988+ if (reflected !== undefined || property in target) {
989+ return reflected;
990+ }
928991 return reflected;
929992 },
930993 set: function(target, property, value, receiver) {
@@ -956,18 +1019,6 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
9561019 }
9571020 })
9581021 : constructable;
959- try {
960- var nativeSuperclass = nativeClass.__superclass;
961- if (nativeSuperclass && nativeSuperclass !== nativeClass) {
962- var superclassWrapper = wrapNativeClass(nativeSuperclass);
963- if (superclassWrapper &&
964- superclassWrapper !== wrapper &&
965- superclassWrapper !== constructable) {
966- Object.setPrototypeOf(wrapper, superclassWrapper);
967- }
968- }
969- } catch (_) {
970- }
9711022 if (classWrappers) {
9721023 classWrappers.set(nativeClass, wrapper);
9731024 }
@@ -1000,7 +1051,11 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
10001051 function rememberClassOnInstance(instance, classWrapper) {
10011052 if (instance && typeof instance === 'object' && classWrapper) {
10021053 try {
1003- instance.__nativeApiClassWrapper = classWrapper;
1054+ if (typeof api.__rememberObjectClassWrapper === 'function') {
1055+ api.__rememberObjectClassWrapper(instance, classWrapper);
1056+ } else {
1057+ instance.__nativeApiClassWrapper = classWrapper;
1058+ }
10041059 } catch (_) {
10051060 }
10061061 }
0 commit comments