-
Notifications
You must be signed in to change notification settings - Fork 358
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: generate go1.21 files * chore: update CI * feat: add support for generic symbols in standard library packages This is necessary to fully support go1.21 and beyond, which now provide some generic packages such as `cmp`, `maps` or `slices` in the standard library. The principle is to embed the generic symbols in source form (as strings) so they can be instantiated as required during interpretation. Extract() has been modified to skip the generic types, functions and constraint interfaces which can't be represented as reflect.Values. A new stdlib/generic package has been added to provide the corresponding source files as embedded strings. The `Use()` function has been changed to pre-parse generic symbols as doing lazy parsing was causing cyclic dependencies issues at compiling. This is something we may improve in the future. A unit test using `cmp` has been added. For now, there are still some issues with generic stdlib packages inter-dependencies, for example `slices` importing `cmp`, or when generic types or function signatures depends on pre-compiled types in the same package, which we will support shortly. * fixup * fixup * fixup * fixup * fixup * fixup * fixes for go1.20 * fix previous * update unsafe2 for go1.21, skip faky tests In go1.21, the reflect rtype definition has been move to internal/abi. We follow this change for maintainability, even if there is no layout change (the go1.20 unsafe2 is compatible with go1.21). We have isolated a few problematic tests which are failing sometimes in go1.21, but work in go1.20, and also in go1.22. Those tests are skipped if in go1.21. A preliminary investigation can not confirm that something is wrong in yaegi, and the problem disappears with go1.22. * add new wrapper for go1.21 package testing/slogtest * add missing wrapper for go/doc/comment * add support for slices generic package --------- Co-authored-by: Marc Vertes <mvertes@free.fr>
- Loading branch information
Showing
540 changed files
with
7,711 additions
and
4,114 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,7 +6,7 @@ on: | |
- v[0-9]+.[0-9]+* | ||
|
||
env: | ||
GO_VERSION: '1.20' | ||
GO_VERSION: '1.21' | ||
|
||
jobs: | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
module github.com/traefik/yaegi | ||
|
||
go 1.19 | ||
go 1.20 |
3 changes: 3 additions & 0 deletions
3
internal/unsafe2/unsafe.go → internal/unsafe2/go1_20_unsafe.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
//go:build go1.21 | ||
// +build go1.21 | ||
|
||
// Package unsafe2 provides helpers to generate recursive struct types. | ||
package unsafe2 | ||
|
||
import ( | ||
"reflect" | ||
"unsafe" | ||
) | ||
|
||
type dummy struct{} | ||
|
||
// DummyType represents a stand-in for a recursive type. | ||
var DummyType = reflect.TypeOf(dummy{}) | ||
|
||
// The following type sizes must match their original definition in Go src/internal/abi/type.go. | ||
type abiType struct { | ||
_ uintptr | ||
_ uintptr | ||
_ uint32 | ||
_ uint8 | ||
_ uint8 | ||
_ uint8 | ||
_ uint8 | ||
_ uintptr | ||
_ uintptr | ||
_ int32 | ||
_ int32 | ||
} | ||
|
||
type abiName struct { | ||
Bytes *byte | ||
} | ||
|
||
type abiStructField struct { | ||
Name abiName | ||
Typ *abiType | ||
Offset uintptr | ||
} | ||
|
||
type abiStructType struct { | ||
abiType | ||
PkgPath abiName | ||
Fields []abiStructField | ||
} | ||
|
||
type emptyInterface struct { | ||
typ *abiType | ||
_ unsafe.Pointer | ||
} | ||
|
||
// SetFieldType sets the type of the struct field at the given index, to the given type. | ||
// | ||
// The struct type must have been created at runtime. This is very unsafe. | ||
func SetFieldType(s reflect.Type, idx int, t reflect.Type) { | ||
if s.Kind() != reflect.Struct || idx >= s.NumField() { | ||
return | ||
} | ||
|
||
rtyp := unpackType(s) | ||
styp := (*abiStructType)(unsafe.Pointer(rtyp)) | ||
f := styp.Fields[idx] | ||
f.Typ = unpackType(t) | ||
styp.Fields[idx] = f | ||
} | ||
|
||
func unpackType(t reflect.Type) *abiType { | ||
v := reflect.New(t).Elem().Interface() | ||
eface := *(*emptyInterface)(unsafe.Pointer(&v)) | ||
return eface.typ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
//go:build go1.20 && !go1.21 | ||
// +build go1.20,!go1.21 | ||
|
||
package generic | ||
|
||
var Sources = []string{} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// Copyright 2023 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// Package cmp provides types and functions related to comparing | ||
// ordered values. | ||
package cmp | ||
|
||
// Ordered is a constraint that permits any ordered type: any type | ||
// that supports the operators < <= >= >. | ||
// If future releases of Go add new ordered types, | ||
// this constraint will be modified to include them. | ||
// | ||
// Note that floating-point types may contain NaN ("not-a-number") values. | ||
// An operator such as == or < will always report false when | ||
// comparing a NaN value with any other value, NaN or not. | ||
// See the [Compare] function for a consistent way to compare NaN values. | ||
type Ordered interface { | ||
~int | ~int8 | ~int16 | ~int32 | ~int64 | | ||
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | | ||
~float32 | ~float64 | | ||
~string | ||
} | ||
|
||
// Less reports whether x is less than y. | ||
// For floating-point types, a NaN is considered less than any non-NaN, | ||
// and -0.0 is not less than (is equal to) 0.0. | ||
func Less[T Ordered](x, y T) bool { | ||
return (isNaN(x) && !isNaN(y)) || x < y | ||
} | ||
|
||
// Compare returns | ||
// | ||
// -1 if x is less than y, | ||
// 0 if x equals y, | ||
// +1 if x is greater than y. | ||
// | ||
// For floating-point types, a NaN is considered less than any non-NaN, | ||
// a NaN is considered equal to a NaN, and -0.0 is equal to 0.0. | ||
func Compare[T Ordered](x, y T) int { | ||
xNaN := isNaN(x) | ||
yNaN := isNaN(y) | ||
if xNaN && yNaN { | ||
return 0 | ||
} | ||
if xNaN || x < y { | ||
return -1 | ||
} | ||
if yNaN || x > y { | ||
return +1 | ||
} | ||
return 0 | ||
} | ||
|
||
// isNaN reports whether x is a NaN without requiring the math package. | ||
// This will always return false if T is not floating-point. | ||
func isNaN[T Ordered](x T) bool { | ||
return x != x | ||
} |
Oops, something went wrong.