瀏覽代碼

More work on debug.

Mark Sibly 9 年之前
父節點
當前提交
bbbd053caf

+ 13 - 1
modules/monkey/native/bbarray.h

@@ -169,6 +169,16 @@ template<class T,int D> class bbArray : public bbGCNode{
 	operator bool()const{
 		return length();
 	}
+	
+	void dbEmit(){
+		int n=length();
+		if( n>100 ) n=100;
+		bbString t=bbDBType<T>();
+		for( int i=0;i<n;++i ){
+			bbString e=BB_T("[")+bbString( i )+"]:"+t+"="+bbDBValue( &at(i) );
+			puts( e.c_str() );
+		}
+	}
 };
 
 template<class T,int N> bbString bbDBType( bbArray<T,N> **p ){
@@ -176,7 +186,9 @@ template<class T,int N> bbString bbDBType( bbArray<T,N> **p ){
 }
 
 template<class T,int N> bbString bbDBValue( bbArray<T,N> **p ){
-	return "array?????";
+	char buf[64];
+	sprintf( buf,"@%p",*p );
+	return buf;
 }
 
 #endif

+ 30 - 7
modules/monkey/native/bbdebug.cpp

@@ -8,6 +8,8 @@
 #include <signal.h>
 #endif
 
+typedef void(*dbEmit_t)(void*);
+
 namespace bbDB{
 
 	int nextSeq;
@@ -65,17 +67,25 @@ namespace bbDB{
 		}
 	}
 	
-	void emitObject( bbObject *p ){
-		if( p ) p->dbEmit();
-		printf( "\n" );
-		fflush( stdout );
-	}
-	
 	void stop(){
 
 		currentContext->stopped=0;
 	}
 	
+	void emit( const char *e ){
+	
+		if( const char *p=strchr( e,':' ) ){
+			dbEmit_t dbEmit=(dbEmit_t)( strtol( p+1,0,16 ) );
+			dbEmit( (void*)strtol( e,0,16 ) );
+		}else{
+			bbGCNode *node=(bbGCNode*)strtol( e,0,16 );
+			node->dbEmit();
+		}
+		
+		puts( "" );
+		fflush( stdout );
+	}
+	
 	void stopped(){
 
 		printf( "{{!DEBUG!}}\n" );
@@ -96,7 +106,7 @@ namespace bbDB{
 			case 'e':currentContext->stopped=1;return;
 			case 'l':currentContext->stopped=-1;return;
 			case 'r':currentContext->stopped=-0x10000000;return;
-			case '@':emitObject( (bbObject*)strtol( e+1,0,16 ) );continue;
+			case '@':emit( e+1 );continue;
 			case 'q':exit( 0 );return;
 			}
 			printf( "Unrecognized debug cmd: %s\n",buf );fflush( stdout );
@@ -138,3 +148,16 @@ void bbDBContext::init(){
 bbDBContext::~bbDBContext(){
 	delete[] localsBuf;
 }
+
+bbString bbDBValue( bbString *p ){
+	bbString t=*p,dd="";
+	if( t.length()>100 ){
+		t=t.slice( 0,100 );
+		dd="...";
+	}
+	t=t.replace( "\"","~q" );
+	t=t.replace( "\n","~n" );
+	t=t.replace( "\r","~r" );
+	t=t.replace( "\t","~t" );
+	return BB_T("\"")+t+"\""+dd;
+}

+ 27 - 35
modules/monkey/native/bbdebug.h

@@ -10,41 +10,33 @@ struct bbDBFrame;
 struct bbDBVarType;
 struct bbDBVar;
 
-inline bbString bbDBType( void *p ){
-	return "Void";
-}
-
-inline bbString bbDBValue( void *p ){
-	return "?????";
-}
-
-inline bbString bbDBType( bbInt *p ){
-	return "Int";
-}
-
-inline bbString bbDBValue( bbInt *p ){
-	return bbString( *p );
-}
-
-inline bbString bbDBType( bbFloat *p ){
-	return "Float";
-}
-
-inline bbString bbDBValue( bbFloat *p ){
-	return bbString( *p );
-}
-
-inline bbString bbDBType( bbString *p ){
-	return "String";
-}
-
-inline bbString bbDBValue( bbString *p ){
-	return BB_T("\"")+(*p)+"\"";
-}
-
-template<class T> bbString bbDBType( T **p ){
-	return bbDBType( (void*)0 )+" Ptr";
-}
+inline bbString bbDBType( const void *p ){ return "Void"; }
+inline bbString bbDBType( bbByte *p ){ return "Byte"; }
+inline bbString bbDBType( bbUByte *p ){ return "UByte"; }
+inline bbString bbDBType( bbShort *p ){ return "Short"; }
+inline bbString bbDBType( bbUShort *p ){ return "UShort"; }
+inline bbString bbDBType( bbInt *p ){ return "Int"; }
+inline bbString bbDBType( bbUInt *p ){ return "UInt"; }
+inline bbString bbDBType( bbLong *p ){ return "Long"; }
+inline bbString bbDBType( bbULong *p ){ return "ULong"; }
+inline bbString bbDBType( bbFloat *p ){ return "Float"; }
+inline bbString bbDBType( bbDouble *p ){ return "Double"; }
+inline bbString bbDBType( bbString *p ){ return "String"; }
+
+inline bbString bbDBValue( void *p ){ return "?????"; }
+inline bbString bbDBValue( bbByte *p ){ return *p; }
+inline bbString bbDBValue( bbUByte *p ){ return *p; }
+inline bbString bbDBValue( bbShort *p ){ return *p; }
+inline bbString bbDBValue( bbUShort *p ){ return *p; }
+inline bbString bbDBValue( bbInt *p ){ return *p; }
+inline bbString bbDBValue( bbUInt *p ){ return *p; }
+inline bbString bbDBValue( bbLong *p ){ return *p; }
+inline bbString bbDBValue( bbULong *p ){ return *p; }
+inline bbString bbDBValue( bbFloat *p ){ return *p; }
+inline bbString bbDBValue( bbDouble *p ){ return *p; }
+bbString bbDBValue( bbString *p );
+
+template<class T> bbString bbDBType( T **p ){ return bbDBType( (T*)0 )+" Ptr"; }
 
 template<class T> bbString bbDBType(){
 	return bbDBType( (T*)0 );

+ 3 - 0
modules/monkey/native/bbgc.h

@@ -74,6 +74,9 @@ struct bbGCNode{
 	virtual void gcMark(){
 	}
 	
+	virtual void dbEmit(){
+	}
+	
 	virtual const char *typeName(){
 		return "bbGCNode";
 	}

+ 2 - 5
modules/monkey/native/bbobject.h

@@ -19,9 +19,6 @@ struct bbObject : public bbGCNode{
 		return "monkey.Object";
 	}
 	
-	virtual void dbEmit(){
-	}
-
 	void *operator new( size_t size ){
 		return bbGC::alloc( size );
 	}
@@ -86,9 +83,9 @@ inline bbString bbDBInterfaceValue( bbInterface *p ){
 	return bbDBObjectValue( dynamic_cast<bbObject*>( p ) );
 }
 
-inline bbString bbDBStructValue( void *p ){
+template<class T> bbString bbDBStructValue( T *p ){
 	char buf[64];
-	sprintf( buf,"&%p",p );
+	sprintf( buf,"@%p:%p",p,&T::dbEmit );
 	return buf;
 }
 

+ 53 - 47
src/mx2new/translator_cpp.monkey2

@@ -359,15 +359,6 @@ Class Translator_CPP Extends Translator
 				Emit( proto+"{};" )
 			Endif
 			
-			#rem
-			If Cast<LiteralValue>( vvar.init ) And cdecl.kind="class"
-				Emit( VarProto( vvar )+"="+Trans( vvar.init )+";" )
-			Else
-				Emit( VarProto( vvar )+"{};" )
-				If vvar.init needsInit=True
-			Endif
-			#end
-
 		Next
 
 		If needsInit
@@ -381,10 +372,17 @@ Class Translator_CPP Extends Translator
 				EmitBr()
 				Emit( "void gcMark();" )
 			Endif
-			
-			If debug
+		
+		Endif
+		
+		If debug
+		
+			If cdecl.kind="class"
 				Emit( "void dbEmit();" )
+			Else If cdecl.kind="struct"
+				Emit( "static void dbEmit("+cname+"*);" )
 			Endif
+
 		Endif
 
 		'Emit ctor methods
@@ -440,25 +438,6 @@ Class Translator_CPP Extends Translator
 			Endif
 		Endif
 
-		#rem		
-		'Emit default ctor
-		'		
-		If Not hasDefaultCtor
-			EmitBr()
-			Emit( cname+"(){" )
-			If needsInit Emit( "init();" )
-			Emit( "}" )
-		Endif
-		#end
-		
-		#rem
-		If IsStruct( ctype )
-			EmitBr()
-			Emit( cname+"(bbNullCtor_t){" )
-			Emit( "}" )
-		Endif
-		#end
-		
 		Emit( "};" )
 		
 		If debug
@@ -555,27 +534,34 @@ Class Translator_CPP Extends Translator
 			
 			Endif
 			
-			If debug
+		Endif
+		
+		If debug And cdecl.kind="class"
+			EmitBr()
 			
-				EmitBr()
-				Emit( "void "+cname+"::dbEmit(){" )
+			Emit( "void "+cname+"::dbEmit(){" )
 
-				If ctype.superType And ctype.superType<>Type.ObjectClass
-					Emit( ClassName( ctype.superType )+"::dbEmit();" )
-				End
-				
-				For Local node:=Eachin ctype.fields
-					Local vvar:=Cast<VarValue>( node )
-					If Not vvar Continue
-					
-					'Uses( vvar.type )
-					Emit( "bbDBEmit(~q"+vvar.vdecl.ident+"~q,&"+VarName( vvar )+");" )
-				Next
-				
-				Emit( "}" )
+			If ctype.superType And ctype.superType<>Type.ObjectClass
+				Emit( ClassName( ctype.superType )+"::dbEmit();" )
+			End
 			
-			Endif
+			For Local vvar:=Eachin ctype.fields
+				Emit( "bbDBEmit(~q"+vvar.vdecl.ident+"~q,&"+VarName( vvar )+");" )
+			Next
 			
+			Emit( "}" )
+		Endif
+		
+		If debug And cdecl.kind="struct"
+			EmitBr()
+			
+			Emit( "void "+cname+"::dbEmit("+cname+"*p){" )
+			
+			For Local vvar:=Eachin ctype.fields
+				Emit( "bbDBEmit(~q"+vvar.vdecl.ident+"~q,&p->"+VarName( vvar )+");" )
+			Next
+			
+			Emit( "}" )
 		Endif
 	
 		'Emit ctor methods
@@ -613,13 +599,33 @@ Class Translator_CPP Extends Translator
 			Emit( "bbString bbDBValue("+tname+"*p){" )
 			Select cdecl.kind
 			Case "class"
+			
 				Emit( "return bbDBObjectValue(*p);" )
+				
 			Case "interface"
+			
 				Emit( "return bbDBInterfaceValue(*p);" )
+				
 			Case "struct"
+			
 				Emit( "return bbDBStructValue(p);" )
 			End
+			
+				#rem				
+			
+				Emit( "bbString t=~q{~q;" )
+				
+				For Local vvar:=Eachin ctype.fields
+					Local v:="&p->"+VarName( vvar )
+					Emit( "t+=BB_T(~q"+vvar.vdecl.ident+"~q)+~q:~q+bbDBType("+v+")+~q=~q+bbDBValue("+v+")+~q;~q;" )
+				Next
+				
+				Emit( "return t+~q}~q;" )
+				
+				#end
+				
 			Emit( "}" )
+				
 		Endif
 
 		'Emit static struct methods