Browse Source

reflection updates.

Mark Sibly 8 năm trước cách đây
mục cha
commit
9aefb22917

+ 17 - 9
modules/monkey/native/bbdeclinfo.h

@@ -151,14 +151,16 @@ template<class C,class T> struct bbFieldDeclInfo : public bbDeclInfo{
 	
 	
 	bbVariant get( bbVariant instance ){
 	bbVariant get( bbVariant instance ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		return bbVariant( p->*ptr );
 		return bbVariant( p->*ptr );
 	}
 	}
 	
 	
 	void set( bbVariant instance,bbVariant value ){
 	void set( bbVariant instance,bbVariant value ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		p->*ptr=value.get<T>();
 		p->*ptr=value.get<T>();
 	}
 	}
@@ -178,14 +180,16 @@ template<class C,class T> struct bbFieldVarDeclInfo : public bbDeclInfo{
 	
 	
 	bbVariant get( bbVariant instance ){
 	bbVariant get( bbVariant instance ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		return bbVariant( (p->*ptr).get() );
 		return bbVariant( (p->*ptr).get() );
 	}
 	}
 	
 	
 	void set( bbVariant instance,bbVariant value ){
 	void set( bbVariant instance,bbVariant value ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		p->*ptr=value.get<T*>();
 		p->*ptr=value.get<T*>();
 	}
 	}
@@ -250,7 +254,8 @@ template<class C,class R,class...A> struct bbMethodDeclInfo : public bbDeclInfo{
 	
 	
 	bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
 	bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		return bbVariant( invoke( p,params,detail::gen_seq<sizeof...(A)>{} ) );
 		return bbVariant( invoke( p,params,detail::gen_seq<sizeof...(A)>{} ) );
 	}
 	}
@@ -277,7 +282,8 @@ template<class C,class...A> struct bbMethodDeclInfo<C,void,A...> : public bbDecl
 
 
 	bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
 	bbVariant invoke( bbVariant instance,bbArray<bbVariant> params ){
 	
 	
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		invoke( p,params,detail::gen_seq<sizeof...(A)>{} );
 		invoke( p,params,detail::gen_seq<sizeof...(A)>{} );
 		
 		
@@ -309,7 +315,8 @@ template<class C,class T> struct bbPropertyDeclInfo : public bbDeclInfo{
 	bbVariant get( bbVariant instance ){
 	bbVariant get( bbVariant instance ){
 		if( !getter ) bbRuntimeError( "Property has not getter" );
 		if( !getter ) bbRuntimeError( "Property has not getter" );
 
 
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		return bbVariant( (p->*getter)() );
 		return bbVariant( (p->*getter)() );
 	}
 	}
@@ -317,7 +324,8 @@ template<class C,class T> struct bbPropertyDeclInfo : public bbDeclInfo{
 	void set( bbVariant instance,bbVariant value ){
 	void set( bbVariant instance,bbVariant value ){
 		if( !setter ) bbRuntimeError( "Property has not setter" );
 		if( !setter ) bbRuntimeError( "Property has not setter" );
 		
 		
-		C *p=instance.get<C*>();
+//		C *p=instance.get<C*>();
+		C *p=instance.ref<C>();
 		
 		
 		(p->*setter)( value.get<T>() );
 		(p->*setter)( value.get<T>() );
 	}
 	}
@@ -388,7 +396,7 @@ template<class R,class...A> bbDeclInfo *bbFunctionDecl( bbString name,R (*ptr)(A
 template<class...Ds> bbDeclInfo **bbMembers( Ds...ds ){
 template<class...Ds> bbDeclInfo **bbMembers( Ds...ds ){
 
 
 	int n=sizeof...(Ds);
 	int n=sizeof...(Ds);
-	bbDeclInfo *ts[]={ ds... };
+	bbDeclInfo *ts[]={ ds...,0 };
 	bbDeclInfo **ps=new bbDeclInfo*[n+1];
 	bbDeclInfo **ps=new bbDeclInfo*[n+1];
 	for( int i=0;i<n;++i ) ps[i]=ts[i];
 	for( int i=0;i<n;++i ) ps[i]=ts[i];
 	ps[n]=0;
 	ps[n]=0;

+ 19 - 44
modules/monkey/native/bbvariant.h

@@ -68,42 +68,6 @@ struct bbVariant{
 		}
 		}
 	};
 	};
 	
 	
-/*	
-	template<class R,class...A> struct FuncRep : public Rep<bbFunction<R(A...)>>{
-
-		FuncRep( bbFunction<R(A...)> func ):Rep<bbFunction<R(A...)>>( func ){
-		}
-		
-		template<int...I> R invoke( bbArray<bbVariant> params,detail::seq<I...> ){
-
-			return this->value( params[I].get<A>()... );
-		}
-	
-		virtual bbVariant invoke( bbArray<bbVariant> params ){
-		
-			return bbVariant{ invoke( params,detail::gen_seq<sizeof...(A)>{} ) };
-		}
-	};
-	
-	template<class...A> struct FuncRep<void,A...> : public Rep<bbFunction<void(A...)>>{
-
-		FuncRep( bbFunction<void(A...)> func ):Rep<bbFunction<void(A...)>>( func ){
-		}
-		
-		template<int...I> void invoke( bbArray<bbVariant> params,detail::seq<I...> ){
-
-			this->value( params[I].get<A>()... );
-		}
-	
-		virtual bbVariant invoke( bbArray<bbVariant> params ){
-		
-			invoke( params,detail::gen_seq<sizeof...(A)>{} );
-			
-			return {};
-		}
-	};
-*/
-	
 	static RepBase _null;
 	static RepBase _null;
 	
 	
 	RepBase *_rep;
 	RepBase *_rep;
@@ -131,14 +95,6 @@ struct bbVariant{
 	template<class T> explicit bbVariant( const bbGCVar<T> &t ):_rep( new Rep<T*>( t.get() ) ){
 	template<class T> explicit bbVariant( const bbGCVar<T> &t ):_rep( new Rep<T*>( t.get() ) ){
 	}
 	}
 	
 	
-	/*
-	template<class R,class...A> explicit bbVariant( bbFunction<R(A...)> func ) : _rep( new FuncRep<R,A...>( func ) ){
-	}
-	
-	template<class R,class...A> explicit bbVariant( R(*func)(A...) ):_rep( new FuncRep<R,A...>( bbMakefunc( func ) ) ){
-	}
-	*/
-	
 	~bbVariant(){
 	~bbVariant(){
 		release();
 		release();
 	}
 	}
@@ -182,6 +138,25 @@ struct bbVariant{
 		return T{};
 		return T{};
 	}
 	}
 	
 	
+	template<class T> T *_ref( typename T::bb_object_type *p=0 )const{
+	
+		return get<T*>();
+	}
+	
+	template<class T> T *_ref( T *p=0 )const{
+	
+		Rep<T> *r=dynamic_cast<Rep<T>*>( _rep );
+		
+		if( !r ) bbRuntimeError( "Variant cast failed" );
+		
+		return &r->value;
+	}
+	
+	template<class T> T *ref()const{
+	
+		return _ref<T>( 0 );
+	}
+	
 };
 };
 
 
 extern template struct bbVariant::Rep<bbBool>;
 extern template struct bbVariant::Rep<bbBool>;

+ 1 - 1
modules/monkey/types.monkey2

@@ -557,7 +557,7 @@ Class DeclInfo Extends Void="bbDeclInfo"
 	
 	
 	#rem monkeydoc Declaration kind.
 	#rem monkeydoc Declaration kind.
 	
 	
-	This will be one of: Field, Global, Method, Function.
+	This will be one of: Const, Field, Global, Property, Method, Function, Constructor.
 	
 	
 	#end
 	#end
 	Property Kind:String()="getKind"
 	Property Kind:String()="getKind"