diff --git a/src/docode.c b/src/docode.c
index 439423e87dc83c5fab690e2e9d7f28af83a78bf3..7b276ac050c0f914150ee6aa4d4f27852232a794 100644
--- a/src/docode.c
+++ b/src/docode.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: docode.c,v 1.48 1999/06/19 19:57:31 hubbe Exp $");
+RCSID("$Id: docode.c,v 1.49 1999/08/03 00:45:09 hubbe Exp $");
 #include "las.h"
 #include "program.h"
 #include "language.h"
@@ -1078,7 +1078,12 @@ static int do_docode2(node *n,int flags)
     switch(n->u.sval.type)
     {
     case T_INT:
-      emit(F_NUMBER,n->u.sval.u.integer);
+      if(!n->u.sval.u.integer && n->u.sval.subtype==NUMBER_UNDEFINED)
+      {
+	emit2(F_UNDEFINED);
+      }else{
+	emit(F_NUMBER,n->u.sval.u.integer);
+      }
       return 1;
 
     case T_STRING:
diff --git a/src/interpreter.h b/src/interpreter.h
index c1bd510c328c3fc6240cd75b49e88c9b80657cfd..fc365b6bf4d157596f3950f0b09fbb0712f421ea 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -113,6 +113,7 @@ static int eval_instruction(unsigned char *pc)
       CASE(F_LDA); accumulator=GET_ARG(); break;
 
       /* Push number */
+      CASE(F_UNDEFINED); push_int(0); sp[-1].subtype=NUMBER_UNDEFINED; break;
       CASE(F_CONST0); push_int(0); break;
       CASE(F_CONST1); push_int(1); break;
       CASE(F_CONST_1); push_int(-1); break;
diff --git a/src/language.yacc b/src/language.yacc
index b62a5cfbfd4a636d0cf1e651ecf18653287b7fd2..b34c32dafd2f154e4422ad2aa1420490e697e8a2 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -47,6 +47,7 @@
 %token F_CLEAR_STRING_SUBTYPE
 %token F_CONSTANT F_FLOAT F_STRING F_ARROW_STRING
 %token F_NUMBER F_NEG_NUMBER F_CONST_1 F_CONST0 F_CONST1 F_BIGNUM
+%token F_UNDEFINED
 /*
  * These are the predefined functions that can be accessed from Pike.
  */
@@ -181,7 +182,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.119 1999/07/19 00:32:41 hubbe Exp $");
+RCSID("$Id: language.yacc,v 1.120 1999/08/03 00:45:12 hubbe Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
diff --git a/src/lex.c b/src/lex.c
index f8ccb47d309541e0cc052dafb0cf506682530b22..5ffa2ce90db6e55ad2af52f4deddc26a8f9725f5 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: lex.c,v 1.64 1999/03/11 13:44:32 hubbe Exp $");
+RCSID("$Id: lex.c,v 1.65 1999/08/03 00:45:13 hubbe Exp $");
 #include "language.h"
 #include "array.h"
 #include "lex.h"
@@ -185,6 +185,7 @@ struct keyword instr_names[]=
 { "number",             F_NUMBER, I_HASARG },
 { "pop",		F_POP_VALUE,0 },	
 { "pop_n_elems",        F_POP_N_ELEMS, I_HASARG },
+{ "push UNDEFINED",     F_UNDEFINED,0 },
 { "push 0",             F_CONST0,0 },
 { "push 1",             F_CONST1,0 },
 { "push 0x7fffffff",    F_BIGNUM,0 },