|
40 | 40 | #include <deemon/object.h> |
41 | 41 | #include <deemon/property.h> |
42 | 42 | #include <deemon/seq.h> |
| 43 | +#include <deemon/serial.h> |
43 | 44 | #include <deemon/string.h> |
44 | 45 | #include <deemon/super.h> |
45 | 46 | #include <deemon/system-features.h> /* memcpy(), ... */ |
@@ -1371,6 +1372,118 @@ cd_visit(ClassDescriptor *__restrict self, Dee_visit_t proc, void *arg) { |
1371 | 1372 | Dee_XVisit(self->cd_doc); |
1372 | 1373 | } |
1373 | 1374 |
|
| 1375 | +PRIVATE WUNUSED NONNULL((1)) Dee_seraddr_t DCALL |
| 1376 | +cd_serialize(ClassDescriptor *__restrict self, DeeSerial *__restrict writer) { |
| 1377 | + ClassDescriptor *out; |
| 1378 | + Dee_seraddr_t out_addr; |
| 1379 | + size_t i, sizeof_self; |
| 1380 | + sizeof_self = offsetof(ClassDescriptor, cd_iattr_list) + |
| 1381 | + (self->cd_iattr_mask + 1) * |
| 1382 | + sizeof(struct Dee_class_attribute); |
| 1383 | + out_addr = DeeSerial_ObjectMalloc(writer, sizeof_self, self); |
| 1384 | + if (!Dee_SERADDR_ISOK(out_addr)) |
| 1385 | + goto err; |
| 1386 | + out = DeeSerial_Addr2Mem(writer, out_addr, ClassDescriptor); |
| 1387 | +#define ADDROF(field) (out_addr + offsetof(ClassDescriptor, field)) |
| 1388 | + out->cd_flags = self->cd_flags; |
| 1389 | + out->cd_cmemb_size = self->cd_cmemb_size; |
| 1390 | + out->cd_imemb_size = self->cd_imemb_size; |
| 1391 | + out->cd_clsop_mask = self->cd_clsop_mask; |
| 1392 | + out->cd_cattr_mask = self->cd_cattr_mask; |
| 1393 | + out->cd_iattr_mask = self->cd_iattr_mask; |
| 1394 | + memcpyc(out->cd_iattr_list, self->cd_iattr_list, |
| 1395 | + self->cd_iattr_mask + 1, |
| 1396 | + sizeof(struct Dee_class_attribute)); |
| 1397 | + |
| 1398 | + /* Write class name and doc-string */ |
| 1399 | + if (DeeSerial_XPutObject(writer, ADDROF(cd_name), self->cd_name)) |
| 1400 | + goto err; |
| 1401 | + if (DeeSerial_XPutObject(writer, ADDROF(cd_doc), self->cd_doc)) |
| 1402 | + goto err; |
| 1403 | + |
| 1404 | + /* Write instance attribute table. */ |
| 1405 | + for (i = 0; i <= self->cd_iattr_mask; ++i) { |
| 1406 | + Dee_seraddr_t out_addr__cd_iattr_list__i; |
| 1407 | + if (!self->cd_iattr_list[i].ca_name) |
| 1408 | + continue; |
| 1409 | + out_addr__cd_iattr_list__i = ADDROF(cd_iattr_list); |
| 1410 | + out_addr__cd_iattr_list__i += i * sizeof(struct Dee_class_attribute); |
| 1411 | + if (DeeSerial_PutObject(writer, |
| 1412 | + out_addr__cd_iattr_list__i + |
| 1413 | + offsetof(struct Dee_class_attribute, ca_name), |
| 1414 | + self->cd_iattr_list[i].ca_name)) |
| 1415 | + goto err; |
| 1416 | + if (DeeSerial_XPutObject(writer, |
| 1417 | + out_addr__cd_iattr_list__i + |
| 1418 | + offsetof(struct Dee_class_attribute, ca_doc), |
| 1419 | + self->cd_iattr_list[i].ca_doc)) |
| 1420 | + goto err; |
| 1421 | + } |
| 1422 | + |
| 1423 | + /* Write class attribute table. */ |
| 1424 | + if (self->cd_cattr_list == empty_class_attributes) { |
| 1425 | + if (DeeSerial_PutStaticDeemon(writer, ADDROF(cd_cattr_list), empty_class_attributes)) |
| 1426 | + goto err; |
| 1427 | + } else { |
| 1428 | + size_t sizeof__cd_cattr_list; |
| 1429 | + struct Dee_class_attribute *in__cd_cattr_list; |
| 1430 | + struct Dee_class_attribute *out__cd_cattr_list; |
| 1431 | + Dee_seraddr_t addrof_out__cd_cattr_list; |
| 1432 | + in__cd_cattr_list = self->cd_cattr_list; |
| 1433 | + sizeof__cd_cattr_list = (self->cd_cattr_mask + 1) * sizeof(struct Dee_class_attribute); |
| 1434 | + addrof_out__cd_cattr_list = DeeSerial_Malloc(writer, sizeof__cd_cattr_list); |
| 1435 | + if (!Dee_SERADDR_ISOK(addrof_out__cd_cattr_list)) |
| 1436 | + goto err; |
| 1437 | + if (DeeSerial_PutAddr(writer, ADDROF(cd_cattr_list), addrof_out__cd_cattr_list)) |
| 1438 | + goto err; |
| 1439 | + out__cd_cattr_list = DeeSerial_Addr2Mem(writer, addrof_out__cd_cattr_list, |
| 1440 | + struct Dee_class_attribute); |
| 1441 | + memcpy(out__cd_cattr_list, in__cd_cattr_list, sizeof__cd_cattr_list); |
| 1442 | + for (i = 0; i <= self->cd_cattr_mask; ++i) { |
| 1443 | + Dee_seraddr_t addrof_out__cd_cattr_list__i; |
| 1444 | + if (!in__cd_cattr_list[i].ca_name) |
| 1445 | + continue; |
| 1446 | + addrof_out__cd_cattr_list__i = addrof_out__cd_cattr_list; |
| 1447 | + addrof_out__cd_cattr_list__i += i * sizeof(struct Dee_class_attribute); |
| 1448 | + if (DeeSerial_PutObject(writer, |
| 1449 | + addrof_out__cd_cattr_list__i + |
| 1450 | + offsetof(struct Dee_class_attribute, ca_name), |
| 1451 | + in__cd_cattr_list[i].ca_name)) |
| 1452 | + goto err; |
| 1453 | + if (DeeSerial_XPutObject(writer, |
| 1454 | + addrof_out__cd_cattr_list__i + |
| 1455 | + offsetof(struct Dee_class_attribute, ca_doc), |
| 1456 | + in__cd_cattr_list[i].ca_doc)) |
| 1457 | + goto err; |
| 1458 | + } |
| 1459 | + } |
| 1460 | + |
| 1461 | + /* Write class operator table. */ |
| 1462 | + if (self->cd_clsop_list == empty_class_operators) { |
| 1463 | + if (DeeSerial_PutStaticDeemon(writer, ADDROF(cd_clsop_list), empty_class_operators)) |
| 1464 | + goto err; |
| 1465 | + } else { |
| 1466 | + size_t sizeof__cd_clsop_list; |
| 1467 | + Dee_seraddr_t addrof_out__cd_clsop_list; |
| 1468 | + struct Dee_class_operator *in__cd_clsop_list; |
| 1469 | + struct Dee_class_operator *out__cd_clsop_list; |
| 1470 | + in__cd_clsop_list = self->cd_clsop_list; |
| 1471 | + sizeof__cd_clsop_list = (self->cd_clsop_mask + 1) * sizeof(struct Dee_class_operator); |
| 1472 | + addrof_out__cd_clsop_list = DeeSerial_Malloc(writer, sizeof__cd_clsop_list); |
| 1473 | + if (!Dee_SERADDR_ISOK(addrof_out__cd_clsop_list)) |
| 1474 | + goto err; |
| 1475 | + if (DeeSerial_PutAddr(writer, ADDROF(cd_clsop_list), addrof_out__cd_clsop_list)) |
| 1476 | + goto err; |
| 1477 | + out__cd_clsop_list = DeeSerial_Addr2Mem(writer, addrof_out__cd_clsop_list, |
| 1478 | + struct Dee_class_operator); |
| 1479 | + memcpy(out__cd_clsop_list, in__cd_clsop_list, sizeof__cd_clsop_list); |
| 1480 | + } |
| 1481 | +#undef ADDROF |
| 1482 | + return out_addr; |
| 1483 | +err: |
| 1484 | + return Dee_SERADDR_INVALID; |
| 1485 | +} |
| 1486 | + |
1374 | 1487 |
|
1375 | 1488 | PRIVATE WUNUSED NONNULL((1, 2)) bool DCALL |
1376 | 1489 | class_attribute_eq(struct class_attribute *__restrict lhs, |
@@ -2403,7 +2516,7 @@ PUBLIC DeeTypeObject DeeClassDescriptor_Type = { |
2403 | 2516 | /* tp_deep_ctor: */ &DeeObject_NewRef, |
2404 | 2517 | /* tp_any_ctor: */ NULL, |
2405 | 2518 | /* tp_any_ctor_kw: */ &cd_init_kw, |
2406 | | - /* tp_serialize: */ NULL, /* TODO */ |
| 2519 | + /* tp_serialize: */ &cd_serialize, |
2407 | 2520 | /* tp_free: */ NULL |
2408 | 2521 | ), |
2409 | 2522 | /* .tp_dtor = */ (void (DCALL *)(DeeObject *__restrict))&cd_fini, |
|
0 commit comments