Skip to content

Commit f28da7e

Browse files
trying to updated reflect
1 parent 0662b09 commit f28da7e

File tree

6 files changed

+118
-193
lines changed

6 files changed

+118
-193
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build js
2+
13
package abi
24

35
import (
@@ -230,6 +232,25 @@ func (typ *Type) IsWrapped() bool {
230232
return typ.JsType().Get("wrapped").Bool()
231233
}
232234

235+
//gopherjs:new
236+
var jsObjectPtr = ReflectType(js.Global.Get("$jsObjectPtr"))
237+
238+
//gopherjs:new
239+
func WrapJsObject(typ *Type, val *js.Object) *js.Object {
240+
if typ == jsObjectPtr {
241+
return jsObjectPtr.JsType().New(val)
242+
}
243+
return val
244+
}
245+
246+
//gopherjs:new
247+
func UnwrapJsObject(typ *Type, val *js.Object) *js.Object {
248+
if typ == jsObjectPtr {
249+
return val.Get("object")
250+
}
251+
return val
252+
}
253+
233254
//gopherjs:new
234255
func internalStr(strObj *js.Object) string {
235256
var c struct{ str string }
@@ -386,3 +407,12 @@ func ReflectType(typ *js.Object) *Type {
386407
func setKindType(abiTyp *Type, kindType any) {
387408
js.InternalObject(abiTyp).Set(idKindType, js.InternalObject(kindType))
388409
}
410+
411+
//gopherjs:new
412+
func CopyStruct(dst, src *js.Object, typ *Type) {
413+
fields := typ.JsType().Get("fields")
414+
for i := 0; i < fields.Length(); i++ {
415+
prop := fields.Index(i).Get("prop").String()
416+
dst.Set(prop, src.Get(prop))
417+
}
418+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//go:build js
2+
3+
package abi
4+
5+
// GOPHERJS: These utils are being added because they are common between
6+
// reflect and reflectlite.
7+
8+
//gopherjs:new
9+
type errorString struct {
10+
s string
11+
}
12+
13+
//gopherjs:new
14+
func (e *errorString) Error() string {
15+
return e.s
16+
}
17+
18+
//gopherjs:new
19+
var ErrSyntax = &errorString{"invalid syntax"}
20+
21+
//gopherjs:new Added to avoid a dependency on strconv.Unquote
22+
func unquote(s string) (string, error) {
23+
if len(s) < 2 {
24+
return s, nil
25+
}
26+
if s[0] == '\'' || s[0] == '"' {
27+
if s[len(s)-1] == s[0] {
28+
return s[1 : len(s)-1], nil
29+
}
30+
return "", ErrSyntax
31+
}
32+
return s, nil
33+
}
34+
35+
//gopherjs:new
36+
func GetJsTag(tag string) string {
37+
for tag != "" {
38+
// skip leading space
39+
i := 0
40+
for i < len(tag) && tag[i] == ' ' {
41+
i++
42+
}
43+
tag = tag[i:]
44+
if tag == "" {
45+
break
46+
}
47+
48+
// scan to colon.
49+
// a space or a quote is a syntax error
50+
i = 0
51+
for i < len(tag) && tag[i] != ' ' && tag[i] != ':' && tag[i] != '"' {
52+
i++
53+
}
54+
if i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
55+
break
56+
}
57+
name := string(tag[:i])
58+
tag = tag[i+1:]
59+
60+
// scan quoted string to find value
61+
i = 1
62+
for i < len(tag) && tag[i] != '"' {
63+
if tag[i] == '\\' {
64+
i++
65+
}
66+
i++
67+
}
68+
if i >= len(tag) {
69+
break
70+
}
71+
qvalue := string(tag[:i+1])
72+
tag = tag[i+1:]
73+
74+
if name == "js" {
75+
value, _ := unquote(qvalue)
76+
return value
77+
}
78+
}
79+
return ""
80+
}

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

Lines changed: 2 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ func init() {
2424
}
2525

2626
//gopherjs:new
27-
func toAbiType(typ Type) *abi.Type {
28-
return typ.(rtype).common()
27+
func toAbiType(t Type) *abi.Type {
28+
return t.(rtype).common()
2929
}
3030

3131
//gopherjs:new
@@ -37,69 +37,3 @@ func jsType(t Type) *js.Object {
3737
func jsPtrTo(t Type) *js.Object {
3838
return toAbiType(t).JsPtrTo()
3939
}
40-
41-
//gopherjs:new
42-
var jsObjectPtr = abi.ReflectType(js.Global.Get("$jsObjectPtr"))
43-
44-
//gopherjs:new
45-
func wrapJsObject(typ *abi.Type, val *js.Object) *js.Object {
46-
if typ == jsObjectPtr {
47-
return jsObjectPtr.JsType().New(val)
48-
}
49-
return val
50-
}
51-
52-
//gopherjs:new
53-
func unwrapJsObject(typ *abi.Type, val *js.Object) *js.Object {
54-
if typ == jsObjectPtr {
55-
return val.Get("object")
56-
}
57-
return val
58-
}
59-
60-
//gopherjs:new
61-
func getJsTag(tag string) string {
62-
for tag != "" {
63-
// skip leading space
64-
i := 0
65-
for i < len(tag) && tag[i] == ' ' {
66-
i++
67-
}
68-
tag = tag[i:]
69-
if tag == "" {
70-
break
71-
}
72-
73-
// scan to colon.
74-
// a space or a quote is a syntax error
75-
i = 0
76-
for i < len(tag) && tag[i] != ' ' && tag[i] != ':' && tag[i] != '"' {
77-
i++
78-
}
79-
if i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
80-
break
81-
}
82-
name := string(tag[:i])
83-
tag = tag[i+1:]
84-
85-
// scan quoted string to find value
86-
i = 1
87-
for i < len(tag) && tag[i] != '"' {
88-
if tag[i] == '\\' {
89-
i++
90-
}
91-
i++
92-
}
93-
if i >= len(tag) {
94-
break
95-
}
96-
qvalue := string(tag[:i+1])
97-
tag = tag[i+1:]
98-
99-
if name == "js" {
100-
value, _ := unquote(qvalue)
101-
return value
102-
}
103-
}
104-
return ""
105-
}

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

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

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (v Value) Elem() Value {
3838
fl |= flag(tt.Elem.Kind())
3939
return Value{
4040
typ: tt.Elem,
41-
ptr: unsafe.Pointer(wrapJsObject(tt.Elem, val).Unsafe()),
41+
ptr: unsafe.Pointer(abi.WrapJsObject(tt.Elem, val).Unsafe()),
4242
flag: fl,
4343
}
4444

@@ -60,23 +60,14 @@ func valueInterface(v Value) any {
6060
if v.typ.IsWrapped() {
6161
if v.flag&flagIndir != 0 && v.Kind() == abi.Struct {
6262
cv := v.typ.JsType().Call("zero")
63-
copyStruct(cv, v.object(), v.typ)
63+
abi.CopyStruct(cv, v.object(), v.typ)
6464
return any(unsafe.Pointer(v.typ.JsType().New(cv).Unsafe()))
6565
}
6666
return any(unsafe.Pointer(v.typ.JsType().New(v.object()).Unsafe()))
6767
}
6868
return any(unsafe.Pointer(v.object().Unsafe()))
6969
}
7070

71-
//gopherjs:new
72-
func copyStruct(dst, src *js.Object, typ *abi.Type) {
73-
fields := typ.JsType().Get("fields")
74-
for i := 0; i < fields.Length(); i++ {
75-
prop := fields.Index(i).Get("prop").String()
76-
dst.Set(prop, src.Get(prop))
77-
}
78-
}
79-
8071
//gopherjs:new This is new but there are commented out references in the original code.
8172
func makeMethodValue(op string, v Value) Value {
8273
if v.flag&flagMethod == 0 {
@@ -180,7 +171,7 @@ func (v Value) Set(x Value) {
180171
case abi.Interface:
181172
js.InternalObject(v.ptr).Call("$set", js.InternalObject(valueInterface(x)))
182173
case abi.Struct:
183-
copyStruct(js.InternalObject(v.ptr), js.InternalObject(x.ptr), v.typ)
174+
abi.CopyStruct(js.InternalObject(v.ptr), js.InternalObject(x.ptr), v.typ)
184175
default:
185176
js.InternalObject(v.ptr).Call("$set", x.object())
186177
}
@@ -239,13 +230,13 @@ func (v Value) Field(i int) Value {
239230
return Value{
240231
typ: typ,
241232
ptr: unsafe.Pointer(typ.JsPtrTo().New(
242-
js.InternalObject(func() *js.Object { return wrapJsObject(typ, s.Get(prop)) }),
243-
js.InternalObject(func(x *js.Object) { s.Set(prop, unwrapJsObject(typ, x)) }),
233+
js.InternalObject(func() *js.Object { return abi.WrapJsObject(typ, s.Get(prop)) }),
234+
js.InternalObject(func(x *js.Object) { s.Set(prop, abi.UnwrapJsObject(typ, x)) }),
244235
).Unsafe()),
245236
flag: fl,
246237
}
247238
}
248-
return makeValue(typ, wrapJsObject(typ, s.Get(prop)), fl)
239+
return makeValue(typ, abi.WrapJsObject(typ, s.Get(prop)), fl)
249240
}
250241

251242
//gopherjs:replace

compiler/natives/src/reflect/reflect.go

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -102,24 +102,6 @@ func resolveReflectText(ptr unsafe.Pointer) aTextOff {
102102
// ====================================================================
103103
// ====================================================================
104104

105-
func internalStr(strObj *js.Object) string {
106-
var c struct{ str string }
107-
js.InternalObject(c).Set("str", strObj) // get string without internalizing
108-
return c.str
109-
}
110-
111-
func isWrapped(typ Type) bool {
112-
return jsType(typ).Get("wrapped").Bool()
113-
}
114-
115-
func copyStruct(dst, src *js.Object, typ Type) {
116-
fields := jsType(typ).Get("fields")
117-
for i := 0; i < fields.Length(); i++ {
118-
prop := fields.Index(i).Get("prop").String()
119-
dst.Set(prop, src.Get(prop))
120-
}
121-
}
122-
123105
func makeValue(t Type, v *js.Object, fl flag) Value {
124106
rt := t.common()
125107
if t.Kind() == Array || t.Kind() == Struct || t.Kind() == Ptr {
@@ -976,22 +958,6 @@ func (v Value) Cap() int {
976958
panic(&ValueError{"reflect.Value.Cap", k})
977959
}
978960

979-
var jsObjectPtr = reflectType(js.Global.Get("$jsObjectPtr"))
980-
981-
func wrapJsObject(typ Type, val *js.Object) *js.Object {
982-
if typ == jsObjectPtr {
983-
return jsType(jsObjectPtr).New(val)
984-
}
985-
return val
986-
}
987-
988-
func unwrapJsObject(typ Type, val *js.Object) *js.Object {
989-
if typ == jsObjectPtr {
990-
return val.Get("object")
991-
}
992-
return val
993-
}
994-
995961
func (v Value) Elem() Value {
996962
switch k := v.kind(); k {
997963
case Interface:
@@ -1067,52 +1033,6 @@ func (v Value) Field(i int) Value {
10671033
return makeValue(typ, wrapJsObject(typ, s.Get(prop)), fl)
10681034
}
10691035

1070-
func getJsTag(tag string) string {
1071-
for tag != "" {
1072-
// skip leading space
1073-
i := 0
1074-
for i < len(tag) && tag[i] == ' ' {
1075-
i++
1076-
}
1077-
tag = tag[i:]
1078-
if tag == "" {
1079-
break
1080-
}
1081-
1082-
// scan to colon.
1083-
// a space or a quote is a syntax error
1084-
i = 0
1085-
for i < len(tag) && tag[i] != ' ' && tag[i] != ':' && tag[i] != '"' {
1086-
i++
1087-
}
1088-
if i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
1089-
break
1090-
}
1091-
name := string(tag[:i])
1092-
tag = tag[i+1:]
1093-
1094-
// scan quoted string to find value
1095-
i = 1
1096-
for i < len(tag) && tag[i] != '"' {
1097-
if tag[i] == '\\' {
1098-
i++
1099-
}
1100-
i++
1101-
}
1102-
if i >= len(tag) {
1103-
break
1104-
}
1105-
qvalue := string(tag[:i+1])
1106-
tag = tag[i+1:]
1107-
1108-
if name == "js" {
1109-
value, _ := strconv.Unquote(qvalue)
1110-
return value
1111-
}
1112-
}
1113-
return ""
1114-
}
1115-
11161036
func (v Value) UnsafePointer() unsafe.Pointer {
11171037
return unsafe.Pointer(v.Pointer())
11181038
}

0 commit comments

Comments
 (0)