Forráskód Böngészése

"De-interface" values retrieved from maps. Fixes #469.

Dmitry Panov 2 éve
szülő
commit
af048f025c
3 módosított fájl, 27 hozzáadás és 13 törlés
  1. 11 12
      object_gomap_reflect.go
  2. 15 0
      object_gomap_reflect_test.go
  3. 1 1
      object_goreflect.go

+ 11 - 12
object_gomap_reflect.go

@@ -35,28 +35,27 @@ func (o *objectGoMapReflect) strToKey(name string, throw bool) reflect.Value {
 	return o.toKey(newStringValue(name), throw)
 }
 
-func (o *objectGoMapReflect) _get(n Value) Value {
-	key := o.toKey(n, false)
+func (o *objectGoMapReflect) _getKey(key reflect.Value) Value {
 	if !key.IsValid() {
 		return nil
 	}
 	if v := o.fieldsValue.MapIndex(key); v.IsValid() {
-		return o.val.runtime.toValue(v.Interface(), v)
+		rv := v
+		if rv.Kind() == reflect.Interface {
+			rv = rv.Elem()
+		}
+		return o.val.runtime.toValue(v.Interface(), rv)
 	}
 
 	return nil
 }
 
-func (o *objectGoMapReflect) _getStr(name string) Value {
-	key := o.strToKey(name, false)
-	if !key.IsValid() {
-		return nil
-	}
-	if v := o.fieldsValue.MapIndex(key); v.IsValid() {
-		return o.val.runtime.toValue(v.Interface(), v)
-	}
+func (o *objectGoMapReflect) _get(n Value) Value {
+	return o._getKey(o.toKey(n, false))
+}
 
-	return nil
+func (o *objectGoMapReflect) _getStr(name string) Value {
+	return o._getKey(o.strToKey(name, false))
 }
 
 func (o *objectGoMapReflect) getStr(name unistring.String, receiver Value) Value {

+ 15 - 0
object_gomap_reflect_test.go

@@ -292,3 +292,18 @@ func TestGoMapReflectStruct(t *testing.T) {
 		t.Fatal(res)
 	}
 }
+
+func TestGoMapReflectElt(t *testing.T) {
+	type mapping map[string]interface{}
+
+	const SCRIPT = `a.s() && a.t === null && a.t1 === undefined;`
+
+	r := New()
+
+	r.Set("a", mapping{
+		"s": func() bool { return true },
+		"t": nil,
+	})
+
+	r.testScript(SCRIPT, valueTrue, t)
+}

+ 1 - 1
object_goreflect.go

@@ -243,7 +243,7 @@ func (o *objectGoReflect) elemToValue(ev reflect.Value) (Value, reflectValueWrap
 		return ret, nil
 	}
 
-	for ev.Kind() == reflect.Interface {
+	if ev.Kind() == reflect.Interface {
 		ev = ev.Elem()
 	}