diff --git a/src/program.c b/src/program.c
index d5de00034242efa4b42e0b59bbf6b108d5bf37fb..270321fba9f112fe987ba2a38559c2c479896041 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: program.c,v 1.18 1997/01/31 23:09:03 hubbe Exp $");
+RCSID("$Id: program.c,v 1.19 1997/02/07 01:34:19 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -92,9 +92,14 @@ dynamic_buffer used_modules;
 
 void use_module(struct svalue *s)
 {
-  assign_svalue_no_free((struct svalue *)
-			low_make_buf_space(sizeof(struct svalue),
-					   &used_modules), s);
+  if( (1<<s->type) & (BIT_MAPPING | BIT_OBJECT))
+  {
+    assign_svalue_no_free((struct svalue *)
+			  low_make_buf_space(sizeof(struct svalue),
+					     &used_modules), s);
+  }else{
+    yyerror("Module is neither mapping nor object");
+  }
 }
 
 
@@ -104,7 +109,7 @@ static int low_find_shared_string_identifier(struct pike_string *name,
 int find_module_identifier(struct pike_string *ident)
 {
   JMP_BUF tmp;
-  
+
   if(SETJMP(tmp))
   {
     ONERROR tmp;
@@ -125,11 +130,13 @@ int find_module_identifier(struct pike_string *ident)
       ident->refs++;
       f_index(2);
       
-      if(!IS_ZERO(sp-1) || sp[-1].subtype != 1)
+      if(!IS_UNDEFINED(sp-1))
       {
+/*	fprintf(stderr,"MOD: %s, %d %d\n",ident->str, current_line, sp[-1].type); */
 	UNSETJMP(tmp);
 	return 1;
       }
+      pop_stack();
     }
   }
   UNSETJMP(tmp);
@@ -1046,6 +1053,31 @@ int add_string_constant(char *name,
   return ret;
 }
 
+int add_program_constant(char *name,
+			 struct program *p,
+			 INT32 flags)
+{
+  INT32 ret;
+  struct svalue tmp;
+  tmp.type=T_PROGRAM;
+  tmp.subtype=0;
+  tmp.u.program=p;
+  ret=simple_add_constant(name, &tmp, flags);
+  return ret;
+}
+
+int end_class(char *name, INT32 flags)
+{
+  INT32 ret;
+  struct svalue tmp;
+  tmp.type=T_PROGRAM;
+  tmp.subtype=0;
+  tmp.u.program=end_program();
+  ret=simple_add_constant(name, &tmp, flags);
+  free_svalue(&tmp);
+  return ret;
+}
+
 /*
  * define a new function
  * if func isn't given, it is supposed to be a prototype.
@@ -1495,18 +1527,6 @@ struct program *compile_string(struct pike_string *prog,
   return p;
 }
 
-struct program *end_c_program(char *name)
-{
-  struct program *q;
-  q=end_program();
-
-  push_string(make_shared_string(name));
-  push_program(q);
-  APPLY_MASTER("add_precompiled_program",2);
-  pop_stack();
-  return q;
-}
-
 void add_function(char *name,void (*cfun)(INT32),char *type,INT16 flags)
 {
   struct pike_string *name_tmp,*type_tmp;
diff --git a/src/program.h b/src/program.h
index 6366339038d2a5246a98094c7ac2d14871ed1541..d48a69e81a042c01a499490baf6792cb1ae647e3 100644
--- a/src/program.h
+++ b/src/program.h
@@ -48,11 +48,6 @@ extern char *lfun_names[];
 struct svalue;
 #endif
 
-#ifndef STRUCT_MODULE_DECLARED
-#define STRUCT_MODULE_DECLARED
-struct module;
-#endif
-
 #ifndef STRUCT_OBJECT_DECLARED
 #define STRUCT_OBJECT_DECLARED
 struct object;
@@ -153,7 +148,6 @@ struct program
   unsigned INT16 *identifier_index;
   struct svalue *constants;
   char *linenumbers;
-  struct module *from_module;
   void (*init)(struct object *);
   void (*exit)(struct object *);
 #ifdef DEBUG
@@ -211,9 +205,21 @@ int define_variable(struct pike_string *name,
 int add_constant(struct pike_string *name,
 		 struct svalue *c,
 		 INT32 flags);
+int simple_add_constant(char *name, 
+			struct svalue *c,
+			INT32 flags);
 int add_integer_constant(char *name,
 			 INT32 i,
 			 INT32 flags);
+int add_float_constant(char *name,
+			 double f,
+			 INT32 flags);
+int add_string_constant(char *name,
+			char *str,
+			INT32 flags);
+int add_program_constant(char *name,
+			 struct program *p,
+			 INT32 flags);
 INT32 define_function(struct pike_string *name,
 		      struct pike_string *type,
 		      INT16 flags,
@@ -233,7 +239,6 @@ void compile();
 struct program *compile_file(struct pike_string *file_name);
 struct program *compile_string(struct pike_string *prog,
 			       struct pike_string *name);
-struct program *end_c_program(char *name);
 void add_function(char *name,void (*cfun)(INT32),char *type,INT16 flags);
 void check_all_programs();
 void cleanup_program();