Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .agents/docs-and-formatting.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Load this file when changing documentation, public APIs, protocol specs, benchma

## Rules

- Do not format Markdown under `tasks/`, including task design, plan, progress, state, history,
and lessons files. These files are agent working state rather than repository documentation.
- Update the relevant docs under `docs/` when important public APIs change.
- Update `docs/specification/**` when protocol behavior changes.
- Keep examples working and aligned with the current API and protocol behavior.
Expand All @@ -32,8 +34,6 @@ Load this file when changing documentation, public APIs, protocol specs, benchma
## Formatting Commands

- Markdown: `prettier --write <file>`
- Do not format Markdown under `tasks/`, including task design, plan, progress, state, history,
and lessons files. These files are agent working state rather than repository documentation.
- Python code, including `compiler/`, `benchmarks/`, `integration_tests/`, and `python/`:
`python -m ruff format <changed-python-files>` and
`python -m ruff check --fix <changed-python-files>`
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ For more detailed benchmarks and methodology, see [Go Benchmark](benchmarks/go).
<img src="docs/benchmarks/python/throughput.png" width="95%">
</p>

For more detailed benchmarks and methodology, see [Python](benchmarks/python).
For more detailed benchmarks and methodology, see [Python Benchmarks](benchmarks/python).

### JavaScript/NodeJS Serialization Performance

Expand Down
147 changes: 60 additions & 87 deletions dart/packages/fory-test/lib/entity/xlang_test_manual.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ library;
// ignore_for_file: implementation_imports, invalid_use_of_internal_member

import 'package:fory/fory.dart';
import 'package:fory/src/serializer/serializer_support.dart';

import 'xlang_test_models.dart';

Expand Down Expand Up @@ -166,43 +165,17 @@ const List<GeneratedFieldInfo> _refOverrideContainerForyFieldInfo =
final GeneratedStructRegistration<RefOverrideContainer>
_refOverrideContainerForyRegistration =
GeneratedStructRegistration<RefOverrideContainer>(
fieldWritersBySlot: <GeneratedStructFieldInfoWriter<RefOverrideContainer>>[
_writeRefOverrideContainerField0,
_writeRefOverrideContainerField1,
_writeRefOverrideContainerField2,
],
type: RefOverrideContainer,
serializerFactory: _RefOverrideContainerForySerializer.new,
evolving: true,
needsRootRef: true,
usesNestedTypeDefinitions: true,
fields: _refOverrideContainerForyFieldInfo,
);

void _writeRefOverrideContainerField0(
WriteContext context,
GeneratedStructFieldInfo field,
RefOverrideContainer value,
) {
writeGeneratedStructFieldInfoValue(context, field, value.listField);
}

void _writeRefOverrideContainerField1(
WriteContext context,
GeneratedStructFieldInfo field,
RefOverrideContainer value,
) {
writeGeneratedStructFieldInfoValue(context, field, value.setField);
}

void _writeRefOverrideContainerField2(
WriteContext context,
GeneratedStructFieldInfo field,
RefOverrideContainer value,
) {
writeGeneratedStructFieldInfoValue(context, field, value.mapField);
}

final class _RefOverrideContainerForySerializer
extends Serializer<RefOverrideContainer> {
extends Serializer<RefOverrideContainer>
implements GeneratedStructSerializer<RefOverrideContainer> {
List<GeneratedStructFieldInfo>? _generatedFields;

_RefOverrideContainerForySerializer();
Expand All @@ -223,67 +196,67 @@ final class _RefOverrideContainerForySerializer

@override
void write(WriteContext context, RefOverrideContainer value) {
final slots = generatedStructWriteSlots(context);
if (slots == null) {
final fields = _writeFields(context);
writeGeneratedStructFieldInfoValue(context, fields[0], value.listField);
writeGeneratedStructFieldInfoValue(context, fields[1], value.setField);
writeGeneratedStructFieldInfoValue(context, fields[2], value.mapField);
return;
}
final writers = _refOverrideContainerForyRegistration.fieldWritersBySlot;
for (final field in slots.orderedFields) {
writers[field.slot](context, field, value);
}
final fields = _writeFields(context);
writeGeneratedStructFieldInfoValue(context, fields[0], value.listField);
writeGeneratedStructFieldInfoValue(context, fields[1], value.setField);
writeGeneratedStructFieldInfoValue(context, fields[2], value.mapField);
}

@override
RefOverrideContainer read(ReadContext context) {
final slots = generatedStructReadSlots(context);
final value = RefOverrideContainer();
context.reference(value);
if (slots == null) {
final fields = _readFields(context);
value.listField = _readRefOverrideContainerListField(
readGeneratedStructFieldInfoValue(context, fields[0], value.listField),
value.listField,
);
value.setField = _readRefOverrideContainerSetField(
readGeneratedStructFieldInfoValue(context, fields[1], value.setField),
value.setField,
);
value.mapField = _readRefOverrideContainerMapField(
readGeneratedStructFieldInfoValue(context, fields[2], value.mapField),
value.mapField,
);
return value;
}
if (slots.containsSlot(0)) {
final rawRefOverrideContainer0 = slots.valueForSlot(0);
value.listField = _readRefOverrideContainerListField(
rawRefOverrideContainer0 is DeferredReadRef
? context.getReadRef(rawRefOverrideContainer0.id)
: rawRefOverrideContainer0,
value.listField,
);
}
if (slots.containsSlot(1)) {
final rawRefOverrideContainer1 = slots.valueForSlot(1);
value.setField = _readRefOverrideContainerSetField(
rawRefOverrideContainer1 is DeferredReadRef
? context.getReadRef(rawRefOverrideContainer1.id)
: rawRefOverrideContainer1,
value.setField,
);
}
if (slots.containsSlot(2)) {
final rawRefOverrideContainer2 = slots.valueForSlot(2);
value.mapField = _readRefOverrideContainerMapField(
rawRefOverrideContainer2 is DeferredReadRef
? context.getReadRef(rawRefOverrideContainer2.id)
: rawRefOverrideContainer2,
value.mapField,
);
final fields = _readFields(context);
value.listField = _readRefOverrideContainerListField(
readGeneratedStructFieldInfoValue(context, fields[0], value.listField),
value.listField,
);
value.setField = _readRefOverrideContainerSetField(
readGeneratedStructFieldInfoValue(context, fields[1], value.setField),
value.setField,
);
value.mapField = _readRefOverrideContainerMapField(
readGeneratedStructFieldInfoValue(context, fields[2], value.mapField),
value.mapField,
);
return value;
}

@override
RefOverrideContainer readCompatibleStruct(
ReadContext context,
CompatibleStructReadLayout layout,
) {
final value = RefOverrideContainer();
for (var index = 0; index < layout.fieldCount; index += 1) {
final field = layout.localFieldAt(index);
if (field == null) {
skipGeneratedCompatibleStructField(context, layout, index);
continue;
}
switch (field.index) {
case 0:
value.listField = _readRefOverrideContainerListField(
readGeneratedCompatibleStructField(context, layout, index),
value.listField,
);
break;
case 1:
value.setField = _readRefOverrideContainerSetField(
readGeneratedCompatibleStructField(context, layout, index),
value.setField,
);
break;
case 2:
value.mapField = _readRefOverrideContainerMapField(
readGeneratedCompatibleStructField(context, layout, index),
value.mapField,
);
break;
default:
throw StateError(
'Compatible field index is out of range for RefOverrideContainer.',
);
}
}
return value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import 'package:fory_test/entity/xlang_test_models.dart';
import 'package:test/test.dart';

void main() {
test('compatible named struct round trip scopes nested struct slots', () {
test('compatible named struct round trip preserves nested struct fields', () {
final fory = Fory(compatible: true);
registerXlangType(
fory,
Expand Down
Loading
Loading