bbtypeinfo.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #include "bbvariant.h"
  2. #include "bbtypeinfo_r.h"
  3. #include "bbdeclinfo.h"
  4. namespace{
  5. bbClassTypeInfo *_classes;
  6. }
  7. #define BB_PRIM_GETTYPE( TYPE,ID ) bbTypeInfo *bbGetType( TYPE const& ){ \
  8. static bbPrimTypeInfo<TYPE> info( ID ); \
  9. return &info; \
  10. }
  11. BB_PRIM_GETTYPE( bbBool,"Bool" )
  12. BB_PRIM_GETTYPE( bbByte,"Byte" )
  13. BB_PRIM_GETTYPE( bbUByte,"UByte" )
  14. BB_PRIM_GETTYPE( bbShort,"Short" )
  15. BB_PRIM_GETTYPE( bbUShort,"UShort" )
  16. BB_PRIM_GETTYPE( bbInt,"Int" )
  17. BB_PRIM_GETTYPE( bbUInt,"UInt" )
  18. BB_PRIM_GETTYPE( bbLong,"Long" )
  19. BB_PRIM_GETTYPE( bbULong,"ULong" )
  20. BB_PRIM_GETTYPE( bbFloat,"Float" )
  21. BB_PRIM_GETTYPE( bbDouble,"Double" )
  22. BB_PRIM_GETTYPE( bbString,"String" )
  23. BB_PRIM_GETTYPE( bbCString,"CString" )
  24. BB_PRIM_GETTYPE( bbVariant,"Variant" )
  25. // ***** bbTypeInfo *****
  26. bbString bbTypeInfo::toString(){
  27. return name;
  28. }
  29. bbTypeInfo *bbTypeInfo::pointeeType(){
  30. bbRuntimeError( "Type '"+name+"' is not a pointer type" );
  31. return 0;
  32. }
  33. bbTypeInfo *bbTypeInfo::elementType(){
  34. bbRuntimeError( "Type '"+name+"' is not an array type" );
  35. return 0;
  36. }
  37. int bbTypeInfo::arrayRank(){
  38. bbRuntimeError( "Type '"+name+"' is not an array type" );
  39. return 0;
  40. }
  41. bbTypeInfo *bbTypeInfo::returnType(){
  42. bbRuntimeError( "Type '"+name+"' is not a function type" );
  43. return 0;
  44. }
  45. bbArray<bbTypeInfo*> bbTypeInfo::paramTypes(){
  46. bbRuntimeError( "Type '"+name+"' is not a function type" );
  47. return {};
  48. }
  49. bbTypeInfo *bbTypeInfo::superType(){
  50. bbRuntimeError( "Type '"+name+"' is not a class type" );
  51. return 0;
  52. }
  53. bbArray<bbTypeInfo*> bbTypeInfo::interfaceTypes(){
  54. bbRuntimeError( "Type '"+name+"' is not a class or interface type" );
  55. return {};
  56. }
  57. bbBool bbTypeInfo::extendsType( bbTypeInfo *type ){
  58. return this==type;
  59. }
  60. bbArray<bbDeclInfo*> bbTypeInfo::getDecls(){
  61. bbRuntimeError( "Type '"+name+"' is not a class or interface type" );
  62. return {};
  63. }
  64. bbVariant bbTypeInfo::makeEnum( int ){
  65. bbRuntimeError( "Type '"+name+"' is not an enum type" );
  66. return {};
  67. }
  68. int bbTypeInfo::getEnum( bbVariant ){
  69. bbRuntimeError( "Type '"+name+"' is not an enum type" );
  70. return {};
  71. }
  72. bbVariant bbTypeInfo::nullValue(){
  73. return {};
  74. }
  75. bbVariant bbTypeInfo::newArray( int length ){
  76. return {};
  77. }
  78. bbDeclInfo *bbTypeInfo::getDecl( bbString name ){
  79. bbArray<bbDeclInfo*> decls=getDecls();
  80. bbDeclInfo *found=0;
  81. for( int i=0;i<decls.length();++i ){
  82. bbDeclInfo *decl=decls[i];
  83. if( decl->name!=name ) continue;
  84. if( found ) return 0;
  85. found=decl;
  86. }
  87. return found;
  88. }
  89. bbArray<bbDeclInfo*> bbTypeInfo::getDecls( bbString name ){
  90. bbArray<bbDeclInfo*> decls=getDecls();
  91. int n=0;
  92. for( int i=0;i<decls.length();++i ){
  93. if( decls[i]->name==name ) ++n;
  94. }
  95. if( !n ) return {};
  96. bbArray<bbDeclInfo*> rdecls( n );
  97. int j=0;
  98. for( int i=0;i<decls.length();++i ){
  99. if( decls[i]->name==name ) rdecls[j++]=decls[i];
  100. }
  101. return rdecls;
  102. }
  103. bbDeclInfo *bbTypeInfo::getDecl( bbString name,bbTypeInfo *type ){
  104. bbArray<bbDeclInfo*> decls=getDecls();
  105. for( int i=0;i<decls.length();++i ){
  106. bbDeclInfo *decl=decls[i];
  107. if( decl->name==name && decl->type==type ) return decl;
  108. }
  109. return 0;
  110. }
  111. bbTypeInfo *bbTypeInfo::getType( bbString cname ){
  112. for( bbClassTypeInfo *c=_classes;c;c=c->_succ ){
  113. if( c->name==cname ) return c;
  114. }
  115. return 0;
  116. }
  117. bbArray<bbTypeInfo*> bbTypeInfo::getTypes(){
  118. int n=0;
  119. for( bbClassTypeInfo *c=_classes;c;c=c->_succ ) ++n;
  120. bbArray<bbTypeInfo*> types( n );
  121. int i=0;
  122. for( bbClassTypeInfo *c=_classes;c;c=c->_succ ) types[i++]=c;
  123. return types;
  124. }
  125. // ***** bbUnknownTypeInfo *****
  126. bbUnknownTypeInfo::bbUnknownTypeInfo( const char *name ){
  127. this->name=name ? bbString( name ) : BB_T("Unknown@")+bbString( bbLong( this ) );
  128. this->kind="Unknown";
  129. }
  130. // ***** bbVoidTypeInfo *****
  131. bbVoidTypeInfo bbVoidTypeInfo::instance;
  132. bbVoidTypeInfo::bbVoidTypeInfo(){
  133. this->name="Void";
  134. this->kind="Void";
  135. }
  136. // ***** bbObjectTypeInfo *****
  137. bbObjectTypeInfo bbObjectTypeInfo::instance;
  138. bbObjectTypeInfo::bbObjectTypeInfo(){
  139. this->name="Object";
  140. this->kind="Class";
  141. }
  142. bbTypeInfo *bbObjectTypeInfo::superType(){
  143. return 0;
  144. }
  145. bbBool bbObjectTypeInfo::extendsType( bbTypeInfo *type ){
  146. return type==&instance;
  147. }
  148. bbArray<bbDeclInfo*> bbObjectTypeInfo::getDecls(){
  149. return {};
  150. }
  151. bbTypeInfo *bbObject::typeof()const{
  152. return &bbObjectTypeInfo::instance;
  153. }
  154. // ***** bbClassDecls *****
  155. bbClassDecls::bbClassDecls( bbClassTypeInfo *classType ){
  156. _succ=classType->_decls;
  157. classType->_decls=this;
  158. }
  159. bbDeclInfo **bbClassDecls::decls(){
  160. if( !_decls ){
  161. _decls=initDecls();
  162. bbDeclInfo **p=_decls;
  163. while( *p ) ++p;
  164. _numDecls=p-_decls;
  165. }
  166. return _decls;
  167. }
  168. int bbClassDecls::numDecls(){
  169. if( !_decls ) decls();
  170. return _numDecls;
  171. }
  172. // ***** bbClassTypeInfo *****
  173. bbClassTypeInfo::bbClassTypeInfo( bbString name,bbString kind ){
  174. // printf( "ClassTypeInfo:%s\n",name.c_str() );
  175. this->name=name;
  176. this->kind=kind;
  177. _succ=_classes;
  178. _classes=this;
  179. }
  180. bbTypeInfo *bbClassTypeInfo::superType(){
  181. return 0;
  182. }
  183. bbArray<bbTypeInfo*> bbClassTypeInfo::interfaceTypes(){
  184. return {};
  185. }
  186. bbBool bbClassTypeInfo::extendsType( bbTypeInfo *type ){
  187. if( type==this ) return true;
  188. bbArray<bbTypeInfo*> ifaces=interfaceTypes();
  189. for( int i=0;i<ifaces.length();++i ){
  190. if( ifaces[i]->extendsType( type ) ) return true;
  191. }
  192. if( bbTypeInfo *super=superType() ) return super->extendsType( type );
  193. return false;
  194. }
  195. bbArray<bbDeclInfo*> bbClassTypeInfo::getDecls(){
  196. int n=0;
  197. for( bbClassDecls *m=_decls;m;m=m->_succ ) n+=m->numDecls();
  198. bbArray<bbDeclInfo*> rdecls( n );
  199. int i=0;
  200. for( bbClassDecls *m=_decls;m;m=m->_succ ){
  201. bbDeclInfo **decls=m->decls();
  202. int n=m->numDecls();
  203. for( int j=0;j<n;++j ) rdecls[i++]=decls[j];
  204. }
  205. return rdecls;
  206. }
  207. bbClassTypeInfo *bbClassTypeInfo::getNamespace( bbString name ){
  208. for( bbClassTypeInfo *nmspace=_classes;nmspace;nmspace=nmspace->_succ ){
  209. if( nmspace->name==name ) return nmspace;
  210. }
  211. bbClassTypeInfo *nmspace=new bbClassTypeInfo( name,"Namespace" );
  212. return nmspace;
  213. }
  214. // ***** EnumTypeInfo *****