|
14 | 14 |
|
15 | 15 | namespace objc_bridge { |
16 | 16 |
|
17 | | -void ObjCBridgeData::registerClassGlobals(napi_env env, napi_value global) { |
| 17 | +void ObjCBridgeState::registerClassGlobals(napi_env env, napi_value global) { |
18 | 18 | MDSectionOffset offset = metadata->classesOffset; |
19 | 19 | while (offset < metadata->structsOffset) { |
20 | 20 | MDSectionOffset originalOffset = offset; |
|
89 | 89 | return func; |
90 | 90 | } |
91 | 91 |
|
92 | | - auto bridgeData = ObjCBridgeData::InstanceData(env); |
93 | | - bridgeData->registerClass(env, argv[0]); |
| 92 | + auto bridgeState = ObjCBridgeState::InstanceData(env); |
| 93 | + bridgeState->registerClass(env, argv[0]); |
94 | 94 | return nullptr; |
95 | 95 | } |
96 | 96 |
|
97 | 97 | char class_name[256]; |
98 | 98 |
|
99 | 99 | // Get a Bridged Class by metadata offset, creating it if it doesn't exist. |
100 | | -// This is used to cache BridgedClass instances. |
101 | | -BridgedClass *ObjCBridgeData::getClass(napi_env env, MDSectionOffset offset) { |
| 100 | +// This is used to cache ObjCClass instances. |
| 101 | +ObjCClass *ObjCBridgeState::getClass(napi_env env, MDSectionOffset offset) { |
102 | 102 | auto find = this->classes[offset]; |
103 | 103 | if (find != nullptr) { |
104 | 104 | return find; |
105 | 105 | } |
106 | 106 |
|
107 | | - auto bridgedClass = new BridgedClass(env, offset); |
| 107 | + auto bridgedClass = new ObjCClass(env, offset); |
108 | 108 | this->classes[offset] = bridgedClass; |
109 | 109 |
|
110 | 110 | return bridgedClass; |
|
146 | 146 | void *data; |
147 | 147 | napi_get_cb_info(env, cbinfo, nullptr, nullptr, nullptr, &data); |
148 | 148 | MDSectionOffset offset = (MDSectionOffset)((size_t)data); |
149 | | - auto bridgeData = ObjCBridgeData::InstanceData(env); |
| 149 | + auto bridgeState = ObjCBridgeState::InstanceData(env); |
150 | 150 |
|
151 | | - auto cached = bridgeData->mdValueCache[offset]; |
| 151 | + auto cached = bridgeState->mdValueCache[offset]; |
152 | 152 | if (cached != nullptr) { |
153 | 153 | return get_ref_value(env, cached); |
154 | 154 | } |
155 | 155 |
|
156 | | - // std::string name = bridgeData->metadata->getString(offset); |
157 | | - auto cls = bridgeData->getClass(env, offset); |
| 156 | + // std::string name = bridgeState->metadata->getString(offset); |
| 157 | + auto cls = bridgeState->getClass(env, offset); |
158 | 158 |
|
159 | 159 | if (cls != nullptr) { |
160 | | - bridgeData->mdValueCache[offset] = cls->constructor; |
| 160 | + bridgeState->mdValueCache[offset] = cls->constructor; |
161 | 161 | } else { |
162 | 162 | return nullptr; |
163 | 163 | } |
|
204 | 204 | napi_get_cb_info(env, cbinfo, nil, nil, &jsThis, &data); |
205 | 205 | id self; |
206 | 206 | napi_unwrap(env, jsThis, (void **)&self); |
207 | | - auto bridgeData = ObjCBridgeData::InstanceData(env); |
208 | | - bridgeData->unregisterObject(self); |
| 207 | + auto bridgeState = ObjCBridgeState::InstanceData(env); |
| 208 | + bridgeState->unregisterObject(self); |
209 | 209 | return nullptr; |
210 | 210 | } |
211 | 211 |
|
|
220 | 220 | // extended by a JS class. |
221 | 221 | // Every Bridged Class extends the NativeObject class. |
222 | 222 |
|
223 | | -BridgedClass::BridgedClass(napi_env env, MDSectionOffset offset) { |
| 223 | +ObjCClass::ObjCClass(napi_env env, MDSectionOffset offset) { |
224 | 224 | NAPI_PREAMBLE |
225 | 225 |
|
226 | 226 | this->env = env; |
227 | 227 |
|
228 | 228 | metadataOffset = offset; |
229 | 229 |
|
230 | | - auto bridgeData = ObjCBridgeData::InstanceData(env); |
| 230 | + auto bridgeState = ObjCBridgeState::InstanceData(env); |
231 | 231 |
|
232 | 232 | bool isNativeObject = offset == MD_SECTION_OFFSET_NULL; |
233 | 233 |
|
|
239 | 239 | name = NativeObjectName; |
240 | 240 | nativeClass = nil; |
241 | 241 | } else { |
242 | | - auto nameOffset = bridgeData->metadata->getOffset(offset); |
| 242 | + auto nameOffset = bridgeState->metadata->getOffset(offset); |
243 | 243 | offset += sizeof(MDSectionOffset); |
244 | 244 | bool hasProtocols = (nameOffset & mdSectionOffsetNext) != 0; |
245 | 245 | nameOffset &= ~mdSectionOffsetNext; |
246 | | - name = bridgeData->metadata->resolveString(nameOffset); |
| 246 | + name = bridgeState->metadata->resolveString(nameOffset); |
247 | 247 | while (hasProtocols) { |
248 | | - auto protocolOffset = bridgeData->metadata->getOffset(offset); |
| 248 | + auto protocolOffset = bridgeState->metadata->getOffset(offset); |
249 | 249 | offset += sizeof(MDSectionOffset); |
250 | 250 | hasProtocols = (protocolOffset & mdSectionOffsetNext) != 0; |
251 | 251 | protocolOffset &= ~mdSectionOffsetNext; |
252 | 252 | if (protocolOffset != MD_SECTION_OFFSET_NULL) |
253 | 253 | protocolOffsets.push_back(protocolOffset); |
254 | 254 | } |
255 | | - superClassOffset = bridgeData->metadata->getOffset(offset); |
| 255 | + superClassOffset = bridgeState->metadata->getOffset(offset); |
256 | 256 | hasMembers = (superClassOffset & mdSectionOffsetNext) != 0; |
257 | 257 | superClassOffset &= ~mdSectionOffsetNext; |
258 | 258 | offset += sizeof(MDSectionOffset); |
|
277 | 277 | // exists. |
278 | 278 | if (!isNativeObject) { |
279 | 279 | for (auto protocolOffset : protocolOffsets) { |
280 | | - auto protocol = bridgeData->getProtocol( |
281 | | - env, protocolOffset + bridgeData->metadata->protocolsOffset); |
| 280 | + auto protocol = bridgeState->getProtocol( |
| 281 | + env, protocolOffset + bridgeState->metadata->protocolsOffset); |
282 | 282 | if (protocol == nil) |
283 | 283 | continue; |
284 | 284 | defineProtocolMembers(env, protocol->membersOffset, constructor); |
285 | 285 | } |
286 | 286 |
|
287 | 287 | if (superClassOffset != MD_SECTION_OFFSET_NULL) { |
288 | | - superClassOffset += bridgeData->metadata->classesOffset; |
| 288 | + superClassOffset += bridgeState->metadata->classesOffset; |
289 | 289 | } |
290 | 290 |
|
291 | 291 | // If class offset is 0, it means that the class doesn't have a super class. |
292 | 292 | // But we just inherit NativeObject class in that case. |
293 | | - superclass = bridgeData->getClass(env, superClassOffset); |
| 293 | + superclass = bridgeState->getClass(env, superClassOffset); |
294 | 294 | if (superclass != nil) { |
295 | 295 | superConstructor = get_ref_value(env, superclass->constructor); |
296 | 296 | superPrototype = get_ref_value(env, superclass->prototype); |
|
334 | 334 | return; |
335 | 335 | } |
336 | 336 |
|
337 | | - bridgeData->classesByPointer[nativeClass] = this; |
| 337 | + bridgeState->classesByPointer[nativeClass] = this; |
338 | 338 |
|
339 | 339 | if (!hasMembers) |
340 | 340 | return; |
341 | 341 |
|
342 | 342 | bool next = true; |
343 | 343 | while (next) { |
344 | | - auto flags = bridgeData->metadata->getMemberFlag(offset); |
| 344 | + auto flags = bridgeState->metadata->getMemberFlag(offset); |
345 | 345 | next = (flags & mdMemberNext) != 0; |
346 | 346 | offset += sizeof(flags); |
347 | 347 |
|
|
354 | 354 |
|
355 | 355 | if ((flags & mdMemberProperty) != 0) { |
356 | 356 | bool readonly = (flags & mdMemberReadonly) != 0; |
357 | | - auto name = bridgeData->metadata->getString(offset); |
| 357 | + auto name = bridgeState->metadata->getString(offset); |
358 | 358 | offset += sizeof(MDSectionOffset); // name |
359 | 359 |
|
360 | 360 | MDSectionOffset getterSignature, setterSignature; |
361 | 361 |
|
362 | | - auto getterSelector = bridgeData->metadata->getString(offset); |
| 362 | + auto getterSelector = bridgeState->metadata->getString(offset); |
363 | 363 | offset += sizeof(MDSectionOffset); // getterSelector |
364 | 364 |
|
365 | | - getterSignature = bridgeData->metadata->getOffset(offset); |
| 365 | + getterSignature = bridgeState->metadata->getOffset(offset); |
366 | 366 | offset += sizeof(MDSectionOffset); // getterSignature |
367 | 367 |
|
368 | 368 | const char *setterSelector = nullptr; |
369 | 369 | if (!readonly) { |
370 | | - setterSelector = bridgeData->metadata->getString(offset); |
| 370 | + setterSelector = bridgeState->metadata->getString(offset); |
371 | 371 | offset += sizeof(MDSectionOffset); // setterSelector |
372 | 372 |
|
373 | | - setterSignature = bridgeData->metadata->getOffset(offset); |
| 373 | + setterSignature = bridgeState->metadata->getOffset(offset); |
374 | 374 | offset += sizeof(MDSectionOffset); // setterSignature |
375 | 375 | } |
376 | 376 |
|
377 | | - auto prop = new BridgedMethod(); |
378 | | - prop->bridgeData = bridgeData; |
| 377 | + std::shared_ptr<ObjCClassMember> prop = |
| 378 | + std::make_shared<ObjCClassMember>(); |
| 379 | + prop->bridgeState = bridgeState; |
379 | 380 | prop->classMethod = (flags & mdMemberStatic) != 0; |
380 | 381 | prop->selector = sel_registerName(getterSelector); |
381 | 382 | prop->setterSelector = |
382 | 383 | setterSelector == nullptr ? nil : sel_registerName(setterSelector); |
383 | 384 | prop->signature = |
384 | | - getterSignature + bridgeData->metadata->signaturesOffset; |
| 385 | + getterSignature + bridgeState->metadata->signaturesOffset; |
385 | 386 | prop->setterSignature = |
386 | 387 | setterSelector == nullptr |
387 | 388 | ? 0 |
388 | | - : setterSignature + bridgeData->metadata->signaturesOffset; |
| 389 | + : setterSignature + bridgeState->metadata->signaturesOffset; |
389 | 390 |
|
390 | 391 | napi_property_descriptor property = { |
391 | 392 | .utf8name = name, |
|
396 | 397 | .value = nil, |
397 | 398 | .attributes = |
398 | 399 | (napi_property_attributes)(napi_configurable | napi_enumerable), |
399 | | - .data = prop, |
| 400 | + .data = members.emplace_back(prop).get(), |
400 | 401 | }; |
401 | 402 |
|
402 | 403 | napi_define_properties(env, jsObject, 1, &property); |
403 | 404 | } else { |
404 | | - auto selector = bridgeData->metadata->getString(offset); |
| 405 | + auto selector = bridgeState->metadata->getString(offset); |
405 | 406 | offset += sizeof(MDSectionOffset); // selector |
406 | | - auto signature = bridgeData->metadata->getOffset(offset); |
| 407 | + auto signature = bridgeState->metadata->getOffset(offset); |
407 | 408 | offset += sizeof(MDSectionOffset); // signature |
408 | 409 |
|
409 | 410 | auto name = jsifySelector(selector); |
|
414 | 415 | continue; |
415 | 416 | } |
416 | 417 |
|
417 | | - auto method = new BridgedMethod(); |
418 | | - method->bridgeData = bridgeData; |
| 418 | + std::shared_ptr<ObjCClassMember> method = |
| 419 | + std::make_shared<ObjCClassMember>(); |
| 420 | + method->bridgeState = bridgeState; |
419 | 421 | method->classMethod = (flags & mdMemberStatic) != 0; |
420 | 422 | method->selector = sel_registerName(selector); |
421 | | - method->signature = signature + bridgeData->metadata->signaturesOffset; |
| 423 | + method->signature = signature + bridgeState->metadata->signaturesOffset; |
422 | 424 | method->returnOwned = (flags & mdMemberReturnOwned) != 0; |
423 | 425 |
|
424 | 426 | napi_property_descriptor property = { |
|
431 | 433 | .attributes = |
432 | 434 | (napi_property_attributes)(napi_configurable | napi_writable | |
433 | 435 | napi_enumerable), |
434 | | - .data = method, |
| 436 | + .data = members.emplace_back(method).get(), |
435 | 437 | }; |
436 | 438 |
|
437 | 439 | napi_define_properties(env, jsObject, 1, &property); |
438 | 440 | } |
439 | 441 | } |
440 | 442 | } |
441 | 443 |
|
442 | | -BridgedClass::~BridgedClass() { |
| 444 | +ObjCClass::~ObjCClass() { |
443 | 445 | napi_delete_reference(env, constructor); |
444 | 446 | napi_delete_reference(env, prototype); |
445 | 447 | } |
|
0 commit comments