• Keith Randall's avatar
    cmd/compile: do more type conversion inline · 688995d1
    Keith Randall authored
    The code to do the conversion is smaller than the
    call to the runtime.
    The 1-result asserts need to call panic if they fail, but that
    code is out of line.
    
    The only conversions left in the runtime are those which
    might allocate and those which might need to generate an itab.
    
    Given the following types:
      type E interface{}
      type I interface { foo() }
      type I2 iterface { foo(); bar() }
      type Big [10]int
      func (b Big) foo() { ... }
    
    This CL inlines the following conversions:
    
    was assertE2T
      var e E = ...
      b := i.(Big)
    was assertE2T2
      var e E = ...
      b, ok := i.(Big)
    was assertI2T
      var i I = ...
      b := i.(Big)
    was assertI2T2
      var i I = ...
      b, ok := i.(Big)
    was assertI2E
      var i I = ...
      e := i.(E)
    was assertI2E2
      var i I = ...
      e, ok := i.(E)
    
    These are the remaining runtime calls:
    
    convT2E:
      var b Big = ...
      var e E = b
    convT2I:
      var b Big = ...
      var i I = b
    convI2I:
      var i2 I2 = ...
      var i I = i2
    assertE2I:
      var e E = ...
      i := e.(I)
    assertE2I2:
      var e E = ...
      i, ok := e.(I)
    assertI2I:
      var i I = ...
      i2 := i.(I2)
    assertI2I2:
      var i I = ...
      i2, ok := i.(I2)
    
    Fixes #17405
    Fixes #8422
    
    Change-Id: Ida2367bf8ce3cd2c6bb599a1814f1d275afabe21
    Reviewed-on: https://go-review.googlesource.com/32313
    Run-TryBot: Keith Randall <khr@golang.org>
    Reviewed-by: 's avatarDavid Chase <drchase@google.com>
    688995d1
racewalk.go 14 KB