Skip to content

Commit

Permalink
Merge pull request #49 from DevCycleHQ/remove-unmanaged
Browse files Browse the repository at this point in the history
Remove unmanaged decorator from generated output
  • Loading branch information
piotr-oles committed Mar 24, 2023
2 parents 29a3226 + c039104 commit 6842339
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 49 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,7 @@ google-protobuf x 160,281 ops/sec ±0.46% (91 runs sampled)

The library is slower on decoding mostly because of GC - AssemblyScript provides very simple (and small) GC
which is not as good as V8 GC. The `as-proto` beats JavaScript on decoding when messages contain
only primitive values or other messages (no strings and arrays). In this case the generator creates
`@unmanaged` classes which are much faster for memory management.
only primitive values or other messages (no strings and arrays).

## License
MIT
Expand Down
1 change: 0 additions & 1 deletion bench/data/assembly/generated/Test/Inner/InnerInner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import { Writer, Reader } from "as-proto/assembly";
import { Enum } from "../Enum";

@unmanaged
export class InnerInner {
static encode(message: InnerInner, writer: Writer): void {
writer.uint32(8);
Expand Down
46 changes: 0 additions & 46 deletions packages/as-proto-gen/src/generate/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ export function generateMessage(
}

const MessageClass = `
${canMessageByUnmanaged(messageDescriptor, fileContext) ? "@unmanaged" : ""}
export class ${Message} {
${generateEncodeMethod(messageDescriptor, fileContext)}
${generateDecodeMethod(messageDescriptor, fileContext)}
Expand Down Expand Up @@ -187,51 +186,6 @@ function generateMessageConstructor(
`;
}

function canMessageByUnmanaged(
messageDescriptor: DescriptorProto,
fileContext: FileContext,
visitedMessageDescriptors = new Set<DescriptorProto>()
): boolean {
const fields = getAllFields(messageDescriptor);

if (visitedMessageDescriptors.has(messageDescriptor)) {
// handle cycles
return false;
}
visitedMessageDescriptors.add(messageDescriptor);

return fields.every((fieldDescriptor) => {
if (
fieldDescriptor.getLabel() === FieldDescriptorProto.Label.LABEL_REPEATED
) {
// message with repeated field is not supported as unmanaged
return false;
} else if (!isManagedFieldType(fieldDescriptor)) {
// not managed type - we're good
return true;
} else if (
fieldDescriptor.getType() === FieldDescriptorProto.Type.TYPE_MESSAGE
) {
// message type - if message itself is unmanaged, we're good
const typeName = fieldDescriptor.getTypeName();
assert.ok(typeName !== undefined);
const relatedMessageDescriptor = fileContext
.getGeneratorContext()
.getMessageDescriptorByFieldTypeName(typeName);
return relatedMessageDescriptor
? canMessageByUnmanaged(
relatedMessageDescriptor,
fileContext,
visitedMessageDescriptors
)
: false;
} else {
// unsupported managed type
return false;
}
});
}

function generateHelperMethods(
Message: string,
fileContext: FileContext
Expand Down

0 comments on commit 6842339

Please sign in to comment.