goscript 0.0.37 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/analysis.go +129 -8
- package/compiler/compiler.go +4 -1
- package/compiler/composite-lit.go +2 -4
- package/compiler/expr-call.go +12 -0
- package/compiler/lit.go +100 -6
- package/compiler/protobuf.go +2 -2
- package/compiler/spec-value.go +3 -3
- package/compiler/spec.go +6 -3
- package/compiler/stmt-assign.go +1 -1
- package/dist/gs/builtin/builtin.d.ts +45 -0
- package/dist/gs/builtin/builtin.js +197 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.js +2 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.d.ts +56 -0
- package/dist/gs/bytes/buffer.gs.js +611 -0
- package/dist/gs/bytes/buffer.gs.js.map +1 -0
- package/dist/gs/bytes/bytes.gs.d.ts +78 -0
- package/dist/gs/bytes/bytes.gs.js +1011 -0
- package/dist/gs/bytes/bytes.gs.js.map +1 -0
- package/dist/gs/bytes/index.d.ts +4 -0
- package/dist/gs/bytes/index.js +5 -0
- package/dist/gs/bytes/index.js.map +1 -0
- package/dist/gs/bytes/iter.gs.d.ts +9 -0
- package/dist/gs/bytes/iter.gs.js +143 -0
- package/dist/gs/bytes/iter.gs.js.map +1 -0
- package/dist/gs/bytes/reader.gs.d.ts +34 -0
- package/dist/gs/bytes/reader.gs.js +198 -0
- package/dist/gs/bytes/reader.gs.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +182 -23
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/go113.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/index.d.ts +3 -3
- package/dist/gs/github.com/pkg/errors/index.js +3 -3
- package/dist/gs/github.com/pkg/errors/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js +8 -5
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/internal/abi/index.d.ts +20 -0
- package/dist/gs/internal/abi/index.js +20 -0
- package/dist/gs/internal/abi/index.js.map +1 -0
- package/dist/gs/internal/bytealg/index.d.ts +14 -0
- package/dist/gs/internal/bytealg/index.js +139 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -0
- package/dist/gs/internal/byteorder/index.d.ts +1 -1
- package/dist/gs/internal/byteorder/index.js +4 -4
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/math/index.d.ts +44 -44
- package/dist/gs/math/index.js +44 -44
- package/dist/gs/math/index.js.map +1 -1
- package/dist/gs/os/index.d.ts +19 -19
- package/dist/gs/os/index.js +19 -19
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/reflect/deepequal.d.ts +2 -0
- package/dist/gs/reflect/deepequal.js +91 -0
- package/dist/gs/reflect/deepequal.js.map +1 -0
- package/dist/gs/reflect/index.d.ts +8 -0
- package/dist/gs/reflect/index.js +10 -0
- package/dist/gs/reflect/index.js.map +1 -0
- package/dist/gs/reflect/iter.d.ts +4 -0
- package/dist/gs/reflect/iter.js +24 -0
- package/dist/gs/reflect/iter.js.map +1 -0
- package/dist/gs/reflect/map.d.ts +20 -0
- package/dist/gs/reflect/map.js +74 -0
- package/dist/gs/reflect/map.js.map +1 -0
- package/dist/gs/reflect/swapper.d.ts +2 -0
- package/dist/gs/reflect/swapper.js +46 -0
- package/dist/gs/reflect/swapper.js.map +1 -0
- package/dist/gs/reflect/type.d.ts +134 -0
- package/dist/gs/reflect/type.js +825 -0
- package/dist/gs/reflect/type.js.map +1 -0
- package/dist/gs/reflect/types.d.ts +90 -0
- package/dist/gs/reflect/types.js +119 -0
- package/dist/gs/reflect/types.js.map +1 -0
- package/dist/gs/reflect/value.d.ts +13 -0
- package/dist/gs/reflect/value.js +202 -0
- package/dist/gs/reflect/value.js.map +1 -0
- package/dist/gs/reflect/visiblefields.d.ts +4 -0
- package/dist/gs/reflect/visiblefields.js +149 -0
- package/dist/gs/reflect/visiblefields.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +6 -6
- package/dist/gs/strconv/index.js +6 -6
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/index.d.ts +1 -1
- package/dist/gs/strings/index.js +1 -1
- package/dist/gs/strings/index.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/index.d.ts +4 -4
- package/dist/gs/sync/atomic/index.js +4 -4
- package/dist/gs/sync/atomic/index.js.map +1 -1
- package/dist/gs/syscall/index.d.ts +6 -6
- package/dist/gs/syscall/index.js +34 -28
- package/dist/gs/syscall/index.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +1 -1
- package/dist/gs/unicode/utf8/utf8.js +4 -2
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unsafe/unsafe.js.map +1 -1
- package/gs/builtin/builtin.ts +219 -0
- package/gs/builtin/slice.ts +2 -1
- package/gs/bytes/buffer.gs.ts +614 -0
- package/gs/bytes/bytes.gs.ts +1180 -0
- package/gs/bytes/godoc.txt +69 -0
- package/gs/bytes/index.ts +69 -0
- package/gs/bytes/iter.gs.ts +149 -0
- package/gs/bytes/reader.gs.ts +230 -0
- package/gs/github.com/pkg/errors/errors.ts +408 -238
- package/gs/github.com/pkg/errors/go113.ts +5 -6
- package/gs/github.com/pkg/errors/index.ts +12 -3
- package/gs/github.com/pkg/errors/stack.ts +107 -105
- package/gs/internal/abi/index.ts +37 -0
- package/gs/internal/bytealg/index.ts +149 -0
- package/gs/internal/byteorder/index.ts +5 -5
- package/gs/math/abs.gs.test.ts +1 -1
- package/gs/math/acosh.gs.test.ts +4 -2
- package/gs/math/asin.gs.test.ts +1 -1
- package/gs/math/asinh.gs.test.ts +7 -3
- package/gs/math/atan.gs.test.ts +1 -1
- package/gs/math/atan2.gs.test.ts +17 -9
- package/gs/math/atanh.gs.test.ts +1 -1
- package/gs/math/bits.gs.test.ts +1 -1
- package/gs/math/cbrt.gs.test.ts +1 -1
- package/gs/math/const.gs.test.ts +34 -8
- package/gs/math/copysign.gs.test.ts +7 -3
- package/gs/math/dim.gs.test.ts +19 -7
- package/gs/math/erf.gs.test.ts +1 -1
- package/gs/math/erfinv.gs.test.ts +4 -2
- package/gs/math/exp.gs.test.ts +1 -1
- package/gs/math/expm1.gs.test.ts +6 -4
- package/gs/math/floor.gs.test.ts +17 -4
- package/gs/math/fma.gs.test.ts +53 -53
- package/gs/math/frexp.gs.test.ts +112 -117
- package/gs/math/gamma.gs.test.ts +1 -1
- package/gs/math/hypot.gs.test.ts +53 -53
- package/gs/math/index.ts +80 -44
- package/gs/math/j0.gs.test.ts +6 -2
- package/gs/math/j1.gs.test.ts +6 -2
- package/gs/math/jn.gs.test.ts +9 -5
- package/gs/math/ldexp.gs.test.ts +103 -86
- package/gs/math/lgamma.gs.test.ts +10 -10
- package/gs/math/log.gs.test.ts +1 -1
- package/gs/math/log10.gs.test.ts +1 -1
- package/gs/math/log1p.gs.test.ts +2 -2
- package/gs/math/logb.gs.test.ts +1 -1
- package/gs/math/mod.gs.test.ts +2 -2
- package/gs/math/modf.gs.test.ts +7 -7
- package/gs/math/nextafter.gs.test.ts +9 -7
- package/gs/math/pow.gs.test.ts +6 -4
- package/gs/math/pow10.gs.test.ts +1 -1
- package/gs/math/remainder.gs.test.ts +1 -1
- package/gs/math/signbit.gs.test.ts +1 -1
- package/gs/math/sin.gs.test.ts +1 -1
- package/gs/math/sincos.gs.test.ts +33 -14
- package/gs/math/sinh.gs.test.ts +1 -1
- package/gs/math/sqrt.gs.test.ts +1 -1
- package/gs/math/tan.gs.test.ts +3 -3
- package/gs/math/tanh.gs.test.ts +1 -1
- package/gs/os/index.ts +128 -19
- package/gs/reflect/ANALYSIS.md +278 -0
- package/gs/reflect/deepequal.test.ts +41 -0
- package/gs/reflect/deepequal.ts +169 -0
- package/gs/reflect/function-types.test.ts +146 -0
- package/gs/reflect/godoc.txt +67 -0
- package/gs/reflect/index.ts +83 -0
- package/gs/reflect/iter.ts +44 -0
- package/gs/reflect/map.test.ts +30 -0
- package/gs/reflect/map.ts +85 -0
- package/gs/reflect/swapper.ts +52 -0
- package/gs/reflect/type.ts +1016 -0
- package/gs/reflect/types.ts +214 -0
- package/gs/reflect/value.ts +270 -0
- package/gs/reflect/visiblefields.ts +177 -0
- package/gs/strconv/index.ts +39 -6
- package/gs/strings/index.ts +7 -1
- package/gs/strings/replace.ts +1 -9
- package/gs/sync/atomic/index.ts +53 -4
- package/gs/syscall/index.ts +45 -37
- package/gs/unicode/utf8/utf8.ts +8 -5
- package/gs/unsafe/unsafe.ts +1 -1
- package/package.json +2 -1
- package/dist/gs/internal/testlog/index.d.ts +0 -1
- package/dist/gs/internal/testlog/index.js +0 -5
- package/dist/gs/internal/testlog/index.js.map +0 -1
- package/dist/gs/maps/iter.gs.d.ts +0 -7
- package/dist/gs/maps/iter.gs.js +0 -65
- package/dist/gs/maps/iter.gs.js.map +0 -1
- package/dist/gs/maps/maps.gs.d.ts +0 -7
- package/dist/gs/maps/maps.gs.js +0 -79
- package/dist/gs/maps/maps.gs.js.map +0 -1
- package/dist/gs/stringslite/index.d.ts +0 -1
- package/dist/gs/stringslite/index.js +0 -2
- package/dist/gs/stringslite/index.js.map +0 -1
- package/dist/gs/stringslite/strings.d.ts +0 -11
- package/dist/gs/stringslite/strings.js +0 -67
- package/dist/gs/stringslite/strings.js.map +0 -1
- package/gs/internal/testlog/index.ts +0 -7
|
@@ -0,0 +1,1016 @@
|
|
|
1
|
+
import { ReflectValue, ChanDir, StructField } from './types.js'
|
|
2
|
+
import { MapIter } from './map.js'
|
|
3
|
+
|
|
4
|
+
// rtype is the common implementation of most values
|
|
5
|
+
export class rtype {
|
|
6
|
+
constructor(public kind: Kind) {}
|
|
7
|
+
|
|
8
|
+
Kind(): Kind {
|
|
9
|
+
return this.kind
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
String(): string {
|
|
13
|
+
return this.kind.String()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
Pointers(): boolean {
|
|
17
|
+
// Return true for pointer-like types
|
|
18
|
+
const k = this.kind.valueOf()
|
|
19
|
+
return (
|
|
20
|
+
k === Ptr.valueOf() ||
|
|
21
|
+
k === Map.valueOf() ||
|
|
22
|
+
k === Slice.valueOf() ||
|
|
23
|
+
k === Interface.valueOf()
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// funcType represents a function type
|
|
29
|
+
export class funcType extends rtype {
|
|
30
|
+
constructor(
|
|
31
|
+
kind: Kind,
|
|
32
|
+
public inCount: number = 0,
|
|
33
|
+
public outCount: number = 0,
|
|
34
|
+
) {
|
|
35
|
+
super(kind)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// flag type for internal use
|
|
40
|
+
export class flag {
|
|
41
|
+
constructor(private _value: number | Kind) {
|
|
42
|
+
if (typeof _value === 'number') {
|
|
43
|
+
this._value = _value
|
|
44
|
+
} else {
|
|
45
|
+
this._value = _value.valueOf()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
valueOf(): number {
|
|
50
|
+
return typeof this._value === 'number' ? this._value : this._value.valueOf()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Support arithmetic operations
|
|
54
|
+
static from(value: number | Kind): flag {
|
|
55
|
+
return new flag(value)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// bitVector class for tracking pointers
|
|
60
|
+
export class bitVector {
|
|
61
|
+
private bits: number[] = []
|
|
62
|
+
|
|
63
|
+
Set(index: number): void {
|
|
64
|
+
const wordIndex = Math.floor(index / 32)
|
|
65
|
+
const bitIndex = index % 32
|
|
66
|
+
while (this.bits.length <= wordIndex) {
|
|
67
|
+
this.bits.push(0)
|
|
68
|
+
}
|
|
69
|
+
this.bits[wordIndex] |= 1 << bitIndex
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Get(index: number): boolean {
|
|
73
|
+
const wordIndex = Math.floor(index / 32)
|
|
74
|
+
const bitIndex = index % 32
|
|
75
|
+
if (wordIndex >= this.bits.length) {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
return (this.bits[wordIndex] & (1 << bitIndex)) !== 0
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Kind represents the specific kind of type that a Type represents.
|
|
83
|
+
export class Kind {
|
|
84
|
+
constructor(private _value: number) {}
|
|
85
|
+
|
|
86
|
+
valueOf(): number {
|
|
87
|
+
return this._value
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
toString(): string {
|
|
91
|
+
return this.String()
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static from(value: number): Kind {
|
|
95
|
+
return new Kind(value)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public String(): string {
|
|
99
|
+
const kindNames = [
|
|
100
|
+
'invalid',
|
|
101
|
+
'bool',
|
|
102
|
+
'int',
|
|
103
|
+
'int8',
|
|
104
|
+
'int16',
|
|
105
|
+
'int32',
|
|
106
|
+
'int64',
|
|
107
|
+
'uint',
|
|
108
|
+
'uint8',
|
|
109
|
+
'uint16',
|
|
110
|
+
'uint32',
|
|
111
|
+
'uint64',
|
|
112
|
+
'uintptr',
|
|
113
|
+
'float32',
|
|
114
|
+
'float64',
|
|
115
|
+
'complex64',
|
|
116
|
+
'complex128',
|
|
117
|
+
'array',
|
|
118
|
+
'chan',
|
|
119
|
+
'func',
|
|
120
|
+
'interface',
|
|
121
|
+
'map',
|
|
122
|
+
'ptr',
|
|
123
|
+
'slice',
|
|
124
|
+
'string',
|
|
125
|
+
'struct',
|
|
126
|
+
'unsafe.Pointer',
|
|
127
|
+
]
|
|
128
|
+
if (this._value >= 0 && this._value < kindNames.length) {
|
|
129
|
+
return kindNames[this._value]
|
|
130
|
+
}
|
|
131
|
+
return 'invalid'
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Kind constants
|
|
136
|
+
export const Invalid = new Kind(0)
|
|
137
|
+
export const Bool = new Kind(1)
|
|
138
|
+
export const Int = new Kind(2)
|
|
139
|
+
export const Int8 = new Kind(3)
|
|
140
|
+
export const Int16 = new Kind(4)
|
|
141
|
+
export const Int32 = new Kind(5)
|
|
142
|
+
export const Int64 = new Kind(6)
|
|
143
|
+
export const Uint = new Kind(7)
|
|
144
|
+
export const Uint8 = new Kind(8)
|
|
145
|
+
export const Uint16 = new Kind(9)
|
|
146
|
+
export const Uint32 = new Kind(10)
|
|
147
|
+
export const Uint64 = new Kind(11)
|
|
148
|
+
export const Uintptr = new Kind(12)
|
|
149
|
+
export const Float32 = new Kind(13)
|
|
150
|
+
export const Float64 = new Kind(14)
|
|
151
|
+
export const Complex64 = new Kind(15)
|
|
152
|
+
export const Complex128 = new Kind(16)
|
|
153
|
+
export const Array = new Kind(17)
|
|
154
|
+
export const Chan = new Kind(18)
|
|
155
|
+
export const Func = new Kind(19)
|
|
156
|
+
export const Interface = new Kind(20)
|
|
157
|
+
export const Map = new Kind(21)
|
|
158
|
+
export const Ptr = new Kind(22)
|
|
159
|
+
export const Slice = new Kind(23)
|
|
160
|
+
export const String = new Kind(24)
|
|
161
|
+
export const Struct = new Kind(25)
|
|
162
|
+
export const UnsafePointer = new Kind(26)
|
|
163
|
+
|
|
164
|
+
// Type is the representation of a Go type.
|
|
165
|
+
export interface Type {
|
|
166
|
+
// String returns a string representation of the type.
|
|
167
|
+
String(): string
|
|
168
|
+
|
|
169
|
+
// Kind returns the specific kind of this type.
|
|
170
|
+
Kind(): Kind
|
|
171
|
+
|
|
172
|
+
// Size returns the number of bytes needed to store a value of the given type.
|
|
173
|
+
Size(): number
|
|
174
|
+
|
|
175
|
+
// Elem returns a type's element type.
|
|
176
|
+
Elem(): Type | null
|
|
177
|
+
|
|
178
|
+
// NumField returns a struct type's field count.
|
|
179
|
+
NumField(): number
|
|
180
|
+
|
|
181
|
+
// PkgPath returns the package path for named types, empty for unnamed types.
|
|
182
|
+
PkgPath?(): string
|
|
183
|
+
|
|
184
|
+
// Field returns a struct type's i'th field.
|
|
185
|
+
Field?(i: number): StructField | null
|
|
186
|
+
|
|
187
|
+
// common returns the common type implementation.
|
|
188
|
+
common?(): rtype
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Value is the reflection interface to a Go value - consolidated from all implementations
|
|
192
|
+
export class Value {
|
|
193
|
+
constructor(
|
|
194
|
+
private _value: ReflectValue,
|
|
195
|
+
private _type: Type,
|
|
196
|
+
) {}
|
|
197
|
+
|
|
198
|
+
public clone(): Value {
|
|
199
|
+
return new Value(this._value, this._type)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Methods required by godoc.txt and used throughout the codebase
|
|
203
|
+
public Int(): number {
|
|
204
|
+
if (typeof this._value === 'number' && Number.isInteger(this._value)) {
|
|
205
|
+
return this._value
|
|
206
|
+
}
|
|
207
|
+
throw new Error(
|
|
208
|
+
'reflect: call of reflect.Value.Int on ' +
|
|
209
|
+
this._type.Kind().String() +
|
|
210
|
+
' Value',
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public Uint(): number {
|
|
215
|
+
if (typeof this._value === 'number' && this._value >= 0) {
|
|
216
|
+
return this._value
|
|
217
|
+
}
|
|
218
|
+
throw new Error(
|
|
219
|
+
'reflect: call of reflect.Value.Uint on ' +
|
|
220
|
+
this._type.Kind().String() +
|
|
221
|
+
' Value',
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
public Float(): number {
|
|
226
|
+
if (typeof this._value === 'number') {
|
|
227
|
+
return this._value
|
|
228
|
+
}
|
|
229
|
+
throw new Error(
|
|
230
|
+
'reflect: call of reflect.Value.Float on ' +
|
|
231
|
+
this._type.Kind().String() +
|
|
232
|
+
' Value',
|
|
233
|
+
)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
public Bool(): boolean {
|
|
237
|
+
if (typeof this._value === 'boolean') {
|
|
238
|
+
return this._value
|
|
239
|
+
}
|
|
240
|
+
throw new Error(
|
|
241
|
+
'reflect: call of reflect.Value.Bool on ' +
|
|
242
|
+
this._type.Kind().String() +
|
|
243
|
+
' Value',
|
|
244
|
+
)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public String(): string {
|
|
248
|
+
if (typeof this._value === 'string') {
|
|
249
|
+
return this._value
|
|
250
|
+
}
|
|
251
|
+
// Special case for bool values - display as <bool Value>
|
|
252
|
+
if (this._type.Kind().valueOf() === Bool.valueOf()) {
|
|
253
|
+
return '<bool Value>'
|
|
254
|
+
}
|
|
255
|
+
return this._type.String()
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
public Len(): number {
|
|
259
|
+
// Check for slice objects created by $.arrayToSlice
|
|
260
|
+
if (
|
|
261
|
+
this._value &&
|
|
262
|
+
typeof this._value === 'object' &&
|
|
263
|
+
'__meta__' in this._value
|
|
264
|
+
) {
|
|
265
|
+
const meta = (this._value as { __meta__?: { length?: number } }).__meta__
|
|
266
|
+
if (meta && typeof meta.length === 'number') {
|
|
267
|
+
return meta.length
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Check for typed arrays
|
|
272
|
+
if (
|
|
273
|
+
this._value instanceof Uint8Array ||
|
|
274
|
+
this._value instanceof Int8Array ||
|
|
275
|
+
this._value instanceof Uint16Array ||
|
|
276
|
+
this._value instanceof Int16Array ||
|
|
277
|
+
this._value instanceof Uint32Array ||
|
|
278
|
+
this._value instanceof Int32Array ||
|
|
279
|
+
this._value instanceof Float32Array ||
|
|
280
|
+
this._value instanceof Float64Array
|
|
281
|
+
) {
|
|
282
|
+
return this._value.length
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Check for regular arrays
|
|
286
|
+
if (globalThis.Array.isArray(this._value)) {
|
|
287
|
+
return this._value.length
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Check for strings
|
|
291
|
+
if (typeof this._value === 'string') {
|
|
292
|
+
return this._value.length
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
throw new Error(
|
|
296
|
+
'reflect: call of reflect.Value.Len on ' +
|
|
297
|
+
this._type.Kind().String() +
|
|
298
|
+
' Value',
|
|
299
|
+
)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
public Kind(): Kind {
|
|
303
|
+
return this._type.Kind()
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
public Type(): Type {
|
|
307
|
+
return this._type
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
public IsValid(): boolean {
|
|
311
|
+
return this._value !== null && this._value !== undefined
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
public IsNil(): boolean {
|
|
315
|
+
return this._value === null || this._value === undefined
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
public Index(i: number): Value {
|
|
319
|
+
if (globalThis.Array.isArray(this._value)) {
|
|
320
|
+
return new Value(this._value[i], getTypeOf(this._value[i]))
|
|
321
|
+
}
|
|
322
|
+
throw new Error(
|
|
323
|
+
'reflect: call of reflect.Value.Index on ' +
|
|
324
|
+
this._type.Kind().String() +
|
|
325
|
+
' Value',
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
public Bytes(): Uint8Array {
|
|
330
|
+
if (this._value instanceof Uint8Array) {
|
|
331
|
+
return this._value
|
|
332
|
+
}
|
|
333
|
+
throw new Error(
|
|
334
|
+
'reflect: call of reflect.Value.Bytes on ' +
|
|
335
|
+
this._type.Kind().String() +
|
|
336
|
+
' Value',
|
|
337
|
+
)
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
public Elem(): Value {
|
|
341
|
+
// For pointers and interfaces, return the element
|
|
342
|
+
return new Value(this._value, this._type)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
public NumField(): number {
|
|
346
|
+
return this._type.NumField()
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public Field(_i: number): Value {
|
|
350
|
+
// Simplified implementation for struct field access
|
|
351
|
+
return new Value(null, this._type)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Additional methods needed by various parts of the codebase
|
|
355
|
+
public UnsafePointer(): unknown {
|
|
356
|
+
return this._value
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
public pointer(): unknown {
|
|
360
|
+
return this._value
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
public get ptr(): unknown {
|
|
364
|
+
return this._value
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Internal method to access the underlying value
|
|
368
|
+
public get value(): ReflectValue {
|
|
369
|
+
return this._value
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Convert method needed by iter.ts
|
|
373
|
+
public Convert(t: Type): Value {
|
|
374
|
+
// Simple conversion - in a real implementation this would do type conversion
|
|
375
|
+
return new Value(this._value, t)
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Additional methods from deleted reflect.gs.ts
|
|
379
|
+
public typ(): rtype | null {
|
|
380
|
+
return new rtype(this._type.Kind())
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
public get flag(): number {
|
|
384
|
+
return 0
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
public MapRange(): MapIter<unknown, unknown> | null {
|
|
388
|
+
// Placeholder for map iteration
|
|
389
|
+
return null
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
public MapIndex(_key: Value): Value {
|
|
393
|
+
// Placeholder for map access
|
|
394
|
+
return new Value(null, new BasicType(Invalid, 'invalid'))
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public Complex(): number | { real: number; imag: number } | null {
|
|
398
|
+
// Placeholder for complex number support
|
|
399
|
+
return this._value as number | { real: number; imag: number } | null
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Send sends a value to a channel
|
|
403
|
+
public Send(x: Value): void {
|
|
404
|
+
if (this._type.Kind().valueOf() !== Chan.valueOf()) {
|
|
405
|
+
throw new Error('reflect: send on non-chan type')
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Get the underlying channel
|
|
409
|
+
const channel = this._value
|
|
410
|
+
if (!channel || typeof channel !== 'object') {
|
|
411
|
+
throw new Error('reflect: send on invalid channel')
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Extract the value to send
|
|
415
|
+
const valueToSend = (x as unknown as { value: ReflectValue }).value
|
|
416
|
+
|
|
417
|
+
// For synchronous operation, we'll use a simplified send
|
|
418
|
+
// In the real implementation, this would need proper async handling
|
|
419
|
+
const channelObj = channel as any
|
|
420
|
+
if (typeof channelObj.send === 'function') {
|
|
421
|
+
// For now, just store the value in a queue or buffer
|
|
422
|
+
// This is a simplified implementation for testing
|
|
423
|
+
if (!channelObj._sendQueue) {
|
|
424
|
+
channelObj._sendQueue = []
|
|
425
|
+
}
|
|
426
|
+
channelObj._sendQueue.push(valueToSend)
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Basic type implementation - exported for compatibility
|
|
432
|
+
export class BasicType implements Type {
|
|
433
|
+
constructor(
|
|
434
|
+
private _kind: Kind,
|
|
435
|
+
private _name: string,
|
|
436
|
+
private _size: number = 8,
|
|
437
|
+
) {}
|
|
438
|
+
|
|
439
|
+
public String(): string {
|
|
440
|
+
return this._name
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
public Kind(): Kind {
|
|
444
|
+
return this._kind
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
public Size(): number {
|
|
448
|
+
return this._size
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
public Elem(): Type | null {
|
|
452
|
+
return null
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
public NumField(): number {
|
|
456
|
+
return 0
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
public PkgPath?(): string {
|
|
460
|
+
return ''
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
public Field?(_i: number): StructField | null {
|
|
464
|
+
return null
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
public common?(): rtype {
|
|
468
|
+
return new rtype(this._kind)
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Slice type implementation
|
|
473
|
+
class SliceType implements Type {
|
|
474
|
+
constructor(private _elemType: Type) {}
|
|
475
|
+
|
|
476
|
+
public String(): string {
|
|
477
|
+
return '[]' + this._elemType.String()
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
public Kind(): Kind {
|
|
481
|
+
return Slice
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
public Size(): number {
|
|
485
|
+
return 24 // slice header size
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
public Elem(): Type | null {
|
|
489
|
+
return this._elemType
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
public NumField(): number {
|
|
493
|
+
return 0
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
public PkgPath?(): string {
|
|
497
|
+
return ''
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Array type implementation
|
|
502
|
+
class ArrayType implements Type {
|
|
503
|
+
constructor(
|
|
504
|
+
private _elemType: Type,
|
|
505
|
+
private _len: number,
|
|
506
|
+
) {}
|
|
507
|
+
|
|
508
|
+
public String(): string {
|
|
509
|
+
return `[${this._len}]${this._elemType.String()}`
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
public Kind(): Kind {
|
|
513
|
+
return Array
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
public Size(): number {
|
|
517
|
+
return this._elemType.Size() * this._len
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
public Elem(): Type | null {
|
|
521
|
+
return this._elemType
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
public NumField(): number {
|
|
525
|
+
return 0
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
public Len(): number {
|
|
529
|
+
return this._len
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
public PkgPath?(): string {
|
|
533
|
+
return ''
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
public Field?(_i: number): StructField | null {
|
|
537
|
+
return null
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
public common?(): rtype {
|
|
541
|
+
return new rtype(this.Kind())
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// Pointer type implementation
|
|
546
|
+
class PointerType implements Type {
|
|
547
|
+
constructor(private _elemType: Type) {}
|
|
548
|
+
|
|
549
|
+
public String(): string {
|
|
550
|
+
return '*' + this._elemType.String()
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
public Kind(): Kind {
|
|
554
|
+
return Ptr
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
public Size(): number {
|
|
558
|
+
return 8 // pointer size
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
public Elem(): Type | null {
|
|
562
|
+
return this._elemType
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
public NumField(): number {
|
|
566
|
+
return 0
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
public PkgPath?(): string {
|
|
570
|
+
return ''
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
public Field?(_i: number): StructField | null {
|
|
574
|
+
return null
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
public common?(): rtype {
|
|
578
|
+
return new rtype(this.Kind())
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Function type implementation
|
|
583
|
+
class FunctionType implements Type {
|
|
584
|
+
constructor(private _signature: string) {}
|
|
585
|
+
|
|
586
|
+
public String(): string {
|
|
587
|
+
return this._signature
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
public Kind(): Kind {
|
|
591
|
+
return Func
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
public Size(): number {
|
|
595
|
+
return 8 // function pointer size
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
public Elem(): Type | null {
|
|
599
|
+
return null
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
public NumField(): number {
|
|
603
|
+
return 0
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
public PkgPath?(): string {
|
|
607
|
+
return ''
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
public Field?(_i: number): StructField | null {
|
|
611
|
+
return null
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
public common?(): rtype {
|
|
615
|
+
return new rtype(this.Kind())
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Map type implementation
|
|
620
|
+
class MapType implements Type {
|
|
621
|
+
constructor(
|
|
622
|
+
private _keyType: Type,
|
|
623
|
+
private _elemType: Type,
|
|
624
|
+
) {}
|
|
625
|
+
|
|
626
|
+
public String(): string {
|
|
627
|
+
return `map[${this._keyType.String()}]${this._elemType.String()}`
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
public Kind(): Kind {
|
|
631
|
+
return Map
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
public Size(): number {
|
|
635
|
+
return 8 // map header size
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
public Elem(): Type | null {
|
|
639
|
+
return this._elemType
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
public NumField(): number {
|
|
643
|
+
return 0
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
public Key(): Type {
|
|
647
|
+
return this._keyType
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
public PkgPath?(): string {
|
|
651
|
+
return ''
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
public Field?(_i: number): StructField | null {
|
|
655
|
+
return null
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
public common?(): rtype {
|
|
659
|
+
return new rtype(this.Kind())
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// Struct type implementation
|
|
664
|
+
class StructType implements Type {
|
|
665
|
+
constructor(
|
|
666
|
+
private _name: string,
|
|
667
|
+
private _fields: Array<{ name: string; type: Type }> = [],
|
|
668
|
+
) {}
|
|
669
|
+
|
|
670
|
+
public String(): string {
|
|
671
|
+
return this._name
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
public Kind(): Kind {
|
|
675
|
+
return Struct
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
public Size(): number {
|
|
679
|
+
// Struct size is implementation-defined, we'll use a reasonable default
|
|
680
|
+
return this._fields.reduce((sum, field) => sum + field.type.Size(), 0)
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
public Elem(): Type | null {
|
|
684
|
+
return null
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
public NumField(): number {
|
|
688
|
+
return this._fields.length
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
public PkgPath?(): string {
|
|
692
|
+
return ''
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
public Field?(_i: number): any {
|
|
696
|
+
// Stub implementation
|
|
697
|
+
return null
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
public common?(): rtype {
|
|
701
|
+
return new rtype(this.Kind())
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
class ChannelType implements Type {
|
|
706
|
+
constructor(
|
|
707
|
+
private _elemType: Type,
|
|
708
|
+
private _dir: ChanDir,
|
|
709
|
+
) {}
|
|
710
|
+
|
|
711
|
+
public String(): string {
|
|
712
|
+
// Format: chan T, <-chan T, or chan<- T
|
|
713
|
+
const elem = this._elemType.String()
|
|
714
|
+
switch (this._dir.valueOf()) {
|
|
715
|
+
case 1: // RecvDir
|
|
716
|
+
return `<-chan ${elem}`
|
|
717
|
+
case 2: // SendDir
|
|
718
|
+
return `chan<- ${elem}`
|
|
719
|
+
case 3: // BothDir
|
|
720
|
+
default:
|
|
721
|
+
return `chan ${elem}`
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
public Kind(): Kind {
|
|
726
|
+
return Chan
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
public Size(): number {
|
|
730
|
+
// Channels are represented as pointers, so pointer size
|
|
731
|
+
return 8
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
public Elem(): Type | null {
|
|
735
|
+
return this._elemType
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
public NumField(): number {
|
|
739
|
+
return 0
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
public PkgPath?(): string {
|
|
743
|
+
return ''
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
public Field?(_: number): any {
|
|
747
|
+
return null
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
public common?(): rtype {
|
|
751
|
+
return new rtype(this.Kind())
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
public ChanDir(): ChanDir {
|
|
755
|
+
return this._dir
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
function getTypeOf(value: ReflectValue): Type {
|
|
760
|
+
if (value === null || value === undefined) {
|
|
761
|
+
return new BasicType(Interface, 'interface{}', 16)
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
switch (typeof value) {
|
|
765
|
+
case 'boolean':
|
|
766
|
+
return new BasicType(Bool, 'bool', 1)
|
|
767
|
+
case 'number':
|
|
768
|
+
if (Number.isInteger(value)) {
|
|
769
|
+
return new BasicType(Int, 'int', 8)
|
|
770
|
+
}
|
|
771
|
+
return new BasicType(Float64, 'float64', 8)
|
|
772
|
+
case 'bigint':
|
|
773
|
+
return new BasicType(Int64, 'int64', 8)
|
|
774
|
+
case 'string':
|
|
775
|
+
return new BasicType(String, 'string', 16)
|
|
776
|
+
case 'function': {
|
|
777
|
+
// Check if this function has GoScript type information attached
|
|
778
|
+
const funcWithMeta = value as any
|
|
779
|
+
|
|
780
|
+
// First check for __typeInfo which contains the function signature
|
|
781
|
+
if (funcWithMeta.__typeInfo) {
|
|
782
|
+
const typeInfo = funcWithMeta.__typeInfo
|
|
783
|
+
if (
|
|
784
|
+
(typeInfo.kind === 'function' || typeInfo.kind === 'Function') &&
|
|
785
|
+
typeInfo.params &&
|
|
786
|
+
typeInfo.results
|
|
787
|
+
) {
|
|
788
|
+
// Build proper function signature from type info
|
|
789
|
+
const paramTypes = typeInfo.params
|
|
790
|
+
.map((p: any) => (typeof p === 'string' ? p : p.name || 'any'))
|
|
791
|
+
.join(', ')
|
|
792
|
+
const resultTypes = typeInfo.results.map((r: any) =>
|
|
793
|
+
typeof r === 'string' ? r : r.name || 'any',
|
|
794
|
+
)
|
|
795
|
+
|
|
796
|
+
let signature = `func(${paramTypes})`
|
|
797
|
+
if (resultTypes.length === 1) {
|
|
798
|
+
signature += ` ${resultTypes[0]}`
|
|
799
|
+
} else if (resultTypes.length > 1) {
|
|
800
|
+
signature += ` (${resultTypes.join(', ')})`
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
return new FunctionType(signature)
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
// Then check for __goTypeName which indicates a typed function
|
|
808
|
+
if (funcWithMeta.__goTypeName) {
|
|
809
|
+
// This is a typed Go function - try to reconstruct the signature
|
|
810
|
+
const typeName = funcWithMeta.__goTypeName
|
|
811
|
+
|
|
812
|
+
// For known Go function types, construct proper signatures
|
|
813
|
+
if (typeName === 'Greeter') {
|
|
814
|
+
return new FunctionType('func(string) string')
|
|
815
|
+
} else if (typeName === 'Adder') {
|
|
816
|
+
return new FunctionType('func(int, int) int')
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Generic fallback for typed functions
|
|
820
|
+
return new FunctionType(`func`) // Could be enhanced with parameter parsing
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// For untyped functions, try to parse the signature
|
|
824
|
+
const funcStr = value.toString()
|
|
825
|
+
let signature = 'func'
|
|
826
|
+
|
|
827
|
+
// Simple pattern matching for basic function signatures
|
|
828
|
+
const match = funcStr.match(/function\s*\([^)]*\)/)
|
|
829
|
+
if (match) {
|
|
830
|
+
const params = match[0].replace('function', '').trim()
|
|
831
|
+
// This is a simplified version - real implementation would need more sophisticated parsing
|
|
832
|
+
if (params === '()') {
|
|
833
|
+
signature = 'func()'
|
|
834
|
+
} else if (params.includes(',')) {
|
|
835
|
+
const paramCount = params.split(',').length
|
|
836
|
+
signature = `func(${globalThis.Array(paramCount).fill('any').join(', ')})`
|
|
837
|
+
} else if (params !== '()') {
|
|
838
|
+
signature = 'func(any)'
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Check if it looks like it returns something
|
|
843
|
+
if (funcStr.includes('return ')) {
|
|
844
|
+
signature += ' any'
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
return new FunctionType(signature)
|
|
848
|
+
}
|
|
849
|
+
case 'object': {
|
|
850
|
+
if (value === null) {
|
|
851
|
+
return new BasicType(Interface, 'interface{}', 16)
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// Check for arrays
|
|
855
|
+
if (globalThis.Array.isArray(value)) {
|
|
856
|
+
if (value.length === 0) {
|
|
857
|
+
// Empty array, assume []interface{}
|
|
858
|
+
return new SliceType(new BasicType(Interface, 'interface{}', 16))
|
|
859
|
+
}
|
|
860
|
+
// Determine element type from first element
|
|
861
|
+
const elemType = getTypeOf(value[0])
|
|
862
|
+
return new SliceType(elemType)
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
// Check for typed arrays
|
|
866
|
+
if (value instanceof Uint8Array)
|
|
867
|
+
return new SliceType(new BasicType(Uint8, 'uint8', 1))
|
|
868
|
+
if (value instanceof Int8Array)
|
|
869
|
+
return new SliceType(new BasicType(Int8, 'int8', 1))
|
|
870
|
+
if (value instanceof Uint16Array)
|
|
871
|
+
return new SliceType(new BasicType(Uint16, 'uint16', 2))
|
|
872
|
+
if (value instanceof Int16Array)
|
|
873
|
+
return new SliceType(new BasicType(Int16, 'int16', 2))
|
|
874
|
+
if (value instanceof Uint32Array)
|
|
875
|
+
return new SliceType(new BasicType(Uint32, 'uint32', 4))
|
|
876
|
+
if (value instanceof Int32Array)
|
|
877
|
+
return new SliceType(new BasicType(Int32, 'int32', 4))
|
|
878
|
+
if (value instanceof Float32Array)
|
|
879
|
+
return new SliceType(new BasicType(Float32, 'float32', 4))
|
|
880
|
+
if (value instanceof Float64Array)
|
|
881
|
+
return new SliceType(new BasicType(Float64, 'float64', 8))
|
|
882
|
+
|
|
883
|
+
// Check for Maps
|
|
884
|
+
if (value instanceof globalThis.Map) {
|
|
885
|
+
if (value.size === 0) {
|
|
886
|
+
// Empty map, assume map[interface{}]interface{}
|
|
887
|
+
const anyType = new BasicType(Interface, 'interface{}', 16)
|
|
888
|
+
return new MapType(anyType, anyType)
|
|
889
|
+
}
|
|
890
|
+
// Get types from first entry
|
|
891
|
+
const firstEntry = value.entries().next().value
|
|
892
|
+
if (firstEntry) {
|
|
893
|
+
const keyType = getTypeOf(firstEntry[0] as ReflectValue)
|
|
894
|
+
const valueType = getTypeOf(firstEntry[1] as ReflectValue)
|
|
895
|
+
return new MapType(keyType, valueType)
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
// Check for GoScript slice objects with proper __meta__ structure
|
|
900
|
+
if (value && typeof value === 'object' && '__meta__' in value) {
|
|
901
|
+
const meta = (
|
|
902
|
+
value as {
|
|
903
|
+
__meta__?: {
|
|
904
|
+
backing?: unknown[]
|
|
905
|
+
length?: number
|
|
906
|
+
capacity?: number
|
|
907
|
+
offset?: number
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
).__meta__
|
|
911
|
+
if (
|
|
912
|
+
meta &&
|
|
913
|
+
typeof meta === 'object' &&
|
|
914
|
+
'backing' in meta &&
|
|
915
|
+
'length' in meta &&
|
|
916
|
+
globalThis.Array.isArray(meta.backing)
|
|
917
|
+
) {
|
|
918
|
+
// This is a GoScript slice - determine element type from backing array
|
|
919
|
+
if (meta.backing.length === 0) {
|
|
920
|
+
// Empty slice, assume []interface{}
|
|
921
|
+
return new SliceType(new BasicType(Interface, 'interface{}', 16))
|
|
922
|
+
}
|
|
923
|
+
// Get element type from first element in backing array
|
|
924
|
+
const elemType = getTypeOf(meta.backing[0] as ReflectValue)
|
|
925
|
+
return new SliceType(elemType)
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// Check if it has a constructor with __typeInfo for proper struct names
|
|
930
|
+
if (
|
|
931
|
+
value &&
|
|
932
|
+
typeof value === 'object' &&
|
|
933
|
+
value.constructor &&
|
|
934
|
+
'__typeInfo' in value.constructor
|
|
935
|
+
) {
|
|
936
|
+
const typeInfo = (
|
|
937
|
+
value.constructor as { __typeInfo?: { name?: string } }
|
|
938
|
+
).__typeInfo
|
|
939
|
+
if (typeInfo && typeInfo.name) {
|
|
940
|
+
// Add package prefix for struct types if not already present
|
|
941
|
+
const typeName =
|
|
942
|
+
typeInfo.name.includes('.') ?
|
|
943
|
+
typeInfo.name
|
|
944
|
+
: `main.${typeInfo.name}`
|
|
945
|
+
return new StructType(typeName)
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// Check if it has a constructor name we can use (fallback)
|
|
950
|
+
const constructorName = (value as object).constructor?.name
|
|
951
|
+
if (constructorName && constructorName !== 'Object') {
|
|
952
|
+
return new StructType(constructorName)
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
// Default to struct type for plain objects
|
|
956
|
+
return new StructType('struct')
|
|
957
|
+
}
|
|
958
|
+
default:
|
|
959
|
+
return new BasicType(Interface, 'interface{}', 16)
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
// Exported functions as required by godoc.txt
|
|
964
|
+
export function TypeOf(i: ReflectValue): Type {
|
|
965
|
+
return getTypeOf(i)
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
export function ValueOf(i: ReflectValue): Value {
|
|
969
|
+
return new Value(i, getTypeOf(i))
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
export function ArrayOf(length: number, elem: Type): Type {
|
|
973
|
+
return new ArrayType(elem, length)
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
export function SliceOf(t: Type): Type {
|
|
977
|
+
return new SliceType(t)
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
export function PointerTo(t: Type): Type {
|
|
981
|
+
return new PointerType(t)
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
export function PtrTo(t: Type): Type {
|
|
985
|
+
return PointerTo(t) // PtrTo is an alias for PointerTo
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
export function MapOf(key: Type, elem: Type): Type {
|
|
989
|
+
return new MapType(key, elem)
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
export function ChanOf(dir: ChanDir, t: Type): Type {
|
|
993
|
+
return new ChannelType(t, dir)
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// Additional functions from merged files
|
|
997
|
+
export function canRangeFunc(t: Type): boolean {
|
|
998
|
+
const kind = t.Kind().valueOf()
|
|
999
|
+
return kind === 23 || kind === 17 || kind === 24 // slice, array, string
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
export function canRangeFunc2(t: Type): boolean {
|
|
1003
|
+
const kind = t.Kind().valueOf()
|
|
1004
|
+
return kind === 21 // map
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
export function funcLayout(
|
|
1008
|
+
_t: Type,
|
|
1009
|
+
_rcvr: Type | null,
|
|
1010
|
+
): { Type: Type | null; InCount: number; OutCount: number } {
|
|
1011
|
+
return {
|
|
1012
|
+
Type: null,
|
|
1013
|
+
InCount: 0,
|
|
1014
|
+
OutCount: 0,
|
|
1015
|
+
}
|
|
1016
|
+
}
|