Skip to content

Type-safe Embind port, compatible with the current API #7553

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 32 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9cd6c7d
Initial commit: update CMakeLists and add some basic embind functiona…
GulgDev Apr 25, 2025
a8f3995
Extend embind functionality
GulgDev Apr 25, 2025
515e6a1
Add automatic expression generation and move away from C API
GulgDev Apr 25, 2025
f23396f
Switch to direct bindings
GulgDev Apr 26, 2025
38354b1
Transform expression factories into inline structs
GulgDev Apr 26, 2025
4216539
Merge branch 'main' of https://github.com/WebAssembly/binaryen into c…
GulgDev Apr 26, 2025
f87350c
Switch to C++ API
GulgDev Apr 26, 2025
9da6d8b
Extend API
GulgDev Apr 27, 2025
89e7f4f
Clean up
GulgDev Apr 27, 2025
8440c8f
Add more pass functions
GulgDev Apr 27, 2025
91cf1ee
Fix bugs
GulgDev Apr 27, 2025
d1b425b
Fix memory corruption
GulgDev Apr 27, 2025
5fde9ba
Fix the `Maximum call stack size exceeded` bug!
GulgDev Apr 29, 2025
b81cd4b
Extend expression wrapper field support
GulgDev Apr 29, 2025
2341097
Make expression building functions return specific classes
GulgDev Apr 29, 2025
6ff26de
Fix field bindings
GulgDev Apr 30, 2025
cb2bf97
Fix
GulgDev Apr 30, 2025
0fb5df7
Add boolean fields & do some fixes
GulgDev Apr 30, 2025
2fd493e
Add expression info & fix UB
GulgDev Apr 30, 2025
fd1d914
Refactor
GulgDev May 1, 2025
df7edea
Add vector field type
GulgDev May 1, 2025
c9eb24b
Add vector type to expression info
GulgDev May 1, 2025
2e1fff2
Extend instruction set
GulgDev May 1, 2025
c1f9fd0
Add missing instructions
GulgDev May 1, 2025
db647e2
Update instructions
GulgDev May 1, 2025
f865de4
Fix const
GulgDev May 1, 2025
64ee7d4
Fix bugs & update tests
GulgDev May 1, 2025
7a35cd1
Add general instructions
GulgDev May 1, 2025
9555a78
Add name list field & fix vector set
GulgDev May 1, 2025
478a4f5
Add CallIndirect
GulgDev May 1, 2025
a3ef118
Fix `createType`
GulgDev May 1, 2025
ed6d36b
Add `isTee`
GulgDev May 1, 2025
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 45 additions & 7 deletions src/binaryen-embind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,17 +452,55 @@ EMSCRIPTEN_BINDINGS(Binaryen) {
allow_raw_pointer<wasm::Expression>()) \
.property(#field, &wasm::id::field, allow_raw_pointer<wasm::Expression>())
#define DELEGATE_FIELD_CHILD_VECTOR(id, field) \
//.property(#field, &wasm::id::field,
// allow_raw_pointer<wasm::Expression>())
#define DELEGATE_FIELD_INT(id, field)
.function( \
GETTER(#field), \
+[](const wasm::id& expr) { \
return binaryen::ExpressionList( \
val::array(std::vector(expr.field.begin(), expr.field.end()))); \
}, \
allow_raw_pointer<wasm::Expression>()) \
.function( \
SETTER(#field), \
+[](wasm::id& expr, binaryen::ExpressionList value) { \
expr.field.set(vecFromJSArray<wasm::Expression*>( \
value, allow_raw_pointer<wasm::Expression>())); \
}, \
allow_raw_pointer<wasm::Expression>()) \
.property( \
#field, \
+[](const wasm::id& expr) { \
return binaryen::ExpressionList( \
val::array(std::vector(expr.field.begin(), expr.field.end()))); \
}, \
+[](wasm::id& expr, binaryen::ExpressionList value) { \
expr.field.set(vecFromJSArray<wasm::Expression*>( \
value, allow_raw_pointer<wasm::Expression>())); \
}, \
allow_raw_pointer<wasm::Expression>())
#define DELEGATE_FIELD_INT(id, field) \
.function( \
GETTER(#field), +[](const wasm::id& expr) { return expr.field; }) \
.function( \
SETTER(#field), \
+[](wasm::id& expr, uint32_t value) { expr.field = value; }) \
.property(#field, &wasm::id::field)
#define DELEGATE_FIELD_INT_ARRAY(id, field)
#define DELEGATE_FIELD_INT_VECTOR(id, field)
#define DELEGATE_FIELD_BOOL(id, field)
#define DELEGATE_FIELD_BOOL_VECTOR(id, field)
#define DELEGATE_FIELD_ENUM(id, field, type)
#define DELEGATE_FIELD_LITERAL(id, field)
#define DELEGATE_FIELD_NAME(id, field) \
.property( \
#field, \
+[](const wasm::id& expr) { return expr.field.toString(); }, \
+[](wasm::id& expr, std::string value) { expr.field = value; })
.function( \
GETTER(#field), \
+[](const wasm::id& expr) { return expr.field.toString(); }) \
.function( \
SETTER(#field), \
+[](wasm::id& expr, std::string value) { expr.field = value; }) \
.property( \
#field, \
+[](const wasm::id& expr) { return expr.field.toString(); }, \
+[](wasm::id& expr, std::string value) { expr.field = value; })
#define DELEGATE_FIELD_NAME_VECTOR(id, field)
#define DELEGATE_FIELD_SCOPE_NAME_DEF(id, field) DELEGATE_FIELD_NAME(id, field)
#define DELEGATE_FIELD_SCOPE_NAME_USE(id, field) DELEGATE_FIELD_NAME(id, field)
Expand Down
95 changes: 60 additions & 35 deletions src/wasm-delegations-fields.def
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,27 @@
// of child pointers. If this is not defined, and DELEGATE_GET_FIELD is, then
// DELEGATE_FIELD_CHILD is called on them.
//
// DELEGATE_FIELD_INT(id, field) - called for an integer field (bool, enum,
// Index, int32, or int64).
// DELEGATE_FIELD_INT(id, field) - called for an integer field (enum, Index,
// int32, or int64).
//
// DELEGATE_FIELD_INT_ARRAY(id, field) - called for a std::array of fixed size
// of integer values (like a SIMD mask). If this is not defined, and
// DELEGATE_GET_FIELD is, then DELEGATE_FIELD_INT is called on them.

//
// DELEGATE_FIELD_INT_VECTOR(id, field) - called for a variable-sized vector
// of integer values. If this is not defined, and DELEGATE_GET_FIELD is, then
// DELEGATE_FIELD_INT is called on them.
//
// DELEGATE_FIELD_ENUM(id, field, type) - called for an enum field. If this is
// not defined, then DELEGATE_FIELD_INT is used as fallback.
//
// DELEGATE_FIELD_BOOL(id, field) - called for a boolean field. If this is not
// defined, then DELEGATE_FIELD_INT is used as fallback.
//
// DELEGATE_FIELD_BOOL_VECTOR(id, field) - called for a variable-sized vector
// of boolean values. If this is not defined, then DELEGATE_FIELD_INT_VECTOR
// is used as fallback.
//
// DELEGATE_FIELD_LITERAL(id, field) - called for a Literal.
//
// DELEGATE_FIELD_NAME(id, field) - called for a Name.
Expand Down Expand Up @@ -150,6 +160,19 @@
#endif
#endif

#ifndef DELEGATE_FIELD_ENUM
#define DELEGATE_FIELD_ENUM(id, field, type) DELEGATE_FIELD_INT(id, field)
#endif

#ifndef DELEGATE_FIELD_BOOL
#define DELEGATE_FIELD_BOOL(id, field) DELEGATE_FIELD_INT(id, field)
#endif

#ifndef DELEGATE_FIELD_BOOL_VECTOR
#define DELEGATE_FIELD_BOOL_VECTOR(id, field) \
DELEGATE_FIELD_INT_VECTOR(id, field)
#endif

#ifndef DELEGATE_FIELD_LITERAL
#error please define DELEGATE_FIELD_LITERAL(id, field)
#endif
Expand Down Expand Up @@ -290,15 +313,15 @@ DELEGATE_FIELD_CASE_END(Switch)
DELEGATE_FIELD_CASE_START(Call)
DELEGATE_FIELD_CHILD_VECTOR(Call, operands)
DELEGATE_FIELD_NAME_KIND(Call, target, ModuleItemKind::Function)
DELEGATE_FIELD_INT(Call, isReturn)
DELEGATE_FIELD_BOOL(Call, isReturn)
DELEGATE_FIELD_CASE_END(Call)

DELEGATE_FIELD_CASE_START(CallIndirect)
DELEGATE_FIELD_CHILD(CallIndirect, target)
DELEGATE_FIELD_NAME_KIND(CallIndirect, table, ModuleItemKind::Table)
DELEGATE_FIELD_CHILD_VECTOR(CallIndirect, operands)
DELEGATE_FIELD_HEAPTYPE(CallIndirect, heapType)
DELEGATE_FIELD_INT(CallIndirect, isReturn)
DELEGATE_FIELD_BOOL(CallIndirect, isReturn)
DELEGATE_FIELD_CASE_END(CallIndirect)

DELEGATE_FIELD_CASE_START(LocalGet)
Expand All @@ -322,10 +345,10 @@ DELEGATE_FIELD_CASE_END(GlobalSet)
DELEGATE_FIELD_CASE_START(Load)
DELEGATE_FIELD_CHILD(Load, ptr)
DELEGATE_FIELD_INT(Load, bytes)
DELEGATE_FIELD_INT(Load, signed_)
DELEGATE_FIELD_BOOL(Load, signed_)
DELEGATE_FIELD_ADDRESS(Load, offset)
DELEGATE_FIELD_ADDRESS(Load, align)
DELEGATE_FIELD_INT(Load, isAtomic)
DELEGATE_FIELD_BOOL(Load, isAtomic)
DELEGATE_FIELD_NAME_KIND(Load, memory, ModuleItemKind::Memory)
DELEGATE_FIELD_CASE_END(Load)

Expand All @@ -335,15 +358,15 @@ DELEGATE_FIELD_CHILD(Store, ptr)
DELEGATE_FIELD_INT(Store, bytes)
DELEGATE_FIELD_ADDRESS(Store, offset)
DELEGATE_FIELD_ADDRESS(Store, align)
DELEGATE_FIELD_INT(Store, isAtomic)
DELEGATE_FIELD_BOOL(Store, isAtomic)
DELEGATE_FIELD_TYPE(Store, valueType)
DELEGATE_FIELD_NAME_KIND(Store, memory, ModuleItemKind::Memory)
DELEGATE_FIELD_CASE_END(Store)

DELEGATE_FIELD_CASE_START(AtomicRMW)
DELEGATE_FIELD_CHILD(AtomicRMW, value)
DELEGATE_FIELD_CHILD(AtomicRMW, ptr)
DELEGATE_FIELD_INT(AtomicRMW, op)
DELEGATE_FIELD_ENUM(AtomicRMW, op, AtomicRMWOp)
DELEGATE_FIELD_INT(AtomicRMW, bytes)
DELEGATE_FIELD_ADDRESS(AtomicRMW, offset)
DELEGATE_FIELD_NAME_KIND(AtomicRMW, memory, ModuleItemKind::Memory)
Expand Down Expand Up @@ -380,14 +403,14 @@ DELEGATE_FIELD_CASE_END(AtomicFence)

DELEGATE_FIELD_CASE_START(SIMDExtract)
DELEGATE_FIELD_CHILD(SIMDExtract, vec)
DELEGATE_FIELD_INT(SIMDExtract, op)
DELEGATE_FIELD_ENUM(SIMDExtract, op, SIMDExtractOp)
DELEGATE_FIELD_INT(SIMDExtract, index)
DELEGATE_FIELD_CASE_END(SIMDExtract)

DELEGATE_FIELD_CASE_START(SIMDReplace)
DELEGATE_FIELD_CHILD(SIMDReplace, value)
DELEGATE_FIELD_CHILD(SIMDReplace, vec)
DELEGATE_FIELD_INT(SIMDReplace, op)
DELEGATE_FIELD_ENUM(SIMDReplace, op, SIMDReplaceOp)
DELEGATE_FIELD_INT(SIMDReplace, index)
DELEGATE_FIELD_CASE_END(SIMDReplace)

Expand All @@ -401,18 +424,18 @@ DELEGATE_FIELD_CASE_START(SIMDTernary)
DELEGATE_FIELD_CHILD(SIMDTernary, c)
DELEGATE_FIELD_CHILD(SIMDTernary, b)
DELEGATE_FIELD_CHILD(SIMDTernary, a)
DELEGATE_FIELD_INT(SIMDTernary, op)
DELEGATE_FIELD_ENUM(SIMDTernary, op, SIMDTernaryOp)
DELEGATE_FIELD_CASE_END(SIMDTernary)

DELEGATE_FIELD_CASE_START(SIMDShift)
DELEGATE_FIELD_CHILD(SIMDShift, shift)
DELEGATE_FIELD_CHILD(SIMDShift, vec)
DELEGATE_FIELD_INT(SIMDShift, op)
DELEGATE_FIELD_ENUM(SIMDShift, op, SIMDShiftOp)
DELEGATE_FIELD_CASE_END(SIMDShift)

DELEGATE_FIELD_CASE_START(SIMDLoad)
DELEGATE_FIELD_CHILD(SIMDLoad, ptr)
DELEGATE_FIELD_INT(SIMDLoad, op)
DELEGATE_FIELD_ENUM(SIMDLoad, op, SIMDLoadOp)
DELEGATE_FIELD_ADDRESS(SIMDLoad, offset)
DELEGATE_FIELD_ADDRESS(SIMDLoad, align)
DELEGATE_FIELD_NAME_KIND(SIMDLoad, memory, ModuleItemKind::Memory)
Expand All @@ -421,7 +444,7 @@ DELEGATE_FIELD_CASE_END(SIMDLoad)
DELEGATE_FIELD_CASE_START(SIMDLoadStoreLane)
DELEGATE_FIELD_CHILD(SIMDLoadStoreLane, vec)
DELEGATE_FIELD_CHILD(SIMDLoadStoreLane, ptr)
DELEGATE_FIELD_INT(SIMDLoadStoreLane, op)
DELEGATE_FIELD_ENUM(SIMDLoadStoreLane, op, SIMDLoadStoreLaneOp)
DELEGATE_FIELD_ADDRESS(SIMDLoadStoreLane, offset)
DELEGATE_FIELD_ADDRESS(SIMDLoadStoreLane, align)
DELEGATE_FIELD_INT(SIMDLoadStoreLane, index)
Expand Down Expand Up @@ -461,13 +484,13 @@ DELEGATE_FIELD_CASE_END(Const)

DELEGATE_FIELD_CASE_START(Unary)
DELEGATE_FIELD_CHILD(Unary, value)
DELEGATE_FIELD_INT(Unary, op)
DELEGATE_FIELD_ENUM(Unary, op, UnaryOp)
DELEGATE_FIELD_CASE_END(Unary)

DELEGATE_FIELD_CASE_START(Binary)
DELEGATE_FIELD_CHILD(Binary, right)
DELEGATE_FIELD_CHILD(Binary, left)
DELEGATE_FIELD_INT(Binary, op)
DELEGATE_FIELD_ENUM(Binary, op, BinaryOp)
DELEGATE_FIELD_CASE_END(Binary)

DELEGATE_FIELD_CASE_START(Select)
Expand Down Expand Up @@ -563,7 +586,7 @@ DELEGATE_FIELD_CASE_END(Try)

DELEGATE_FIELD_CASE_START(TryTable)
DELEGATE_FIELD_TYPE_VECTOR(TryTable, sentTypes)
DELEGATE_FIELD_INT_VECTOR(TryTable, catchRefs)
DELEGATE_FIELD_BOOL_VECTOR(TryTable, catchRefs)
DELEGATE_FIELD_SCOPE_NAME_USE_VECTOR(TryTable, catchDests)
DELEGATE_FIELD_NAME_KIND_VECTOR(TryTable, catchTags, ModuleItemKind::Tag)
DELEGATE_FIELD_CHILD(TryTable, body)
Expand Down Expand Up @@ -592,7 +615,7 @@ DELEGATE_FIELD_CASE_START(Pop)
DELEGATE_FIELD_CASE_END(Pop)

DELEGATE_FIELD_CASE_START(TupleMake)
DELEGATE_FIELD_CHILD_VECTOR(Tuple, operands)
DELEGATE_FIELD_CHILD_VECTOR(TupleMake, operands)
DELEGATE_FIELD_CASE_END(TupleMake)

DELEGATE_FIELD_CASE_START(TupleExtract)
Expand All @@ -606,13 +629,13 @@ DELEGATE_FIELD_CASE_END(RefI31)

DELEGATE_FIELD_CASE_START(I31Get)
DELEGATE_FIELD_CHILD(I31Get, i31)
DELEGATE_FIELD_INT(I31Get, signed_)
DELEGATE_FIELD_BOOL(I31Get, signed_)
DELEGATE_FIELD_CASE_END(I31Get)

DELEGATE_FIELD_CASE_START(CallRef)
DELEGATE_FIELD_CHILD(CallRef, target)
DELEGATE_FIELD_CHILD_VECTOR(CallRef, operands)
DELEGATE_FIELD_INT(CallRef, isReturn)
DELEGATE_FIELD_BOOL(CallRef, isReturn)
DELEGATE_FIELD_CASE_END(CallRef)

DELEGATE_FIELD_CASE_START(RefTest)
Expand All @@ -625,7 +648,7 @@ DELEGATE_FIELD_CHILD(RefCast, ref)
DELEGATE_FIELD_CASE_END(RefCast)

DELEGATE_FIELD_CASE_START(BrOn)
DELEGATE_FIELD_INT(BrOn, op)
DELEGATE_FIELD_ENUM(BrOn, op, BrOnOp)
DELEGATE_FIELD_SCOPE_NAME_USE(BrOn, name)
DELEGATE_FIELD_TYPE(BrOn, castType)
DELEGATE_FIELD_CHILD(BrOn, ref)
Expand All @@ -638,31 +661,31 @@ DELEGATE_FIELD_CASE_END(StructNew)
DELEGATE_FIELD_CASE_START(StructGet)
DELEGATE_FIELD_INT(StructGet, index)
DELEGATE_FIELD_CHILD(StructGet, ref)
DELEGATE_FIELD_INT(StructGet, signed_)
DELEGATE_FIELD_INT(StructGet, order)
DELEGATE_FIELD_BOOL(StructGet, signed_)
DELEGATE_FIELD_ENUM(StructGet, order, MemoryOrder)
DELEGATE_FIELD_CASE_END(StructGet)

DELEGATE_FIELD_CASE_START(StructSet)
DELEGATE_FIELD_INT(StructSet, index)
DELEGATE_FIELD_CHILD(StructSet, value)
DELEGATE_FIELD_CHILD(StructSet, ref)
DELEGATE_FIELD_INT(StructSet, order)
DELEGATE_FIELD_ENUM(StructSet, order, MemoryOrder)
DELEGATE_FIELD_CASE_END(StructSet)

DELEGATE_FIELD_CASE_START(StructRMW)
DELEGATE_FIELD_INT(StructRMW, op)
DELEGATE_FIELD_ENUM(StructRMW, op, StructRMWOp)
DELEGATE_FIELD_INT(StructRMW, index)
DELEGATE_FIELD_CHILD(StructRMW, value)
DELEGATE_FIELD_CHILD(StructRMW, ref)
DELEGATE_FIELD_INT(StructRMW, order)
DELEGATE_FIELD_ENUM(StructRMW, order, MemoryOrder)
DELEGATE_FIELD_CASE_END(StructRMW)

DELEGATE_FIELD_CASE_START(StructCmpxchg)
DELEGATE_FIELD_INT(StructCmpxchg, index)
DELEGATE_FIELD_CHILD(StructCmpxchg, replacement)
DELEGATE_FIELD_CHILD(StructCmpxchg, expected)
DELEGATE_FIELD_CHILD(StructCmpxchg, ref)
DELEGATE_FIELD_INT(StructCmpxchg, order)
DELEGATE_FIELD_ENUM(StructCmpxchg, order, MemoryOrder)
DELEGATE_FIELD_CASE_END(StructCmpxchg)

DELEGATE_FIELD_CASE_START(ArrayNew)
Expand All @@ -689,7 +712,7 @@ DELEGATE_FIELD_CASE_END(ArrayNewFixed)
DELEGATE_FIELD_CASE_START(ArrayGet)
DELEGATE_FIELD_CHILD(ArrayGet, index)
DELEGATE_FIELD_CHILD(ArrayGet, ref)
DELEGATE_FIELD_INT(ArrayGet, signed_)
DELEGATE_FIELD_BOOL(ArrayGet, signed_)
DELEGATE_FIELD_CASE_END(ArrayGet)

DELEGATE_FIELD_CASE_START(ArraySet)
Expand Down Expand Up @@ -734,12 +757,12 @@ DELEGATE_FIELD_CHILD(ArrayInitElem, ref)
DELEGATE_FIELD_CASE_END(ArrayInitElem)

DELEGATE_FIELD_CASE_START(RefAs)
DELEGATE_FIELD_INT(RefAs, op)
DELEGATE_FIELD_ENUM(RefAs, op, RefAsOp)
DELEGATE_FIELD_CHILD(RefAs, value)
DELEGATE_FIELD_CASE_END(RefAs)

DELEGATE_FIELD_CASE_START(StringNew)
DELEGATE_FIELD_INT(StringNew, op)
DELEGATE_FIELD_ENUM(StringNew, op, StringNewOp)
DELEGATE_FIELD_OPTIONAL_CHILD(StringNew, end)
DELEGATE_FIELD_OPTIONAL_CHILD(StringNew, start)
DELEGATE_FIELD_CHILD(StringNew, ref)
Expand All @@ -750,12 +773,12 @@ DELEGATE_FIELD_NAME(StringConst, string)
DELEGATE_FIELD_CASE_END(StringConst)

DELEGATE_FIELD_CASE_START(StringMeasure)
DELEGATE_FIELD_INT(StringMeasure, op)
DELEGATE_FIELD_ENUM(StringMeasure, op, StringMeasureOp)
DELEGATE_FIELD_CHILD(StringMeasure, ref)
DELEGATE_FIELD_CASE_END(StringMeasure)

DELEGATE_FIELD_CASE_START(StringEncode)
DELEGATE_FIELD_INT(StringEncode, op)
DELEGATE_FIELD_ENUM(StringEncode, op, StringEncodeOp)
DELEGATE_FIELD_OPTIONAL_CHILD(StringEncode, start)
DELEGATE_FIELD_CHILD(StringEncode, array)
DELEGATE_FIELD_CHILD(StringEncode, str)
Expand All @@ -767,7 +790,7 @@ DELEGATE_FIELD_CHILD(StringConcat, left)
DELEGATE_FIELD_CASE_END(StringConcat)

DELEGATE_FIELD_CASE_START(StringEq)
DELEGATE_FIELD_INT(StringEq, op)
DELEGATE_FIELD_ENUM(StringEq, op, StringEqOp)
DELEGATE_FIELD_CHILD(StringEq, right)
DELEGATE_FIELD_CHILD(StringEq, left)
DELEGATE_FIELD_CASE_END(StringEq)
Expand Down Expand Up @@ -820,7 +843,6 @@ DELEGATE_FIELD_CHILD_VECTOR(StackSwitch, operands)
DELEGATE_FIELD_NAME_KIND(StackSwitch, tag, ModuleItemKind::Tag)
DELEGATE_FIELD_CASE_END(StackSwitch)


DELEGATE_FIELD_MAIN_END

#undef DELEGATE_ID
Expand All @@ -832,6 +854,9 @@ DELEGATE_FIELD_MAIN_END
#undef DELEGATE_FIELD_INT
#undef DELEGATE_FIELD_INT_ARRAY
#undef DELEGATE_FIELD_INT_VECTOR
#undef DELEGATE_FIELD_ENUM
#undef DELEGATE_FIELD_BOOL
#undef DELEGATE_FIELD_BOOL_VECTOR
#undef DELEGATE_FIELD_LITERAL
#undef DELEGATE_FIELD_NAME
#undef DELEGATE_FIELD_NAME_VECTOR
Expand Down
Loading