use of org.ballerinalang.util.codegen.cpentries.UTF8CPEntry 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());
}
}
}
use of org.ballerinalang.util.codegen.cpentries.UTF8CPEntry in project ballerina by ballerina-lang.
the class ProgramFileReader method readWorkerDataChannelEntries.
public void readWorkerDataChannelEntries(DataInputStream dataInputStream, PackageInfo packageInfo, CallableUnitInfo callableUnitInfo) throws IOException {
int sourceCPIndex = dataInputStream.readInt();
int targetCPIndex = dataInputStream.readInt();
UTF8CPEntry sourceCPEntry = (UTF8CPEntry) packageInfo.getCPEntry(sourceCPIndex);
UTF8CPEntry targetCPEntry = (UTF8CPEntry) packageInfo.getCPEntry(targetCPIndex);
WorkerDataChannelInfo workerDataChannelInfo = new WorkerDataChannelInfo(sourceCPIndex, sourceCPEntry.getValue(), targetCPIndex, targetCPEntry.getValue());
int dataChannelRefCPIndex = dataInputStream.readInt();
WorkerDataChannelRefCPEntry refCPEntry = (WorkerDataChannelRefCPEntry) packageInfo.getCPEntry(dataChannelRefCPIndex);
refCPEntry.setWorkerDataChannelInfo(workerDataChannelInfo);
callableUnitInfo.addWorkerDataChannelInfo(workerDataChannelInfo);
}
use of org.ballerinalang.util.codegen.cpentries.UTF8CPEntry in project ballerina by ballerina-lang.
the class ProgramFileReader method readStructInfoEntries.
private void readStructInfoEntries(DataInputStream dataInStream, PackageInfo packageInfo) throws IOException {
int structCount = dataInStream.readShort();
for (int i = 0; i < structCount; i++) {
// Create struct info entry
int structNameCPIndex = dataInStream.readInt();
int flags = dataInStream.readInt();
UTF8CPEntry structNameUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(structNameCPIndex);
String structName = structNameUTF8Entry.getValue();
StructInfo structInfo = new StructInfo(packageInfo.getPkgNameCPIndex(), packageInfo.getPkgPath(), structNameCPIndex, structName, flags);
packageInfo.addStructInfo(structName, structInfo);
// Set struct type
BStructType bStructType = new BStructType(structInfo, structName, packageInfo.getPkgPath(), flags);
structInfo.setType(bStructType);
// Read struct field info entries
int structFiledCount = dataInStream.readShort();
for (int j = 0; j < structFiledCount; j++) {
// Read field name
int fieldNameCPIndex = dataInStream.readInt();
UTF8CPEntry fieldNameUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(fieldNameCPIndex);
// Read field type signature
int fieldTypeSigCPIndex = dataInStream.readInt();
UTF8CPEntry fieldTypeSigUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(fieldTypeSigCPIndex);
int fieldFlags = dataInStream.readInt();
StructFieldInfo fieldInfo = new StructFieldInfo(fieldNameCPIndex, fieldNameUTF8Entry.getValue(), fieldTypeSigCPIndex, fieldTypeSigUTF8Entry.getValue(), fieldFlags);
structInfo.addFieldInfo(fieldInfo);
readAttributeInfoEntries(dataInStream, packageInfo, fieldInfo);
}
String defaultInit = structName + INIT_FUNCTION_SUFFIX;
// Read attached function info entries
int attachedFuncCount = dataInStream.readShort();
for (int j = 0; j < attachedFuncCount; j++) {
// Read function name
int nameCPIndex = dataInStream.readInt();
UTF8CPEntry nameUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(nameCPIndex);
String attachedFuncName = nameUTF8Entry.getValue();
// Read function type signature
int typeSigCPIndex = dataInStream.readInt();
UTF8CPEntry typeSigUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(typeSigCPIndex);
int funcFlags = dataInStream.readInt();
AttachedFunctionInfo functionInfo = new AttachedFunctionInfo(nameCPIndex, attachedFuncName, typeSigCPIndex, typeSigUTF8Entry.getValue(), funcFlags);
structInfo.funcInfoEntries.put(functionInfo.name, functionInfo);
// Setting the initializer function info, if any.
if (structName.equals(attachedFuncName)) {
structInfo.initializer = functionInfo;
}
// Setting the default initializer function info
if (defaultInit.equals(attachedFuncName)) {
structInfo.defaultsValuesInitFunc = functionInfo;
}
}
// Read attributes of the struct info
readAttributeInfoEntries(dataInStream, packageInfo, structInfo);
}
}
use of org.ballerinalang.util.codegen.cpentries.UTF8CPEntry in project ballerina by ballerina-lang.
the class ProgramFileReader method getLineNumberInfo.
private LineNumberInfo getLineNumberInfo(DataInputStream dataInStream, ConstantPool constantPool) throws IOException {
int lineNumber = dataInStream.readInt();
int fileNameCPIndex = dataInStream.readInt();
int ip = dataInStream.readInt();
UTF8CPEntry fileNameCPEntry = (UTF8CPEntry) constantPool.getCPEntry(fileNameCPIndex);
LineNumberInfo lineNumberInfo = new LineNumberInfo(lineNumber, fileNameCPIndex, fileNameCPEntry.getValue(), ip);
// In here constant pool is always a packageInfo since only package info has lineNumberTableAttribute
lineNumberInfo.setPackageInfo((PackageInfo) constantPool);
return lineNumberInfo;
}
use of org.ballerinalang.util.codegen.cpentries.UTF8CPEntry in project ballerina by ballerina-lang.
the class ProgramFileReader method getWorkerInfo.
private WorkerInfo getWorkerInfo(DataInputStream dataInStream, PackageInfo packageInfo) throws IOException {
int workerNameCPIndex = dataInStream.readInt();
UTF8CPEntry workerNameUTF8Entry = (UTF8CPEntry) packageInfo.getCPEntry(workerNameCPIndex);
WorkerInfo workerInfo = new WorkerInfo(workerNameCPIndex, workerNameUTF8Entry.getValue());
int wrkrDtChnlRefCPIndex = dataInStream.readInt();
workerInfo.setWrkrDtChnlRefCPIndex(wrkrDtChnlRefCPIndex);
if (wrkrDtChnlRefCPIndex >= 0) {
WorkerDataChannelRefCPEntry refCPEntry = (WorkerDataChannelRefCPEntry) packageInfo.getCPEntry(wrkrDtChnlRefCPIndex);
workerInfo.setWorkerDataChannelInfoForForkJoin(refCPEntry.getWorkerDataChannelInfo());
}
readForkJoinInfo(dataInStream, packageInfo, workerInfo);
// Read attributes
readAttributeInfoEntries(dataInStream, packageInfo, workerInfo);
CodeAttributeInfo codeAttribute = (CodeAttributeInfo) workerInfo.getAttributeInfo(AttributeInfo.Kind.CODE_ATTRIBUTE);
workerInfo.setCodeAttributeInfo(codeAttribute);
return workerInfo;
}
Aggregations