From ac74943f2687a2c4ad7f0bf1250598b85330f60f Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Fri, 10 Dec 2021 09:32:42 -0800 Subject: [PATCH] fixes for vector operations --- src/script_opt/CPP/Exprs.cc | 18 +++++++++++++++--- src/script_opt/CPP/RuntimeVec.h | 5 +++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/script_opt/CPP/Exprs.cc b/src/script_opt/CPP/Exprs.cc index fcb0d1bd74..ae7e7a6489 100644 --- a/src/script_opt/CPP/Exprs.cc +++ b/src/script_opt/CPP/Exprs.cc @@ -603,7 +603,7 @@ string CPPCompile::GenArithCoerceExpr(const Expr* e, GenType gt) } if ( is_vec ) - return string("vec_coerce_") + cast_name + "__CPP(" + GenExpr(op, GEN_NATIVE) + ", " + + return string("vec_coerce_to_") + cast_name + "__CPP(" + GenExpr(op, GEN_NATIVE) + ", " + GenTypeName(t) + ")"; return NativeToGT(cast_name + "(" + GenExpr(op, GEN_NATIVE) + ")", t, gt); @@ -784,7 +784,7 @@ string CPPCompile::GenBinary(const Expr* e, GenType gt, const char* op, const ch if ( t->Tag() == TYPE_VECTOR && t->Yield()->Tag() == TYPE_STRING && op2->GetType()->Tag() == TYPE_VECTOR ) - return string("vec_str_op_") + vec_op + "__CPP(" + gen1 + ", " + gen2 + ")"; + return string("str_vec_op_") + vec_op + "__CPP(" + gen1 + ", " + gen2 + ")"; return GenVectorOp(e, gen1, gen2, vec_op); } @@ -1103,9 +1103,21 @@ string CPPCompile::GenVectorOp(const Expr* e, string op, const char* vec_op) string CPPCompile::GenVectorOp(const Expr* e, string op1, string op2, const char* vec_op) { + auto& op1_t = e->GetOp1()->GetType(); + auto& op2_t = e->GetOp2()->GetType(); + + if ( op1_t->Tag() != TYPE_VECTOR || op2_t->Tag() != TYPE_VECTOR ) + { + // This is a deprecated mixed-scalar-and-vector operation. + // We don't support these. Arrange for linking errors. + reporter->Error( + "C++ generation does not support deprecated scalar-mixed-with-vector operations"); + return "vec_scalar_mixed_with_vector()"; + } + auto invoke = string(vec_op) + "__CPP(" + op1 + ", " + op2 + ")"; - if ( e->GetOp1()->GetType()->Yield()->Tag() == TYPE_STRING ) + if ( op2_t->Yield()->Tag() == TYPE_STRING ) return string("str_vec_op_") + invoke; auto gen = string("vec_op_") + invoke; diff --git a/src/script_opt/CPP/RuntimeVec.h b/src/script_opt/CPP/RuntimeVec.h index 918bee2c49..96cc1cfc67 100644 --- a/src/script_opt/CPP/RuntimeVec.h +++ b/src/script_opt/CPP/RuntimeVec.h @@ -80,4 +80,9 @@ extern VectorValPtr vec_coerce_to_bro_int_t__CPP(const VectorValPtr& v, TypePtr extern VectorValPtr vec_coerce_to_bro_uint_t__CPP(const VectorValPtr& v, TypePtr targ); extern VectorValPtr vec_coerce_to_double__CPP(const VectorValPtr& v, TypePtr targ); +// A dummy function used during code generation for unsupported operations +// that mix vector and scalar arguments. We don't define it in RuntimeVec.cc +// so that it'll generate a linking error. +extern VectorValPtr vec_scalar_mixed_with_vector(); + } // namespace zeek::detail