亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? selector.c

?? gcc的組件
?? C
字號:
/* GNU Objective C Runtime selector related functions   Copyright (C) 1993, 1995, 1996, 1997, 2002, 2004 Free Software Foundation, Inc.   Contributed by Kresten Krab ThorupThis file is part of GCC.GCC is free software; you can redistribute it and/or modify it under theterms of the GNU General Public License as published by the Free SoftwareFoundation; either version 2, or (at your option) any later version.GCC is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU General Public License for moredetails.You should have received a copy of the GNU General Public License along withGCC; see the file COPYING.  If not, write to the Free SoftwareFoundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  *//* As a special exception, if you link this library with files compiled with   GCC to produce an executable, this does not cause the resulting executable   to be covered by the GNU General Public License. This exception does not   however invalidate any other reasons why the executable file might be   covered by the GNU General Public License.  */#include "objc/runtime.h"#include "objc/sarray.h"#include "objc/encoding.h"/* Initial selector hash table size. Value doesn't matter much */#define SELECTOR_HASH_SIZE 128/* Tables mapping selector names to uid and opposite */static struct sarray *__objc_selector_array = 0; /* uid -> sel  !T:MUTEX */static struct sarray *__objc_selector_names = 0; /* uid -> name !T:MUTEX */static cache_ptr      __objc_selector_hash  = 0; /* name -> uid !T:MUTEX *//* Number of selectors stored in each of the above tables */unsigned int __objc_selector_max_index = 0;     /* !T:MUTEX */void __objc_init_selector_tables (void){  __objc_selector_array = sarray_new (SELECTOR_HASH_SIZE, 0);  __objc_selector_names = sarray_new (SELECTOR_HASH_SIZE, 0);  __objc_selector_hash    = objc_hash_new (SELECTOR_HASH_SIZE,		     (hash_func_type) objc_hash_string,		     (compare_func_type) objc_compare_strings);}  /* This routine is given a class and records all of the methods in its class   structure in the record table.  */void__objc_register_selectors_from_class (Class class){  MethodList_t method_list;  method_list = class->methods;  while (method_list)    {      __objc_register_selectors_from_list (method_list);      method_list = method_list->method_next;    }}/* This routine is given a list of methods and records each of the methods in   the record table.  This is the routine that does the actual recording   work.   The name and type pointers in the method list must be permanent and   immutable.   */void__objc_register_selectors_from_list (MethodList_t method_list){  int i = 0;  objc_mutex_lock (__objc_runtime_mutex);  while (i < method_list->method_count)    {      Method_t method = &method_list->method_list[i];      if (method->method_name)	{	  method->method_name	    = __sel_register_typed_name ((const char *) method->method_name,					 method->method_types, 0, YES);	}      i += 1;    }  objc_mutex_unlock (__objc_runtime_mutex);}/* Register instance methods as class methods for root classes */void __objc_register_instance_methods_to_class (Class class){  MethodList_t method_list;  MethodList_t class_method_list;  int max_methods_no = 16;  MethodList_t new_list;  Method_t curr_method;  /* Only if a root class. */  if (class->super_class)    return;  /* Allocate a method list to hold the new class methods */  new_list = objc_calloc (sizeof (struct objc_method_list)			    + sizeof (struct objc_method[max_methods_no]), 1);  method_list = class->methods;  class_method_list = class->class_pointer->methods;  curr_method = &new_list->method_list[0];  /* Iterate through the method lists for the class */  while (method_list)    {      int i;      /* Iterate through the methods from this method list */      for (i = 0; i < method_list->method_count; i++)	{	  Method_t mth = &method_list->method_list[i];	  if (mth->method_name	      && ! search_for_method_in_list (class_method_list,					      mth->method_name))	    {	      /* This instance method isn't a class method. 		  Add it into the new_list. */	      *curr_method = *mth;  	      /* Reallocate the method list if necessary */	      if (++new_list->method_count == max_methods_no)		new_list =		  objc_realloc (new_list, sizeof (struct objc_method_list)				+ sizeof (struct 					objc_method[max_methods_no += 16]));	      curr_method = &new_list->method_list[new_list->method_count];	    }	}      method_list = method_list->method_next;    }  /* If we created any new class methods     then attach the method list to the class */  if (new_list->method_count)    {      new_list = 	objc_realloc (new_list, sizeof (struct objc_method_list)		     + sizeof (struct objc_method[new_list->method_count]));      new_list->method_next = class->class_pointer->methods;      class->class_pointer->methods = new_list;    }  else    objc_free(new_list);    __objc_update_dispatch_table_for_class (class->class_pointer);}/* Returns YES iff t1 and t2 have same method types, but we ignore   the argframe layout */BOOLsel_types_match (const char *t1, const char *t2){  if (! t1 || ! t2)    return NO;  while (*t1 && *t2)    {      if (*t1 == '+') t1++;      if (*t2 == '+') t2++;      while (isdigit ((unsigned char) *t1)) t1++;      while (isdigit ((unsigned char) *t2)) t2++;      /* xxx Remove these next two lines when qualifiers are put in	 all selectors, not just Protocol selectors. */      t1 = objc_skip_type_qualifiers (t1);      t2 = objc_skip_type_qualifiers (t2);      if (! *t1 && ! *t2)	return YES;      if (*t1 != *t2)	return NO;      t1++;      t2++;    }  return NO;}/* return selector representing name */SELsel_get_typed_uid (const char *name, const char *types){  struct objc_list *l;  sidx i;  objc_mutex_lock (__objc_runtime_mutex);  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);  if (i == 0)    {      objc_mutex_unlock (__objc_runtime_mutex);      return 0;    }  for (l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);       l; l = l->tail)    {      SEL s = (SEL) l->head;      if (types == 0 || s->sel_types == 0)	{	  if (s->sel_types == types)	    {	      objc_mutex_unlock (__objc_runtime_mutex);	      return s;	    }	}      else if (sel_types_match (s->sel_types, types))	{	  objc_mutex_unlock (__objc_runtime_mutex);	  return s;	}    }  objc_mutex_unlock (__objc_runtime_mutex);  return 0;}/* Return selector representing name; prefer a selector with non-NULL type */SELsel_get_any_typed_uid (const char *name){  struct objc_list *l;  sidx i;  SEL s = NULL;  objc_mutex_lock (__objc_runtime_mutex);  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);  if (i == 0)    {      objc_mutex_unlock (__objc_runtime_mutex);      return 0;    }  for (l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);       l; l = l->tail)    {      s = (SEL) l->head;      if (s->sel_types)	{	    objc_mutex_unlock (__objc_runtime_mutex);	    return s;	}    }  objc_mutex_unlock (__objc_runtime_mutex);  return s;}/* return selector representing name */SELsel_get_any_uid (const char *name){  struct objc_list *l;  sidx i;  objc_mutex_lock (__objc_runtime_mutex);  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);  if (soffset_decode (i) == 0)    {      objc_mutex_unlock (__objc_runtime_mutex);      return 0;    }  l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);  objc_mutex_unlock (__objc_runtime_mutex);  if (l == 0)    return 0;  return (SEL) l->head;}/* return selector representing name */SELsel_get_uid (const char *name){  return sel_register_typed_name (name, 0);}/* Get name of selector.  If selector is unknown, the empty string ""    is returned */ const char *sel_get_name (SEL selector){  const char *ret;  objc_mutex_lock (__objc_runtime_mutex);  if ((soffset_decode ((sidx)selector->sel_id) > 0)      && (soffset_decode ((sidx)selector->sel_id) <= __objc_selector_max_index))    ret = sarray_get_safe (__objc_selector_names, (sidx) selector->sel_id);  else    ret = 0;  objc_mutex_unlock (__objc_runtime_mutex);  return ret;}BOOLsel_is_mapped (SEL selector){  unsigned int idx = soffset_decode ((sidx)selector->sel_id);  return ((idx > 0) && (idx <= __objc_selector_max_index));}const char *sel_get_type (SEL selector){  if (selector)    return selector->sel_types;  else    return 0;}/* The uninstalled dispatch table */extern struct sarray *__objc_uninstalled_dtable;/* __sel_register_typed_name allocates lots of struct objc_selector:s   of 8 (16, if pointers are 64 bits) bytes at startup. To reduce the number   of malloc calls and memory lost to malloc overhead, we allocate   objc_selector:s in blocks here. This is only called from   __sel_register_typed_name, and __sel_register_typed_name may only be   called when __objc_runtime_mutex is locked.   Note that the objc_selector:s allocated from __sel_register_typed_name   are never freed.   62 because 62 * sizeof (struct objc_selector) = 496 (992). This should   let malloc add some overhead and use a nice, round 512 (1024) byte chunk.   */#define SELECTOR_POOL_SIZE 62static struct objc_selector *selector_pool;static int selector_pool_left;static struct objc_selector *pool_alloc_selector(void){  if (!selector_pool_left)    {      selector_pool = objc_malloc (sizeof (struct objc_selector)				   * SELECTOR_POOL_SIZE);      selector_pool_left = SELECTOR_POOL_SIZE;    }  return &selector_pool[--selector_pool_left];}/* Store the passed selector name in the selector record and return its   selector value (value returned by sel_get_uid).   Assumes that the calling function has locked down __objc_runtime_mutex. *//* is_const parameter tells us if the name and types parameters   are really constant or not.  If YES then they are constant and   we can just store the pointers.  If NO then we need to copy   name and types because the pointers may disappear later on. */SEL__sel_register_typed_name (const char *name, const char *types, 			   struct objc_selector *orig, BOOL is_const){  struct objc_selector *j;  sidx i;  struct objc_list *l;  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);  if (soffset_decode (i) != 0)    {      for (l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);	   l; l = l->tail)	{	  SEL s = (SEL) l->head;	  if (types == 0 || s->sel_types == 0)	    {	      if (s->sel_types == types)		{		  if (orig)		    {		      orig->sel_id = (void *) i;		      return orig;		    }		  else		    return s;		}	    }	  else if (! strcmp (s->sel_types, types))	    {	      if (orig)		{		  orig->sel_id = (void *) i;		  return orig;		}	      else		return s;	    }	}      if (orig)	j = orig;      else	j = pool_alloc_selector ();      j->sel_id = (void *) i;      /* Can we use the pointer or must copy types?  Don't copy if NULL */      if ((is_const) || (types == 0))	j->sel_types = (const char *) types;      else {	j->sel_types = (char *) objc_malloc (strlen (types) + 1);	strcpy ((char *) j->sel_types, types);      }      l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);    }  else    {      __objc_selector_max_index += 1;      i = soffset_encode (__objc_selector_max_index);      if (orig)	j = orig;      else	j = pool_alloc_selector ();	      j->sel_id = (void *) i;      /* Can we use the pointer or must copy types?  Don't copy if NULL */      if ((is_const) || (types == 0))	j->sel_types = (const char *) types;      else {	j->sel_types = (char *) objc_malloc (strlen (types) + 1);	strcpy ((char *) j->sel_types, types);      }      l = 0;    }  DEBUG_PRINTF ("Record selector %s[%s] as: %ld\n", name, types, 		(long) soffset_decode (i));    {    int is_new = (l == 0);    const char *new_name;    /* Can we use the pointer or must copy name?  Don't copy if NULL */    if ((is_const) || (name == 0))      new_name = name;    else {      new_name = (char *) objc_malloc (strlen (name) + 1);      strcpy ((char *) new_name, name);    }    l = list_cons ((void *) j, l);    sarray_at_put_safe (__objc_selector_names, i, (void *) new_name);    sarray_at_put_safe (__objc_selector_array, i, (void *) l);    if (is_new)      objc_hash_add (&__objc_selector_hash, (void *) new_name, (void *) i);  }  sarray_realloc (__objc_uninstalled_dtable, __objc_selector_max_index + 1);  return (SEL) j;}SELsel_register_name (const char *name){  SEL ret;      objc_mutex_lock (__objc_runtime_mutex);  /* Assume that name is not constant static memory and needs to be     copied before put into a runtime structure.  is_const == NO */  ret = __sel_register_typed_name (name, 0, 0, NO);  objc_mutex_unlock (__objc_runtime_mutex);    return ret;}SELsel_register_typed_name (const char *name, const char *type){  SEL ret;  objc_mutex_lock (__objc_runtime_mutex);  /* Assume that name and type are not constant static memory and need to     be copied before put into a runtime structure.  is_const == NO */  ret = __sel_register_typed_name (name, type, 0, NO);  objc_mutex_unlock (__objc_runtime_mutex);    return ret;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合免费观看高清在线观看| 日韩欧美高清在线| 国产不卡在线一区| 国产成人在线影院| 国产激情偷乱视频一区二区三区| 国产一区二区三区黄视频 | 国产成人免费视频网站高清观看视频| 天天色天天爱天天射综合| 亚洲图片欧美色图| 免费在线观看视频一区| 久久精品国产秦先生| 国产一区二区久久| av色综合久久天堂av综合| 91免费看片在线观看| 欧美日韩中文字幕一区二区| 日韩一区二区麻豆国产| 日韩精品自拍偷拍| 国产精品蜜臀在线观看| 亚洲一区二区三区免费视频| 美日韩一区二区| 国产·精品毛片| 91福利精品视频| 欧美成人精精品一区二区频| 中文字幕av不卡| 一区二区三区精品久久久| 麻豆国产精品视频| 成人激情视频网站| 欧美精品久久久久久久多人混战| 精品欧美一区二区久久| 国产欧美一区二区在线观看| 日韩理论电影院| 蜜臀av一区二区| 91影院在线观看| 欧美tk丨vk视频| 亚洲免费在线视频| 久久99热国产| 欧美久久久久久久久中文字幕| 久久综合一区二区| 亚洲国产精品精华液网站| 国产在线一区二区| 欧美一区二区视频观看视频| 亚洲欧美一区二区久久| 国产高清在线精品| 日韩美女一区二区三区| 亚洲综合免费观看高清完整版在线| 国产九九视频一区二区三区| 欧美裸体bbwbbwbbw| 国产精品久久久久久久久久久免费看 | 欧美写真视频网站| 国产欧美在线观看一区| 日韩av一区二区三区| 在线中文字幕一区二区| 国产精品美女久久久久久久久久久| 日韩专区中文字幕一区二区| 色婷婷综合中文久久一本| 国产色婷婷亚洲99精品小说| 日本va欧美va瓶| 日韩午夜精品电影| 亚洲福利视频一区二区| 日本韩国视频一区二区| 亚洲欧美偷拍另类a∨色屁股| 国产九九视频一区二区三区| 精品剧情在线观看| 久久99久久99| 精品少妇一区二区三区 | 欧美成人性战久久| 奇米在线7777在线精品| 欧美精品色综合| 亚洲a一区二区| 制服丝袜一区二区三区| 香蕉久久夜色精品国产使用方法 | 亚洲欧美日韩在线| 99精品视频中文字幕| 中文字幕乱码亚洲精品一区| 国产成人自拍高清视频在线免费播放| 久久综合久久鬼色中文字| 国产做a爰片久久毛片| 久久夜色精品国产噜噜av| 国产在线精品国自产拍免费| www精品美女久久久tv| 国产精品一区二区视频| 国产精品毛片久久久久久久| 91蝌蚪国产九色| 亚洲最新在线观看| 91麻豆精品国产无毒不卡在线观看| 午夜av一区二区| 精品国产不卡一区二区三区| 国产一区二区成人久久免费影院 | 精品成人佐山爱一区二区| 久久成人久久鬼色| 欧美国产成人在线| 在线观看www91| 天天亚洲美女在线视频| 欧美精品一区二区三区一线天视频 | 欧美日韩综合一区| 蜜桃一区二区三区在线观看| 久久久www成人免费毛片麻豆 | 首页亚洲欧美制服丝腿| 日韩欧美中文字幕一区| 成人爽a毛片一区二区免费| 一区二区三区在线免费播放| 337p亚洲精品色噜噜狠狠| 国产成人综合在线观看| 亚洲综合视频在线观看| 日韩精品最新网址| 色综合色综合色综合色综合色综合| 日韩精品一区第一页| 国产女主播一区| 777午夜精品视频在线播放| 国产成人日日夜夜| 日韩在线卡一卡二| 亚洲欧洲一区二区三区| 日韩亚洲国产中文字幕欧美| 成人中文字幕电影| 日韩va亚洲va欧美va久久| 国产精品国产三级国产aⅴ中文| 欧美精品自拍偷拍| av一区二区三区在线| 美女视频黄久久| 一区二区三区自拍| 欧美国产欧美综合| 欧美精品一区视频| 日韩一区二区电影| 91国偷自产一区二区使用方法| 国产一区二区在线看| 亚洲午夜电影在线| 综合欧美一区二区三区| 久久久国产精华| 日韩欧美中文一区| 制服丝袜亚洲精品中文字幕| 91网上在线视频| 国产黑丝在线一区二区三区| 免费成人av在线| 日韩制服丝袜av| 亚洲一卡二卡三卡四卡| 亚洲视频在线观看三级| 欧美国产激情二区三区| 国产午夜亚洲精品羞羞网站| 日韩无一区二区| 欧美美女一区二区三区| 欧美午夜宅男影院| 色婷婷国产精品| 日本高清无吗v一区| youjizz国产精品| 成人涩涩免费视频| 成人免费视频国产在线观看| 国产精品亚洲视频| 国产精品自在在线| 国产成人精品影院| 国产成人在线视频网站| 国产成人自拍网| 成人av在线播放网址| av在线这里只有精品| 97久久人人超碰| 91色九色蝌蚪| 色婷婷激情一区二区三区| 在线亚洲一区二区| 欧美日韩国产一二三| 91.麻豆视频| 精品人在线二区三区| 久久嫩草精品久久久精品| 久久婷婷一区二区三区| 亚洲免费在线播放| 一区二区三区免费看视频| 亚洲va国产天堂va久久en| 日韩影视精彩在线| 国内精品国产成人国产三级粉色| 久久99久久精品欧美| 丁香网亚洲国际| 日本电影欧美片| 91精品国产综合久久精品app| 欧美成人精精品一区二区频| 久久久久97国产精华液好用吗 | 91免费视频观看| 欧美日韩综合一区| 久久午夜色播影院免费高清 | 欧美亚洲精品一区| 精品国产免费视频| 国产精品国模大尺度视频| 亚洲午夜视频在线| 国内外成人在线| 91福利社在线观看| 久久影院视频免费| 依依成人综合视频| 国产综合色产在线精品| 色婷婷狠狠综合| 国产亚洲欧美一级| 亚欧色一区w666天堂| 国产精品一区二区黑丝| 色婷婷综合中文久久一本| 精品久久国产字幕高潮| 1024成人网| 久久69国产一区二区蜜臀 | 亚洲影视在线观看| 国产精品一区专区| 欧美日韩精品欧美日韩精品一 | 裸体在线国模精品偷拍| 97精品视频在线观看自产线路二| 欧美一区二区美女| 亚洲主播在线观看|