Skip to main content

1689. gopy objects misc

What we are porting

Ten files, ~7500 lines combined. The "everything else" of Objects/:

  • Objects/weakrefobject.c: weak references, weakref proxies, callback chains. v0.10 along with cycle GC.
  • Objects/memoryobject.c: memoryview. The buffer-protocol consumer. v0.10.
  • Objects/fileobject.c: small set of file-object helpers (PyFile_WriteObject, PyFile_GetLine). The actual file types come from io/ stdlib; this file is just glue.
  • Objects/picklebufobject.c: PickleBuffer (PEP 574 out-of-band buffer). Used by pickle.dumps with protocol=5.
  • Objects/typevarobject.c: PEP 695 TypeVar, TypeVarTuple, ParamSpec, plus TypeAliasType. Lands when type-params are reachable through real syntax (v0.7 alongside class creation).
  • Objects/unionobject.c: types.UnionType (the result of int | str, PEP 604).
  • Objects/genericaliasobject.c: types.GenericAlias (the result of list[int], PEP 585).
  • Objects/interpolationobject.c: Interpolation (PEP 750 t-string field).
  • Objects/templateobject.c: Template (PEP 750 t-string result type).
  • Objects/obmalloc.c: small-block allocator. Stub only; Go GC does the work.

Why this exists as one spec

These ten files are independent of each other and small. Bundling them keeps the per-spec count manageable. Each gets its own checklist sub-section below.

Phasing

FilePhaseNotes
typevarobject.cv0.7needs class creation
unionobject.cv0.7created by type.__or__
genericaliasobject.cv0.7created by type.__class_getitem__
interpolationobject.cv0.7needed by 1644
templateobject.cv0.7needed by 1644
fileobject.cv0.8needs io/
picklebufobject.cv0.8needs marshal/pickle
weakrefobject.cv0.10needs cycle GC
memoryobject.cv0.10needs buffer protocol everywhere
obmalloc.cv0.10+stub; Go GC subsumes

Go shape (key types)

// WeakRef mirrors PyWeakReference.
type WeakRef struct {
Header
Object Object // strong while alive; cleared on death
Callback Object // optional callback
Hash int64
Prev *WeakRef // intra-list link
Next *WeakRef
}

// MemoryView mirrors PyMemoryViewObject. Wraps a buffer export.
type MemoryView struct {
VarHeader
View BufferView // shape, strides, format, ndim, etc.
Flags uint32
}

// PickleBuffer mirrors PyPickleBufferObject.
type PickleBuffer struct {
Header
View BufferView
}

// TypeVar mirrors PyTypeVarObject.
type TypeVar struct {
Header
Name *Str
Bound Object
Constraints *Tuple
Default Object // PEP 696
InferVariance bool
Covariant bool
Contravariant bool
}

// UnionType mirrors PyUnionObject.
type UnionType struct {
Header
Args *Tuple
Hashable bool
}

// GenericAlias mirrors Py_GenericAlias.
type GenericAlias struct {
Header
Origin Object
Args *Tuple
Parameters *Tuple
Starred bool
}

// Interpolation mirrors string.templatelib.Interpolation.
type Interpolation struct {
Header
Value Object
Expression *Str
Conversion Object // None or 'r'/'s'/'a'
FormatSpec *Str
}

// Template mirrors string.templatelib.Template.
type Template struct {
Header
Strings *Tuple // *Str
Interpolations *Tuple // *Interpolation
}

File mapping

C sourceGo target
Objects/weakrefobject.cobjects/weakref.go
Objects/memoryobject.cobjects/memoryview.go
Objects/fileobject.cobjects/file_glue.go
Objects/picklebufobject.cobjects/picklebuf.go
Objects/typevarobject.cobjects/typevar.go
Objects/unionobject.cobjects/union.go
Objects/genericaliasobject.cobjects/genericalias.go
Objects/interpolationobject.cobjects/interpolation.go
Objects/templateobject.cobjects/template.go
Objects/obmalloc.cobjects/obmalloc_stub.go

Checklist

Status legend: [x] shipped, [ ] pending, [~] partial / scaffold, [n] deferred / not in scope this phase.

typevarobject.c (v0.7)

  • objects/typevar.go: TypeVar, TypeVarTuple, ParamSpec, TypeAliasType, plus the constructor that the INTRINSIC_TYPEVAR opcode calls.
  • PEP 696 default values.
  • Variance flags (covariant, contravariant, infer_variance).

unionobject.c (v0.7)

  • objects/union.go: UnionType, __or__ chain that flattens nested unions, __args__, __parameters__, __hash__ / __eq__ over an order-insensitive set comparison.

genericaliasobject.c (v0.7)

  • objects/genericalias.go: __class_getitem__ factory, __args__, __origin__, __parameters__, __getitem__ for nested subscripts (e.g. list[T][int]).

interpolationobject.c, templateobject.c (v0.7)

  • objects/interpolation.go: PEP 750 Interpolation node.
  • objects/template.go: Template, + concatenation rules, iteration that interleaves strings and interpolations.

fileobject.c (v0.8)

  • objects/file_glue.go: PyFile_WriteObject equivalent (io.write_object_to_file), PyFile_GetLine.

picklebufobject.c (v0.8)

  • objects/picklebuf.go: PickleBuffer with raw / readonly views, used by pickle protocol 5.

weakrefobject.c (v0.10)

  • objects/weakref.go: WeakRef, WeakProxy, weakref callback chain, weakref-list head on Type (tp_weaklistoffset equivalent).
  • Callback fires after __del__, before deallocation.
  • WeakValueDictionary / WeakKeyDictionary helpers.

memoryobject.c (v0.10)

  • objects/memoryview.go: BufferView shape struct, slice semantics, format-string parsing, casting (memoryview.cast), contiguous-vs-strided dispatch.

obmalloc.c (v0.10+)

  • objects/obmalloc_stub.go: PyObject_Malloc, PyObject_Free, PyMem_Malloc, PyMem_Free redirecting to Go's allocator. The free-threaded mimalloc path is N/A.

Surface guarantees

  • weakref.ref(obj)() returns obj while alive, None after death; callback fires once.
  • memoryview(b'abc')[1] == ord('b'); slicing and casting match CPython's strides table.
  • int | str produces a UnionType whose hash matches hash(typing.Union[int, str]) per CPython.
  • list[int].__origin__ is list, list[int].__args__ == (int,).
  • t"hello {name}" produces a Template with .strings == ('hello ', '') and .interpolations[0].expression == 'name'.
  • hash(TypeVar('T')) != hash(TypeVar('T')) (TypeVars are identity-keyed).

Cross-references

  • TypeAlias compile-time path: 1620 codegen (TypeAlias visitor).
  • String parser t-string emission: 1644.
  • Buffer protocol exposers: 1676 (bytes), 1677 (str), 1689 (the consumer side here).

Out of scope

  • _typing accelerator module (separate from typing.py). Stdlib bridge, not part of Objects/.
  • gc module Python surface. The Go-side cycle collector lives in gc/ (1611 series adjacent).