Search in sources :

Example 1 with FunctionRefCPEntry

use of org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry in project ballerina by ballerina-lang.

the class CPU method beginTransaction.

private static void beginTransaction(WorkerExecutionContext ctx, int transactionBlockId, int retryCountRegIndex, int committedFuncIndex, int abortedFuncIndex) {
    // If global tx enabled, it is managed via transaction coordinator. Otherwise it is managed locally without
    // any interaction with the transaction coordinator.
    boolean isGlobalTransactionEnabled = ctx.getGlobalTransactionEnabled();
    // Transaction is attempted three times by default to improve resiliency
    int retryCount = TransactionConstants.DEFAULT_RETRY_COUNT;
    if (retryCountRegIndex != -1) {
        retryCount = (int) ctx.workerLocal.longRegs[retryCountRegIndex];
        if (retryCount < 0) {
            ctx.setError(BLangVMErrors.createError(ctx, BLangExceptionHelper.getErrorMessage(RuntimeErrors.INVALID_RETRY_COUNT)));
            handleError(ctx);
            return;
        }
    }
    // Register committed function handler if exists.
    if (committedFuncIndex != -1) {
        FunctionRefCPEntry funcRefCPEntry = (FunctionRefCPEntry) ctx.constPool[committedFuncIndex];
        BFunctionPointer fpCommitted = new BFunctionPointer(funcRefCPEntry);
        TransactionResourceManager.getInstance().registerCommittedFunction(transactionBlockId, fpCommitted);
    }
    // Register aborted function handler if exists.
    if (abortedFuncIndex != -1) {
        FunctionRefCPEntry funcRefCPEntry = (FunctionRefCPEntry) ctx.constPool[abortedFuncIndex];
        BFunctionPointer fpAborted = new BFunctionPointer(funcRefCPEntry);
        TransactionResourceManager.getInstance().registerAbortedFunction(transactionBlockId, fpAborted);
    }
    LocalTransactionInfo localTransactionInfo = ctx.getLocalTransactionInfo();
    if (localTransactionInfo == null) {
        String globalTransactionId;
        String protocol = null;
        String url = null;
        if (isGlobalTransactionEnabled) {
            BValue[] returns = TransactionUtils.notifyTransactionBegin(ctx, null, null, transactionBlockId, TransactionConstants.DEFAULT_COORDINATION_TYPE);
            BStruct txDataStruct = (BStruct) returns[0];
            globalTransactionId = txDataStruct.getStringField(1);
            protocol = txDataStruct.getStringField(2);
            url = txDataStruct.getStringField(3);
        } else {
            globalTransactionId = UUID.randomUUID().toString().replaceAll("-", "");
        }
        localTransactionInfo = new LocalTransactionInfo(globalTransactionId, url, protocol);
        ctx.setLocalTransactionInfo(localTransactionInfo);
    } else {
        if (isGlobalTransactionEnabled) {
            TransactionUtils.notifyTransactionBegin(ctx, localTransactionInfo.getGlobalTransactionId(), localTransactionInfo.getURL(), transactionBlockId, localTransactionInfo.getProtocol());
        }
    }
    localTransactionInfo.beginTransactionBlock(transactionBlockId, retryCount);
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) FunctionRefCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry) LocalTransactionInfo(org.ballerinalang.util.transactions.LocalTransactionInfo) BValue(org.ballerinalang.model.values.BValue) BString(org.ballerinalang.model.values.BString) BFunctionPointer(org.ballerinalang.model.values.BFunctionPointer)

Example 2 with FunctionRefCPEntry

use of org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry in project ballerina by ballerina-lang.

the class ProgramFileReader method readInstructions.

private void readInstructions(DataInputStream dataInStream, PackageInfo packageInfo) throws IOException {
    int codeLength = dataInStream.readInt();
    byte[] code = new byte[codeLength];
    // Ignore bytes read should be same as the code length.
    dataInStream.read(code);
    DataInputStream codeStream = new DataInputStream(new ByteArrayInputStream(code));
    while (codeStream.available() > 0) {
        int i, j, k, h;
        int funcRefCPIndex;
        FunctionRefCPEntry funcRefCPEntry;
        int flags;
        int[] argRegs;
        int[] retRegs;
        int opcode = codeStream.readUnsignedByte();
        switch(opcode) {
            case InstructionCodes.HALT:
            case InstructionCodes.RET:
                packageInfo.addInstruction(InstructionFactory.get(opcode));
                break;
            case InstructionCodes.ICONST_0:
            case InstructionCodes.ICONST_1:
            case InstructionCodes.ICONST_2:
            case InstructionCodes.ICONST_3:
            case InstructionCodes.ICONST_4:
            case InstructionCodes.ICONST_5:
            case InstructionCodes.FCONST_0:
            case InstructionCodes.FCONST_1:
            case InstructionCodes.FCONST_2:
            case InstructionCodes.FCONST_3:
            case InstructionCodes.FCONST_4:
            case InstructionCodes.FCONST_5:
            case InstructionCodes.BCONST_0:
            case InstructionCodes.BCONST_1:
            case InstructionCodes.RCONST_NULL:
            case InstructionCodes.GOTO:
            case InstructionCodes.THROW:
            case InstructionCodes.ERRSTORE:
            case InstructionCodes.NEWXMLSEQ:
                i = codeStream.readInt();
                packageInfo.addInstruction(InstructionFactory.get(opcode, i));
                break;
            case InstructionCodes.ICONST:
            case InstructionCodes.FCONST:
            case InstructionCodes.SCONST:
            case InstructionCodes.IMOVE:
            case InstructionCodes.FMOVE:
            case InstructionCodes.SMOVE:
            case InstructionCodes.BMOVE:
            case InstructionCodes.LMOVE:
            case InstructionCodes.RMOVE:
            case InstructionCodes.IGLOAD:
            case InstructionCodes.FGLOAD:
            case InstructionCodes.SGLOAD:
            case InstructionCodes.BGLOAD:
            case InstructionCodes.LGLOAD:
            case InstructionCodes.RGLOAD:
            case InstructionCodes.IGSTORE:
            case InstructionCodes.FGSTORE:
            case InstructionCodes.SGSTORE:
            case InstructionCodes.BGSTORE:
            case InstructionCodes.LGSTORE:
            case InstructionCodes.RGSTORE:
            case InstructionCodes.INEG:
            case InstructionCodes.FNEG:
            case InstructionCodes.BNOT:
            case InstructionCodes.REQ_NULL:
            case InstructionCodes.RNE_NULL:
            case InstructionCodes.BR_TRUE:
            case InstructionCodes.BR_FALSE:
            case InstructionCodes.TR_END:
            case InstructionCodes.FPLOAD:
            case InstructionCodes.ARRAYLEN:
            case InstructionCodes.INEWARRAY:
            case InstructionCodes.FNEWARRAY:
            case InstructionCodes.SNEWARRAY:
            case InstructionCodes.BNEWARRAY:
            case InstructionCodes.LNEWARRAY:
            case InstructionCodes.RNEWARRAY:
            case InstructionCodes.JSONNEWARRAY:
            case InstructionCodes.NEWSTRUCT:
            case InstructionCodes.NEWCONNECTOR:
            case InstructionCodes.ITR_NEW:
            case InstructionCodes.ITR_HAS_NEXT:
            case InstructionCodes.IRET:
            case InstructionCodes.FRET:
            case InstructionCodes.SRET:
            case InstructionCodes.BRET:
            case InstructionCodes.LRET:
            case InstructionCodes.RRET:
            case InstructionCodes.XML2XMLATTRS:
            case InstructionCodes.NEWXMLCOMMENT:
            case InstructionCodes.NEWXMLTEXT:
            case InstructionCodes.XMLSEQSTORE:
            case InstructionCodes.TYPEOF:
            case InstructionCodes.TYPELOAD:
            case InstructionCodes.SEQ_NULL:
            case InstructionCodes.SNE_NULL:
            case InstructionCodes.NEWJSON:
            case InstructionCodes.NEWMAP:
            case InstructionCodes.NEWTABLE:
            case InstructionCodes.I2ANY:
            case InstructionCodes.F2ANY:
            case InstructionCodes.S2ANY:
            case InstructionCodes.B2ANY:
            case InstructionCodes.L2ANY:
            case InstructionCodes.ANY2I:
            case InstructionCodes.ANY2F:
            case InstructionCodes.ANY2S:
            case InstructionCodes.ANY2B:
            case InstructionCodes.ANY2L:
            case InstructionCodes.ANY2JSON:
            case InstructionCodes.ANY2XML:
            case InstructionCodes.ANY2MAP:
            case InstructionCodes.ANY2TYPE:
            case InstructionCodes.ANY2DT:
            case InstructionCodes.NULL2JSON:
            case InstructionCodes.I2F:
            case InstructionCodes.I2S:
            case InstructionCodes.I2B:
            case InstructionCodes.I2JSON:
            case InstructionCodes.F2I:
            case InstructionCodes.F2S:
            case InstructionCodes.F2B:
            case InstructionCodes.F2JSON:
            case InstructionCodes.S2I:
            case InstructionCodes.S2F:
            case InstructionCodes.S2B:
            case InstructionCodes.S2JSON:
            case InstructionCodes.B2I:
            case InstructionCodes.B2F:
            case InstructionCodes.B2S:
            case InstructionCodes.B2JSON:
            case InstructionCodes.JSON2I:
            case InstructionCodes.JSON2F:
            case InstructionCodes.JSON2S:
            case InstructionCodes.JSON2B:
            case InstructionCodes.DT2XML:
            case InstructionCodes.DT2JSON:
            case InstructionCodes.T2MAP:
            case InstructionCodes.T2JSON:
            case InstructionCodes.XML2JSON:
            case InstructionCodes.JSON2XML:
            case InstructionCodes.XMLATTRS2MAP:
            case InstructionCodes.ANY2SCONV:
            case InstructionCodes.S2XML:
            case InstructionCodes.XML2S:
            case InstructionCodes.S2JSONX:
            case InstructionCodes.NULL2S:
            case InstructionCodes.AWAIT:
            case InstructionCodes.CHECK_CONVERSION:
            case InstructionCodes.XMLLOADALL:
                i = codeStream.readInt();
                j = codeStream.readInt();
                packageInfo.addInstruction(InstructionFactory.get(opcode, i, j));
                break;
            case InstructionCodes.IALOAD:
            case InstructionCodes.FALOAD:
            case InstructionCodes.SALOAD:
            case InstructionCodes.BALOAD:
            case InstructionCodes.LALOAD:
            case InstructionCodes.RALOAD:
            case InstructionCodes.JSONALOAD:
            case InstructionCodes.IASTORE:
            case InstructionCodes.FASTORE:
            case InstructionCodes.SASTORE:
            case InstructionCodes.BASTORE:
            case InstructionCodes.LASTORE:
            case InstructionCodes.RASTORE:
            case InstructionCodes.JSONASTORE:
            case InstructionCodes.IFIELDLOAD:
            case InstructionCodes.FFIELDLOAD:
            case InstructionCodes.SFIELDLOAD:
            case InstructionCodes.BFIELDLOAD:
            case InstructionCodes.LFIELDLOAD:
            case InstructionCodes.RFIELDLOAD:
            case InstructionCodes.IFIELDSTORE:
            case InstructionCodes.FFIELDSTORE:
            case InstructionCodes.SFIELDSTORE:
            case InstructionCodes.BFIELDSTORE:
            case InstructionCodes.LFIELDSTORE:
            case InstructionCodes.RFIELDSTORE:
            case InstructionCodes.MAPLOAD:
            case InstructionCodes.MAPSTORE:
            case InstructionCodes.JSONLOAD:
            case InstructionCodes.JSONSTORE:
            case InstructionCodes.ENUMERATORLOAD:
            case InstructionCodes.IADD:
            case InstructionCodes.FADD:
            case InstructionCodes.SADD:
            case InstructionCodes.XMLADD:
            case InstructionCodes.ISUB:
            case InstructionCodes.FSUB:
            case InstructionCodes.IMUL:
            case InstructionCodes.FMUL:
            case InstructionCodes.IDIV:
            case InstructionCodes.FDIV:
            case InstructionCodes.IMOD:
            case InstructionCodes.FMOD:
            case InstructionCodes.IEQ:
            case InstructionCodes.FEQ:
            case InstructionCodes.SEQ:
            case InstructionCodes.BEQ:
            case InstructionCodes.REQ:
            case InstructionCodes.INE:
            case InstructionCodes.FNE:
            case InstructionCodes.SNE:
            case InstructionCodes.BNE:
            case InstructionCodes.RNE:
            case InstructionCodes.IGT:
            case InstructionCodes.FGT:
            case InstructionCodes.IGE:
            case InstructionCodes.FGE:
            case InstructionCodes.ILT:
            case InstructionCodes.FLT:
            case InstructionCodes.ILE:
            case InstructionCodes.FLE:
            case InstructionCodes.XMLATTRLOAD:
            case InstructionCodes.XMLATTRSTORE:
            case InstructionCodes.S2QNAME:
            case InstructionCodes.NEWXMLPI:
            case InstructionCodes.TEQ:
            case InstructionCodes.TNE:
            case InstructionCodes.XMLLOAD:
            case InstructionCodes.NEW_INT_RANGE:
            case InstructionCodes.LENGTHOF:
            case InstructionCodes.NEWSTREAM:
            case InstructionCodes.CHECKCAST:
            case InstructionCodes.MAP2T:
            case InstructionCodes.JSON2T:
            case InstructionCodes.ANY2T:
            case InstructionCodes.ANY2C:
            case InstructionCodes.ANY2E:
            case InstructionCodes.IS_ASSIGNABLE:
            case InstructionCodes.TR_RETRY:
            case InstructionCodes.XMLSEQLOAD:
                i = codeStream.readInt();
                j = codeStream.readInt();
                k = codeStream.readInt();
                packageInfo.addInstruction(InstructionFactory.get(opcode, i, j, k));
                break;
            case InstructionCodes.NEWQNAME:
            case InstructionCodes.NEWXMLELEMENT:
            case InstructionCodes.TR_BEGIN:
                i = codeStream.readInt();
                j = codeStream.readInt();
                k = codeStream.readInt();
                h = codeStream.readInt();
                packageInfo.addInstruction(InstructionFactory.get(opcode, i, j, k, h));
                break;
            case InstructionCodes.CALL:
                funcRefCPIndex = codeStream.readInt();
                flags = codeStream.readInt();
                funcRefCPEntry = (FunctionRefCPEntry) packageInfo.getCPEntry(funcRefCPIndex);
                packageInfo.addInstruction(new InstructionCALL(opcode, funcRefCPIndex, funcRefCPEntry.getFunctionInfo(), flags, getArgRegs(codeStream), getArgRegs(codeStream)));
                break;
            case InstructionCodes.VCALL:
                int receiverRegIndex = codeStream.readInt();
                funcRefCPIndex = codeStream.readInt();
                flags = codeStream.readInt();
                funcRefCPEntry = (FunctionRefCPEntry) packageInfo.getCPEntry(funcRefCPIndex);
                packageInfo.addInstruction(new InstructionVCALL(opcode, receiverRegIndex, funcRefCPIndex, funcRefCPEntry.getFunctionInfo(), flags, getArgRegs(codeStream), getArgRegs(codeStream)));
                break;
            case InstructionCodes.ACALL:
                int actionRefCPIndex = codeStream.readInt();
                flags = codeStream.readInt();
                ActionRefCPEntry actionRefCPEntry = (ActionRefCPEntry) packageInfo.getCPEntry(actionRefCPIndex);
                packageInfo.addInstruction(new InstructionACALL(opcode, actionRefCPIndex, actionRefCPEntry.getActionName(), flags, getArgRegs(codeStream), getArgRegs(codeStream)));
                break;
            case InstructionCodes.FPCALL:
                funcRefCPIndex = codeStream.readInt();
                flags = codeStream.readInt();
                argRegs = getArgRegs(codeStream);
                retRegs = getArgRegs(codeStream);
                FunctionCallCPEntry funcCallCPEntry = new FunctionCallCPEntry(flags, argRegs, retRegs);
                int funcCallCPIndex = packageInfo.addCPEntry(funcCallCPEntry);
                packageInfo.addInstruction(InstructionFactory.get(opcode, funcRefCPIndex, funcCallCPIndex));
                break;
            case InstructionCodes.TCALL:
                int transformCPIndex = codeStream.readInt();
                flags = codeStream.readInt();
                TransformerRefCPEntry transformerRefCPEntry = (TransformerRefCPEntry) packageInfo.getCPEntry(transformCPIndex);
                packageInfo.addInstruction(new InstructionTCALL(opcode, transformCPIndex, transformerRefCPEntry.getTransformerInfo(), flags, getArgRegs(codeStream), getArgRegs(codeStream)));
                break;
            case InstructionCodes.WRKSEND:
            case InstructionCodes.WRKRECEIVE:
                int channelRefCPIndex = codeStream.readInt();
                WorkerDataChannelRefCPEntry channelRefCPEntry = (WorkerDataChannelRefCPEntry) packageInfo.getCPEntry(channelRefCPIndex);
                int sigCPIndex = codeStream.readInt();
                UTF8CPEntry sigCPEntry = (UTF8CPEntry) packageInfo.getCPEntry(sigCPIndex);
                BType[] bTypes = getParamTypes(sigCPEntry.getValue(), packageInfo);
                packageInfo.addInstruction(new InstructionWRKSendReceive(opcode, channelRefCPIndex, channelRefCPEntry.getWorkerDataChannelInfo(), sigCPIndex, bTypes, getArgRegs(codeStream)));
                break;
            case InstructionCodes.FORKJOIN:
                int forkJoinIndexCPIndex = codeStream.readInt();
                ForkJoinCPEntry forkJoinIndexCPEntry = (ForkJoinCPEntry) packageInfo.getCPEntry(forkJoinIndexCPIndex);
                int timeoutRegIndex = codeStream.readInt();
                int joinVarRegIndex = codeStream.readInt();
                int joinBlockAddr = codeStream.readInt();
                int timeoutVarRegIndex = codeStream.readInt();
                int timeoutBlockAddr = codeStream.readInt();
                packageInfo.addInstruction(new InstructionFORKJOIN(opcode, forkJoinIndexCPIndex, forkJoinIndexCPEntry, timeoutRegIndex, joinVarRegIndex, joinBlockAddr, timeoutVarRegIndex, timeoutBlockAddr));
                break;
            case InstructionCodes.ITR_NEXT:
                int iteratorIndex = codeStream.readInt();
                int[] typeTags = getArgRegs(codeStream);
                retRegs = getArgRegs(codeStream);
                packageInfo.addInstruction(new InstructionIteratorNext(opcode, iteratorIndex, retRegs.length, typeTags, retRegs));
                break;
            case InstructionCodes.LOCK:
            case InstructionCodes.UNLOCK:
                int varCount = codeStream.readInt();
                BType[] varTypes = new BType[varCount];
                int[] varRegs = new int[varCount];
                for (int m = 0; m < varCount; m++) {
                    int varSigCPIndex = codeStream.readInt();
                    TypeRefCPEntry typeRefCPEntry = (TypeRefCPEntry) packageInfo.getCPEntry(varSigCPIndex);
                    varTypes[m] = typeRefCPEntry.getType();
                    varRegs[m] = codeStream.readInt();
                }
                packageInfo.addInstruction(new InstructionLock(opcode, varTypes, varRegs));
                break;
            default:
                throw new ProgramFileFormatException("unknown opcode " + opcode + " in package " + packageInfo.getPkgPath());
        }
    }
}
Also used : TransformerRefCPEntry(org.ballerinalang.util.codegen.cpentries.TransformerRefCPEntry) TypeRefCPEntry(org.ballerinalang.util.codegen.cpentries.TypeRefCPEntry) ActionRefCPEntry(org.ballerinalang.util.codegen.cpentries.ActionRefCPEntry) InstructionIteratorNext(org.ballerinalang.util.codegen.Instruction.InstructionIteratorNext) ProgramFileFormatException(org.ballerinalang.util.exceptions.ProgramFileFormatException) InstructionCALL(org.ballerinalang.util.codegen.Instruction.InstructionCALL) InstructionTCALL(org.ballerinalang.util.codegen.Instruction.InstructionTCALL) WorkerDataChannelRefCPEntry(org.ballerinalang.util.codegen.cpentries.WorkerDataChannelRefCPEntry) InstructionWRKSendReceive(org.ballerinalang.util.codegen.Instruction.InstructionWRKSendReceive) DataInputStream(java.io.DataInputStream) InstructionVCALL(org.ballerinalang.util.codegen.Instruction.InstructionVCALL) FunctionCallCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionCallCPEntry) UTF8CPEntry(org.ballerinalang.util.codegen.cpentries.UTF8CPEntry) FunctionRefCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry) InstructionACALL(org.ballerinalang.util.codegen.Instruction.InstructionACALL) InstructionLock(org.ballerinalang.util.codegen.Instruction.InstructionLock) ByteArrayInputStream(java.io.ByteArrayInputStream) BType(org.ballerinalang.model.types.BType) ForkJoinCPEntry(org.ballerinalang.util.codegen.cpentries.ForkJoinCPEntry) InstructionFORKJOIN(org.ballerinalang.util.codegen.Instruction.InstructionFORKJOIN)

Example 3 with FunctionRefCPEntry

use of org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry in project ballerina by ballerina-lang.

the class BalScheduleAppointment method execute.

public void execute(Context ctx) {
    FunctionRefCPEntry onTriggerFunctionRefCPEntry;
    FunctionRefCPEntry onErrorFunctionRefCPEntry = null;
    if (ctx.getLocalWorkerData().refRegs[0] != null && ctx.getLocalWorkerData().refRegs[0] instanceof BFunctionPointer) {
        onTriggerFunctionRefCPEntry = ((BFunctionPointer) ctx.getRefArgument(0)).value();
    } else {
        ctx.setReturnValues(new BString(""), BLangVMErrors.createError(ctx, 0, "The onTrigger function is not provided"));
        return;
    }
    if (ctx.getLocalWorkerData().refRegs[1] != null && ctx.getLocalWorkerData().refRegs[1] instanceof BFunctionPointer) {
        onErrorFunctionRefCPEntry = ((BFunctionPointer) ctx.getRefArgument(1)).value();
    }
    String schedule = ctx.getStringArgument(0);
    try {
        Appointment appointment = new Appointment(this, ctx, schedule, onTriggerFunctionRefCPEntry, onErrorFunctionRefCPEntry);
        ctx.setReturnValues(new BString(appointment.getId()));
    } catch (SchedulingException e) {
        ctx.setReturnValues(BLangVMErrors.createError(ctx, 0, e.getMessage()));
    }
}
Also used : FunctionRefCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry) BString(org.ballerinalang.model.values.BString) BString(org.ballerinalang.model.values.BString) SchedulingException(org.ballerinalang.nativeimpl.task.SchedulingException) BFunctionPointer(org.ballerinalang.model.values.BFunctionPointer)

Example 4 with FunctionRefCPEntry

use of org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry in project ballerina by ballerina-lang.

the class BalScheduleTimer method execute.

public void execute(Context ctx) {
    FunctionRefCPEntry onTriggerFunctionRefCPEntry;
    FunctionRefCPEntry onErrorFunctionRefCPEntry = null;
    if (ctx.getLocalWorkerData().refRegs[0] != null && ctx.getLocalWorkerData().refRegs[0] instanceof BFunctionPointer) {
        onTriggerFunctionRefCPEntry = ((BFunctionPointer) ctx.getRefArgument(0)).value();
    } else {
        ctx.setReturnValues(new BString(""), BLangVMErrors.createError(ctx, 0, "The onTrigger function is not provided"));
        return;
    }
    if (ctx.getLocalWorkerData().refRegs[1] != null && ctx.getLocalWorkerData().refRegs[1] instanceof BFunctionPointer) {
        onErrorFunctionRefCPEntry = ((BFunctionPointer) ctx.getRefArgument(1)).value();
    }
    BStruct scheduler = (BStruct) ctx.getRefArgument(2);
    long delay = scheduler.getIntField(0);
    long interval = scheduler.getIntField(1);
    try {
        Timer timer = new Timer(this, ctx, delay, interval, onTriggerFunctionRefCPEntry, onErrorFunctionRefCPEntry);
        ctx.setReturnValues(new BString(timer.getId()));
    } catch (SchedulingException e) {
        ctx.setReturnValues(BLangVMErrors.createError(ctx, 0, e.getMessage()));
    }
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) FunctionRefCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry) BString(org.ballerinalang.model.values.BString) SchedulingException(org.ballerinalang.nativeimpl.task.SchedulingException) BFunctionPointer(org.ballerinalang.model.values.BFunctionPointer)

Example 5 with FunctionRefCPEntry

use of org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry in project ballerina by ballerina-lang.

the class ProgramFileReader method readCPEntry.

private ConstantPoolEntry readCPEntry(DataInputStream dataInStream, ConstantPool constantPool, ConstantPoolEntry.EntryType cpEntryType) throws IOException {
    int cpIndex;
    int pkgCPIndex;
    UTF8CPEntry utf8CPEntry;
    PackageRefCPEntry packageRefCPEntry;
    Optional<PackageInfo> packageInfoOptional;
    switch(cpEntryType) {
        case CP_ENTRY_UTF8:
            short length = dataInStream.readShort();
            String strValue = null;
            // Therefore we read the UTF value only if the length >= 0.
            if (length >= 0) {
                strValue = dataInStream.readUTF();
            }
            return new UTF8CPEntry(strValue);
        case CP_ENTRY_INTEGER:
            long longVal = dataInStream.readLong();
            return new IntegerCPEntry(longVal);
        case CP_ENTRY_FLOAT:
            double doubleVal = dataInStream.readDouble();
            return new FloatCPEntry(doubleVal);
        case CP_ENTRY_STRING:
            cpIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            return new StringCPEntry(cpIndex, utf8CPEntry.getValue());
        case CP_ENTRY_PACKAGE:
            cpIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            return new PackageRefCPEntry(cpIndex, utf8CPEntry.getValue());
        case CP_ENTRY_FUNCTION_REF:
            pkgCPIndex = dataInStream.readInt();
            packageRefCPEntry = (PackageRefCPEntry) constantPool.getCPEntry(pkgCPIndex);
            cpIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            String funcName = utf8CPEntry.getValue();
            FunctionRefCPEntry functionRefCPEntry = new FunctionRefCPEntry(pkgCPIndex, packageRefCPEntry.getPackageName(), cpIndex, funcName);
            // Find the functionInfo
            packageInfoOptional = Optional.ofNullable(programFile.getPackageInfo(packageRefCPEntry.getPackageName()));
            Optional<FunctionInfo> funcInfoOptional = packageInfoOptional.map(packageInfo -> packageInfo.getFunctionInfo(funcName));
            if (!funcInfoOptional.isPresent()) {
                // This must reference to the current package and the current package is not been read yet.
                // Therefore we add this to the unresolved CP Entry list.
                unresolvedCPEntries.add(functionRefCPEntry);
                return functionRefCPEntry;
            }
            functionRefCPEntry.setFunctionInfo(funcInfoOptional.get());
            return functionRefCPEntry;
        case CP_ENTRY_TRANSFORMER_REF:
            pkgCPIndex = dataInStream.readInt();
            packageRefCPEntry = (PackageRefCPEntry) constantPool.getCPEntry(pkgCPIndex);
            cpIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            String transformerName = utf8CPEntry.getValue();
            TransformerRefCPEntry transformerRefCPEntry = new TransformerRefCPEntry(pkgCPIndex, packageRefCPEntry.getPackageName(), cpIndex, transformerName);
            // Find the transformerInfo
            packageInfoOptional = Optional.ofNullable(programFile.getPackageInfo(packageRefCPEntry.getPackageName()));
            Optional<TransformerInfo> transInfoOptional = packageInfoOptional.map(packageInfo -> packageInfo.getTransformerInfo(transformerName));
            if (!transInfoOptional.isPresent()) {
                // This must reference to the current package and the current package is not been read yet.
                // Therefore we add this to the unresolved CP Entry list.
                unresolvedCPEntries.add(transformerRefCPEntry);
                return transformerRefCPEntry;
            }
            transformerRefCPEntry.setTransformerInfo(transInfoOptional.get());
            return transformerRefCPEntry;
        case CP_ENTRY_ACTION_REF:
            pkgCPIndex = dataInStream.readInt();
            packageRefCPEntry = (PackageRefCPEntry) constantPool.getCPEntry(pkgCPIndex);
            cpIndex = dataInStream.readInt();
            UTF8CPEntry nameCPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            String actionName = nameCPEntry.getValue();
            return new ActionRefCPEntry(pkgCPIndex, packageRefCPEntry.getPackageName(), cpIndex, actionName);
        case CP_ENTRY_STRUCTURE_REF:
            pkgCPIndex = dataInStream.readInt();
            packageRefCPEntry = (PackageRefCPEntry) constantPool.getCPEntry(pkgCPIndex);
            cpIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(cpIndex);
            StructureRefCPEntry structureRefCPEntry = new StructureRefCPEntry(pkgCPIndex, packageRefCPEntry.getPackageName(), cpIndex, utf8CPEntry.getValue());
            packageInfoOptional = Optional.ofNullable(programFile.getPackageInfo(packageRefCPEntry.getPackageName()));
            Optional<StructureTypeInfo> structInfoOptional = packageInfoOptional.map(packageInfo -> packageInfo.getStructureTypeInfo(utf8CPEntry.getValue()));
            if (!structInfoOptional.isPresent()) {
                // This must reference to the current package and the current package is not been read yet.
                // Therefore we add this to the unresolved CP Entry list.
                unresolvedCPEntries.add(structureRefCPEntry);
                return structureRefCPEntry;
            }
            structureRefCPEntry.setStructureTypeInfo(structInfoOptional.get());
            return structureRefCPEntry;
        case CP_ENTRY_TYPE_REF:
            int typeSigCPIndex = dataInStream.readInt();
            utf8CPEntry = (UTF8CPEntry) constantPool.getCPEntry(typeSigCPIndex);
            TypeRefCPEntry typeRefCPEntry = new TypeRefCPEntry(typeSigCPIndex, utf8CPEntry.getValue());
            unresolvedCPEntries.add(typeRefCPEntry);
            return typeRefCPEntry;
        case CP_ENTRY_FORK_JOIN:
            int forkJoinCPIndex = dataInStream.readInt();
            return new ForkJoinCPEntry(forkJoinCPIndex);
        case CP_ENTRY_WRKR_DATA_CHNL_REF:
            int uniqueNameCPIndex = dataInStream.readInt();
            UTF8CPEntry wrkrDtChnlTypesSigCPEntry = (UTF8CPEntry) constantPool.getCPEntry(uniqueNameCPIndex);
            return new WorkerDataChannelRefCPEntry(uniqueNameCPIndex, wrkrDtChnlTypesSigCPEntry.getValue());
        default:
            throw new ProgramFileFormatException("invalid constant pool entry " + cpEntryType.getValue());
    }
}
Also used : StringCPEntry(org.ballerinalang.util.codegen.cpentries.StringCPEntry) ProgramFileFormatException(org.ballerinalang.util.exceptions.ProgramFileFormatException) UTF8CPEntry(org.ballerinalang.util.codegen.cpentries.UTF8CPEntry) ForkJoinCPEntry(org.ballerinalang.util.codegen.cpentries.ForkJoinCPEntry) PackageRefCPEntry(org.ballerinalang.util.codegen.cpentries.PackageRefCPEntry) TransformerRefCPEntry(org.ballerinalang.util.codegen.cpentries.TransformerRefCPEntry) TypeRefCPEntry(org.ballerinalang.util.codegen.cpentries.TypeRefCPEntry) ActionRefCPEntry(org.ballerinalang.util.codegen.cpentries.ActionRefCPEntry) FloatCPEntry(org.ballerinalang.util.codegen.cpentries.FloatCPEntry) WorkerDataChannelRefCPEntry(org.ballerinalang.util.codegen.cpentries.WorkerDataChannelRefCPEntry) FunctionRefCPEntry(org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry) StructureRefCPEntry(org.ballerinalang.util.codegen.cpentries.StructureRefCPEntry) IntegerCPEntry(org.ballerinalang.util.codegen.cpentries.IntegerCPEntry)

Aggregations

FunctionRefCPEntry (org.ballerinalang.util.codegen.cpentries.FunctionRefCPEntry)8 BFunctionPointer (org.ballerinalang.model.values.BFunctionPointer)4 BString (org.ballerinalang.model.values.BString)4 TypeRefCPEntry (org.ballerinalang.util.codegen.cpentries.TypeRefCPEntry)4 BStruct (org.ballerinalang.model.values.BStruct)3 TransformerRefCPEntry (org.ballerinalang.util.codegen.cpentries.TransformerRefCPEntry)3 BType (org.ballerinalang.model.types.BType)2 BValue (org.ballerinalang.model.values.BValue)2 SchedulingException (org.ballerinalang.nativeimpl.task.SchedulingException)2 InstructionACALL (org.ballerinalang.util.codegen.Instruction.InstructionACALL)2 InstructionCALL (org.ballerinalang.util.codegen.Instruction.InstructionCALL)2 InstructionFORKJOIN (org.ballerinalang.util.codegen.Instruction.InstructionFORKJOIN)2 InstructionLock (org.ballerinalang.util.codegen.Instruction.InstructionLock)2 InstructionTCALL (org.ballerinalang.util.codegen.Instruction.InstructionTCALL)2 InstructionVCALL (org.ballerinalang.util.codegen.Instruction.InstructionVCALL)2 InstructionWRKSendReceive (org.ballerinalang.util.codegen.Instruction.InstructionWRKSendReceive)2 ActionRefCPEntry (org.ballerinalang.util.codegen.cpentries.ActionRefCPEntry)2 ForkJoinCPEntry (org.ballerinalang.util.codegen.cpentries.ForkJoinCPEntry)2 StringCPEntry (org.ballerinalang.util.codegen.cpentries.StringCPEntry)2 StructureRefCPEntry (org.ballerinalang.util.codegen.cpentries.StructureRefCPEntry)2