@@ -14,24 +14,33 @@ export function emnapiCreateFunction<F extends (...args: any[]) => any> (envObje
1414 const functionName = ( ! utf8name || ! length ) ? '' : ( emnapiString . UTF8ToString ( utf8name , length ) )
1515
1616 let f : F
17+ const napiCallback = makeDynCall ( 'ppp' , 'cb' )
18+ const callback = ( envObject : Env ) => {
19+ return napiCallback ( envObject . id , envObject . ctx . scopeStore . currentScope . id )
20+ }
1721
18- const makeFunction = ( ) => function ( this : any ) : any {
22+ const makeFunction = ( envObject : Env , callback : ( env : Env ) => any ) => function ( this : any ) : any {
1923 'use strict'
20- const cbinfo = emnapiCtx . cbinfoStack . push ( this , data , arguments , f )
21- const scope = emnapiCtx . openScope ( envObject )
24+ const scope = envObject . ctx . openScope ( envObject )
25+ const callbackInfo = scope . callbackInfo
26+ callbackInfo . data = data
27+ callbackInfo . args = arguments
28+ callbackInfo . thiz = this
29+ callbackInfo . fn = f
2230 try {
23- return envObject . callIntoModule ( ( envObject ) => {
24- const napiValue = makeDynCall ( 'ppp' , 'cb' ) ( envObject . id , cbinfo )
25- return ( ! napiValue ) ? undefined : emnapiCtx . handleStore . get ( napiValue ) ! . value
26- } )
31+ const napiValue = envObject . callIntoModule ( callback )
32+ return ( ! napiValue ) ? undefined : envObject . ctx . handleStore . get ( napiValue ) ! . value
2733 } finally {
28- emnapiCtx . cbinfoStack . pop ( )
29- emnapiCtx . closeScope ( envObject , scope )
34+ callbackInfo . data = 0
35+ callbackInfo . args = undefined !
36+ callbackInfo . thiz = undefined
37+ callbackInfo . fn = undefined !
38+ envObject . ctx . closeScope ( envObject , scope )
3039 }
3140 }
3241
3342 if ( functionName === '' ) {
34- f = makeFunction ( ) as F
43+ f = makeFunction ( envObject , callback ) as F
3544 return { status : napi_status . napi_ok , f }
3645 }
3746
@@ -41,7 +50,7 @@ export function emnapiCreateFunction<F extends (...args: any[]) => any> (envObje
4150
4251// #if DYNAMIC_EXECUTION
4352 if ( emnapiCtx . feature . supportNewFunction ) {
44- const _ = makeFunction ( )
53+ const _ = makeFunction ( envObject , callback )
4554 try {
4655 f = ( new Function ( '_' ,
4756 'return function ' + functionName + '(){' +
@@ -50,15 +59,15 @@ export function emnapiCreateFunction<F extends (...args: any[]) => any> (envObje
5059 '};'
5160 ) ) ( _ )
5261 } catch ( _err ) {
53- f = makeFunction ( ) as F
62+ f = makeFunction ( envObject , callback ) as F
5463 if ( emnapiCtx . feature . canSetFunctionName ) Object . defineProperty ( f , 'name' , { value : functionName } )
5564 }
5665 } else {
57- f = makeFunction ( ) as F
66+ f = makeFunction ( envObject , callback ) as F
5867 if ( emnapiCtx . feature . canSetFunctionName ) Object . defineProperty ( f , 'name' , { value : functionName } )
5968 }
6069// #else
61- f = makeFunction ( ) as F
70+ f = makeFunction ( envObject , callback ) as F
6271 if ( emnapiCtx . feature . canSetFunctionName ) Object . defineProperty ( f , 'name' , { value : functionName } )
6372// #endif
6473 return { status : napi_status . napi_ok , f }
0 commit comments