Skip to content

Commit 13d01f5

Browse files
authored
[embind] Use Object.assign to setup prototypes. NFC (#20241)
1 parent 645770f commit 13d01f5

File tree

1 file changed

+130
-138
lines changed

1 file changed

+130
-138
lines changed

src/embind/embind.js

Lines changed: 130 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
/*global simpleReadValueFromPointer, floatReadValueFromPointer, integerReadValueFromPointer, enumReadValueFromPointer, replacePublicSymbol, craftInvokerFunction, tupleRegistrations*/
1919
/*global finalizationRegistry, attachFinalizer, detachFinalizer, releaseClassHandle, runDestructor*/
2020
/*global ClassHandle, makeClassHandle, structRegistrations, whenDependentTypesAreResolved, BindingError, deletionQueue, delayFunction:true, upcastPointer*/
21-
/*global exposePublicSymbol, heap32VectorToArray, newFunc, RegisteredPointer_getPointee, RegisteredPointer_destructor, RegisteredPointer_deleteObject, char_0, char_9*/
21+
/*global exposePublicSymbol, heap32VectorToArray, newFunc, char_0, char_9*/
2222
/*global getInheritedInstanceCount, getLiveInheritedInstances, setDelayFunction, InternalError, runDestructors*/
2323
/*global requireRegisteredType, unregisterInheritedInstance, registerInheritedInstance, PureVirtualError, throwUnboundTypeError*/
24-
/*global assert, validateThis, downcastPointer, registeredPointers, RegisteredClass, getInheritedInstance, ClassHandle_isAliasOf, ClassHandle_clone, ClassHandle_isDeleted, ClassHandle_deleteLater*/
24+
/*global assert, validateThis, downcastPointer, registeredPointers, RegisteredClass, getInheritedInstance */
2525
/*global throwInstanceAlreadyDeleted, shallowCopyInternalPointer*/
2626
/*global RegisteredPointer_fromWireType, constNoSmartPtrRawPointerToWireType, nonConstNoSmartPtrRawPointerToWireType, genericPointerToWireType*/
2727

@@ -494,7 +494,9 @@ var LibraryEmbind = {
494494

495495
registerType(rawType, {
496496
name,
497-
'fromWireType': (value) => {
497+
// For some method names we use string keys here since they are part of
498+
// the public/external API and/or used by the runtime-generated code.
499+
'fromWireType'(value) {
498500
var length = {{{ makeGetValue('value', '0', SIZE_TYPE) }}};
499501
var payload = value + {{{ POINTER_SIZE }}};
500502

@@ -528,7 +530,7 @@ var LibraryEmbind = {
528530

529531
return str;
530532
},
531-
'toWireType': (destructors, value) => {
533+
'toWireType'(destructors, value) {
532534
if (value instanceof ArrayBuffer) {
533535
value = new Uint8Array(value);
534536
}
@@ -575,7 +577,9 @@ var LibraryEmbind = {
575577
},
576578
'argPackAdvance': GenericWireTypeSize,
577579
'readValueFromPointer': readPointer,
578-
destructorFunction: (ptr) => _free(ptr),
580+
destructorFunction(ptr) {
581+
_free(ptr);
582+
},
579583
});
580584
},
581585

@@ -648,7 +652,9 @@ var LibraryEmbind = {
648652
},
649653
'argPackAdvance': GenericWireTypeSize,
650654
'readValueFromPointer': simpleReadValueFromPointer,
651-
destructorFunction: (ptr) => _free(ptr),
655+
destructorFunction(ptr) {
656+
_free(ptr);
657+
}
652658
});
653659
},
654660

@@ -1348,16 +1354,33 @@ var LibraryEmbind = {
13481354
},
13491355

13501356
$init_RegisteredPointer__deps: [
1357+
'$RegisteredPointer',
13511358
'$readPointer',
1352-
'$RegisteredPointer_getPointee', '$RegisteredPointer_destructor',
1353-
'$RegisteredPointer_deleteObject', '$RegisteredPointer_fromWireType'],
1359+
'$RegisteredPointer_fromWireType',
1360+
'$GenericWireTypeSize',
1361+
],
13541362
$init_RegisteredPointer: () => {
1355-
RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
1356-
RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
1357-
RegisteredPointer.prototype['argPackAdvance'] = GenericWireTypeSize;
1358-
RegisteredPointer.prototype['readValueFromPointer'] = readPointer;
1359-
RegisteredPointer.prototype['deleteObject'] = RegisteredPointer_deleteObject;
1360-
RegisteredPointer.prototype['fromWireType'] = RegisteredPointer_fromWireType;
1363+
Object.assign(RegisteredPointer.prototype, {
1364+
getPointee(ptr) {
1365+
if (this.rawGetPointee) {
1366+
ptr = this.rawGetPointee(ptr);
1367+
}
1368+
return ptr;
1369+
},
1370+
destructor(ptr) {
1371+
if (this.rawDestructor) {
1372+
this.rawDestructor(ptr);
1373+
}
1374+
},
1375+
'argPackAdvance': GenericWireTypeSize,
1376+
'readValueFromPointer': readPointer,
1377+
'deleteObject'(handle) {
1378+
if (handle !== null) {
1379+
handle['delete']();
1380+
}
1381+
},
1382+
'fromWireType': RegisteredPointer_fromWireType,
1383+
});
13611384
},
13621385

13631386
$RegisteredPointer__docs: `/** @constructor
@@ -1418,27 +1441,6 @@ var LibraryEmbind = {
14181441
}
14191442
},
14201443

1421-
$RegisteredPointer_getPointee__docs: '/** @suppress {globalThis} */',
1422-
$RegisteredPointer_getPointee: function(ptr) {
1423-
if (this.rawGetPointee) {
1424-
ptr = this.rawGetPointee(ptr);
1425-
}
1426-
return ptr;
1427-
},
1428-
1429-
$RegisteredPointer_destructor__docs: '/** @suppress {globalThis} */',
1430-
$RegisteredPointer_destructor: function(ptr) {
1431-
if (this.rawDestructor) {
1432-
this.rawDestructor(ptr);
1433-
}
1434-
},
1435-
1436-
$RegisteredPointer_deleteObject: (handle) => {
1437-
if (handle !== null) {
1438-
handle['delete']();
1439-
}
1440-
},
1441-
14421444
$RegisteredPointer_fromWireType__docs: '/** @suppress {globalThis} */',
14431445
$RegisteredPointer_fromWireType__deps: [
14441446
'$downcastPointer', '$registeredPointers',
@@ -1615,128 +1617,120 @@ var LibraryEmbind = {
16151617
},
16161618

16171619
$init_ClassHandle__deps: [
1618-
'$ClassHandle_isAliasOf', '$ClassHandle_clone', '$ClassHandle_delete',
1619-
'$ClassHandle_isDeleted', '$ClassHandle_deleteLater'],
1620+
'$ClassHandle',
1621+
'$shallowCopyInternalPointer',
1622+
'$throwInstanceAlreadyDeleted',
1623+
'$attachFinalizer',
1624+
'$releaseClassHandle',
1625+
'$throwBindingError',
1626+
'$detachFinalizer',
1627+
],
16201628
$init_ClassHandle: () => {
1621-
ClassHandle.prototype['isAliasOf'] = ClassHandle_isAliasOf;
1622-
ClassHandle.prototype['clone'] = ClassHandle_clone;
1623-
ClassHandle.prototype['delete'] = ClassHandle_delete;
1624-
ClassHandle.prototype['isDeleted'] = ClassHandle_isDeleted;
1625-
ClassHandle.prototype['deleteLater'] = ClassHandle_deleteLater;
1626-
},
1627-
1628-
$ClassHandle__docs: '/** @constructor */',
1629-
$ClassHandle__deps: ['$init_ClassHandle'],
1630-
$ClassHandle__postset: 'init_ClassHandle()',
1631-
// root of all pointer and smart pointer handles in embind
1632-
$ClassHandle: function() {
1633-
},
1629+
Object.assign(ClassHandle.prototype, {
1630+
"isAliasOf"(other) {
1631+
if (!(this instanceof ClassHandle)) {
1632+
return false;
1633+
}
1634+
if (!(other instanceof ClassHandle)) {
1635+
return false;
1636+
}
16341637

1635-
$ClassHandle_isAliasOf__docs: '/** @suppress {globalThis,checkTypes} */',
1636-
$ClassHandle_isAliasOf: function(other) {
1637-
if (!(this instanceof ClassHandle)) {
1638-
return false;
1639-
}
1640-
if (!(other instanceof ClassHandle)) {
1641-
return false;
1642-
}
1638+
var leftClass = this.$$.ptrType.registeredClass;
1639+
var left = this.$$.ptr;
1640+
other.$$ = /** @type {Object} */ (other.$$);
1641+
var rightClass = other.$$.ptrType.registeredClass;
1642+
var right = other.$$.ptr;
16431643

1644-
var leftClass = this.$$.ptrType.registeredClass;
1645-
var left = this.$$.ptr;
1646-
other.$$ = /** @type {Object} */ (other.$$);
1647-
var rightClass = other.$$.ptrType.registeredClass;
1648-
var right = other.$$.ptr;
1644+
while (leftClass.baseClass) {
1645+
left = leftClass.upcast(left);
1646+
leftClass = leftClass.baseClass;
1647+
}
16491648

1650-
while (leftClass.baseClass) {
1651-
left = leftClass.upcast(left);
1652-
leftClass = leftClass.baseClass;
1653-
}
1649+
while (rightClass.baseClass) {
1650+
right = rightClass.upcast(right);
1651+
rightClass = rightClass.baseClass;
1652+
}
16541653

1655-
while (rightClass.baseClass) {
1656-
right = rightClass.upcast(right);
1657-
rightClass = rightClass.baseClass;
1658-
}
1654+
return leftClass === rightClass && left === right;
1655+
},
16591656

1660-
return leftClass === rightClass && left === right;
1661-
},
1657+
"clone"() {
1658+
if (!this.$$.ptr) {
1659+
throwInstanceAlreadyDeleted(this);
1660+
}
16621661

1663-
$throwInstanceAlreadyDeleted__deps: ['$throwBindingError'],
1664-
$throwInstanceAlreadyDeleted: (obj) => {
1665-
function getInstanceTypeName(handle) {
1666-
return handle.$$.ptrType.registeredClass.name;
1667-
}
1668-
throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
1669-
},
1662+
if (this.$$.preservePointerOnDelete) {
1663+
this.$$.count.value += 1;
1664+
return this;
1665+
} else {
1666+
var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), {
1667+
$$: {
1668+
value: shallowCopyInternalPointer(this.$$),
1669+
}
1670+
}));
16701671

1671-
$ClassHandle_clone__docs: '/** @suppress {globalThis} */',
1672-
$ClassHandle_clone__deps: ['$shallowCopyInternalPointer', '$throwInstanceAlreadyDeleted', '$attachFinalizer'],
1673-
$ClassHandle_clone: function() {
1674-
if (!this.$$.ptr) {
1675-
throwInstanceAlreadyDeleted(this);
1676-
}
1672+
clone.$$.count.value += 1;
1673+
clone.$$.deleteScheduled = false;
1674+
return clone;
1675+
}
1676+
},
16771677

1678-
if (this.$$.preservePointerOnDelete) {
1679-
this.$$.count.value += 1;
1680-
return this;
1681-
} else {
1682-
var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), {
1683-
$$: {
1684-
value: shallowCopyInternalPointer(this.$$),
1678+
"delete"() {
1679+
if (!this.$$.ptr) {
1680+
throwInstanceAlreadyDeleted(this);
16851681
}
1686-
}));
16871682

1688-
clone.$$.count.value += 1;
1689-
clone.$$.deleteScheduled = false;
1690-
return clone;
1691-
}
1692-
},
1683+
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
1684+
throwBindingError('Object already scheduled for deletion');
1685+
}
16931686

1694-
$ClassHandle_delete__docs: '/** @suppress {globalThis} */',
1695-
$ClassHandle_delete__deps: ['$releaseClassHandle', '$throwBindingError',
1696-
'$detachFinalizer', '$throwInstanceAlreadyDeleted'],
1697-
$ClassHandle_delete: function() {
1698-
if (!this.$$.ptr) {
1699-
throwInstanceAlreadyDeleted(this);
1700-
}
1687+
detachFinalizer(this);
1688+
releaseClassHandle(this.$$);
17011689

1702-
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
1703-
throwBindingError('Object already scheduled for deletion');
1704-
}
1690+
if (!this.$$.preservePointerOnDelete) {
1691+
this.$$.smartPtr = undefined;
1692+
this.$$.ptr = undefined;
1693+
}
1694+
},
17051695

1706-
detachFinalizer(this);
1707-
releaseClassHandle(this.$$);
1696+
"isDeleted"() {
1697+
return !this.$$.ptr;
1698+
},
17081699

1709-
if (!this.$$.preservePointerOnDelete) {
1710-
this.$$.smartPtr = undefined;
1711-
this.$$.ptr = undefined;
1712-
}
1700+
"deleteLater"() {
1701+
if (!this.$$.ptr) {
1702+
throwInstanceAlreadyDeleted(this);
1703+
}
1704+
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
1705+
throwBindingError('Object already scheduled for deletion');
1706+
}
1707+
deletionQueue.push(this);
1708+
if (deletionQueue.length === 1 && delayFunction) {
1709+
delayFunction(flushPendingDeletes);
1710+
}
1711+
this.$$.deleteScheduled = true;
1712+
return this;
1713+
},
1714+
});
17131715
},
17141716

1715-
$deletionQueue: [],
1716-
1717-
$ClassHandle_isDeleted__docs: '/** @suppress {globalThis} */',
1718-
$ClassHandle_isDeleted: function() {
1719-
return !this.$$.ptr;
1717+
$ClassHandle__docs: '/** @constructor */',
1718+
$ClassHandle__deps: ['$init_ClassHandle'],
1719+
$ClassHandle__postset: 'init_ClassHandle()',
1720+
// root of all pointer and smart pointer handles in embind
1721+
$ClassHandle: function() {
17201722
},
17211723

1722-
$ClassHandle_deleteLater__docs: '/** @suppress {globalThis} */',
1723-
$ClassHandle_deleteLater__deps: [
1724-
'$delayFunction', '$deletionQueue', '$flushPendingDeletes'],
1725-
$ClassHandle_deleteLater: function() {
1726-
if (!this.$$.ptr) {
1727-
throwInstanceAlreadyDeleted(this);
1728-
}
1729-
if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
1730-
throwBindingError('Object already scheduled for deletion');
1731-
}
1732-
deletionQueue.push(this);
1733-
if (deletionQueue.length === 1 && delayFunction) {
1734-
delayFunction(flushPendingDeletes);
1724+
$throwInstanceAlreadyDeleted__deps: ['$throwBindingError'],
1725+
$throwInstanceAlreadyDeleted: (obj) => {
1726+
function getInstanceTypeName(handle) {
1727+
return handle.$$.ptrType.registeredClass.name;
17351728
}
1736-
this.$$.deleteScheduled = true;
1737-
return this;
1729+
throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
17381730
},
17391731

1732+
$deletionQueue: [],
1733+
17401734
$flushPendingDeletes__deps: ['$deletionQueue'],
17411735
$flushPendingDeletes: () => {
17421736
while (deletionQueue.length) {
@@ -2322,9 +2316,7 @@ var LibraryEmbind = {
23222316
};
23232317

23242318
ctor.prototype = Object.create(wrapperPrototype);
2325-
for (var p in properties) {
2326-
ctor.prototype[p] = properties[p];
2327-
}
2319+
Object.assign(ctor.prototype, properties);
23282320
return Emval.toHandle(ctor);
23292321
},
23302322

0 commit comments

Comments
 (0)