Skip to content

Commit 4578fba

Browse files
slogging through reflect
1 parent c43bb75 commit 4578fba

File tree

8 files changed

+1276
-1212
lines changed

8 files changed

+1276
-1212
lines changed

compiler/natives/src/internal/abi/type.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,22 @@ func (typ *Type) IsWrapped() bool {
235235
//gopherjs:new
236236
var jsObjectPtr = ReflectType(js.Global.Get("$jsObjectPtr"))
237237

238+
//gopherjs:new
239+
func IsJsObjectPtr(typ *Type) bool {
240+
return typ == jsObjectPtr
241+
}
242+
238243
//gopherjs:new
239244
func WrapJsObject(typ *Type, val *js.Object) *js.Object {
240-
if typ == jsObjectPtr {
245+
if IsJsObjectPtr(typ) {
241246
return jsObjectPtr.JsType().New(val)
242247
}
243248
return val
244249
}
245250

246251
//gopherjs:new
247252
func UnwrapJsObject(typ *Type, val *js.Object) *js.Object {
248-
if typ == jsObjectPtr {
253+
if IsJsObjectPtr(typ) {
249254
return val.Get("object")
250255
}
251256
return val

compiler/natives/src/internal/abi/utils.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
package abi
44

5+
import (
6+
"unsafe"
7+
8+
"github.com/gopherjs/gopherjs/js"
9+
)
10+
511
// GOPHERJS: These utils are being added because they are common between
612
// reflect and reflectlite.
713

@@ -78,3 +84,25 @@ func GetJsTag(tag string) string {
7884
}
7985
return ""
8086
}
87+
88+
//gopherjs:new
89+
func UnsafeNew(typ *Type) unsafe.Pointer {
90+
switch typ.Kind() {
91+
case Struct:
92+
return unsafe.Pointer(typ.JsType().Get("ptr").New().Unsafe())
93+
case Array:
94+
return unsafe.Pointer(typ.JsType().Call("zero").Unsafe())
95+
default:
96+
return unsafe.Pointer(js.Global.Call("$newDataPointer", typ.JsType().Call("zero"), typ.JsPtrTo()).Unsafe())
97+
}
98+
}
99+
100+
//gopherjs:new
101+
func IfaceE2I(t *Type, src any, dst unsafe.Pointer) {
102+
js.InternalObject(dst).Call("$set", js.InternalObject(src))
103+
}
104+
105+
//gopherjs:new
106+
func TypedMemMove(t *Type, dst, src unsafe.Pointer) {
107+
js.InternalObject(dst).Call("$set", js.InternalObject(src).Call("$get"))
108+
}

compiler/natives/src/internal/reflectlite/reflectlite.go

Lines changed: 0 additions & 39 deletions
This file was deleted.

compiler/natives/src/internal/reflectlite/type.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,36 @@ import (
1010
"github.com/gopherjs/gopherjs/js"
1111
)
1212

13+
func init() {
14+
// avoid dead code elimination
15+
used := func(i any) {}
16+
used(rtype{})
17+
used(uncommonType{})
18+
used(arrayType{})
19+
used(chanType{})
20+
used(funcType{})
21+
used(interfaceType{})
22+
used(mapType{})
23+
used(ptrType{})
24+
used(sliceType{})
25+
used(structType{})
26+
}
27+
28+
//gopherjs:new
29+
func toAbiType(t Type) *abi.Type {
30+
return t.(rtype).common()
31+
}
32+
33+
//gopherjs:new
34+
func jsType(t Type) *js.Object {
35+
return toAbiType(t).JsType()
36+
}
37+
38+
//gopherjs:new
39+
func jsPtrTo(t Type) *js.Object {
40+
return toAbiType(t).JsPtrTo()
41+
}
42+
1343
// GOPHERJS: For some reason the original code left mapType and aliased the rest
1444
// to the ABI version. mapType is not used so this is an alias to override the
1545
// left over refactor cruft.

compiler/natives/src/internal/reflectlite/value.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,10 @@ func (v Value) Field(i int) Value {
204204
}
205205

206206
if tag := tt.Fields[i].Name.Tag(); tag != "" && i != 0 {
207-
if jsTag := getJsTag(tag); jsTag != "" {
207+
if jsTag := abi.GetJsTag(tag); jsTag != "" {
208208
for {
209209
v = v.Field(0)
210-
if v.typ == jsObjectPtr {
210+
if abi.IsJsObjectPtr(v.typ) {
211211
o := v.object().Get("object")
212212
return Value{
213213
typ: typ,
@@ -241,14 +241,7 @@ func (v Value) Field(i int) Value {
241241

242242
//gopherjs:replace
243243
func unsafe_New(typ *abi.Type) unsafe.Pointer {
244-
switch typ.Kind() {
245-
case abi.Struct:
246-
return unsafe.Pointer(typ.JsType().Get("ptr").New().Unsafe())
247-
case abi.Array:
248-
return unsafe.Pointer(typ.JsType().Call("zero").Unsafe())
249-
default:
250-
return unsafe.Pointer(js.Global.Call("$newDataPointer", typ.JsType().Call("zero"), typ.JsPtrTo()).Unsafe())
251-
}
244+
return abi.UnsafeNew(typ)
252245
}
253246

254247
//gopherjs:replace
@@ -350,10 +343,10 @@ func (v Value) assignTo(context string, dst *abi.Type, target unsafe.Pointer) Va
350343

351344
//gopherjs:replace
352345
func ifaceE2I(t *abi.Type, src any, dst unsafe.Pointer) {
353-
js.InternalObject(dst).Call("$set", js.InternalObject(src))
346+
abi.IfaceE2I(t, src, dst)
354347
}
355348

356349
//gopherjs:replace
357350
func typedmemmove(t *abi.Type, dst, src unsafe.Pointer) {
358-
js.InternalObject(dst).Call("$set", js.InternalObject(src).Call("$get"))
351+
abi.TypedMemMove(t, dst, src)
359352
}

0 commit comments

Comments
 (0)