Merge remote-tracking branch 'origin/master' into j2/progress

This commit is contained in:
Tyler Wilding
2022-09-27 23:00:22 -04:00
170 changed files with 57997 additions and 18336 deletions
+29 -1
View File
@@ -149,7 +149,7 @@ Form* try_cast_simplify(Form* in,
if (div * METER_LENGTH == *fc) {
return pool.form<GenericElement>(
GenericOperator::make_function(pool.form<ConstantTokenElement>("meters")),
pool.form<ConstantFloatElement>(div));
pool.form<ConstantTokenElement>(float_to_string(div, false)));
} else {
lg::error("Floating point value {} could not be converted to meters.", *fc);
}
@@ -1575,6 +1575,31 @@ void SimpleExpressionElement::update_from_stack_vector_plus_minus_cross(
result->push_back(new_form);
}
void SimpleExpressionElement::update_from_stack_vector_plus_float_times(
const Env& env,
FormPool& pool,
FormStack& stack,
std::vector<FormElement*>* result,
bool allow_side_effects) {
std::vector<Form*> popped_args = pop_to_forms({m_expr.get_arg(0).var(), m_expr.get_arg(1).var(),
m_expr.get_arg(2).var(), m_expr.get_arg(3).var()},
env, pool, stack, allow_side_effects);
for (int i = 0; i < 4; i++) {
auto arg_type = env.get_types_before_op(m_my_idx).get(m_expr.get_arg(i).var().reg());
TypeSpec desired_type(i == 3 ? "float" : "vector");
if (arg_type.typespec() != desired_type) {
popped_args.at(i) = cast_form(popped_args.at(i), desired_type, pool, env);
}
}
auto new_form = pool.alloc_element<GenericElement>(
GenericOperator::make_fixed(FixedOperatorKind::VECTOR_PLUS_FLOAT_TIMES),
std::vector<Form*>{popped_args.at(0), popped_args.at(1), popped_args.at(2),
popped_args.at(3)});
result->push_back(new_form);
}
void SimpleExpressionElement::update_from_stack_vector_float_product(
const Env& env,
FormPool& pool,
@@ -2472,6 +2497,9 @@ void SimpleExpressionElement::update_from_stack(const Env& env,
update_from_stack_vectors_in_common(FixedOperatorKind::VECTOR_LENGTH, env, pool, stack,
result, allow_side_effects);
break;
case SimpleExpression::Kind::VECTOR_PLUS_FLOAT_TIMES:
update_from_stack_vector_plus_float_times(env, pool, stack, result, allow_side_effects);
break;
default:
throw std::runtime_error(
fmt::format("SimpleExpressionElement::update_from_stack NYI for {}", to_string(env)));