From 1adc6c4ca5ece22c2b97aaaa5f08aa34feb68e97 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sun, 12 Dec 1999 20:46:26 +0100
Subject: [PATCH] Implemented F_SOFT_CAST for real.

Rev: src/interpreter.h:1.22
---
 src/interpreter.h | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/interpreter.h b/src/interpreter.h
index 95dd2a2ae7..0019311296 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -1293,17 +1293,39 @@ static int eval_instruction(unsigned char *pc)
       CASE(F_CAST); f_cast(); break;
 
       CASE(F_SOFT_CAST);
+      /* Stack: type_string, value */
 #ifdef PIKE_DEBUG
+      if (sp[-2].type != T_STRING) {
+	fatal("Argument 1 to soft_cast isn't a string!\n");
+      }
+#endif /* PIKE_DEBUG */
+      /* FIXME: Should probably be some other flag */
       if (d_flag) {
-	/* FIXME: Perform a type-check here */
-	/* Stack: type_string, value */
-	if (d_flag > 1) {
+	struct pike_string *sval_type = get_type_of_svalue(sp-1);
+	if (!pike_types_le(sval_type, sp[-2].u.string)) {
+	  struct pike_string *t;
+	  ONERROR tmp;
+
+	  free_string(sval_type);
+
+	  t = describe_type(sp[-2].u.string);
+	  SET_ONERRROR(tmp, free_string, t);
+	  bad_arg_error("soft_cast", sp-1, 1, 1, t->str, sp-1,
+			"Assertion failed in soft_cast(). Expected %s\n",
+			t->str);
+	  /* NOT_REACHED */
+	  UNSET_ONERROR(tmp);
+	  free_string(t);
+	}
+	free_string(sval_type);
+#ifdef PIKE_DEBUG
+	if (d_flag > 2) {
 	  struct pike_string *t = describe_type(sp[-2].u.string);
 	  fprintf(stderr, "Soft cast to %s\n", t->str);
 	  free_string(t);
 	}
-      }
 #endif /* PIKE_DEBUG */
+      }
       stack_swap();
       pop_stack();
       break;
-- 
GitLab