精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

當(dāng)Go遇上了Lua,會發(fā)生什么

開發(fā) 后端
我們知道 Golang 是靜態(tài)語言,而 Lua 是動態(tài)語言,Golang 的性能和效率各語言中表現(xiàn)得非常不錯(cuò),但在動態(tài)能力上,肯定是無法與 Lua 相比。那么如果我們能夠?qū)⒍呓Y(jié)合起來,就能綜合二者各自的長處了。

在 GitHub 玩耍時(shí),偶然發(fā)現(xiàn)了 gopher-lua ,這是一個(gè)純 Golang 實(shí)現(xiàn)的 Lua 虛擬機(jī)。我們知道 Golang 是靜態(tài)語言,而 Lua 是動態(tài)語言,Golang 的性能和效率各語言中表現(xiàn)得非常不錯(cuò),但在動態(tài)能力上,肯定是無法與 Lua 相比。那么如果我們能夠?qū)⒍呓Y(jié)合起來,就能綜合二者各自的長處了(手動滑稽。

在項(xiàng)目 Wiki 中,我們可以知道 gopher-lua 的執(zhí)行效率和性能僅比 C 實(shí)現(xiàn)的 bindings 差。因此從性能方面考慮,這應(yīng)該是一款非常不錯(cuò)的虛擬機(jī)方案。

Hello World

這里給出了一個(gè)簡單的 Hello World 程序。我們先是新建了一個(gè)虛擬機(jī),隨后對其進(jìn)行了 DoString(...) 解釋執(zhí)行 lua 代碼的操作,***將虛擬機(jī)關(guān)閉。執(zhí)行程序,我們將在命令行看到 "Hello World" 的字符串。 

  1. package main  
  2. import (  
  3.     "github.com/yuin/gopher-lua"  
  4.  
  5. func main() {  
  6.     l :lua.NewState()  
  7.     defer l.Close()  
  8.     if err :l.DoString(`print("Hello World")`); err != nil {  
  9.         panic(err)  
  10.     }  
  11.  
  12. // Hello World 

提前編譯

在查看上述 DoString(...) 方法的調(diào)用鏈后,我們發(fā)現(xiàn)每執(zhí)行一次 DoString(...) 或 DoFile(...) ,都會各執(zhí)行一次 parse 和 compile 。 

  1. func (ls *LState) DoString(source string) error {  
  2.     if fn, err :ls.LoadString(source); err != nil {  
  3.         return err  
  4.     } else {  
  5.         ls.Push(fn)  
  6.         return ls.PCall(0, MultRet, nil)  
  7.     }  
  8.  
  9. func (ls *LState) LoadString(source string) (*LFunction, error) {  
  10.     return ls.Load(strings.NewReader(source), "<string>")  
  11.  
  12. func (ls *LState) Load(reader io.Reader, name string) (*LFunction, error) {  
  13.     chunk, err :parse.Parse(reader, name)  
  14.     // ...  
  15.     proto, err :Compile(chunk, name)  
  16.     // ...  

從這一點(diǎn)考慮,在同份 Lua 代碼將被執(zhí)行多次(如在 http server 中,每次請求將執(zhí)行相同 Lua 代碼)的場景下,如果我們能夠?qū)Υa進(jìn)行提前編譯,那么應(yīng)該能夠減少 parse 和 compile 的開銷(如果這屬于 hotpath 代碼)。根據(jù) Benchmark 結(jié)果,提前編譯確實(shí)能夠減少不必要的開銷。 

  1. package glua_test  
  2. import (  
  3.     "bufio"  
  4.     "os"  
  5.     "strings"  
  6.     lua "github.com/yuin/gopher-lua"  
  7.     "github.com/yuin/gopher-lua/parse"  
  8.  
  9. // 編譯 lua 代碼字段  
  10. func CompileString(source string) (*lua.FunctionProto, error) {  
  11.     reader :strings.NewReader(source)  
  12.     chunk, err :parse.Parse(reader, source)  
  13.     if err != nil {  
  14.         return nil, err  
  15.     }  
  16.     proto, err :lua.Compile(chunk, source)  
  17.     if err != nil {  
  18.         return nil, err  
  19.     }  
  20.     return proto, nil  
  21.  
  22. // 編譯 lua 代碼文件  
  23. func CompileFile(filePath string) (*lua.FunctionProto, error) {  
  24.     file, err :os.Open(filePath)  
  25.     defer file.Close()  
  26.     if err != nil {  
  27.         return nil, err  
  28.     }  
  29.     reader :bufio.NewReader(file)  
  30.     chunk, err :parse.Parse(reader, filePath)  
  31.     if err != nil {  
  32.         return nil, err  
  33.     }  
  34.     proto, err :lua.Compile(chunk, filePath)  
  35.     if err != nil {  
  36.         return nil, err  
  37.     }  
  38.     return proto, nil  
  39.  
  40. func BenchmarkRunWithoutPreCompiling(b *testing.B) {  
  41.     l :lua.NewState()  
  42.     for i :0; i < b.N; i++ {  
  43.         _ = l.DoString(`a = 1 + 1`)  
  44.     }  
  45.     l.Close()  
  46.  
  47. func BenchmarkRunWithPreCompiling(b *testing.B) {  
  48.     l :lua.NewState()  
  49.     proto, _ :CompileString(`a = 1 + 1`)  
  50.     lfunc :l.NewFunctionFromProto(proto)  
  51.     for i :0; i < b.N; i++ {  
  52.         l.Push(lfunc) 
  53.          _ = l.PCall(0, lua.MultRet, nil)  
  54.     }  
  55.     l.Close()  
  56.  
  57. // goos: darwin  
  58. // goarch: amd64  
  59. // pkg: glua  
  60. // BenchmarkRunWithoutPreCompiling-8         100000             19392 ns/op           85626 B/op         67 allocs/op  
  61. // BenchmarkRunWithPreCompiling-8           1000000              1162 ns/op            2752 B/op          8 allocs/op  
  62. // PASS  
  63. // ok      glua    3.328s 

虛擬機(jī)實(shí)例池

在同份 Lua 代碼被執(zhí)行的場景下,除了可使用提前編譯優(yōu)化性能外,我們還可以引入虛擬機(jī)實(shí)例池。

因?yàn)樾陆ㄒ粋€(gè) Lua 虛擬機(jī)會涉及到大量的內(nèi)存分配操作,如果采用每次運(yùn)行都重新創(chuàng)建和銷毀的方式的話,將消耗大量的資源。引入虛擬機(jī)實(shí)例池,能夠復(fù)用虛擬機(jī),減少不必要的開銷。 

  1. func BenchmarkRunWithoutPool(b *testing.B) {  
  2.     for i :0; i < b.N; i++ {  
  3.         l :lua.NewState()  
  4.         _ = l.DoString(`a = 1 + 1`)  
  5.         l.Close()  
  6.     }  
  7.  
  8. func BenchmarkRunWithPool(b *testing.B) {  
  9.     pool :newVMPool(nil, 100)  
  10.     for i :0; i < b.N; i++ {  
  11.         l :pool.get()  
  12.         _ = l.DoString(`a = 1 + 1`)  
  13.         pool.put(l)  
  14.     }  
  15.  
  16. // goos: darwin  
  17. // goarch: amd64  
  18. // pkg: glua  
  19. // BenchmarkRunWithoutPool-8          10000            129557 ns/op          262599 B/op        826 allocs/op  
  20. // BenchmarkRunWithPool-8            100000             19320 ns/op           85626 B/op         67 allocs/op  
  21. // PASS  
  22. // ok      glua    3.467s 

Benchmark 結(jié)果顯示,虛擬機(jī)實(shí)例池的確能夠減少很多內(nèi)存分配操作。

下面給出了 README 提供的實(shí)例池實(shí)現(xiàn),但注意到該實(shí)現(xiàn)在初始狀態(tài)時(shí),并未創(chuàng)建足夠多的虛擬機(jī)實(shí)例(初始時(shí),實(shí)例數(shù)為0),以及存在 slice 的動態(tài)擴(kuò)容問題,這都是值得改進(jìn)的地方。 

  1. type lStatePool struct {  
  2.     m     sync.Mutex  
  3.     saved []*lua.LState  
  4.  
  5. func (pl *lStatePool) Get() *lua.LState {  
  6.     pl.m.Lock()  
  7.     defer pl.m.Unlock()  
  8.     n :len(pl.saved)  
  9.     if n == 0 {  
  10.         return pl.New()  
  11.     }  
  12.     x :pl.saved[n-1]  
  13.     plpl.saved = pl.saved[0 : n-1]  
  14.     return x  
  15.  
  16. func (pl *lStatePool) New() *lua.LState {  
  17.     L :lua.NewState()  
  18.     // setting the L up here.  
  19.     // load scripts, set global variables, share channels, etc...  
  20.     return L  
  21.  
  22. func (pl *lStatePool) Put(L *lua.LState) {  
  23.     pl.m.Lock()  
  24.     defer pl.m.Unlock()  
  25.     pl.saved = append(pl.saved, L)  
  26.  
  27. func (pl *lStatePool) Shutdown() {  
  28.     for _, L :range pl.saved {  
  29.         L.Close()  
  30.     }  
  31.  
  32. // Global LState pool  
  33. var luaPool = &lStatePool{  
  34.     saved: make([]*lua.LState, 0, 4),  

模塊調(diào)用

gopher-lua 支持 Lua 調(diào)用 Go 模塊,個(gè)人覺得,這是一個(gè)非常令人振奮的功能點(diǎn),因?yàn)樵?Golang 程序開發(fā)中,我們可能設(shè)計(jì)出許多常用的模塊,這種跨語言調(diào)用的機(jī)制,使得我們能夠?qū)Υa、工具進(jìn)行復(fù)用。

當(dāng)然,除此之外,也存在 Go 調(diào)用 Lua 模塊,但個(gè)人感覺后者是沒啥必要的,所以在這里并沒有涉及后者的內(nèi)容。 

  1. package main  
  2. import (  
  3.     "fmt"  
  4.     lua "github.com/yuin/gopher-lua"  
  5.  
  6. const source = `  
  7. local m = require("gomodule")  
  8. m.goFunc()  
  9. print(m.name)  
  10. func main() {  
  11.     L :lua.NewState()  
  12.     defer L.Close()  
  13.     L.PreloadModule("gomodule", load)  
  14.     if err :L.DoString(source); err != nil {  
  15.         panic(err)  
  16.     }  
  17.  
  18. func load(L *lua.LState) int {  
  19.     mod :L.SetFuncs(L.NewTable(), exports)  
  20.     L.SetField(mod, "name", lua.LString("gomodule"))  
  21.     L.Push(mod)  
  22.     return 1  
  23.  
  24. var exports = map[string]lua.LGFunction{  
  25.     "goFunc": goFunc,  
  26.  
  27. func goFunc(L *lua.LState) int {  
  28.     fmt.Println("golang")  
  29.     return 0  
  30.  
  31. // golang  
  32. // gomodule 

變量污染

當(dāng)我們使用實(shí)例池減少開銷時(shí),會引入另一個(gè)棘手的問題:由于同一個(gè)虛擬機(jī)可能會被多次執(zhí)行同樣的 Lua 代碼,進(jìn)而變動了其中的全局變量。如果代碼邏輯依賴于全局變量,那么可能會出現(xiàn)難以預(yù)測的運(yùn)行結(jié)果(這有點(diǎn)數(shù)據(jù)庫隔離性中的“不可重復(fù)讀”的味道)。

全局變量

如果我們需要限制 Lua 代碼只能使用局部變量,那么站在這個(gè)出發(fā)點(diǎn)上,我們需要對全局變量做出限制。那問題來了,該如何實(shí)現(xiàn)呢?

我們知道,Lua 是編譯成字節(jié)碼,再被解釋執(zhí)行的。那么,我們可以在編譯字節(jié)碼的階段中,對全局變量的使用作出限制。在查閱完 Lua 虛擬機(jī)指令后,發(fā)現(xiàn)涉及到全局變量的指令有兩條:GETGLOBAL(Opcode 5)和 SETGLOBAL(Opcode 7)。

到這里,已經(jīng)有了大致的思路:我們可通過判斷字節(jié)碼是否含有 GETGLOBAL 和 SETGLOBAL 進(jìn)而限制代碼的全局變量的使用。至于字節(jié)碼的獲取,可通過調(diào)用 CompileString(...) 和 CompileFile(...) ,得到 Lua 代碼的 FunctionProto ,而其中的 Code 屬性即為字節(jié)碼 slice,類型為 []uint32 。

在虛擬機(jī)實(shí)現(xiàn)代碼中,我們可以找到一個(gè)根據(jù)字節(jié)碼輸出對應(yīng) OpCode 的工具函數(shù)。 

  1. // 獲取對應(yīng)指令的 OpCode  
  2. func opGetOpCode(inst uint32) int {  
  3.     return int(inst >> 26)  

有了這個(gè)工具函數(shù),我們即可實(shí)現(xiàn)對全局變量的檢查。 

  1. package main  
  2. // ...  
  3. func CheckGlobal(proto *lua.FunctionProto) error {  
  4.     for _, code :range proto.Code {  
  5.         switch opGetOpCode(code) {  
  6.         case lua.OP_GETGLOBAL:  
  7.             return errors.New("not allow to access global")  
  8.         case lua.OP_SETGLOBAL:  
  9.             return errors.New("not allow to set global")  
  10.         }  
  11.     }  
  12.     // 對嵌套函數(shù)進(jìn)行全局變量的檢查  
  13.     for _, nestedProto :range proto.FunctionPrototypes {  
  14.         if err :CheckGlobal(nestedProto); err != nil {  
  15.             return err  
  16.         }  
  17.     }  
  18.     return nil  
  19.  
  20. func TestCheckGetGlobal(t *testing.T) {  
  21.     l :lua.NewState()  
  22.     proto, _ :CompileString(`print(_G)`)  
  23.     if err :CheckGlobal(proto); err == nil {  
  24.         t.Fail()  
  25.     }  
  26.     l.Close()  
  27.  
  28. func TestCheckSetGlobal(t *testing.T) {  
  29.     l :lua.NewState()  
  30.     proto, _ :CompileString(`_G = {}`)  
  31.     if err :CheckGlobal(proto); err == nil {  
  32.         t.Fail()  
  33.     }  
  34.     l.Close()  

模塊

除變量可能被污染外,導(dǎo)入的 Go 模塊也有可能在運(yùn)行期間被篡改。因此,我們需要一種機(jī)制,確保導(dǎo)入到虛擬機(jī)的模塊不被篡改,即導(dǎo)入的對象是只讀的。

在查閱相關(guān)博客后,我們可以對 Table 的 __newindex 方法的修改,將模塊設(shè)置為只讀模式。 

  1. package main  
  2. import (  
  3.     "fmt"  
  4.     "github.com/yuin/gopher-lua"  
  5.  
  6. // 設(shè)置表為只讀  
  7. func SetReadOnly(l *lua.LState, table *lua.LTable) *lua.LUserData {  
  8.     ud :l.NewUserData()  
  9.     mt :l.NewTable()  
  10.     // 設(shè)置表中域的指向?yàn)?nbsp;table  
  11.     l.SetField(mt, "__index", table)  
  12.     // 限制對表的更新操作  
  13.     l.SetField(mt, "__newindex", l.NewFunction(func(state *lua.LState) int {  
  14.         state.RaiseError("not allow to modify table")  
  15.         return 0  
  16.     }))  
  17.     ud.Metatable = mt  
  18.     return ud  
  19.  
  20. func load(l *lua.LState) int {  
  21.     mod :l.SetFuncs(l.NewTable(), exports)  
  22.     l.SetField(mod, "name", lua.LString("gomodule"))  
  23.     // 設(shè)置只讀  
  24.     l.Push(SetReadOnly(l, mod))  
  25.     return 1  
  26.  
  27. var exports = map[string]lua.LGFunction{  
  28.     "goFunc": goFunc,  
  29.  
  30. func goFunc(l *lua.LState) int {  
  31.     fmt.Println("golang")  
  32.     return 0  
  33.  
  34. func main() {  
  35.     l :lua.NewState()  
  36.     l.PreloadModule("gomodule", load)  
  37.     // 嘗試修改導(dǎo)入的模塊  
  38.     if err :l.DoString(`local m = require("gomodule");m.name = "hello world"`); err != nil {  
  39.         fmt.Println(err)  
  40.     }  
  41.     l.Close()  
  42.  
  43. // <string>:1: not allow to modify table 

寫在***

Golang 和 Lua 的融合,開闊了我的視野:原來靜態(tài)語言和動態(tài)語言還能這么融合,靜態(tài)語言的運(yùn)行高效率,配合動態(tài)語言的開發(fā)高效率,想想都興奮(逃。

在網(wǎng)上找了很久,發(fā)現(xiàn)并沒有關(guān)于 Go-Lua 的技術(shù)分享,只找到了一篇稍微有點(diǎn)聯(lián)系的文章(京東三級列表頁持續(xù)架構(gòu)優(yōu)化 — Golang + Lua (OpenResty) ***實(shí)踐),且在這篇文章中, Lua 還是跑在 C 上的。由于信息的缺乏以及本人(學(xué)生黨)開發(fā)經(jīng)驗(yàn)不足的原因,并不能很好地評價(jià)該方案在實(shí)際生產(chǎn)中的可行性。因此,本篇文章也只能當(dāng)作“閑文”了,哈哈。 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2023-06-27 16:53:50

2018-03-23 04:58:16

區(qū)塊鏈物聯(lián)網(wǎng)互聯(lián)網(wǎng)

2018-06-06 00:26:20

SDN5G無線網(wǎng)絡(luò)

2018-03-16 12:43:38

物聯(lián)網(wǎng)智慧城市智能

2017-04-07 15:57:20

人工智能放射科診斷

2017-04-05 09:50:50

人工智能醫(yī)生

2011-10-11 15:42:54

大數(shù)據(jù)數(shù)據(jù)庫

2015-11-19 00:11:12

2025-11-18 07:00:00

AI戰(zhàn)略自動化自主式AI

2023-04-27 07:40:08

Spring框架OpenAI

2020-03-05 16:35:06

人臉識別口罩人工智能

2012-02-03 14:06:34

Node.js

2015-08-18 09:09:46

WiFiO2O

2024-04-02 11:31:33

USBAndroid

2021-12-27 08:24:08

漏洞網(wǎng)絡(luò)安全

2021-08-19 17:27:41

IT數(shù)據(jù)中心災(zāi)難

2021-05-31 20:48:45

人工智能AI無人機(jī)

2021-07-13 09:29:03

5G網(wǎng)絡(luò)IaaS云計(jì)算

2023-08-26 07:44:13

系統(tǒng)內(nèi)存虛擬

2018-04-12 20:19:19

無線網(wǎng)絡(luò)人工智能機(jī)器學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日韩欧美国产一区二区三区| 一个人看的www日本高清视频| 特级丰满少妇一级aaaa爱毛片| 国产一区日韩| av亚洲精华国产精华精| 自拍偷拍亚洲在线| 亚洲自偷自拍熟女另类| 国产福利免费视频| 久久人人99| 日本精品视频一区二区| 国产日韩久久| 久久网免费视频| 国产精品亚洲四区在线观看| 中文字幕一区二区三区不卡在线 | 亚洲一区国产精品| 少妇av片在线观看| 成人免费网站视频| 91在线播放网址| 午夜精品久久久久久久久久久久久| 精品国产乱码久久久久久1区二区| 成人在线免费公开观看视频| 你懂的在线观看一区二区| 一区二区三区蜜桃| 91沈先生播放一区二区| 国产波霸爆乳一区二区| 精品视频成人| 亚洲制服丝袜av| 色综合久久久久久久久五月| 一区二区视频网站| 欧美国产美女| 亚洲美女性视频| 国产v亚洲v天堂无码久久久| 成人在线免费电影| 99久久99精品久久久久久| 成人午夜黄色影院| 欧美极品视频在线观看| 日韩伦理一区二区| 亚洲欧美一区二区三区久本道91| 91gao视频| 久久影视中文字幕| 天天久久综合| 精品少妇一区二区三区视频免付费 | 懂色av蜜臀av粉嫩av分享吧| 影音先锋中文字幕一区| 日韩激情av在线播放| 欧美两根一起进3p做受视频| chinese偷拍一区二区三区| 99久久国产综合色|国产精品| 亚洲影院色无极综合| 亚洲影院一区二区三区| 秋霞成人午夜伦在线观看| www.日韩.com| 国产原创剧情av| 免费观看亚洲| 久久久久久麻豆| 成人国产精品免费视频| 欧美性受xxx黑人xyx性爽| 激情五月综合| 亚洲最新av网址| 国产大学生av| 日韩av大片站长工具| 精品免费在线观看| 久久av免费观看| 伊人免费在线观看| 美女国产一区二区三区| 欧美黑人狂野猛交老妇| 亚洲综合自拍网| 欧美一区二区三区婷婷| 欧美视频中文一区二区三区在线观看 | www.日日操| 日韩中文视频| 亚洲免费观看高清完整版在线观看熊 | 99国产欧美另类久久久精品| 蜜桃传媒视频第一区入口在线看| 做爰视频毛片视频| 免费在线观看精品| 午夜精品在线视频| 国产美女激情视频| 午夜欧美精品| 亚洲欧美日韩一区二区三区在线| 永久免费看mv网站入口78| 久久av网站| 亚洲а∨天堂久久精品9966| 免费成年人高清视频| 一本大道色婷婷在线| 一区二区三区自拍| 亚洲欧洲日韩综合二区| 亚洲日本在线播放| 国产不卡视频一区二区三区| 国产精品视频免费观看www| 国产成人无码精品久在线观看| 香蕉国产精品| 最近2019年手机中文字幕| 欧美黑人欧美精品刺激| 超碰在线亚洲| 欧美大黄免费观看| 无码人妻精品一区二区三区温州| 成人精品中文字幕| 亚洲视频专区在线| av无码av天天av天天爽| 色偷偷综合网| 正在播放亚洲1区| 欧美激情国产精品免费| 日韩激情视频在线观看| 国产激情视频一区| 西西44rtwww国产精品| 欧美视频四区| 九九热精品视频国产| 精品国产视频在线观看| 国产精品97| 午夜精品久久久久久久99黑人| 涩涩视频在线观看| www.日韩av| 日本黄xxxxxxxxx100| 超碰超碰在线| 亚洲精选视频免费看| 日韩精品视频一区二区在线观看| 日本精品在线播放| 日韩一区二区在线免费观看| 国模大尺度视频| 日韩在线观看中文字幕| 国产亚洲视频在线| 国产第一页精品| 久久一区二区三区喷水| 欧美亚洲国产成人精品| 日韩一级在线视频| 日本aⅴ亚洲精品中文乱码| 国产福利不卡| 日漫免费在线观看网站| 久久精品男人天堂av| 日韩免费av一区二区三区| 国产在线自天天| 国产精品欧美经典| 免费成人进口网站| 好看的中文字幕在线播放| 精品久久久久久久久久久久久| 日本美女视频一区| 欧美综合视频| 国产成人精品av在线| 欧美男男同志| 亚洲欧洲无码一区二区三区| 肉大捧一出免费观看网站在线播放 | 国模精品视频一区二区三区| av黄色在线播放| 丁香啪啪综合成人亚洲小说| 免费av在线一区二区| 久久香蕉av| 色婷婷亚洲综合| 国产无遮挡猛进猛出免费软件 | 日本在线人成| 一区二区三区在线观看网站| 岛国av免费在线| 久久精品青草| 97se国产在线视频| 视频在线这里都是精品| 欧美视频在线观看免费网址| 99re精彩视频| 精品三级av在线导航| 亚洲天堂日韩电影| av一级在线观看| 国产美女主播视频一区| 精品亚洲一区二区三区四区五区高| 国内三级在线观看| 欧美主播一区二区三区| 成年人小视频在线观看| 亚洲电影av| 久久亚洲高清| 性欧美freehd18| 精品成人在线观看| 在线免费观看毛片| 久久99精品国产.久久久久| 精品视频免费观看| 成人小电影网站| 中文字幕少妇一区二区三区| 国产精品久久久久久免费播放| 91在线观看下载| 中文字幕第21页| 人人香蕉久久| 国产福利精品av综合导导航| 黄色动漫在线| 欧美日韩午夜影院| 欧美熟妇一区二区| 国内自拍视频一区二区三区| 91精品国产综合久久久久久蜜臀 | 日韩无码精品一区二区三区| 久久久一区二区| 久久久久久久久久久久久久久国产| 欧美精品播放| 欧美一区二区三区四区夜夜大片| 性国产高清在线观看| 亚洲国产精品va在线看黑人动漫 | 国际av在线| 日韩一区国产二区欧美三区| 亚洲成人第一网站| 亚洲精品综合在线| av手机在线播放| 成人午夜精品一区二区三区| 亚洲色图38p| 亚洲网址在线| 宅男av一区二区三区| 91九色综合| 国产亚洲精品久久久久久777 | 欧美精品一区二区三区四区| 中文字幕av网站| 婷婷久久综合九色综合伊人色| 日韩一卡二卡在线观看| 秋霞av亚洲一区二区三| 4444在线观看| 欧美视频免费| 久久99精品久久久久久水蜜桃| 疯狂欧洲av久久成人av电影| 日本欧美中文字幕| 国产中文字幕在线| 亚洲精品一线二线三线无人区| 在线观看免费黄色小视频| 亚洲国产一区二区三区| 肉丝美足丝袜一区二区三区四| 天堂在线一区二区| 视频一区二区在线| 久久久久观看| 成人自拍偷拍| 国产一区二区三区黄网站| 国产精品第8页| 米奇777四色精品人人爽| 欧美情侣在线播放| 久久久久亚洲av片无码| 国产最新精品免费| 中文字幕免费高| 久久国产精品美女| 国产精品偷伦免费视频观看的| 老司机午夜在线视频| 国产午夜精品一区理论片飘花| 天天操天天干天天操| 日韩精品专区在线影院观看| 一区二区美女视频| 尤物视频一区二区| 自拍偷拍第9页| 国产精品视频yy9299一区| 少妇毛片一区二区三区| av中文字幕一区| 国产精品久久久久久亚洲av| 国产成人午夜99999| www在线观看免费| 伊人久久大香线蕉无限次| 国产精品丝袜白浆摸在线| 日韩成人影音| 国产aaa精品| 欧美人与性动交xxⅹxx| 奇门遁甲1982国语版免费观看高清| h网站在线免费观看| 亚洲性线免费观看视频成熟| 免费在线观看一级毛片| 亚洲色图五月天| 国产粉嫩一区二区三区在线观看 | 亚洲嫩草精品久久| 777777国产7777777| 亚洲精品乱码久久久久久| 亚洲怡红院在线观看| 国产成人精品亚洲777人妖| 亚洲天堂av一区二区| 激情六月婷婷久久| 亚洲在线观看网站| 国产黄色91视频| 稀缺小u女呦精品呦| 成人av高清在线| 国产色视频在线播放| 九色|91porny| 国产免费无码一区二区| 成人免费视频视频在线观看免费 | 精品在线网站观看| 欧美日韩中文国产一区发布| av在线播放一区二区| 欧美在线国产精品| 亚洲天堂导航| 国产精品视频免费在线| www.欧美视频| 国产一区二区三区四区hd| 免费看日本一区二区| 国产精品久久亚洲| 色综合一区二区日本韩国亚洲 | 99这里有精品视频| 精品国产一区二区精华| 六十路在线观看| 久久影视电视剧免费网站| 成人在线免费电影| 久久伊人精品一区二区三区| 在线免费av资源| 成人乱色短篇合集| 日韩欧美美女在线观看| 国产精品视频免费观看| 精品日韩免费| 欧美一区二区三区在线播放 | 中文字幕一区2区3区| 日韩免费性生活视频播放| 欧美日韩伦理片| 欧美成人精品一区二区| 欧美激情黑人| 国模私拍视频一区| 久久久加勒比| 国产精品久久久久久久久久ktv| 国产精品美女久久久久| 久久综合伊人77777麻豆| 亚洲有吗中文字幕| 国产美女视频免费| 在线综合欧美| 国产无限制自拍| 亚洲国产一区二区三区高清| 女人帮男人橹视频播放| 国产精品久久| 国产精品区在线| www国产成人| 欧美一区二区三区成人精品| 亚洲精品视频在线| 欧美日韩在线视频播放| 精品国产免费一区二区三区四区 | 99视频在线视频| 97国产一区二区| 久久久久久久久久久久久久久久久| 在线看一区二区| 日本韩国精品一区二区| 久久久久久亚洲精品中文字幕 | 一区二区在线观看不卡| 一区二区乱子伦在线播放| 亚洲精品久久久久久下一站| 图片区 小说区 区 亚洲五月| 久青草国产97香蕉在线视频| 456成人影院在线观看| 农村寡妇一区二区三区| 伊人成人在线| 中国男女全黄大片| 亚洲欧美日韩在线| 中文字幕一区二区三区四区免费看| 亚洲精品一区二区网址| 成人激情电影在线看| 热99在线视频| 色老板在线视频一区二区| 国产在线观看欧美| 亚洲视频观看| 香蕉网在线视频| 91丨porny丨国产入口| 久久久久亚洲av成人片| 日韩免费视频线观看| 任你弄在线视频免费观看| 91视频免费进入| 欧美日韩一区二区高清| 无码人妻一区二区三区一| 亚洲精品视频在线看| 性做久久久久久久久久| 亚洲石原莉奈一区二区在线观看| 色戒汤唯在线观看| 91精品久久久久久久久久入口| 成人3d精品动漫精品一二三| 国产日韩成人内射视频| 国产午夜亚洲精品午夜鲁丝片| chinese国产精品| 在线观看中文字幕亚洲| 免费在线观看一区| 亚洲一区二区在线看| 亚洲毛片视频| 亚洲第一黄色网址| 欧美体内谢she精2性欧美| 内射无码专区久久亚洲| 日韩中文字幕亚洲| 经典三级久久| 女人被男人躁得好爽免费视频 | 国产成人精品在线视频| 日韩欧美综合| 玖玖爱视频在线| 亚洲免费在线观看| 精品乱子伦一区二区| 在线观看欧美成人| 欧美成a人片免费观看久久五月天| 国产精品无码乱伦| www.久久精品| 中文字幕在线观看免费| 欧美高清视频免费观看| 欧美精品中文| 亚欧激情乱码久久久久久久久| 亚洲激情六月丁香| 青青国产在线| 国产日韩专区在线| 国内精品久久久久久久影视麻豆| 国产伦精品一区二区三区妓女| 欧美色图一区二区三区| 欧美家庭影院| 日本10禁啪啪无遮挡免费一区二区| 麻豆传媒一区二区三区| 黄色小视频在线免费看| 3atv一区二区三区| 成全电影播放在线观看国语| 91夜夜揉人人捏人人添红杏| 一本色道久久综合亚洲精品酒店| 国产精品入口免费软件| 亚洲黄色av一区| 国产毛片av在线| 高清不卡一区二区三区| 日本亚洲欧美天堂免费| 国产午夜久久久| 日韩中文在线观看| 免费成人av|