diff --git a/compiler/prelude/jsmapping.go b/compiler/prelude/jsmapping.go index 24cdf8ed3..ce0691b5a 100644 --- a/compiler/prelude/jsmapping.go +++ b/compiler/prelude/jsmapping.go @@ -181,6 +181,13 @@ var $internalize = function(v, t, recv) { if (t === $jsObjectPtr.elem) { $panic(new $String("cannot internalize js.Object, use *js.Object instead")); } + var timePkg = $packages["time"]; + if (timePkg !== undefined && t === timePkg.Time) { + if (!(v !== null && v !== undefined && v.constructor === Date)) { + $panic(new $String("cannot internalize time.Time from " + typeof v + ", must be Date")); + } + return timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000)); + } switch (t.kind) { case $kindBool: return !!v; @@ -270,12 +277,11 @@ var $internalize = function(v, t, recv) { case Boolean: return new $Bool(!!v); case Date: - var timePkg = $packages["time"]; if (timePkg === undefined) { /* time package is not present, internalize as &js.Object{Date} so it can be externalized into original Date. */ return new $jsObjectPtr(v); } - return new timePkg.Time(timePkg.Unix(new $Int64(0, 0), new $Int64(0, v.getTime() * 1000000))); + return new timePkg.Time($internalize(v, timePkg.Time)); case Function: var funcType = $funcType([$sliceType($emptyInterface)], [$jsObjectPtr], true); return new funcType($internalize(v, funcType)); diff --git a/js/js_test.go b/js/js_test.go index 754fb1a1b..189776525 100644 --- a/js/js_test.go +++ b/js/js_test.go @@ -287,6 +287,17 @@ func TestDate(t *testing.T) { } } +// https://github.com/gopherjs/gopherjs/issues/287 +func TestInternalizeDate(t *testing.T) { + var a = time.Unix(0, (123 * time.Millisecond).Nanoseconds()) + var b time.Time + js.Global.Set("internalizeDate", func(t time.Time) { b = t }) + js.Global.Call("eval", "(internalizeDate(new Date(123)))") + if a != b { + t.Fail() + } +} + func TestEquality(t *testing.T) { if js.Global.Get("Array") != js.Global.Get("Array") || js.Global.Get("Array") == js.Global.Get("String") { t.Fail() @@ -480,6 +491,21 @@ func TestNewArrayBuffer(t *testing.T) { } } +func TestInternalizeExternalizeNull(t *testing.T) { + type S struct { + *js.Object + } + r := js.Global.Call("eval", "(function(f) { return f(null); })").Invoke(func(s S) S { + if s.Object != nil { + t.Fail() + } + return s + }) + if r != nil { + t.Fail() + } +} + func TestInternalizeExternalizeUndefined(t *testing.T) { type S struct { *js.Object