Browse Source

Add setting of variables too

Hugh Sanderson 13 years ago
parent
commit
ccee6388eb
1 changed files with 95 additions and 22 deletions
  1. 95 22
      std/cpp/vm/DebugStdio.hx

+ 95 - 22
std/cpp/vm/DebugStdio.hx

@@ -15,6 +15,15 @@ enum DebugToken
    RARRAY;
    RARRAY;
 }
 }
 
 
+enum DebugExpr
+{
+   EXPR_VALUE(value:Dynamic);
+   EXPR_FIELD_REF(obj:Dynamic,member:String);
+   EXPR_ARRAY_REF(obj:Dynamic,index:Int);
+   EXPR_STACK_REF(name:String);
+}
+
+
 
 
 class DebugStdio
 class DebugStdio
 {
 {
@@ -200,23 +209,26 @@ class DebugStdio
       return result;
       return result;
    }
    }
 
 
-   function resolve(inName:String) : Dynamic
+   function resolve(inName:String) : DebugExpr
 	{
 	{
 		if (vars!=null)
 		if (vars!=null)
 		{
 		{
 			for(v in vars)
 			for(v in vars)
 				if (v==inName)
 				if (v==inName)
-					return Debugger.getStackVar(frame,inName);
+					return EXPR_STACK_REF(inName);
 		}
 		}
 		var cls = Type.resolveClass(inName);
 		var cls = Type.resolveClass(inName);
-      return cls;
+      if (cls!=null)
+         return EXPR_VALUE(cls);
+
+      return null;
    }
    }
 
 
 
 
-   function getValue(inTokens:Array<DebugToken>) : Dynamic
+   function getExpression(inTokens:Array<DebugToken>) : DebugExpr
    {
    {
       var classPath = "";
       var classPath = "";
-      var lhs:Dynamic = null;
+      var expr:Dynamic = null;
 
 
       var tok = 0;
       var tok = 0;
       var len = inTokens.length;
       var len = inTokens.length;
@@ -225,33 +237,33 @@ class DebugStdio
 			switch(inTokens[tok])
 			switch(inTokens[tok])
          {
          {
    			case IDENT(name):
    			case IDENT(name):
-					if (lhs!=null)
+					if (expr!=null)
 						throw "Misplaced '" + name + "'";
 						throw "Misplaced '" + name + "'";
-					lhs = resolve(name);
-					if (lhs==null)
+					expr = resolve(name);
+					if (expr==null)
 						classPath = name;
 						classPath = name;
 					tok++;
 					tok++;
 
 
    			case CONST(value):
    			case CONST(value):
-					if (lhs!=null || classPath!="")
+					if (expr!=null || classPath!="")
 						throw "Misplaced '" + value + "'";
 						throw "Misplaced '" + value + "'";
-					lhs = value;
+					expr = EXPR_VALUE(value);
 					tok++;
 					tok++;
 
 
    			case DOT:
    			case DOT:
-					if (lhs==null && classPath=="")
+					if (expr==null && classPath=="")
 						throw "Bad '.' after null value";
 						throw "Bad '.' after null value";
 					tok++;
 					tok++;
 					switch(inTokens[tok])
 					switch(inTokens[tok])
 					{
 					{
 						case IDENT(name):
 						case IDENT(name):
-							if (lhs!=null)
-								lhs = Reflect.getProperty(lhs,name);
+							if (expr!=null)
+								expr = EXPR_FIELD_REF(exprToDynamic(expr),name);
 							else
 							else
 							{
 							{
 								var qname = classPath + "." + name;
 								var qname = classPath + "." + name;
-								lhs = resolve(qname);
-								classPath = (lhs==null) ? qname : "";
+								expr = resolve(qname);
+								classPath = (expr==null) ? qname : "";
 							}
 							}
 							tok++;
 							tok++;
 						default: throw "Expected field after '.'";
 						default: throw "Expected field after '.'";
@@ -272,7 +284,7 @@ class DebugStdio
    							case LARRAY: arrayOpen++;
    							case LARRAY: arrayOpen++;
    							case RARRAY: arrayOpen--;
    							case RARRAY: arrayOpen--;
    							case COMMA: 
    							case COMMA: 
-									if (arrayOpen==0 && parenOpen==1 && lhs!=null)
+									if (arrayOpen==0 && parenOpen==1 && expr!=null)
 									{
 									{
 										args.push( getValue( inTokens.slice(lastComma+1,tok) ) );
 										args.push( getValue( inTokens.slice(lastComma+1,tok) ) );
 										lastComma = tok;
 										lastComma = tok;
@@ -286,15 +298,15 @@ class DebugStdio
 						// Not function call...
 						// Not function call...
 						if (classPath!="")
 						if (classPath!="")
 							throw "Unresolved " + classPath;
 							throw "Unresolved " + classPath;
-						if (lhs==null)
+						if (expr==null)
                   {
                   {
-							lhs = getValue( inTokens.slice(start,tok-1) );
+							expr = EXPR_VALUE(getValue( inTokens.slice(start,tok-1) ));
                   }
                   }
 						else
 						else
 						{
 						{
                      if (lastComma+1 < tok-1)
                      if (lastComma+1 < tok-1)
 								args.push( getValue( inTokens.slice(lastComma+1,tok-1) ) );
 								args.push( getValue( inTokens.slice(lastComma+1,tok-1) ) );
-							lhs = untyped lhs.__Run( args );
+							expr = EXPR_VALUE( untyped expr.__Run( args ) );
 						}
 						}
 
 
    			case LARRAY:
    			case LARRAY:
@@ -317,12 +329,12 @@ class DebugStdio
 							throw "Mismatched '['";
 							throw "Mismatched '['";
 						if (classPath!=null)
 						if (classPath!=null)
 							throw "Unresolved " + classPath;
 							throw "Unresolved " + classPath;
-						if (lhs==null)
+						if (expr==null)
 							throw "Error taking index of null object";
 							throw "Error taking index of null object";
 						var val:Dynamic = getValue( inTokens.slice(start,tok) );
 						var val:Dynamic = getValue( inTokens.slice(start,tok) );
 						if ( !Std.is(val,Int) )
 						if ( !Std.is(val,Int) )
 							throw "Bad array index: " + val;
 							throw "Bad array index: " + val;
-						lhs = lhs[ Std.int(val) ];
+						expr = EXPR_ARRAY_REF(exprToDynamic(expr), Std.int(val));
 
 
    			case RPAREN: throw "Misplaced ')'";
    			case RPAREN: throw "Misplaced ')'";
    			case COMMA:  throw "Misplaced ','";
    			case COMMA:  throw "Misplaced ','";
@@ -333,9 +345,26 @@ class DebugStdio
 		if (classPath!="")
 		if (classPath!="")
 			throw "Unresolved " + classPath;
 			throw "Unresolved " + classPath;
 
 
-      return lhs;
+      return expr==null ? EXPR_VALUE(null) : expr;
+   }
+
+   function exprToDynamic(inExpr:DebugExpr)
+   {
+      switch(inExpr)
+      {
+         case EXPR_VALUE(value): return value;
+         case EXPR_FIELD_REF(obj,member): return Reflect.getProperty(obj,member);
+         case EXPR_ARRAY_REF(obj,index): return obj[index];
+         case EXPR_STACK_REF(name): return Debugger.getStackVar(frame,name);
+      }
+   }
+
+   function getValue(inTokens:Array<DebugToken>) : Dynamic
+   {
+      return exprToDynamic(getExpression(inTokens));
    }
    }
 
 
+
 	function printResult(result:String)
 	function printResult(result:String)
 	{
 	{
 		Sys.println(result);
 		Sys.println(result);
@@ -357,6 +386,46 @@ class DebugStdio
       }
       }
    }
    }
 
 
+   function set(inString:String)
+   {
+      var tokens:Array<DebugToken> = null;
+		try
+      {
+         tokens = tokenize(inString);
+
+         var equals_pos = -1;
+         for(i in 0...tokens.length)
+         {
+            if (tokens[i]==EQUALS)
+            {
+               if (equals_pos>=0)
+                  throw "more than one '='";
+               equals_pos = i;
+            }
+         }
+         if (equals_pos<0)
+             throw "use a = b syntax";
+         if (equals_pos==0 || equals_pos==tokens.length-1)
+             throw "Misplaced '='";
+
+         var lhs = getExpression( tokens.slice(0,equals_pos) );
+         var rhs = getValue( tokens.slice(equals_pos+1, tokens.length) );
+
+         switch(lhs)
+         {
+            case EXPR_VALUE(value): throw "left hand side can't be set";
+            case EXPR_FIELD_REF(obj,member): Reflect.setProperty(obj,member,rhs);
+            case EXPR_ARRAY_REF(obj,index): obj[index] = rhs;
+            case EXPR_STACK_REF(name): Debugger.setStackVar(frame,name,rhs);
+         }
+      }
+      catch (e:Dynamic)
+      {
+         Sys.println("Error while setting : " + e);//+ ( tokens==null ? "" : " : " + tokens) );
+      }
+   }
+
+
    function setFrame(inFrame:Int)
    function setFrame(inFrame:Int)
 	{
 	{
 		if (stack!=null && inFrame>0 && inFrame <= stack.length )
 		if (stack!=null && inFrame>0 && inFrame <= stack.length )
@@ -467,6 +536,10 @@ class DebugStdio
 					words.shift();
 					words.shift();
 					print(words.join(" "));
 					print(words.join(" "));
 
 
+            case "set","s":
+					words.shift();
+					set(words.join(" "));
+
 
 
             case "files","fi":
             case "files","fi":
                showFiles();
                showFiles();