青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    由于Vczh Library++3.0的托管語(yǔ)言ManagedX被設(shè)計(jì)成編譯到本地語(yǔ)言NativeX,因此山寨一個(gè)mscorlib.dll是必不可少的。不過(guò)我的mscorlib.dll只包含最低限度的代碼。譬如說(shuō)string,譬如說(shuō)數(shù)組,譬如說(shuō)函數(shù)類型等等這些本不能用托管語(yǔ)言自己來(lái)實(shí)現(xiàn)的類(C++是唯一的一個(gè)所有東西都可以用類庫(kù)來(lái)彌補(bǔ)的語(yǔ)言)。因此花費(fèi)了數(shù)日,用ManagedX實(shí)現(xiàn)了它的聲明和一些代碼,然后external一些函數(shù)。最終,ManagedX寫的mscorlib會(huì)被編譯成NativeX,而external的幾個(gè)函數(shù)自然會(huì)用NativeX自己來(lái)寫。譬如說(shuō)如何比較兩個(gè)string的大小,這個(gè)托管語(yǔ)言自己顯然是搞不定的。

    因此這里就比較麻煩了,需要做一些工程上的麻煩事情。首先,若干個(gè)ManagedX文件被編譯成一個(gè)單獨(dú)的NativeX文件,然后這個(gè)生成的NativeX文件跟另一個(gè)手寫的NativeX文件再一起被編譯成一個(gè)assembly。這就跟把C#編譯成C差不多。

    第一個(gè)版本的ManagedX還需要做出一點(diǎn)折衷,譬如說(shuō)數(shù)組的維度不能超過(guò)10。這里的維度指的是a[,,,,,,,,,],而不是a[][][][][][][][][][]。譬如說(shuō)函數(shù)類型的參數(shù)數(shù)量不能超過(guò)10(但是函數(shù)的參數(shù)數(shù)量卻可以,這里只針對(duì)函數(shù)類型)。主要是因?yàn)椋瑸榱俗孧anagedX可以被編譯成NativeX,那么勢(shì)必不可能運(yùn)行的時(shí)候才動(dòng)態(tài)生成某個(gè)類(模板除外,因?yàn)槲业腘ativeX==C+template)。因此一維、二維乃至十維的數(shù)組當(dāng)然是10個(gè)不同的類(你可以使用一個(gè)二維的十維數(shù)組的數(shù)組去模擬一個(gè)十二維的數(shù)組,這毫無(wú)問(wèn)題)。不過(guò)為了避免我真的將一批相似的類重復(fù)寫10次,我使用了一年多前開發(fā)的Fpmacro來(lái)做。Fpmacro是一個(gè)語(yǔ)法不同的類似C語(yǔ)言宏的擴(kuò)展,但是沒(méi)有C語(yǔ)言的宏的所有陷阱,而且其實(shí)是一門函數(shù)是語(yǔ)言,帶有類似lambda表達(dá)式的東西,每一個(gè)函數(shù)都被設(shè)計(jì)成一個(gè)返回字符串的函數(shù),參數(shù)可以是數(shù)組、字符串或者另一個(gè)函數(shù)。而且語(yǔ)法經(jīng)過(guò)了優(yōu)化,完全沒(méi)有多余的東西。這里給一個(gè)例子,譬如說(shuō)聲明10個(gè)Array的Fpmacro代碼:
  1 $$include:Common.fpm
  2 
  3 $$define $DIMENTION_FIELD_NAME($element) dimSize$element
  4 $$define $DIMENTION_PARAMETER_NAME($element) _$element
  5 $$define $DIMENTION_PARAMETER_DEFINITION($element) int $DIMENTION_PARAMETER_NAME($element)
  6 $$define $DIMENTION_PARAMETER_NAME_IN_ARRAY($element) indices[$element]
  7 
  8 $$define $DIMENTION_FIELD($element) $$begin
  9         private int $DIMENTION_FIELD_NAME($element);
 10 $( )
 11 $$end
 12 
 13 $$define $DIMENTION_FIELD_SETTER($element) $$begin
 14             $DIMENTION_FIELD_NAME($element) = $DIMENTION_PARAMETER_NAME($element);
 15 $( )
 16 $$end
 17 
 18 $$define $DIMENTION_SIZE_CASE($element) $$begin
 19                 case $element:
 20                     return $DIMENTION_FIELD_NAME($element);
 21 $( )
 22 $$end
 23 
 24 $$define $DIMENTION_CHECK($element) $$begin
 25             if($DIMENTION_PARAMETER_NAME($element)<0 || $DIMENTION_PARAMETER_NAME($element)>=$DIMENTION_FIELD_NAME($element))
 26                 throw new ArgumentOutOfRangeException($(")$DIMENTION_PARAMETER_NAME($element)$("));
 27 $( )
 28 $$end
 29 
 30 $$define $DIMENTION_SUMMERS($elements) $$begin
 31   $$define $DIMENTION_SUMMER($index) $$begin
 32             sum*=$DIMENTION_FIELD_NAME($sub($sub($elements,1),$index));
 33             index+=sum*$DIMENTION_PARAMETER_NAME($sub($sub($elements,2),$index));
 34 $( )
 35   $$end
 36 $loop($sub($elements,1),0,$DIMENTION_SUMMER)
 37 $$end
 38 
 39 $$define $ARRAY_IMPLEMENTATION($elements) $$begin
 40 $( )
 41     generic<inout T>
 42     public sealed class Array$elements : Array
 43     {
 44 $( )
 45         public constructor($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ), Array<T> src=nullbool copy=true)
 46         {
 47 $loop($elements,0,$DIMENTION_FIELD_SETTER)
 48             Initialize(this.Length, src, copy);
 49         }
 50 $( )
 51 $loop($elements,0,$DIMENTION_FIELD)
 52         public override int GetDimCount()
 53         {
 54             return $elements;
 55         }
 56 $( )
 57         public override int GetDimSize(int dim)
 58         {
 59             switch(dim)
 60             {
 61 $loop($elements,0,$DIMENTION_SIZE_CASE)
 62                 default:
 63                     throw new ArgumentOutOfRangeException("dim");
 64             }
 65         }
 66 $( )
 67         public override int Length
 68         {
 69             get
 70             {
 71                 return $loopsep($elements,0,$DIMENTION_FIELD_NAME,$(*));
 72             }
 73         }
 74 $( )
 75         public override int GetStartIndexFromIndices(params int[] indices)
 76         {
 77             if(indices.Length!=$elements)
 78             {
 79                 throw new ArgumentOutOfRangeException("indices");
 80             }
 81             return GetStartIndex[$loopsep($elements,0,$DIMENTION_PARAMETER_NAME_IN_ARRAY,$(,))];
 82         }
 83 $( )
 84         public int GetStartIndex($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
 85         {
 86 $loop($elements,0,$DIMENTION_CHECK)
 87             int index=$DIMENTION_PARAMETER_NAME($sub($elements,1));
 88             int sum=1;
 89             $DIMENTION_SUMMERS($elements)
 90             return index;
 91         }
 92 $( )
 93         public override T GetElement(params int[] indices)
 94         {
 95             return Get(GetStartIndexFromIndices(indices));
 96         }
 97 $( )
 98         public override void SetElement(T value, params int[] indices)
 99         {
100             Set(value, GetStartIndexFromIndices(indices));
101         }
102 $( )
103         public T operator get[]($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
104         {
105             return Get($loopsep($elements,0,$DIMENTION_PARAMETER_NAME,$(,) ));
106         }
107 $( )
108         public T operator set[](T value, $loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
109         {
110             return Set(value, $loopsep($elements,0,$DIMENTION_PARAMETER_NAME,$(,) ));
111         }
112 $( )
113     }
114 $$end
115 
116 namespace System
117 {
118     generic<inout T>
119     public abstract class Array : IEnumerable<T>
120     {
121         protected intptr gchandle=0;
122         protected external void Initialize(int size, Array<T> src, bool copy);
123         public external T Get(int position);
124         public external void Set(T value, int position);
125 $( )
126         public external void CopyTo(intptr pointer, int fromStart, int length);
127         public external void CopyTo(Array<T> array, int fromStart, int length, int toStart);
128 $( )
129         public abstract int GetDimCount();
130         public abstract int GetDimSize(int dim);
131         public abstract int Length{get;}
132         public abstract int GetStartIndexFromIndices(params int[] indices);
133         public abstract T GetElement(params int[] indices);
134         public abstract void SetElement(T value, params int[] indices);
135 $( )
136         private class Enumerator : IEnumerator
137         {
138             private Array<T> array;
139             private int index;
140 $( )
141             public constructor(Array<T> array)
142             {
143                 this.array=array;
144                 this.index=-1;
145             }
146 $( )
147             public bool MoveNext()
148             {
149                 if(index==array.Length-1)
150                 {
151                     return false;
152                 }
153                 else
154                 {
155                     index++;
156                     return true;
157                 }
158             }
159 $( )
160             public T Current
161             {
162                 get
163                 {
164                     return array.Get(index);
165                 }
166             }
167 $( )
168             object IEnumerator::Current
169             {
170                 get
171                 {
172                     return array.Get(index);
173                 }
174             }
175         }
176 $( )
177         IEnumerator<T> IEnumerable<T>::GetEnumerator()
178         {
179             return new Enumerator(this);
180         }
181 $( )
182         IEnumerator IEnumerable::GetEnumerator()
183         {
184             return new Enumerator(this);
185         }
186 $( )
187     }
188 $( )
189     generic<inout T>
190     public class ReadonlyArray
191     {
192         private T[] items;
193 $( )
194         public constructor(T[] items)
195         {
196             this.items=items;
197         }
198 $( )
199         public int Length
200         {
201             get
202             {
203                 return this.items.Length;
204             }
205         }
206 $( )
207         public T operator get[](int index)
208         {
209             return this.items[index];
210         }
211     }
212 $loop($MAX_ELEMENT_COUNT(),1,$ARRAY_IMPLEMENTATION)
213 }

    會(huì)被擴(kuò)展成(太長(zhǎng)cppblog編輯器性能太爛導(dǎo)致響應(yīng)速度無(wú)法忍受,下載代碼并打開UnitTest\Binary\ScriptCoreLibrary\System.CoreManaged\Array.txt自行閱讀)

    山寨mscorlib.dll的ManagedX部分基本完成,剩下的十幾個(gè)函數(shù)寫的NativeX則等到編譯成NativeX的部分完成之后再寫。到了這里,一共實(shí)現(xiàn)了:
    Array<T>
    Array1<T> .. Array10<T>
    Attribute
    AttributeUsageAttribute
    AutoGeneratedAttribute
    NotInstantiableAttribute
    StructBaseAttribute
    DefaultValueAttribute
    VariadicParameterAttribute
    EnumItemBase
    EnumItemManager
    Exception
    IndexOutOfRangeException
    ArgumentOutOfRangeException
    WrongFormatException
    TypeConversionException
    NotImplementedException
    Delegate
    DelegateTarget
    MethodDelegate
    BroadcastDelegate
    Function<R> .. Function<R, T0 .. T9>
    Procedure, Procedure<T0> .. Procedure<T0 .. T9>
    Event, Event<T0> .. Event<T0 .. T9>
    IEnumerator
    IEnumerable
    IEnumerator<T>
    IEnumerable<T>
    SInt8 .. SInt64
    UInt8 .. UInt64
    Single, Double, Char, Bool, Void
    Object
    String
    Type

    從明天開始就要做ManagedX的語(yǔ)義分析器了。接下來(lái)的路還很長(zhǎng)。語(yǔ)義分析結(jié)束之后,要把ManagedX展開變成一份更長(zhǎng)但是包含的東西更少的ManagedX(譬如沒(méi)有l(wèi)ambda expression,因?yàn)楸恢貙懗闪艘粋€(gè)內(nèi)部類),最后編譯成NativeX。
posted on 2011-06-26 09:15 陳梓瀚(vczh) 閱讀(4038) 評(píng)論(17)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀(jì)事

評(píng)論:
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 16:47 | 空明流轉(zhuǎn)
樓主威武!(別刪我留言。。。)  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 17:42 | clayui
才知道樓主是這么一個(gè)牛人,也非常感謝樓主能去clayui踢館,所以,我今天,不是來(lái)踢館的:)我只有1個(gè)問(wèn)題,我想用樓主的東西,不知道效率如何,跟adobe的AVM2比起來(lái)怎么樣?  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:04 | 戰(zhàn)魂小筑
為啥不用Live Writer呢,編輯起來(lái)多方便  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:18 | lwch
完全看不懂這是神馬玩意...  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:24 | 空明流轉(zhuǎn)
@clayui
完全不是一個(gè)性質(zhì)的玩意兒。
它的那個(gè)東西更像是C#。一門Pure JIT的語(yǔ)言。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:27 | 陳梓瀚(vczh)
@lwch
你只要想象一下string是如何寫出來(lái)的,就知道了……為什么M¥要提供C++/CLI,基本上就是為了這個(gè)。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:29 | 陳梓瀚(vczh)
@clayui
嗯,我還是在山寨C#。不過(guò)距離能用還很遠(yuǎn)……倒是再主頁(yè)上置頂了一個(gè)freescript,是一門動(dòng)態(tài)語(yǔ)言,你可以試試。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:33 | Error
雖然現(xiàn)在還不知道樓主在說(shuō)什么,但是依然覺得樓主V6、樓主牛鞭,,,  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:36 | clayui
@陳梓瀚(vczh)
試試freescript,這是一個(gè)現(xiàn)實(shí)的問(wèn)題,而現(xiàn)實(shí)是比較殘酷的,那么freescript與V8相比有什么優(yōu)點(diǎn)?我的意思是如果別人用V8,而我用freescript,那么我是否比別人更有優(yōu)勢(shì)?  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:38 | clayui
@空明流轉(zhuǎn)
我的確不是很懂這個(gè),所以可能會(huì)說(shuō)出讓你笑掉大牙的話,呵呵,那么,我看介紹說(shuō)的是“通用多語(yǔ)言腳本平臺(tái)”,AVM2是一個(gè)腳本引擎,這2者究竟有何區(qū)別呢?望賜教。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:47 | 陳梓瀚(vczh)
@clayui
這世界上任何一門動(dòng)態(tài)語(yǔ)言都不會(huì)比其他動(dòng)態(tài)語(yǔ)言更有優(yōu)勢(shì)——如果你拿他當(dāng)腳本用的話。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:51 | 陳梓瀚(vczh)
@clayui
這個(gè)嘛,我的初始目的是想做一個(gè)公共的后端,讓以后拿新的語(yǔ)法做實(shí)驗(yàn)會(huì)變得非常容易,并且把結(jié)構(gòu)拆散有利于別人學(xué)習(xí)編譯原理,最后順便實(shí)現(xiàn)把動(dòng)態(tài)語(yǔ)言編譯成本低代碼的夢(mèng)想。想要做到最后一步根據(jù)現(xiàn)在的速度,估計(jì)還得有幾年的時(shí)間。

而一個(gè)腳本引擎,就是做來(lái)給你用的,目的很單純。

這里的區(qū)別就是,倘若我在后面那幾年把我想做的優(yōu)化都做完的話,那以后想支持什么新語(yǔ)言(眾口難調(diào)啊),都做到這個(gè)后端上去,那就變成一個(gè)parser的工作,而不是一個(gè)腳本引擎整個(gè)的工作了。譬如說(shuō)javascript,譬如說(shuō)python,譬如說(shuō)ruby,雖然語(yǔ)法看上去差很遠(yuǎn),但其實(shí)都沒(méi)什么區(qū)別,不需要每一門都單獨(dú)重做一次  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 20:14 | clayui
@陳梓瀚(vczh)
基本上明白了,呵呵,謝謝,我想我要的應(yīng)該就是你優(yōu)化后的東西吧,希望幾年后我還能用上你的腳本語(yǔ)言。根據(jù)我的理解,你應(yīng)該是想要實(shí)現(xiàn)一個(gè)統(tǒng)一的parser引擎?如果這個(gè)能做好,說(shuō)不定可以成為所有腳本語(yǔ)言進(jìn)行parser的一個(gè)工業(yè)標(biāo)準(zhǔn)?恩,假如是這樣,那么,真的很有意思,呵呵。  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 21:36 | 陳梓瀚(vczh)
@clayui
不是統(tǒng)一的parser,parser沒(méi)什么好統(tǒng)一的,只是another CLR/llvm/其他什么的罷了……  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-27 06:15 | 千暮(zblc)
- -bnr 兩個(gè)美元符號(hào)真惡心  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-07-06 01:11 | 蔣楓亦
寫編譯器的工作量實(shí)在很大,各種考慮,這還是在用了工具的情況下,要是沒(méi)有ANTLR ,LLVM等等這些工具的話,估計(jì)我們公司的編譯器開發(fā)完成要猴年馬月了。即時(shí)這樣天天小問(wèn)題還不斷,目前在做怎么支持直接到android平臺(tái)運(yùn)行,android這個(gè)平臺(tái)還真是復(fù)雜,關(guān)sdk工具命令就N多。樓主加油!  回復(fù)  更多評(píng)論
  
# re: Vczh Library++3.0之山寨mscorlib.dll 2011-07-08 08:04 | 陳梓瀚(vczh)
@蔣楓亦
嗯,我在嘗試山寨一個(gè)后端,ANTLR那樣子的前端我已經(jīng)搞定了。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清不卡| 一区二区三区视频观看| 在线亚洲伦理| 日韩午夜黄色| 亚洲综合第一| 亚洲一区日韩在线| 欧美亚洲视频| 久久视频精品在线| 欧美不卡视频一区发布| 亚洲国产精品一区在线观看不卡| 欧美bbbxxxxx| 亚洲人午夜精品免费| 亚洲女人av| 久久免费偷拍视频| 欧美日韩国产在线观看| 国产欧美日本| 日韩视频免费在线| 久久成人在线| 亚洲国产精品一区二区第一页 | 亚洲一区在线免费观看| 欧美一级专区免费大片| 男同欧美伦乱| 国产伦精品一区| 亚洲国产日韩欧美在线动漫| 亚洲午夜日本在线观看| 久久亚洲精品一区二区| 99精品免费| 美女精品国产| 国产视频一区在线观看| 99在线热播精品免费| 久久综合亚州| 亚洲字幕一区二区| 欧美日韩国产经典色站一区二区三区| 国产亚洲一区二区精品| 亚洲视频在线看| 欧美韩国一区| 久久av一区二区| 国产精品久久国产三级国电话系列 | 亚洲精选一区| 久久久久久亚洲精品中文字幕| 亚洲日本久久| 欧美高清视频一区二区三区在线观看 | 亚洲综合不卡| 欧美中文在线字幕| 亚洲高清视频一区| 欧美制服第一页| 欧美香蕉视频| 99在线|亚洲一区二区| 久久亚洲综合| 欧美在线观看天堂一区二区三区| 欧美午夜无遮挡| 一区二区三区四区五区精品| 欧美激情视频在线播放| 久久香蕉国产线看观看av| 红桃视频国产一区| 久久免费黄色| 久久国产精品电影| 国产午夜精品福利| 久久久国产精品一区| 亚洲影院色在线观看免费| 国产精品拍天天在线| 午夜精品久久久久久| 亚洲午夜激情网站| 国产欧美在线观看一区| 久久久精品日韩| 久久精品女人| 亚洲国产天堂久久国产91| 欧美福利电影在线观看| 欧美二区不卡| 亚洲桃色在线一区| 亚洲无线一线二线三线区别av| 欧美视频在线观看视频极品| 在线亚洲激情| 亚洲欧美国产高清| 在线国产日韩| 91久久精品视频| 欧美日韩精品国产| 久久高清国产| 男女视频一区二区| 日韩亚洲欧美一区| 在线亚洲美日韩| 国内精品99| 亚洲国产日本| 国产乱人伦精品一区二区| 另类av一区二区| 欧美精品尤物在线| 欧美一区免费| 欧美激情综合色综合啪啪| 亚洲在线电影| 久久精品亚洲一区| 中文国产成人精品| 久久久久se| 正在播放亚洲一区| 性做久久久久久| 日韩天堂在线视频| 小黄鸭精品密入口导航| 亚洲国产婷婷| 午夜精品国产更新| 日韩午夜在线视频| 久久av最新网址| 一区二区三区福利| 老司机久久99久久精品播放免费 | 欧美影片第一页| 亚洲激情小视频| 亚洲免费小视频| 亚洲精品国产日韩| 欧美一区二区女人| 一区二区激情小说| 久久精品30| 亚洲欧美精品| 欧美护士18xxxxhd| 老司机aⅴ在线精品导航| 国产精品爱久久久久久久| 欧美成人国产| 国产日韩欧美在线视频观看| 亚洲伦理在线免费看| 亚洲电影中文字幕| 欧美在线free| 欧美一区二区在线观看| 欧美午夜不卡| 99热在这里有精品免费| 亚洲精品黄色| 快射av在线播放一区| 久久久蜜桃一区二区人| 国产精品日韩精品欧美在线| 日韩亚洲在线观看| 日韩亚洲国产欧美| 免费不卡视频| 欧美成人69| 亚洲国产精品悠悠久久琪琪| 久久精品一二三区| 久久青青草综合| 国产在线精品二区| 欧美专区一区二区三区| 久久久久久网| 一区国产精品| 久久这里只精品最新地址| 久久亚洲精品欧美| **欧美日韩vr在线| 免费成人av| 亚洲欧洲在线一区| 一本色道久久综合| 欧美三区美女| 亚洲视频电影图片偷拍一区| 亚洲欧美日韩网| 国产精品永久在线| 午夜精品在线视频| 久久青青草综合| 亚洲激情成人网| 欧美久久久久免费| 亚洲深爱激情| 久久久噜噜噜久噜久久| 在线欧美影院| 欧美日韩午夜视频在线观看| 一区二区三区|亚洲午夜| 香蕉成人伊视频在线观看 | 国产日韩在线看| 久久精品毛片| 91久久精品一区| 亚洲一区二区三区免费在线观看| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 一本到高清视频免费精品| 久久久久久久久久看片| 国内精品美女av在线播放| 老司机午夜精品| 一区二区三区免费观看| 久久精品99无色码中文字幕| 在线观看视频一区| 欧美日韩国产成人在线免费| 午夜视频精品| 亚洲激情成人在线| 久久国产欧美| 夜色激情一区二区| 国外成人在线| 欧美日韩国产影院| 久久久久久夜| 一区二区免费在线播放| 玖玖玖国产精品| 亚洲一区二区免费视频| 一区二区亚洲精品| 国产精品一区二区你懂的| 母乳一区在线观看| 香蕉久久一区二区不卡无毒影院| 亚洲国产精品综合| 久久久美女艺术照精彩视频福利播放| 99在线|亚洲一区二区| 国精产品99永久一区一区| 欧美三区视频| 免费成人小视频| 欧美一站二站| 亚洲伊人观看| 日韩香蕉视频| 亚洲国产另类精品专区 | 久久国产精品久久久久久久久久 | aa亚洲婷婷| 亚洲国产cao| 国产一区清纯| 国产偷自视频区视频一区二区| 国产精品成人免费视频| 欧美日韩精品免费看 |