{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: Can not use a method of an instance if the instance and the type are defined separately\n", "- [bug](https://github.com/yunabe/lgo/issues/11)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type Data struct {\n", " value string\n", "}\n", "\n", "func (d Data) Value() string {\n", " return d.value\n", "}\n", "\n", "type WithValue interface {\n", " Value() string\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "d := Data{\"hello\"}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hello\n" ] } ], "source": [ "// Got a link error because of https://github.com/golang/go/issues/22998\n", "d.Value()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hello\n" ] } ], "source": [ "// This works without any problem.\n", "WithValue(d).Value()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: goroutines should be canceled when the main routine ends\n", "- [bug](https://github.com/yunabe/lgo/issues/6)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Canceled\n" ] } ], "source": [ "import (\n", " \"fmt\"\n", ")\n", "\n", "i := 0\n", "go func() {\n", " defer func() {\n", " fmt.Println(\"Canceled\")\n", " }()\n", " for i = 0;; i++ {}\n", "}()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: The entire process terminated when a go routine panics\n", "- [bug](https://github.com/yunabe/lgo/issues/5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "panic: die!\n", "\n", "goroutine 26 [running]:\n", "runtime/debug.Stack(0xc4203f9eb8, 0x7fc12a067bc0, 0xc42003a010)\n", "\t/usr/lib/go-1.8/src/runtime/debug/stack.go:24 +0x7b\n", "github.com/yunabe/lgo/core.FinalizeGoRoutine()\n", "\t/home/yunabe/local/gocode/src/github.com/yunabe/lgo/core/core.go:81 +0x64\n", "panic(0x7fc12a067bc0, 0xc42003a010)\n", "\t/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2e7\n", "github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8.lgo_init.func1.1()\n", "\t/home/yunabe/local/gocode/src/github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8/src.go:13 +0x66\n", "github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8.lgo_init.func1()\n", "\t/home/yunabe/local/gocode/src/github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8/src.go:14 +0x40\n", "created by github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8.lgo_init\n", "\t/home/yunabe/local/gocode/src/github.com/yunabe/lgo/sess7b2274696d65223a313530383530393332323132383131303736397d/exec8/src.go:15 +0x3b\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "main done\n", "10\n", "\n" ] } ], "source": [ "import (\n", " \"fmt\"\n", " \"time\"\n", ")\n", "\n", "go func() {\n", " panic(\"die!\")\n", "}()\n", "\n", "time.Sleep(100 * time.Millisecond)\n", "fmt.Println(\"main done\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: interface is not working\n", "If you invoke a method through an interface in lgo, it crashes with `runtime error: invalid memory address or nil pointer dereference` ([bug](https://github.com/yunabe/lgo/issues/3))." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---- 1 ----\n", "Hello, I'm yunabe.\n", "---- 2 ----\n", "Hello, I'm yunabe.\n" ] } ], "source": [ "import (\n", " \"fmt\"\n", ")\n", "\n", "type Hello interface {\n", " SayHello()\n", "}\n", "\n", "type person struct {\n", " name string\n", "}\n", "\n", "func (p *person) SayHello() {\n", " fmt.Printf(\"Hello, I'm %s.\\n\", p.name)\n", "}\n", "\n", "p := person{\"yunabe\"}\n", "fmt.Println(\"---- 1 ----\")\n", "p.SayHello()\n", "\n", "var h Hello = &p\n", "fmt.Println(\"---- 2 ----\")\n", "h.SayHello()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: GC crashes with a fatal error\n", "The following crashes with `fatal error: found bad pointer in Go heap (incorrect use of unsafe or cgo?)` message ([bug](https://github.com/yunabe/lgo/issues/2))." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import (\n", " \"fmt\"\n", " \"log\"\n", " \"runtime\"\n", " \"runtime/debug\"\n", ")\n", "\n", "type MyData struct {\n", " b []byte\n", "}\n", "\n", "func (m *MyData) Size() int {\n", " return len(m.b)\n", "}\n", "\n", "func NewMyData() *MyData {\n", " return &MyData{\n", " b: make([]byte, 10 * (1 << 20)),\n", " }\n", "}\n", "\n", "var l []*MyData\n", "for i := 0; i < 100; i++ {\n", " d := NewMyData()\n", " l = append(l, d)\n", "}\n", "l = nil\n", "debug.FreeOSMemory()\n", "runtime.GC()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fixed: functions and arguments in go statement are not bound immediately\n", "The following code must output `goroutine: 0`, `goroutine: 1` and `goroutine: 2` in a random order.\n", "But `lgo` shows `goroutine: 3` three times ([bug](https://github.com/yunabe/lgo/issues/73))." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "goroutine: 2\n", "goroutine: 1\n", "goroutine: 0\n" ] } ], "source": [ "import (\n", " \"fmt\"\n", ")\n", "\n", "for i := 0; i < 3; i++ {\n", " go func(id int) {\n", " fmt.Println(\"goroutine:\", id)\n", " }(i)\n", "}" ] } ], "metadata": { "kernelspec": { "display_name": "Go (lgo)", "language": "go", "name": "lgo" }, "language_info": { "file_extension": "", "mimetype": "", "name": "go", "version": "" } }, "nbformat": 4, "nbformat_minor": 2 }