Skip to content

Instantly share code, notes, and snippets.

@magnushiie
Created October 28, 2015 14:11
Show Gist options
  • Save magnushiie/4587ba63b3a37bc9e76e to your computer and use it in GitHub Desktop.
Save magnushiie/4587ba63b3a37bc9e76e to your computer and use it in GitHub Desktop.
gokogiri crash
unexpected fault address 0x676e69727493
fatal error: fault
[signal 0xb code=0x1 addr=0x676e69727493 pc=0x4a3c79]
goroutine 9 [running, locked to thread]:
runtime.throw(0x58c660, 0x5)
/usr/local/go/src/runtime/panic.go:527 +0x90 fp=0xc820036ab8 sp=0xc820036aa0
runtime.sigpanic()
/usr/local/go/src/runtime/sigpanic_unix.go:27 +0x2ab fp=0xc820036b08 sp=0xc820036ab8
github.com/moovweb/gokogiri/xpath.go_can_resolve_function(0xc820091470, 0x1305830, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/util.go:114 +0x99 fp=0xc820036b70 sp=0xc820036b08
runtime.call32(0x0, 0x7fff2a2a2328, 0x7fff2a2a23b0, 0x20)
/usr/local/go/src/runtime/asm_amd64.s:437 +0x3e fp=0xc820036b98 sp=0xc820036b70
runtime.cgocallbackg1()
/usr/local/go/src/runtime/cgocall.go:252 +0x10c fp=0xc820036bd0 sp=0xc820036b98
runtime.cgocallbackg()
/usr/local/go/src/runtime/cgocall.go:177 +0xd7 fp=0xc820036c30 sp=0xc820036bd0
runtime.cgocallback_gofunc(0x407de3, 0x4057a0, 0xc820036ca8)
/usr/local/go/src/runtime/asm_amd64.s:801 +0x60 fp=0xc820036c40 sp=0xc820036c30
runtime.asmcgocall(0x4057a0, 0xc820036ca8)
/usr/local/go/src/runtime/asm_amd64.s:674 +0x3c fp=0xc820036c48 sp=0xc820036c40
runtime.cgocall(0x4057a0, 0xc820036ca8, 0xc800000000)
/usr/local/go/src/runtime/cgocall.go:121 +0x133 fp=0xc820036c78 sp=0xc820036c48
github.com/moovweb/gokogiri/xpath._Cfunc_xmlXPathCompiledEval(0x13055b0, 0x1305440, 0x0)
??:0 +0x36 fp=0xc820036ca8 sp=0xc820036c78
github.com/moovweb/gokogiri/xpath.(*XPath).Evaluate(0xc820091450, 0x1305880, 0xc82008c300, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:142 +0xed fp=0xc820036d58 sp=0xc820036ca8
main.ExtractXPath(0xc820451078, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:35 +0x159 fp=0xc820036e78 sp=0xc820036d58
main.ParseDocument(0xc820092400, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe fp=0xc820036ef0 sp=0xc820036e78
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76 fp=0xc820036f40 sp=0xc820036ef0
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33 fp=0xc820036f70 sp=0xc820036f40
main.ParallelTask(0xc82000a430)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18 fp=0xc820036fa8 sp=0xc820036f70
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc820036fb0 sp=0xc820036fa8
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc82000a3ec)
/usr/local/go/src/runtime/sema.go:43 +0x26
sync.(*WaitGroup).Wait(0xc82000a3e0)
/usr/local/go/src/sync/waitgroup.go:126 +0xb4
main.main()
/home/ubuntu/gopath/src/crashtest/crashtest.go:113 +0xdd
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
goroutine 5 [runnable]:
github.com/moovweb/gokogiri/xpath.(*XPath).ResultAsString(0xc8203eefa0, 0x4, 0xc820305380, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:185
main.ExtractXPath(0xc820263330, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:41 +0x1d4
main.ParseDocument(0xc820307b00, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a3f0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 6 [runnable]:
github.com/moovweb/gokogiri/xml.NewDocument(0x7fe07c007b00, 0x76, 0xc820416d70, 0x6, 0x10, 0xc820416d80, 0x6, 0x10, 0xc820413d40)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xml/document.go:131 +0x3df
github.com/moovweb/gokogiri/html.NewDocument(0x7fe07c007b00, 0x76, 0xc820416d70, 0x6, 0x10, 0xc820416d80, 0x6, 0x10, 0xc82035b648)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/html/document.go:57 +0x9f
github.com/moovweb/gokogiri/html.Parse(0xc82041b400, 0x76, 0x80, 0xc820416d70, 0x6, 0x10, 0x0, 0x0, 0x0, 0x861, ...)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/html/document.go:90 +0x461
github.com/moovweb/gokogiri.ParseHtml(0xc82041b400, 0x76, 0x80, 0x5d7220, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/gokogiri.go:22 +0xbe
main.ParseDocument(0xc82041b400, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:53 +0x51
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a400)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 7 [runnable]:
runtime.Gosched()
/usr/local/go/src/runtime/proc.go:166 +0x14
github.com/moovweb/gokogiri/html.Parse(0xc820426680, 0x76, 0x80, 0x87a6bc, 0x5, 0x5, 0x0, 0x0, 0x0, 0x861, ...)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/html/document.go:67 +0x583
github.com/moovweb/gokogiri.ParseHtml(0xc820426680, 0x76, 0x80, 0x5d7220, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/gokogiri.go:22 +0xbe
main.ParseDocument(0xc820426680, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:53 +0x51
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a410)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 8 [runnable]:
github.com/moovweb/gokogiri/html.Parse(0xc82010dc00, 0x76, 0x80, 0xc82015c0c0, 0x6, 0x10, 0x0, 0x0, 0x0, 0x861, ...)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/html/document.go:68 +0x524
github.com/moovweb/gokogiri.ParseHtml(0xc82010dc00, 0x76, 0x80, 0x5d7220, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/gokogiri.go:22 +0xbe
main.ParseDocument(0xc82010dc00, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:53 +0x51
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a420)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 10 [runnable]:
main.ParseDocument(0xc820137600, 0x76, 0x80, 0xc820137600, 0x76)
/home/ubuntu/gopath/src/crashtest/crashtest.go:51
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a440)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 11 [runnable]:
github.com/moovweb/gokogiri/xpath.(*XPath).SetResolver(0xc820387fe0, 0x7fe08aef7730, 0x8a9eb8)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:210 +0x23
main.ExtractXPath(0xc8202b54e0, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:34 +0x12e
main.ParseDocument(0xc82032e600, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a450)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 12 [runnable]:
github.com/moovweb/gokogiri/xml._Cfunc_xmlFreeDoc(0x7fe07c003de0)
??:0
github.com/moovweb/gokogiri/xml.(*XmlDocument).Free(0xc8203b9170)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xml/document.go:444 +0x1b1
main.ParseDocument(0xc8203b3900, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:68 +0x15a
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a460)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 13 [runnable]:
runtime.Gosched()
/usr/local/go/src/runtime/proc.go:166 +0x14
github.com/moovweb/gokogiri/html.Parse(0xc820458900, 0x76, 0x80, 0x87a6bc, 0x5, 0x5, 0x0, 0x0, 0x0, 0x861, ...)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/html/document.go:67 +0x583
github.com/moovweb/gokogiri.ParseHtml(0xc820458900, 0x76, 0x80, 0x5d7220, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/gokogiri.go:22 +0xbe
main.ParseDocument(0xc820458900, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:53 +0x51
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a470)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 14 [runnable]:
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:72 +0x45
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a480)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
ubuntu@ip-172-31-16-215:~/gopath/src/crashtest$ vi crashtest.go
ubuntu@ip-172-31-16-215:~/gopath/src/crashtest$ vi crashtest.go
ubuntu@ip-172-31-16-215:~/gopath/src/crashtest$ /usr/local/go/bin/go build
ubuntu@ip-172-31-16-215:~/gopath/src/crashtest$ ./crashtest
unexpected fault address 0x676e69727493
fatal error: fault
[signal 0xb code=0x1 addr=0x676e69727493 pc=0x4a3c79]
goroutine 6 [running, locked to thread]:
runtime.throw(0x58c660, 0x5)
/usr/local/go/src/runtime/panic.go:527 +0x90 fp=0xc820034ab8 sp=0xc820034aa0
runtime.sigpanic()
/usr/local/go/src/runtime/sigpanic_unix.go:27 +0x2ab fp=0xc820034b08 sp=0xc820034ab8
github.com/moovweb/gokogiri/xpath.go_can_resolve_function(0xc8202ea210, 0x7f44900043e0, 0x0, 0x7f4490009320)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/util.go:114 +0x99 fp=0xc820034b70 sp=0xc820034b08
runtime.call32(0x0, 0x7f4497765b08, 0x7f4497765b90, 0x20)
/usr/local/go/src/runtime/asm_amd64.s:437 +0x3e fp=0xc820034b98 sp=0xc820034b70
runtime.cgocallbackg1()
/usr/local/go/src/runtime/cgocall.go:252 +0x10c fp=0xc820034bd0 sp=0xc820034b98
runtime.cgocallbackg()
/usr/local/go/src/runtime/cgocall.go:177 +0xd7 fp=0xc820034c30 sp=0xc820034bd0
runtime.cgocallback_gofunc(0x407de3, 0x4057a0, 0xc820034ca8)
/usr/local/go/src/runtime/asm_amd64.s:801 +0x60 fp=0xc820034c40 sp=0xc820034c30
runtime.asmcgocall(0x4057a0, 0xc820034ca8)
/usr/local/go/src/runtime/asm_amd64.s:674 +0x3c fp=0xc820034c48 sp=0xc820034c40
runtime.cgocall(0x4057a0, 0xc820034ca8, 0xc800000000)
/usr/local/go/src/runtime/cgocall.go:121 +0x133 fp=0xc820034c78 sp=0xc820034c48
github.com/moovweb/gokogiri/xpath._Cfunc_xmlXPathCompiledEval(0x7f4490004160, 0x7f4490004ba0, 0x0)
??:0 +0x36 fp=0xc820034ca8 sp=0xc820034c78
github.com/moovweb/gokogiri/xpath.(*XPath).Evaluate(0xc8202ea1f0, 0x7f4490003e70, 0xc82026d340, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:142 +0xed fp=0xc820034d58 sp=0xc820034ca8
main.ExtractXPath(0xc82046d328, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:35 +0x159 fp=0xc820034e78 sp=0xc820034d58
main.ParseDocument(0xc820307900, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe fp=0xc820034ef0 sp=0xc820034e78
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76 fp=0xc820034f40 sp=0xc820034ef0
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33 fp=0xc820034f70 sp=0xc820034f40
main.ParallelTask(0xc82000a400)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18 fp=0xc820034fa8 sp=0xc820034f70
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc820034fb0 sp=0xc820034fa8
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc82000a3ec)
/usr/local/go/src/runtime/sema.go:43 +0x26
sync.(*WaitGroup).Wait(0xc82000a3e0)
/usr/local/go/src/sync/waitgroup.go:126 +0xb4
main.main()
/home/ubuntu/gopath/src/crashtest/crashtest.go:113 +0xdd
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1
goroutine 5 [runnable]:
runtime.Gosched()
/usr/local/go/src/runtime/proc.go:166 +0x14
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:72 +0x45
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a3f0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 7 [runnable, locked to thread]:
github.com/moovweb/gokogiri/xpath._Cfunc_GoString(0x26f2db0, 0x0, 0x0)
??:0 +0x2d
github.com/moovweb/gokogiri/xpath.go_can_resolve_function(0xc820333fe0, 0x26f2db0, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/util.go:111 +0x25
github.com/moovweb/gokogiri/xpath._Cfunc_xmlXPathCompiledEval(0x26f2b30, 0x26f29c0, 0x0)
??:0 +0x36
github.com/moovweb/gokogiri/xpath.(*XPath).Evaluate(0xc820333fb0, 0x26f2de0, 0xc82004bf80, 0x0, 0x0)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:142 +0xed
main.ExtractXPath(0xc82020dfe8, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:35 +0x159
main.ParseDocument(0xc820425f00, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a410)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
goroutine 8 [runnable]:
github.com/moovweb/gokogiri/xpath._Cfunc_set_function_lookup(0x7f44900041a0, 0xc82016f010)
??:0
github.com/moovweb/gokogiri/xpath.(*XPath).SetResolver(0xc82016eff0, 0x7f449921e730, 0x8a9eb8)
/home/ubuntu/gopath/src/github.com/moovweb/gokogiri/xpath/xpath.go:212 +0x82
main.ExtractXPath(0xc8201161c0, 0x5cb5a0, 0x58, 0x0, 0x0, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:34 +0x12e
main.ParseDocument(0xc8202d0d80, 0x76, 0x80, 0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:61 +0xfe
main.TestOneDoc(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:80 +0x76
main.TestBatch(0x0, 0x0)
/home/ubuntu/gopath/src/crashtest/crashtest.go:89 +0x33
main.ParallelTask(0xc82000a420)
/home/ubuntu/gopath/src/crashtest/crashtest.go:98 +0x18
created by main.main
/home/ubuntu/gopath/src/crashtest/crashtest.go:111 +0xbc
package main
import (
"errors"
"fmt"
"sync"
"unsafe"
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xml"
"github.com/moovweb/gokogiri/xpath"
)
type ParserXPathContext struct {
}
func (*ParserXPathContext) ResolveVariable(name string, nsUri string) interface{} {
return nil
}
func (context *ParserXPathContext) IsFunctionRegistered(name string, nsUri string) bool {
return false
}
func (context *ParserXPathContext) ResolveFunction(name string, nsUri string) xpath.XPathFunction {
return nil
}
func ExtractXPath(xmlNode *xml.ElementNode, xpathString string) (string, error) {
xpathExpr := xpath.Compile(xpathString)
defer xpathExpr.Free()
xpathCtx := xmlNode.Document.DocXPathCtx()
xpathCtx.SetResolver(&ParserXPathContext{})
err := xpathCtx.Evaluate(unsafe.Pointer(xmlNode.Ptr), xpathExpr)
if err != nil {
return "", err
}
switch xpathCtx.ReturnType() {
case xpath.XPATH_STRING:
stringVal, err := xpathCtx.ResultAsString()
if err != nil {
return "", err
}
return stringVal, nil
default:
return "", errors.New(fmt.Sprintf("Node type %d not yet implemented", xpathCtx.ReturnType()))
}
}
func ParseDocument(content []byte) error {
var xmlDoc *xml.XmlDocument
htmlDoc, err := gokogiri.ParseHtml(content)
if err != nil {
return err
}
xmlDoc = htmlDoc.XmlDocument
defer xmlDoc.Free()
xpathStr := "string(//div[@class='some_div']/p[@class='some_para']/span/descendant-or-self::*/text())"
stringVal, err := ExtractXPath(xmlDoc.Root(), xpathStr)
if err != nil {
return err
}
_ = stringVal
// println(stringVal)
return nil
}
func TestOneDoc() error {
content := []byte(`
<html><body><div class="some_div">
<p class="some_para">
<span>
x
</span>
</p>
</div></body></html>`)
err := ParseDocument(content)
if err != nil {
return err
}
return nil
}
func TestBatch() error {
for i := 0; i < 1000000; i++ {
err := TestOneDoc()
if err != nil {
return err
}
}
return nil
}
func ParallelTask(done func()) {
err := TestBatch()
if err != nil {
panic(err)
}
done()
}
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 4; i++ {
wg.Add(1)
go ParallelTask(func() {
wg.Done()
})
}
wg.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment