@@ -198,6 +198,8 @@ function inheritMetadata(wrapper, rawFn, nargs) {
198198// arguments out of it into invocation-local storage before `ffi_call` and
199199// reads the return value back only after, so nested/reentrant calls into
200200// the same function are safe.
201+ // Concise methods do not have [[Construct]], unlike function expressions, so
202+ // use them below to match the native FFI functions' non-constructible behavior.
201203function wrapWithSharedBuffer ( rawFn , signature ) {
202204if ( rawFn == null ) return rawFn ;
203205const buffer = rawFn [ kSbSharedBuffer ] ;
@@ -254,7 +256,7 @@ function wrapWithSharedBuffer(rawFn, signature) {
254256// so arity specialization wouldn't buy much here.
255257assert ( slowInvoke !== undefined ,
256258'FFI: shared-buffer raw function with pointer arguments is missing kSbInvokeSlow' ) ;
257- wrapper = function ( ...args ) {
259+ wrapper = { invoke ( ...args ) {
258260if ( args . length !== nargs ) {
259261throwFFIArgCountError ( nargs , args . length ) ;
260262}
@@ -271,7 +273,7 @@ function wrapWithSharedBuffer(rawFn, signature) {
271273}
272274rawFn ( ) ;
273275return retGetter === null ? undefined : retGetter ( view , 0 , true ) ;
274- } ;
276+ } } . invoke ;
275277} else {
276278// Arity specialization avoids the per-call `Array` allocation of
277279// `...args`; the void/non-void split removes a per-call branch on
@@ -295,67 +297,67 @@ function buildNumericWrapper(
295297/* c8 ignore start */
296298if ( nargs === 0 ) {
297299if ( retGetter === null ) {
298- return function ( ) {
300+ return { invoke ( ) {
299301if ( arguments . length !== 0 ) {
300302throwFFIArgCountError ( 0 , arguments . length ) ;
301303}
302304rawFn ( ) ;
303- } ;
305+ } } . invoke ;
304306}
305- return function ( ) {
307+ return { invoke ( ) {
306308if ( arguments . length !== 0 ) {
307309throwFFIArgCountError ( 0 , arguments . length ) ;
308310}
309311rawFn ( ) ;
310312return retGetter ( view , 0 , true ) ;
311- } ;
313+ } } . invoke ;
312314}
313315/* c8 ignore stop */
314316if ( nargs === 1 ) {
315317const i0 = argInfos [ 0 ] ;
316318const o0 = argOffsets [ 0 ] ;
317319if ( retGetter === null ) {
318- return function ( a0 ) {
320+ return { invoke ( a0 ) {
319321if ( arguments . length !== 1 ) {
320322throwFFIArgCountError ( 1 , arguments . length ) ;
321323}
322324writeNumericArg ( view , i0 , o0 , a0 , 0 ) ;
323325rawFn ( ) ;
324- } ;
326+ } } . invoke ;
325327}
326- return function ( a0 ) {
328+ return { invoke ( a0 ) {
327329if ( arguments . length !== 1 ) {
328330throwFFIArgCountError ( 1 , arguments . length ) ;
329331}
330332writeNumericArg ( view , i0 , o0 , a0 , 0 ) ;
331333rawFn ( ) ;
332334return retGetter ( view , 0 , true ) ;
333- } ;
335+ } } . invoke ;
334336}
335337if ( nargs === 2 ) {
336338const i0 = argInfos [ 0 ] ;
337339const i1 = argInfos [ 1 ] ;
338340const o0 = argOffsets [ 0 ] ;
339341const o1 = argOffsets [ 1 ] ;
340342if ( retGetter === null ) {
341- return function ( a0 , a1 ) {
343+ return { invoke ( a0 , a1 ) {
342344if ( arguments . length !== 2 ) {
343345throwFFIArgCountError ( 2 , arguments . length ) ;
344346}
345347writeNumericArg ( view , i0 , o0 , a0 , 0 ) ;
346348writeNumericArg ( view , i1 , o1 , a1 , 1 ) ;
347349rawFn ( ) ;
348- } ;
350+ } } . invoke ;
349351}
350- return function ( a0 , a1 ) {
352+ return { invoke ( a0 , a1 ) {
351353if ( arguments . length !== 2 ) {
352354throwFFIArgCountError ( 2 , arguments . length ) ;
353355}
354356writeNumericArg ( view , i0 , o0 , a0 , 0 ) ;
355357writeNumericArg ( view , i1 , o1 , a1 , 1 ) ;
356358rawFn ( ) ;
357359return retGetter ( view , 0 , true ) ;
358- } ;
360+ } } . invoke ;
359361}
360362if ( nargs === 3 ) {
361363const i0 = argInfos [ 0 ] ;
@@ -365,17 +367,17 @@ function buildNumericWrapper(
365367const o1 = argOffsets [ 1 ] ;
366368const o2 = argOffsets [ 2 ] ;
367369if ( retGetter === null ) {
368- return function ( a0 , a1 , a2 ) {
370+ return { invoke ( a0 , a1 , a2 ) {
369371if ( arguments . length !== 3 ) {
370372throwFFIArgCountError ( 3 , arguments . length ) ;
371373}
372374writeNumericArg ( view , i0 , o0 , a0 , 0 ) ;
373375writeNumericArg ( view , i1 , o1 , a1 , 1 ) ;
374376writeNumericArg ( view , i2 , o2 , a2 , 2 ) ;
375377rawFn ( ) ;
376- } ;
378+ } } . invoke ;
377379}
378- return function ( a0 , a1 , a2 ) {
380+ return { invoke ( a0 , a1 , a2 ) {
379381if ( arguments . length !== 3 ) {
380382throwFFIArgCountError ( 3 , arguments . length ) ;
381383}
@@ -384,7 +386,7 @@ function buildNumericWrapper(
384386writeNumericArg ( view , i2 , o2 , a2 , 2 ) ;
385387rawFn ( ) ;
386388return retGetter ( view , 0 , true ) ;
387- } ;
389+ } } . invoke ;
388390}
389391if ( nargs === 4 ) {
390392const i0 = argInfos [ 0 ] ;
@@ -396,7 +398,7 @@ function buildNumericWrapper(
396398const o2 = argOffsets [ 2 ] ;
397399const o3 = argOffsets [ 3 ] ;
398400if ( retGetter === null ) {
399- return function ( a0 , a1 , a2 , a3 ) {
401+ return { invoke ( a0 , a1 , a2 , a3 ) {
400402if ( arguments . length !== 4 ) {
401403throwFFIArgCountError ( 4 , arguments . length ) ;
402404}
@@ -405,9 +407,9 @@ function buildNumericWrapper(
405407writeNumericArg ( view , i2 , o2 , a2 , 2 ) ;
406408writeNumericArg ( view , i3 , o3 , a3 , 3 ) ;
407409rawFn ( ) ;
408- } ;
410+ } } . invoke ;
409411}
410- return function ( a0 , a1 , a2 , a3 ) {
412+ return { invoke ( a0 , a1 , a2 , a3 ) {
411413if ( arguments . length !== 4 ) {
412414throwFFIArgCountError ( 4 , arguments . length ) ;
413415}
@@ -417,7 +419,7 @@ function buildNumericWrapper(
417419writeNumericArg ( view , i3 , o3 , a3 , 3 ) ;
418420rawFn ( ) ;
419421return retGetter ( view , 0 , true ) ;
420- } ;
422+ } } . invoke ;
421423}
422424if ( nargs === 5 ) {
423425const i0 = argInfos [ 0 ] ;
@@ -431,7 +433,7 @@ function buildNumericWrapper(
431433const o3 = argOffsets [ 3 ] ;
432434const o4 = argOffsets [ 4 ] ;
433435if ( retGetter === null ) {
434- return function ( a0 , a1 , a2 , a3 , a4 ) {
436+ return { invoke ( a0 , a1 , a2 , a3 , a4 ) {
435437if ( arguments . length !== 5 ) {
436438throwFFIArgCountError ( 5 , arguments . length ) ;
437439}
@@ -441,9 +443,9 @@ function buildNumericWrapper(
441443writeNumericArg ( view , i3 , o3 , a3 , 3 ) ;
442444writeNumericArg ( view , i4 , o4 , a4 , 4 ) ;
443445rawFn ( ) ;
444- } ;
446+ } } . invoke ;
445447}
446- return function ( a0 , a1 , a2 , a3 , a4 ) {
448+ return { invoke ( a0 , a1 , a2 , a3 , a4 ) {
447449if ( arguments . length !== 5 ) {
448450throwFFIArgCountError ( 5 , arguments . length ) ;
449451}
@@ -454,7 +456,7 @@ function buildNumericWrapper(
454456writeNumericArg ( view , i4 , o4 , a4 , 4 ) ;
455457rawFn ( ) ;
456458return retGetter ( view , 0 , true ) ;
457- } ;
459+ } } . invoke ;
458460}
459461if ( nargs === 6 ) {
460462const i0 = argInfos [ 0 ] ;
@@ -470,7 +472,7 @@ function buildNumericWrapper(
470472const o4 = argOffsets [ 4 ] ;
471473const o5 = argOffsets [ 5 ] ;
472474if ( retGetter === null ) {
473- return function ( a0 , a1 , a2 , a3 , a4 , a5 ) {
475+ return { invoke ( a0 , a1 , a2 , a3 , a4 , a5 ) {
474476if ( arguments . length !== 6 ) {
475477throwFFIArgCountError ( 6 , arguments . length ) ;
476478}
@@ -481,9 +483,9 @@ function buildNumericWrapper(
481483writeNumericArg ( view , i4 , o4 , a4 , 4 ) ;
482484writeNumericArg ( view , i5 , o5 , a5 , 5 ) ;
483485rawFn ( ) ;
484- } ;
486+ } } . invoke ;
485487}
486- return function ( a0 , a1 , a2 , a3 , a4 , a5 ) {
488+ return { invoke ( a0 , a1 , a2 , a3 , a4 , a5 ) {
487489if ( arguments . length !== 6 ) {
488490throwFFIArgCountError ( 6 , arguments . length ) ;
489491}
@@ -495,22 +497,22 @@ function buildNumericWrapper(
495497writeNumericArg ( view , i5 , o5 , a5 , 5 ) ;
496498rawFn ( ) ;
497499return retGetter ( view , 0 , true ) ;
498- } ;
500+ } } . invoke ;
499501}
500502// 7+ args: further specialization is diminishing returns and bloats
501503// this builder.
502504if ( retGetter === null ) {
503- return function ( ...args ) {
505+ return { invoke ( ...args ) {
504506if ( args . length !== nargs ) {
505507throwFFIArgCountError ( nargs , args . length ) ;
506508}
507509for ( let i = 0 ; i < nargs ; i ++ ) {
508510writeNumericArg ( view , argInfos [ i ] , argOffsets [ i ] , args [ i ] , i ) ;
509511}
510512rawFn ( ) ;
511- } ;
513+ } } . invoke ;
512514}
513- return function ( ...args ) {
515+ return { invoke ( ...args ) {
514516if ( args . length !== nargs ) {
515517throwFFIArgCountError ( nargs , args . length ) ;
516518}
@@ -519,7 +521,7 @@ function buildNumericWrapper(
519521}
520522rawFn ( ) ;
521523return retGetter ( view , 0 , true ) ;
522- } ;
524+ } } . invoke ;
523525}
524526
525527module . exports = {
0 commit comments