M src/backends/LLVMModule.cpp +5 -4
@@ 338,23 338,24 @@ namespace K3 {
auto slotI = globalSymbolTable.find(gv.second.uid);
auto slotIndex = slotI != globalSymbolTable.end() ? std::int32_t(slotI->second) : -1;
- bool noDefaultVal =
+ bool constructorParameter =
((gv.second.varType == External ||
gv.second.varType == Configuration)
&& globalKeyTable.find(gv.first) != globalKeyTable.end());
-
+
if (slotIndex >= 0) {
std::stringstream driverName;
if (gv.second.varType == Stream) {
gv.second.clock.OutputText(driverName);
}
- cppHeader.DeclareSlot(sym.str(), slotIndex, gv.second.data, noDefaultVal, driverName.str());
+ cppHeader.DeclareSlot(sym.str(), slotIndex, gv.second.data, constructorParameter, driverName.str());
}
if (trigger != inputCall.end()) {
cppHeader.DeclareDriver(trigger->second->getName());
}
-
+
+ bool noDefaultVal = constructorParameter || gv.second.varType == UnsafeExternal;
symTableEntry.emplace_back(
ConstantStruct::get(symTy, {
M src/backends/LLVMModule.h +3 -3
@@ 149,7 149,7 @@ namespace K3 {
<< wrapperName << "(" << wrapperName << " const&) = delete;\n\t"
<< wrapperName << "(" << wrapperName << "&& from) { instance = from.instance; from.instance = nullptr; };\n\t"
<< "void operator=(" << wrapperName << " const&) = delete;\n\t"
- << wrapperName << "& operator=(" << wrapperName << "&& from) { auto tmp = from.instance; from.instance = instance; instance = tmp; }\n"
+ << wrapperName << "& operator=(" << wrapperName << "&& from) { auto tmp = from.instance; from.instance = instance; instance = tmp; return *this; }\n"
// << "#endif\n"
"\n";
@@ 236,12 236,12 @@ namespace K3 {
std::vector<ConfigValue> configSlots;
- void DeclareSlot(std::string slotName, int slotIndex, const Type& inputType, bool nodefault, std::string streamingDriver) {
+ void DeclareSlot(std::string slotName, int slotIndex, const Type& inputType, bool constructorParameter, std::string streamingDriver) {
if (header.is_open()) {
auto typeName = GenerateType(className + slotName + "InputType", inputType);
auto cName = CSymbolize(slotName);
- if (nodefault) {
+ if (constructorParameter) {
header << "\n// You must set this before calling `" << className << "Initialize()`\n";
configSlots.push_back(ConfigValue{ typeName, cName });
header << "static void " << className << "Configure" << cName << "(const " << typeName << "* data) { \n\t"
M src/k3/DynamicVariables.cpp +2 -2
@@ 47,8 47,8 @@ namespace K3 {
key.result.Fix(),
std::make_pair(1,1),
nullptr,
- External),
- initType);
+ UnsafeExternal),
+ initType);
}
if (spec.mode == SpecializationState::Configuration) {
M src/k3/DynamicVariables.h +1 -0
@@ 23,6 23,7 @@ namespace K3 {
Internal,
External,
Stream,
+ UnsafeExternal,
NumVarTypes
};