156
156
import com .oracle .graal .python .nodes .util .CastToTruffleStringNode ;
157
157
import com .oracle .graal .python .runtime .PythonContext ;
158
158
import com .oracle .graal .python .runtime .PythonContext .GetThreadStateNode ;
159
+ import com .oracle .graal .python .runtime .PythonOptions ;
159
160
import com .oracle .graal .python .runtime .exception .PException ;
160
161
import com .oracle .graal .python .runtime .exception .PythonErrorType ;
161
162
import com .oracle .graal .python .runtime .object .PythonObjectFactory ;
@@ -1598,6 +1599,10 @@ abstract static class MultiPhaseExtensionModuleInitNode extends Node {
1598
1599
@ GenerateUncached
1599
1600
@ GenerateInline (false ) // footprint reduction 68 -> 49
1600
1601
public abstract static class CreateModuleNode extends MultiPhaseExtensionModuleInitNode {
1602
+ private static final String NFI_CREATE_NAME = "create" ;
1603
+ private static final String NFI_CREATE_SRC = "(POINTER,POINTER):POINTER" ;
1604
+ private static final Source NFI_LIBFFI_CREATE = Source .newBuilder (J_NFI_LANGUAGE , NFI_CREATE_SRC , NFI_CREATE_NAME ).build ();
1605
+ private static final Source NFI_PANAMA_CREATE = Source .newBuilder (J_NFI_LANGUAGE , "with panama " + NFI_CREATE_SRC , NFI_CREATE_NAME ).build ();
1601
1606
1602
1607
public abstract Object execute (CApiContext capiContext , ModuleSpec moduleSpec , Object moduleDef , Object library );
1603
1608
@@ -1672,13 +1677,15 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m
1672
1677
Object [] cArguments = new Object []{PythonToNativeNode .executeUncached (moduleSpec .originalModuleSpec ), moduleDef };
1673
1678
try {
1674
1679
Object result ;
1680
+ PythonContext context = capiContext .getContext ();
1675
1681
if (!interopLib .isExecutable (createFunction )) {
1676
- Object signature = capiContext .getContext ().getEnv ().parseInternal (Source .newBuilder (J_NFI_LANGUAGE , "(POINTER,POINTER):POINTER" , "exec" ).build ()).call ();
1682
+ boolean panama = context .getOption (PythonOptions .UsePanama );
1683
+ Object signature = context .getEnv ().parseInternal (panama ? NFI_PANAMA_CREATE : NFI_LIBFFI_CREATE ).call ();
1677
1684
result = interopLib .execute (SignatureLibrary .getUncached ().bind (signature , createFunction ), cArguments );
1678
1685
} else {
1679
1686
result = interopLib .execute (createFunction , cArguments );
1680
1687
}
1681
- CheckFunctionResultNode .checkFunctionResult (inliningTarget , mName , interopLib .isNull (result ), true , PythonLanguage .get (raiseNode ), capiContext . getContext () , errOccurredProfile ,
1688
+ CheckFunctionResultNode .checkFunctionResult (inliningTarget , mName , interopLib .isNull (result ), true , PythonLanguage .get (raiseNode ), context , errOccurredProfile ,
1682
1689
ErrorMessages .CREATION_FAILD_WITHOUT_EXCEPTION , ErrorMessages .CREATION_RAISED_EXCEPTION );
1683
1690
module = toJavaNode .execute (result );
1684
1691
} catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e ) {
@@ -1733,6 +1740,9 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m
1733
1740
@ GenerateUncached
1734
1741
@ GenerateInline (false ) // footprint reduction 60 -> 42
1735
1742
public abstract static class ExecModuleNode extends MultiPhaseExtensionModuleInitNode {
1743
+ private static final String NFI_EXEC_SRC = "(POINTER):SINT32" ;
1744
+ private static final Source NFI_LIBFFI_EXEC = Source .newBuilder (J_NFI_LANGUAGE , NFI_EXEC_SRC , "exec" ).build ();
1745
+ private static final Source NFI_PANAMA_EXEC = Source .newBuilder (J_NFI_LANGUAGE , "with panama " + NFI_EXEC_SRC , "exec" ).build ();
1736
1746
1737
1747
public abstract int execute (CApiContext capiContext , PythonModule module , Object moduleDef );
1738
1748
@@ -1781,8 +1791,10 @@ static int doGeneric(CApiContext capiContext, PythonModule module, Object module
1781
1791
break ;
1782
1792
case SLOT_PY_MOD_EXEC :
1783
1793
Object execFunction = readPointerNode .readStructArrayElement (slotDefinitions , i , PyModuleDef_Slot__value );
1794
+ PythonContext context = capiContext .getContext ();
1784
1795
if (!U .isExecutable (execFunction )) {
1785
- Object signature = capiContext .getContext ().getEnv ().parseInternal (Source .newBuilder (J_NFI_LANGUAGE , "(POINTER):SINT32" , "exec" ).build ()).call ();
1796
+ boolean panama = context .getOption (PythonOptions .UsePanama );
1797
+ Object signature = context .getEnv ().parseInternal (panama ? NFI_PANAMA_EXEC : NFI_LIBFFI_EXEC ).call ();
1786
1798
execFunction = SignatureLibrary .getUncached ().bind (signature , execFunction );
1787
1799
}
1788
1800
Object result = interopLib .execute (execFunction , PythonToNativeNode .executeUncached (module ));
@@ -1794,7 +1806,7 @@ static int doGeneric(CApiContext capiContext, PythonModule module, Object module
1794
1806
* and won't ignore this if no error is set. This is then the same
1795
1807
* behaviour if we would have a pointer return type and got 'NULL'.
1796
1808
*/
1797
- CheckFunctionResultNode .checkFunctionResult (inliningTarget , mName , iResult != 0 , true , PythonLanguage .get (raiseNode ), capiContext . getContext () ,
1809
+ CheckFunctionResultNode .checkFunctionResult (inliningTarget , mName , iResult != 0 , true , PythonLanguage .get (raiseNode ), context ,
1798
1810
InlinedConditionProfile .getUncached (), ErrorMessages .EXECUTION_FAILED_WITHOUT_EXCEPTION , ErrorMessages .EXECUTION_RAISED_EXCEPTION );
1799
1811
break ;
1800
1812
default :
0 commit comments