ソースを参照

implement some dynamic function-function comparison

Nicolas Cannasse 6 年 前
コミット
8174702b66
2 ファイル変更9 行追加1 行削除
  1. 1 1
      src/jit.c
  2. 8 0
      src/std/cast.c

+ 1 - 1
src/jit.c

@@ -1959,7 +1959,7 @@ static void dyn_value_compare( jit_ctx *ctx, preg *a, preg *b, hl_type *t ) {
 }
 
 static void op_jump( jit_ctx *ctx, vreg *a, vreg *b, hl_opcode *op, int targetPos ) {
-	if( a->t->kind == HDYN || b->t->kind == HDYN ) {
+	if( a->t->kind == HDYN || b->t->kind == HDYN || a->t->kind == HFUN || b->t->kind == HFUN ) {
 		int args[] = { a->stack.id, b->stack.id };
 		int size = prepare_call_args(ctx,2,args,ctx->vregs,0);
 		call_native(ctx,hl_dyn_compare,size);

+ 8 - 0
src/std/cast.c

@@ -369,6 +369,14 @@ HL_PRIM int hl_dyn_compare( vdynamic *a, vdynamic *b ) {
 	case TK2(HVIRTUAL,HOBJ):
 	case TK2(HVIRTUAL,HDYNOBJ):
 		return hl_dyn_compare(((vvirtual*)a)->value,b);
+	case TK2(HFUN,HFUN):
+		if( ((vclosure*)a)->hasValue == 2 )
+			return hl_dyn_compare((vdynamic*)((vclosure_wrapper*)a)->wrappedFun,b);
+		if( ((vclosure*)b)->hasValue == 2 )
+			return hl_dyn_compare(a,(vdynamic*)((vclosure_wrapper*)b)->wrappedFun);
+		if( ((vclosure*)a)->fun != ((vclosure*)b)->fun )
+			return hl_invalid_comparison;
+		return hl_dyn_compare(((vclosure*)a)->value,((vclosure*)b)->value);
 	case TK2(HVIRTUAL,HVIRTUAL):
 		if( ((vvirtual*)a)->value && ((vvirtual*)b)->value )
 			return hl_dyn_compare(((vvirtual*)a)->value,((vvirtual*)b)->value);