(enginep, foldp unsafe.Pointer)
| 569 | } |
| 570 | |
| 571 | func ensureEngine(enginep, foldp unsafe.Pointer) *valueFold { |
| 572 | fold := (*valueFold)(foldp) |
| 573 | if fold.engine != nil { |
| 574 | if fold.init.IsValid() { |
| 575 | initGoType(fold) |
| 576 | } |
| 577 | return fold |
| 578 | } |
| 579 | |
| 580 | if enginep == nilPtr { |
| 581 | panic("accessing value without an engine pointer; who created the value?") |
| 582 | } |
| 583 | engine := engines[enginep] |
| 584 | if engine == nil { |
| 585 | panic("unknown engine pointer; who created the engine?") |
| 586 | } |
| 587 | fold.engine = engine |
| 588 | prev := engine.values[fold.gvalue] |
| 589 | if prev != nil { |
| 590 | for prev.next != nil { |
| 591 | prev = prev.next |
| 592 | } |
| 593 | prev.next = fold |
| 594 | fold.prev = prev |
| 595 | } else { |
| 596 | engine.values[fold.gvalue] = fold |
| 597 | } |
| 598 | before := len(typeNew) |
| 599 | delete(typeNew, fold) |
| 600 | if len(typeNew) == before { |
| 601 | panic("value had no engine, but was not created by a registered type; who created the value?") |
| 602 | } |
| 603 | initGoType(fold) |
| 604 | return fold |
| 605 | } |
| 606 | |
| 607 | func initGoType(fold *valueFold) { |
| 608 | if cdata.Ref() == atomic.LoadUintptr(&guiPaintRef) { |
no test coverage detected