use of org.ballerinalang.model.NativeCallableUnit in project ballerina by ballerina-lang.
the class ProgramFileReader method readConnectorActionInfoEntries.
private void readConnectorActionInfoEntries(DataInputStream dataInStream, PackageInfo packageInfo) throws IOException {
for (ConnectorInfo connectorInfo : packageInfo.getConnectorInfoEntries()) {
// Read action info entries
int actionCount = dataInStream.readShort();
for (int j = 0; j < actionCount; j++) {
// Read action name;
int actionNameCPIndex = dataInStream.readInt();
UTF8CPEntry actionNameUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(actionNameCPIndex);
String actionName = actionNameUTF8Entry.getValue();
ActionInfo actionInfo = new ActionInfo(packageInfo.getPkgNameCPIndex(), packageInfo.getPkgPath(), actionNameCPIndex, actionName, connectorInfo);
actionInfo.setPackageInfo(packageInfo);
connectorInfo.addActionInfo(actionName, actionInfo);
// Read action signature
int actionSigCPIndex = dataInStream.readInt();
UTF8CPEntry actionSigUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(actionSigCPIndex);
actionInfo.setSignatureCPIndex(actionSigCPIndex);
actionInfo.setSignature(actionSigUTF8Entry.getValue());
int flags = dataInStream.readInt();
// actionInfo.setflags(flags);
setCallableUnitSignature(actionInfo, actionSigUTF8Entry.getValue(), packageInfo);
// TODO Temp solution.
boolean nativeAction = dataInStream.readByte() == 1;
actionInfo.setNative(nativeAction);
int workerDataChannelsLength = dataInStream.readShort();
for (int k = 0; k < workerDataChannelsLength; k++) {
readWorkerDataChannelEntries(dataInStream, packageInfo, actionInfo);
}
// Read worker info entries
readWorkerInfoEntries(dataInStream, packageInfo, actionInfo);
if (nativeAction) {
NativeCallableUnit nativeActionObj = NativeUnitLoader.getInstance().loadNativeAction(actionInfo.getPkgPath(), actionInfo.getConnectorInfo().getName(), actionInfo.getName());
if (nativeActionObj == null && !actionInfo.name.equals("<init>")) {
throw new BLangRuntimeException("native action not available " + actionInfo.getPkgPath() + ":" + actionInfo.getConnectorInfo().getName() + "." + actionName);
}
actionInfo.setNativeCallableUnit(nativeActionObj);
}
// Read attributes of the struct info
readAttributeInfoEntries(dataInStream, packageInfo, actionInfo);
}
// Read attributes of the struct info
readAttributeInfoEntries(dataInStream, packageInfo, connectorInfo);
}
}
use of org.ballerinalang.model.NativeCallableUnit in project ballerina by ballerina-lang.
the class BLangFunctions method invokeNativeCallable.
private static WorkerExecutionContext invokeNativeCallable(CallableUnitInfo callableUnitInfo, WorkerExecutionContext parentCtx, int[] argRegs, int[] retRegs, int flags) {
WorkerData parentLocalData = parentCtx.workerLocal;
BType[] retTypes = callableUnitInfo.getRetParamTypes();
WorkerData caleeSF = BLangVMUtils.createWorkerDataForLocal(callableUnitInfo.getDefaultWorkerInfo(), parentCtx, argRegs, callableUnitInfo.getParamTypes());
Context ctx = new NativeCallContext(parentCtx, callableUnitInfo, caleeSF);
NativeCallableUnit nativeCallable = callableUnitInfo.getNativeCallableUnit();
if (nativeCallable == null) {
return parentCtx;
}
try {
if (nativeCallable.isBlocking()) {
nativeCallable.execute(ctx, null);
BLangVMUtils.populateWorkerDataWithValues(parentLocalData, retRegs, ctx.getReturnValues(), retTypes);
if (TraceManagerWrapper.getInstance().isTraceEnabled() && FunctionFlags.isObserved(flags)) {
TraceUtil.finishTraceSpan(TraceUtil.getTracer(parentCtx));
}
/* we want the parent to continue, since we got the response of the native call already */
return parentCtx;
} else {
CallableUnitCallback callback;
if (TraceManagerWrapper.getInstance().isTraceEnabled() && FunctionFlags.isObserved(flags)) {
callback = new TraceableCallbackWrapper(parentCtx, new BLangCallableUnitCallback(ctx, parentCtx, retRegs, retTypes));
} else {
callback = new BLangCallableUnitCallback(ctx, parentCtx, retRegs, retTypes);
}
nativeCallable.execute(ctx, callback);
/* we want the parent to suspend (i.e. go to wait for response state) and stay until notified */
return null;
}
} catch (BLangNullReferenceException e) {
return BLangVMUtils.handleNativeInvocationError(parentCtx, BLangVMErrors.createNullRefException(callableUnitInfo));
} catch (Throwable e) {
return BLangVMUtils.handleNativeInvocationError(parentCtx, BLangVMErrors.createError(callableUnitInfo, e.getMessage()));
}
}
use of org.ballerinalang.model.NativeCallableUnit in project ballerina by ballerina-lang.
the class AppointmentJob method execute.
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
NativeCallableUnit fn = (NativeCallableUnit) jobDataMap.get(AppointmentConstants.BALLERINA_FUNCTION);
Context balParentContext = (Context) jobDataMap.get(AppointmentConstants.BALLERINA_PARENT_CONTEXT);
FunctionRefCPEntry onTriggerFunction = (FunctionRefCPEntry) jobDataMap.get(AppointmentConstants.BALLERINA_ON_TRIGGER_FUNCTION);
FunctionRefCPEntry onErrorFunction = (FunctionRefCPEntry) jobDataMap.get(AppointmentConstants.BALLERINA_ON_ERROR_FUNCTION);
ProgramFile programFile = balParentContext.getProgramFile();
TaskExecutor.execute(fn, balParentContext, onTriggerFunction, onErrorFunction, programFile);
}
use of org.ballerinalang.model.NativeCallableUnit in project ballerina by ballerina-lang.
the class NativeConstructLoadingTest method testLoadingNonExistingFunction.
@Test
public void testLoadingNonExistingFunction() {
NativeCallableUnit function = this.nativeLoader.loadNativeFunction("ballerina.lang.system", "foo");
Assert.assertNull(function);
}
use of org.ballerinalang.model.NativeCallableUnit in project ballerina by ballerina-lang.
the class NativeConstructLoadingTest method testLoadingFunctionInNonExistingPackage.
@Test
public void testLoadingFunctionInNonExistingPackage() {
NativeCallableUnit function = this.nativeLoader.loadNativeFunction("ballerina.lang.foo", "println");
Assert.assertNull(function);
}
Aggregations