StreamSubscriber(String queueName, BFunctionPointer functionPointer) { this.queueName = queueName; this.functionPointer = functionPointer; for (BClosure closure : functionPointer.getClosureVars()) { closureArgs.add(closure.value()); } }
@Override public BValue copy(Map<BValue, BValue> refs) { return new BClosure(value, type); }
switch (closure.getType().getTag()) { case TypeTags.INT_TAG: { sf.longRegs[longIndex] = ((BInteger) closure.value()).intValue(); newArgRegs[argRegIndex++] = longIndex++; break; sf.intRegs[intIndex] = ((BByte) closure.value()).byteValue(); newArgRegs[argRegIndex++] = intIndex++; break; sf.doubleRegs[doubleIndex] = ((BFloat) closure.value()).floatValue(); newArgRegs[argRegIndex++] = doubleIndex++; break; sf.intRegs[intIndex] = ((BBoolean) closure.value()).booleanValue() ? 1 : 0; newArgRegs[argRegIndex++] = intIndex++; break; sf.stringRegs[stringIndex] = (closure.value()).stringValue(); newArgRegs[argRegIndex++] = stringIndex++; break; sf.refRegs[refIndex] = ((BRefType<?>) closure.value()); newArgRegs[argRegIndex++] = refIndex++;
/** * Invokes a callable function pointer. * * @param functionPointer function pointer * @return return values */ protected BValue[] invokeFunction(BFunctionPointer functionPointer) { List<BValue> lambdaFunctionArgs = new ArrayList<>(); for (BClosure closure : functionPointer.getClosureVars()) { lambdaFunctionArgs.add(closure.value()); } return BVMExecutor.executeFunction(functionPointer.value().getPackageInfo().getProgramFile(), functionPointer.value(), lambdaFunctionArgs.toArray(new BValue[0])); }
switch (type) { case TypeTags.INT_TAG: { fp.addClosureVar(new BClosure(new BInteger(sf.longRegs[index]), BTypes.typeInt), TypeTags.INT_TAG); break; fp.addClosureVar(new BClosure(new BByte((byte) sf.intRegs[index]), BTypes.typeByte), TypeTags.BYTE_TAG); break; fp.addClosureVar(new BClosure(new BFloat(sf.doubleRegs[index]), BTypes.typeFloat), TypeTags.FLOAT_TAG); break; fp.addClosureVar(new BClosure(sf.refRegs[index], BTypes.typeDecimal), TypeTags.DECIMAL_TAG); break; fp.addClosureVar(new BClosure(new BBoolean(sf.intRegs[index] == 1), BTypes.typeBoolean), TypeTags.BOOLEAN_TAG); break; fp.addClosureVar(new BClosure(new BString(sf.stringRegs[index]), BTypes.typeString), TypeTags.STRING_TAG); break; fp.addClosureVar(new BClosure(sf.refRegs[index], BTypes.typeAny), TypeTags.ANY_TAG);
closureArgs.add(closure.value());