void IRGenerator::accept(ArrayExpr& arrayExpr) { FNTRACE(); // loads a new array of given elements from regs[1] to regs[N], where regs[0] equals N; Value* array = createAlloca(arrayExpr.getType(), get(1 + arrayExpr.values().size())); // store array size at array[0] createArraySet(array, get(0), get(arrayExpr.values().size())); // store array values at array[1] to array[N] for (size_t i = 1, e = 1 + arrayExpr.values().size(); i != e; ++i) { Value* element = codegen(arrayExpr.values()[i].get()); createArraySet(array, get(i), element); } result_ = array; }
void IRGenerator::accept(ArrayExpr& arrayExpr) { FNTRACE(); std::vector<Value*> values; for (size_t i = 0, e = arrayExpr.values().size(); i != e; ++i) { Value* element = codegen(arrayExpr.values()[i].get()); values.push_back(element); } if (isConstant(values)) { std::vector<Constant*> constants; for (Value* value: values) constants.push_back(static_cast<Constant*>(value)); result_ = get(constants); } else { // TODO: print line:col hint where this exact message occured. // via: reportError(arrayExpr, "Variable array elements not allowed."); reportError("Variable array elements not allowed."); result_ = nullptr; } }
void FlowCallVisitor::accept(ArrayExpr& array) { for (const auto& e: array.values()) { visit(e.get()); } }