From fe46a5d72f1a24d88f774c1bb1eb6e417d0e44b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Wed, 26 Feb 2014 23:59:26 +0100
Subject: [PATCH] Runtime: Added support for casting types to program.

Casting an object type value to program will now result in the
corresponding program. eg:

  program p = (program)_typeof(o);

is approximately the same as

  program p = object_program(o);
---
 src/operators.c | 13 +++++++++++++
 src/program.c   | 17 +++++++++++++++++
 src/program.h   |  1 +
 3 files changed, 31 insertions(+)

diff --git a/src/operators.c b/src/operators.c
index 4ddb629927..2edf7f9253 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -710,6 +710,19 @@ PMOD_EXPORT void o_cast(struct pike_type *type, INT32 run_time_type)
 	}
 	return;
 
+        case PIKE_T_TYPE:
+	{
+	  struct pike_type *t = Pike_sp[-1].u.type;
+	  struct program *p = program_from_type(t);
+	  pop_stack();
+	  if (p) {
+	    ref_push_program(p);
+	  } else {
+	    push_int(0);
+	  }
+	  return;
+	}
+
 	default:
 	  Pike_error("Cannot cast %s to a program.\n",
 		     get_name_of_type(TYPEOF(sp[-1])));
diff --git a/src/program.c b/src/program.c
index 0f66836685..489d054032 100644
--- a/src/program.c
+++ b/src/program.c
@@ -11471,6 +11471,19 @@ PMOD_EXPORT struct program *program_from_function(const struct svalue *f)
   return low_program_from_function(f->u.object, SUBTYPEOF(*f));
 }
 
+static const struct pike_type *is_subtyped_object_type(struct pike_type *t)
+{
+  if ((t->type == T_OBJECT) && t->cdr) return t;
+  return NULL;
+}
+
+PMOD_EXPORT struct program *program_from_type(const struct pike_type *t)
+{
+  t = find_type(t, is_subtyped_object_type);
+  if (!t) return NULL;
+  return id_to_program((int)(ptrdiff_t)t->cdr);
+}
+
 /* NOTE: Does not add references to the return value! */
 PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s,
 						    struct object **parent_obj,
@@ -11510,6 +11523,10 @@ PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s,
 
   case T_PROGRAM:
     return s->u.program;
+
+  case PIKE_T_TYPE:
+    return program_from_type(s->u.type);
+
   default:
     return 0;
   }
diff --git a/src/program.h b/src/program.h
index 1a09732b35..f127ac7aa6 100644
--- a/src/program.h
+++ b/src/program.h
@@ -1042,6 +1042,7 @@ PMOD_EXPORT ptrdiff_t low_get_storage(struct program *o, struct program *p);
 PMOD_EXPORT char *get_storage(struct object *o, struct program *p);
 PMOD_EXPORT struct program *low_program_from_function(struct object *o, INT32 i);
 PMOD_EXPORT struct program *program_from_function(const struct svalue *f);
+PMOD_EXPORT struct program *program_from_type(const struct pike_type *t);
 PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s,
 						    struct object **parent_obj,
 						    int *parent_id);
-- 
GitLab