2
0
Эх сурвалжийг харах

report positions in errors

Aurel Bílý 6 жил өмнө
parent
commit
eb2d506fbc

+ 17 - 0
src/macro/eval/evalEncode.ml

@@ -248,6 +248,13 @@ let encode_pos p =
 		ikind = IPos p;
 		ikind = IPos p;
 	}
 	}
 
 
+let encode_current_pos () =
+	let ctx = get_ctx () in
+	let eval = get_eval ctx in
+	encode_pos (match eval.env with
+		| None -> null_pos
+		| Some env -> { pfile = rev_hash env.env_info.pfile; pmin = env.env_leave_pmin; pmax = env.env_leave_pmax })
+
 let encode_lazytype t f =
 let encode_lazytype t f =
 	vinstance {
 	vinstance {
 		ifields = [||];
 		ifields = [||];
@@ -290,3 +297,13 @@ let encode_lazy f =
 		v
 		v
 	) in
 	) in
 	VLazy r
 	VLazy r
+
+let encode_constructed tp vl =
+	let key = path_hash tp in
+	let ctx = get_ctx () in
+	let fnew = get_instance_constructor ctx key null_pos in
+	let proto = get_instance_prototype ctx key null_pos in
+	let f = (match Lazy.force fnew with VFunction (f,_) -> f | _ -> exc_string "cannot construct") in
+	let vthis = create_instance_direct proto INormal in
+	ignore (f (vthis :: vl));
+	vthis

+ 1 - 0
src/macro/eval/evalHash.ml

@@ -132,6 +132,7 @@ let key_sys_net_Mutex = hash "sys.thread.Mutex"
 let key_sys_net_Lock = hash "sys.thread.Lock"
 let key_sys_net_Lock = hash "sys.thread.Lock"
 let key_sys_net_Tls = hash "sys.thread.Tls"
 let key_sys_net_Tls = hash "sys.thread.Tls"
 let key_sys_net_Deque = hash "sys.thread.Deque"
 let key_sys_net_Deque = hash "sys.thread.Deque"
+let key_haxe_ErrorType = hash "haxe.ErrorType"
 let key_eval_Uv = hash "eval.Uv"
 let key_eval_Uv = hash "eval.Uv"
 let key_eval_uv_DirectoryEntry = hash "eval.uv.DirectoryEntry"
 let key_eval_uv_DirectoryEntry = hash "eval.uv.DirectoryEntry"
 let key_eval_uv_Loop = hash "eval.uv.Loop"
 let key_eval_uv_Loop = hash "eval.uv.Loop"

+ 1 - 10
src/macro/eval/evalStdLib.ml

@@ -3074,16 +3074,7 @@ module StdUv = struct
 
 
 	(* Wrap a libuv error code *)
 	(* Wrap a libuv error code *)
 	let wrap_error errno =
 	let wrap_error errno =
-		let key = path_hash (["haxe"],"Error") in
-		let ctx = get_ctx() in
-		let fnew = get_instance_constructor ctx key null_pos in
-		let proto = get_instance_prototype ctx key null_pos in
-		let v = lazy (match Lazy.force fnew with VFunction (f,_) -> f | _ -> exc_string "failure to throw error") in
-		let f = Lazy.force v in
-		let vthis = create_instance_direct proto INormal in
-		let vl = [vint errno] in
-		ignore(f (vthis :: vl));
-		vthis
+		encode_constructed (["haxe"],"Error") [encode_enum_value key_haxe_ErrorType 0 [|vint errno|] None; encode_current_pos ()]
 
 
 	let wrap_sync = function
 	let wrap_sync = function
 		| Uv.UvError err -> exc (wrap_error err)
 		| Uv.UvError err -> exc (wrap_error err)

+ 44 - 0
std/eval/_std/Std.hx

@@ -0,0 +1,44 @@
+/*
+ * Copyright (C)2005-2019 Haxe Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+import haxe.Error;
+import sys.io.FileOutput;
+import sys.io.FileInput;
+
+@:coreApi extern class Std {
+	public static function is(v:Dynamic, t:Dynamic):Bool;
+
+	public static function downcast<T:{}, S:T>(value:T, c:Class<S>):S;
+
+	@:deprecated('Std.instance() is deprecated. Use Std.downcast() instead.')
+	public static function instance<T:{}, S:T>(value:T, c:Class<S>):S;
+
+	public static function string(s:Dynamic):String;
+
+	public static function int(x:Float):Int;
+
+	public static function parseInt(x:String):Null<Int>;
+
+	public static function parseFloat(x:String):Float;
+
+	public static function random(x:Int):Int;
+}

+ 0 - 9
std/eval/_std/Sys.hx

@@ -86,13 +86,4 @@ class Sys {
 	extern static public function stdout():haxe.io.Output;
 	extern static public function stdout():haxe.io.Output;
 
 
 	extern static public function stderr():haxe.io.Output;
 	extern static public function stderr():haxe.io.Output;
-
-	static function __init__():Void {
-		// This nonsense causes the classes to be loaded. Otherwise they might not make
-		// it into the interpreter, and then stderr() et. al. don't work.
-		var _ = (null : sys.io.FileOutput);
-		var _ = (null : sys.io.FileInput);
-
-		var _ = (null : haxe.Error);
-	}
 }
 }