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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? selector.c

?? GCC編譯器源代碼
?? C
字號:
/* GNU Objective C Runtime selector related functions   Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.   Contributed by Kresten Krab ThorupThis file is part of GNU CC.GNU CC 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.GNU CC 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 withGNU CC; see the file COPYING.  If not, write to the Free SoftwareFoundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "runtime.h"#include "objc/sarray.h"#include "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 */static void register_selectors_from_list(MethodList_t);/* Number of selectors stored in each of the above tables */int __objc_selector_max_index = 0;              /* !T:MUTEX */void __objc_init_selector_tables(){  __objc_selector_array = sarray_new (SELECTOR_HASH_SIZE, 0);  __objc_selector_names = sarray_new (SELECTOR_HASH_SIZE, 0);  __objc_selector_hash    = hash_new (SELECTOR_HASH_SIZE,		(hash_func_type) hash_string,		(compare_func_type) 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)    {      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.   This one is only called for Class objects.  For categories,   class_add_method_list is called.   */static voidregister_selectors_from_list (MethodList_t method_list){  int i = 0;  while (i < method_list->method_count)    {      Method_t method = &method_list->method_list[i];      method->method_name 	= sel_register_typed_name ((const char*)method->method_name, 				     method->method_types);      i += 1;    }}/* 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;    }    __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(*t1)) t1++;      while (isdigit(*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) 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) 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) 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;/* 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) 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 = objc_malloc (sizeof (struct objc_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 = objc_malloc (sizeof (struct objc_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, 		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)      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;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av一二三不卡影片| 亚洲成人7777| 成人高清免费在线播放| 国产日韩影视精品| 国产不卡在线视频| 中文字幕中文字幕在线一区| 北条麻妃一区二区三区| 亚洲毛片av在线| 欧美久久久久久久久中文字幕| 久久在线观看免费| 韩国欧美国产一区| 国产午夜精品久久久久久久| 国产乱人伦偷精品视频免下载| 欧美va亚洲va香蕉在线| 亚洲男人天堂av| 91蝌蚪porny成人天涯| 亚洲一区二区三区在线看| 91精品国产色综合久久ai换脸 | 欧美成人伊人久久综合网| 狠狠网亚洲精品| 国产精品美女久久久久aⅴ| 色综合久久久久久久久久久| 日韩国产精品久久| 国产女同互慰高潮91漫画| 在线亚洲高清视频| 日本女优在线视频一区二区| 国产欧美日韩亚州综合| 欧美无人高清视频在线观看| 精品一区二区三区免费观看| 国产精品成人免费在线| 91精品国产色综合久久ai换脸| 国产99久久久国产精品潘金| 一区二区三区美女视频| 欧美精品一区二区三区蜜臀| av爱爱亚洲一区| 麻豆精品在线看| 亚洲欧美日韩国产成人精品影院| 欧美高清激情brazzers| yourporn久久国产精品| 欧美aaaaaa午夜精品| 亚洲特黄一级片| 精品少妇一区二区三区| 欧美视频完全免费看| 国产高清视频一区| 亚洲sss视频在线视频| 国产精品伦一区二区三级视频| 欧美电影一区二区| 97aⅴ精品视频一二三区| 国产伦精品一区二区三区免费 | 国产欧美精品区一区二区三区| 欧美午夜免费电影| 成人av影视在线观看| 久久精品国产99国产| 亚洲线精品一区二区三区 | 欧美精品在线一区二区| 91女厕偷拍女厕偷拍高清| 国产一区二区女| 日本亚洲免费观看| 亚洲第一福利一区| 亚洲美女精品一区| 亚洲欧美怡红院| 国产精品情趣视频| 国产视频911| 久久久久国产精品人| 日韩久久久久久| 欧美精品一卡二卡| 欧美日韩国产a| 欧美日韩国产一二三| 在线观看视频91| 色老汉一区二区三区| 99精品视频在线观看免费| 成人免费不卡视频| 成人avav影音| 91在线码无精品| 色婷婷综合五月| 91福利资源站| 欧美日韩国产成人在线免费| 欧美日韩一区二区三区四区| 色婷婷av一区二区| 在线视频你懂得一区二区三区| 97se亚洲国产综合自在线| 99精品国产视频| 色诱亚洲精品久久久久久| 色综合久久久久综合99| 欧美视频日韩视频在线观看| 欧美日韩精品欧美日韩精品一综合| 色久综合一二码| 精品视频123区在线观看| 欧美色网一区二区| 欧美一级一区二区| 久久一日本道色综合| 国产精品视频一二| 一区二区三区不卡视频| 亚洲国产另类av| 麻豆精品在线播放| 国产一区二区精品久久99| 国产成人aaa| 成人在线一区二区三区| 日本韩国一区二区| 欧美高清视频一二三区| 久久天堂av综合合色蜜桃网| 国产精品视频一二三区| 亚洲最新在线观看| 免费成人在线视频观看| 国产精品91一区二区| 在线视频你懂得一区| 欧美成人aa大片| 自拍视频在线观看一区二区| 午夜久久久影院| 国产毛片精品国产一区二区三区| 成人免费看片app下载| 欧美亚男人的天堂| 久久综合色天天久久综合图片| 中文字幕日韩av资源站| 日韩在线卡一卡二| 丰满少妇在线播放bd日韩电影| 色94色欧美sute亚洲线路二| 欧美一区二区三区人| 日本一二三不卡| 亚洲国产cao| 岛国精品在线播放| 欧美一区二区在线视频| 国产精品理论片在线观看| 日韩国产欧美在线视频| av激情综合网| 日韩精品专区在线影院重磅| 亚洲欧美另类综合偷拍| 精一区二区三区| 欧美撒尿777hd撒尿| 久久久久久久久97黄色工厂| 亚洲夂夂婷婷色拍ww47| 国产丶欧美丶日本不卡视频| 欧洲色大大久久| 中文字幕国产精品一区二区| 日韩精品五月天| 色av成人天堂桃色av| 日韩精品视频网| 91日韩在线专区| 国产亲近乱来精品视频| 日本三级亚洲精品| 欧亚一区二区三区| 国产精品久久久久久久久快鸭| 蜜臀av性久久久久蜜臀av麻豆| 色偷偷一区二区三区| 国产精品女上位| 国产精品一区二区男女羞羞无遮挡| 在线播放视频一区| 亚洲一区二区三区四区在线观看| 国产iv一区二区三区| 日韩精品一区二区三区蜜臀| 亚洲国产精品一区二区久久| av电影天堂一区二区在线观看| 精品99999| 美腿丝袜亚洲色图| 欧美理论片在线| 亚洲成人tv网| 欧美视频完全免费看| 一区二区三区日本| 波多野结衣一区二区三区| 久久久综合网站| 国产麻豆欧美日韩一区| 久久视频一区二区| 国产乱一区二区| 国产丝袜在线精品| 国产九九视频一区二区三区| 欧美成人官网二区| 国产一区二区视频在线播放| 欧美大片在线观看一区| 老司机一区二区| 亚洲精品一区二区三区香蕉| 九九久久精品视频| 国产亚洲婷婷免费| 丁香五精品蜜臀久久久久99网站| 久久蜜桃一区二区| 成人免费视频网站在线观看| 国产精品第五页| 日本高清不卡视频| 婷婷中文字幕综合| 91精品婷婷国产综合久久性色 | 亚洲少妇屁股交4| 91福利在线观看| 五月天丁香久久| 欧美成人一区二区三区| 国产精品一区二区黑丝| 国产精品久久久久久福利一牛影视| 成人动漫精品一区二区| 亚洲精品国产一区二区精华液 | 亚洲综合一区在线| 欧美三级电影在线看| 日本在线观看不卡视频| 日韩免费看的电影| 国产精品亚洲综合一区在线观看| 久久精品视频一区| 99久久免费国产| 亚洲乱码中文字幕| 日韩欧美在线一区二区三区| 国产精品18久久久| 亚洲与欧洲av电影| 精品久久久久一区| 成人免费av资源|