Skip to content

Commit

Permalink
Merge branch 'module_resolution' into hxb_reloaded
Browse files Browse the repository at this point in the history
  • Loading branch information
kLabz committed Jul 7, 2023
2 parents 31a740a + d9d0eba commit 8d9b53b
Show file tree
Hide file tree
Showing 14 changed files with 112 additions and 18 deletions.
6 changes: 4 additions & 2 deletions src/filters/exceptions.ml
Original file line number Diff line number Diff line change
Expand Up @@ -480,9 +480,11 @@ let catch_native ctx catches t p =
)
(* Haxe-specific wildcard catches should go to if-fest because they need additional handling *)
| (v,_) :: _ when is_haxe_wildcard_catch ctx v.v_type ->
(match handle_as_value_exception with
| [] ->
(match handle_as_value_exception, value_exception_catch with
| [], None ->
catches_to_ifs ctx catches t p
| [], Some catch ->
catches_to_ifs ctx [catch] t p
| _ ->
catches_as_value_exception ctx handle_as_value_exception None t p
:: catches_to_ifs ctx catches t p
Expand Down
7 changes: 6 additions & 1 deletion src/generators/gencpp.ml
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,12 @@ let keyword_remap name =
| "HX_" | "HXLINE" | "HXDLIN"
| "NO" | "YES"
| "abstract" | "decltype" | "finally" | "nullptr" | "static_assert"
| "struct" -> "_hx_" ^ name
| "struct" | "_Atomic"
| "constexpr" | "consteval" | "constinit"
| "co_await" | "co_return" | "co_yield"
| "alignas" | "alignof"
| "_Alignas" | "_Alignof"
| "requires" -> "_hx_" ^ name
| x -> x
;;

Expand Down
9 changes: 7 additions & 2 deletions src/generators/genhl.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3329,15 +3329,20 @@ let generate_static ctx c f =
let gen_content() =
op ctx (OThrow (make_string ctx ("Requires compiling with -D hl-ver=" ^ ver ^ ".0 or higher") null_pos));
in
ignore(make_fun ctx ~gen_content (s_type_path c.cl_path,f.cf_name) (alloc_fid ctx c f) (match f.cf_expr with Some { eexpr = TFunction f } -> f | _ -> abort "Missing function body" f.cf_pos) None None)
(match f.cf_expr with
| Some { eexpr = TFunction fn } -> ignore(make_fun ctx ~gen_content (s_type_path c.cl_path,f.cf_name) (alloc_fid ctx c f) fn None None)
| _ -> if not (Meta.has Meta.NoExpr f.cf_meta) then abort "Missing function body" f.cf_pos)

else
add_native "std" f.cf_name
| (Meta.HlNative,[] ,_ ) :: _ ->
add_native "std" f.cf_name
| (Meta.HlNative,_ ,p) :: _ ->
abort "Invalid @:hlNative decl" p
| [] ->
ignore(make_fun ctx (s_type_path c.cl_path,f.cf_name) (alloc_fid ctx c f) (match f.cf_expr with Some { eexpr = TFunction f } -> f | _ -> abort "Missing function body" f.cf_pos) None None)
(match f.cf_expr with
| Some { eexpr = TFunction fn } -> ignore(make_fun ctx (s_type_path c.cl_path,f.cf_name) (alloc_fid ctx c f) fn None None)
| _ -> if not (Meta.has Meta.NoExpr f.cf_meta) then abort "Missing function body" f.cf_pos)
| _ :: l ->
loop l
in
Expand Down
2 changes: 2 additions & 0 deletions src/typing/nullSafety.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,8 @@ class expr_checker mode immediate_execution report =
| TMeta (_, e) -> self#is_nullable_expr e
| TThrow _ -> false
| TReturn _ -> false
| TContinue -> false
| TBreak -> false
| TBinop ((OpAssign | OpAssignOp _), _, right) -> self#is_nullable_expr right
| TBlock exprs ->
local_safety#block_declared;
Expand Down
11 changes: 10 additions & 1 deletion std/cpp/_std/haxe/Exception.hx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ class Exception {
if(Std.isOfType(value, Exception)) {
return value;
} else {
return new ValueException(value, null, value);
var e = new ValueException(value, null, value);
// Undo automatic __shiftStack()
e.__unshiftStack();
return e;
}
}

Expand Down Expand Up @@ -63,6 +66,12 @@ class Exception {
__skipStack++;
}

@:noCompletion
@:ifFeature("haxe.Exception.get_stack")
inline function __unshiftStack():Void {
__skipStack--;
}

function get_message():String {
return __exceptionMessage;
}
Expand Down
11 changes: 10 additions & 1 deletion std/eval/_std/haxe/Exception.hx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ class Exception {
if(Std.isOfType(value, Exception)) {
return value;
} else {
return new ValueException(value, null, value);
var e = new ValueException(value, null, value);
// Undo automatic __shiftStack()
e.__unshiftStack();
return e;
}
}

Expand Down Expand Up @@ -63,6 +66,12 @@ class Exception {
__skipStack++;
}

@:noCompletion
@:ifFeature("haxe.Exception.get_stack")
inline function __unshiftStack():Void {
__skipStack--;
}

function get_message():String {
return __exceptionMessage;
}
Expand Down
6 changes: 5 additions & 1 deletion std/haxe/macro/MacroStringTools.hx
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ class MacroStringTools {

static public function toComplex(path:String):ComplexType {
var pack = path.split(".");
return TPath({pack: pack, name: pack.pop(), params: []});
if(pack.length >= 2 && ~/^[A-Z]/.match(pack[pack.length - 2])) {
return TPath({pack: pack, sub: pack.pop(), name: pack.pop(), params: []});
} else {
return TPath({pack: pack, name: pack.pop(), params: []});
}
}
}
11 changes: 10 additions & 1 deletion std/hl/_std/haxe/Exception.hx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ class Exception {
if(Std.isOfType(value, Exception)) {
return value;
} else {
return new ValueException(value, null, value);
var e = new ValueException(value, null, value);
// Undo automatic __shiftStack()
e.__unshiftStack();
return e;
}
}

Expand Down Expand Up @@ -62,6 +65,12 @@ class Exception {
__skipStack++;
}

@:noCompletion
@:ifFeature("haxe.Exception.get_stack")
inline function __unshiftStack():Void {
__skipStack--;
}

function get_message():String {
return __exceptionMessage;
}
Expand Down
2 changes: 1 addition & 1 deletion std/hl/_std/haxe/NativeStackTrace.hx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class NativeStackTrace {
var count = callStackRaw(null);
var arr = new NativeArray(count);
callStackRaw(arr);
return arr;
return arr.sub(1, arr.length - 1);
}

@:hlNative("std", "exception_stack_raw")
Expand Down
11 changes: 10 additions & 1 deletion std/neko/_std/haxe/Exception.hx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ class Exception {
if(Std.isOfType(value, Exception)) {
return value;
} else {
return new ValueException(value, null, value);
var e = new ValueException(value, null, value);
// Undo automatic __shiftStack()
e.__unshiftStack();
return e;
}
}

Expand Down Expand Up @@ -63,6 +66,12 @@ class Exception {
__skipStack++;
}

@:noCompletion
@:ifFeature("haxe.Exception.get_stack")
inline function __unshiftStack():Void {
__skipStack--;
}

function get_message():String {
return __exceptionMessage;
}
Expand Down
3 changes: 3 additions & 0 deletions tests/misc/hl/projects/Issue11196/Issue11196.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function main() {
var a:hl.I64 = 5;
}
3 changes: 3 additions & 0 deletions tests/misc/hl/projects/Issue11196/compile.hxml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-m Issue11196
-hl out.hl
-dce no
7 changes: 7 additions & 0 deletions tests/nullsafety/src/cases/TestLoose.hx
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,11 @@ class TestLoose {
}
shouldFail(if (foo()) {});
}

static function nullCoal_continue_shouldPass():Void {
for (i in 0...1) {
var i:String = staticVar ?? continue;
var i2:String = staticVar ?? break;
}
}
}
41 changes: 34 additions & 7 deletions tests/unit/src/unit/TestExceptions.hx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package unit;
package unit;

import haxe.Exception;
import haxe.exceptions.ArgumentException;
Expand Down Expand Up @@ -235,17 +235,16 @@ class TestExceptions extends Test {
public function testExceptionStack() {
var data = [
'_without_ throws' => stacksWithoutThrowLevel1(),
'_with_ throws' => stacksWithThrowLevel1()
'_with_ throws' => stacksWithThrowLevel1(),
#if (eval || hl || neko)
'auto wrapped' => stacksAutoWrappedLevel1()
#end
];
for(label => stacks in data) {
Assert.isTrue(stacks.length > 1, '$label: wrong stacks.length');
var expected = null;
var lineShift = 0;
for(s in stacks) {
// TODO: fix hl vs other targets difference with callstacks
// See https://github.com/HaxeFoundation/haxe/issues/10926
#if hl @:privateAccess s.asArray().shift(); #end

if(expected == null) {
expected = stackItemData(s[0]);
} else {
Expand Down Expand Up @@ -295,6 +294,24 @@ class TestExceptions extends Test {
return result;
}

#if (eval || hl || neko)
function stacksAutoWrappedLevel1() {
return stacksAutoWrappedLevel2();
}

function stacksAutoWrappedLevel2():Array<CallStack> {
@:pure(false) function wrapNativeError(_) return [];

var result:Array<CallStack> = [];
// It's critical for `testExceptionStack` test to keep the following lines
// order with no additional code in between.
result.push(try throw new Exception('') catch(e:Exception) e.stack);
result.push(try throw "" catch(e:Exception) e.stack);
result.push(try wrapNativeError((null:String).length) catch(e:Exception) e.stack);
return result;
}
#end

function stackItemData(item:StackItem):ItemData {
var result:ItemData = {};
switch item {
Expand All @@ -321,6 +338,16 @@ class TestExceptions extends Test {
eq('haxe.Exception', HelperMacros.typeString(try throw new Exception('') catch(e) e));
}

function testCatchValueException() {
try {
throw "";
} catch(e:ValueException) {
Assert.pass();
} catch(e) {
Assert.fail();
}
}

function testNotImplemented() {
try {
futureFeature();
Expand Down Expand Up @@ -374,4 +401,4 @@ class TestExceptions extends Test {
}
}
#end
}
}

0 comments on commit 8d9b53b

Please sign in to comment.