فهرست منبع

added stack overflow detection

Nicolas Cannasse 13 سال پیش
والد
کامیت
0bc4c757a3
1فایلهای تغییر یافته به همراه8 افزوده شده و 0 حذف شده
  1. 8 0
      interp.ml

+ 8 - 0
interp.ml

@@ -127,6 +127,7 @@ type context = {
 	(* runtime *)
 	mutable stack : value DynArray.t;
 	mutable callstack : callstack list;
+	mutable callsize : int;
 	mutable exc : pos list;
 	mutable vthis : value;
 	mutable venv : value array;
@@ -2161,6 +2162,7 @@ let rec eval ctx (e,p) =
 			let vthis = ctx.vthis in
 			let venv = ctx.venv in
 			let stack = ctx.callstack in
+			let csize = ctx.callsize in
 			let size = DynArray.length ctx.stack in
 			try
 				pop_ret ctx e n1
@@ -2173,6 +2175,7 @@ let rec eval ctx (e,p) =
 				in
 				ctx.exc <- loop (List.length stack) (List.rev ctx.callstack);
 				ctx.callstack <- stack;
+				ctx.callsize <- csize;
 				ctx.vthis <- vthis;
 				ctx.venv <- venv;
 				pop ctx (DynArray.length ctx.stack - size);
@@ -2621,9 +2624,12 @@ and call ctx vthis vfun pl p =
 	let oldthis = ctx.vthis in
 	let stackpos = DynArray.length ctx.stack in
 	let oldstack = ctx.callstack in
+	let oldsize = ctx.callsize in
 	let oldenv = ctx.venv in
 	ctx.vthis <- vthis;
 	ctx.callstack <- { cpos = p; cthis = oldthis; cstack = stackpos; cenv = oldenv } :: ctx.callstack;
+	ctx.callsize <- oldsize + 1;
+	if oldsize > 200 then exc (VString "Stack overflow");
 	let ret = (try
 		(match vfun with
 		| VClosure (vl,f) ->
@@ -2649,6 +2655,7 @@ and call ctx vthis vfun pl p =
 	ctx.vthis <- oldthis;
 	ctx.venv <- oldenv;
 	ctx.callstack <- oldstack;
+	ctx.callsize <- oldsize;
 	pop ctx (DynArray.length ctx.stack - stackpos);
 	ret
 
@@ -2771,6 +2778,7 @@ let create com api =
 		globals = PMap.empty;
 		(* runtime *)
 		callstack = [];
+		callsize = 0;
 		stack = DynArray.create();
 		exc = [];
 		vthis = VNull;