Runtime/Behavior Changes

Motivation:

  • Cleanup of messy conditional code
  • Speedup for common cases
  • Allow widening conversions (for instance double = int) in assign to make PropObj behave more as the cm language in general.

PropDef.adjusted() is extremely central to all customization code and we need to keep a thorough lookout for any trouble. If any trouble arises, the following debug-tools have been prepared:

  • The original adjusted() remains in PropDef as deprecated_adjusted().
  • cm.props propDef.cm has a tracing constant: private const bool dbg_trace_put = true;
  • PropObj has a deprecated_put()
  • PropObj has a compare_put() which runs both new and old versions to pinpoint what potentially differs
use cm.props, cm.subset, cm.basic;
private class T1 extends PropObj {
    public props {
	double "w" v=0.2 : domain=DoubleEnum(0.2, 0.4);
	distance "d" v=0.3 : domain=DistanceEnum(0.3, 0.5);
	distance "e" v=distance(0.3) : domain=DistanceEnum(0.3, 0.5);
    }
}

{
    T1 z();
    pln(#z."w");
    z."w" = 1; // uses the new PropDef adjusted which allows us to widen Int(1) -> double PropDef field
    pln(#z."w");
    pln(#z."w".class);
}
output:
  z."w"=0.2
  z."w"=1
  z."w".class=Double

{
    T1 z();
    pln(#z."w");
    z.deprecated_put("w", 1); // same behavior as in 10.5
    pln(#z."w");
    pln(#z."w".class);
}
output:
  z."w"=0.2
    PropDef(double w [ reg boxClass=Double]).depr_adj() null value or wrong boxClass double=1.Int, pType.boxClass=Double
  z."w"=0.2
  z."w".class=Double

Upgraded error reporting

{
    T1 z();
    pln(#z."w");
    z."w" = "ddd"; // "w" is a double field
}
output:
  z."w"=0.2
    PropDef(double w [ reg boxClass=Double]).adjusted() value type mismatch: double=ddd.Str

Extended tracing and compare put

cm.props propDef.cm
private const bool dbg_trace_put = true;
{
    T1 z();
    pln(#z."w");
    z."w" = 1;
    pln(z.compare_put("w", "dd"));
}
output:
  z."w"=0.2
  compare_put:
    new
      PropDef(double w [ reg boxClass=Double]).adjusted() value type mismatch: double=dd.Str
    old
      PropDef(double w [ reg boxClass=Double]).depr_adj() null value or wrong boxClass double=dd.Str, pType.boxClass=Double
    new=dd
    OLD=dd
  <dd, dd>
{
    T1 z();
    pln(#z."w");
    z."w" = 1;
    pln(z.compare_put("w", Byte(2)));
}
output:
  z."w"=0.2
  compare_put:
    new
    old
      PropDef(double w [ reg boxClass=Double]).depr_adj() null value or wrong boxClass double=2.Byte, pType.boxClass=Double
    new=2
    OLD=2
  <2, 2>

If you wish to add your own widening conversions to PropDef.put(), please contact dev support.

Supported widening conversions

private Object angleF_sangleF_widener(Object z)
private Object angleF_sangleF_widener(Object z)
private Object angle_orientation_widener(Object z)
private Object angle_orientation_widener(Object z)
private Object angle_sangle_widener(Object z)
private Object angle_sangle_widener(Object z)
private Object byte_double_widener(Object z)
private Object byte_double_widener(Object z)
private Object byte_float_widener(Object z)
private Object byte_float_widener(Object z)
private Object byte_int16_widener(Object z)
private Object byte_int16_widener(Object z)
private Object byte_int64_widener(Object z)
private Object byte_int64_widener(Object z)
private Object byte_int_widener(Object z)
private Object byte_int_widener(Object z)
private Object byte_nat64_widener(Object z)
private Object byte_nat64_widener(Object z)
private Object byte_nat_widener(Object z)
private Object byte_nat_widener(Object z)
private Object byte_word_widener(Object z)
private Object byte_word_widener(Object z)
private Object color_colorF_widener(Object z)
private Object color_colorF_widener(Object z)
private Object distance_double_widener(Object z)
private Object distance_double_widener(Object z)
private Object float_double_widener(Object z)
private Object float_double_widener(Object z)
private Object int16_double_widener(Object z)
private Object int16_double_widener(Object z)
private Object int16_float_widener(Object z)
private Object int16_float_widener(Object z)
private Object int16_int64_widener(Object z)
private Object int16_int64_widener(Object z)
private Object int16_int_widener(Object z)
private Object int16_int_widener(Object z)
private Object int16_nat64_widener(Object z)
private Object int16_nat64_widener(Object z)
private Object int64_double_widener(Object z)
private Object int64_double_widener(Object z)
private Object int8_double_widener(Object z)
private Object int8_double_widener(Object z)
private Object int8_float_widener(Object z)
private Object int8_float_widener(Object z)
private Object int8_int16_widener(Object z)
private Object int8_int16_widener(Object z)
private Object int8_int64_widener(Object z)
private Object int8_int64_widener(Object z)
private Object int8_int_widener(Object z)
private Object int8_int_widener(Object z)
private Object int8_nat64_widener(Object z)
private Object int8_nat64_widener(Object z)
private Object int_double_widener(Object z)
private Object int_double_widener(Object z)
private Object int_float_widener(Object z)
private Object int_float_widener(Object z)
private Object int_int64_widener(Object z)
private Object int_int64_widener(Object z)
private Object int_nat64_widener(Object z)
private Object int_nat64_widener(Object z)
private Object nat_double_widener(Object z)
private Object nat_double_widener(Object z)
private Object nat_float_widener(Object z)
private Object nat_float_widener(Object z)
private Object nat_int64_widener(Object z)
private Object nat_int64_widener(Object z)
private Object nat_nat64_widener(Object z)
private Object nat_nat64_widener(Object z)
private Object point2D_rect_widener(Object z)
private Object point2D_rect_widener(Object z)
private Object point2D_size2D_widener(Object z)
private Object point2D_size2D_widener(Object z)
private Object pointI_point2D_widener(Object z)
private Object pointI_point2D_widener(Object z)
private Object pointI_rect_widener(Object z)
private Object pointI_rect_widener(Object z)
private Object pointI_size2D_widener(Object z)
private Object pointI_size2D_widener(Object z)
private Object point_colorF_widener(Object z)
private Object point_colorF_widener(Object z)
private Object point_color_widener(Object z)
private Object point_color_widener(Object z)
private Object point_version_widener(Object z)
private Object point_version_widener(Object z)
private Object rangeI_range_widener(Object z)
private Object rangeI_range_widener(Object z)
private Object size2D_rect_widener(Object z)
private Object size2D_rect_widener(Object z)
private Object word_double_widener(Object z)
private Object word_double_widener(Object z)
private Object word_float_widener(Object z)
private Object word_float_widener(Object z)
private Object word_int64_widener(Object z)
private Object word_int64_widener(Object z)
private Object word_int_widener(Object z)
private Object word_int_widener(Object z)
private Object word_nat64_widener(Object z)
private Object word_nat64_widener(Object z)
private Object word_nat_widener(Object z)
private Object word_nat_widener(Object z)