diff --git a/src/language.yacc b/src/language.yacc index 88c2f86dd1549d14565d873661c687fc557899a4..56ff373b6b161522024e3669215be6af37a3fe8d 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -113,7 +113,7 @@ /* This is the grammar definition of Pike. */ #include "global.h" -RCSID("$Id: language.yacc,v 1.276 2002/05/05 13:03:42 mast Exp $"); +RCSID("$Id: language.yacc,v 1.277 2002/05/05 16:31:06 mast Exp $"); #ifdef HAVE_MEMORY_H #include <memory.h> #endif @@ -3258,6 +3258,13 @@ idents: low_idents copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string); free_node($2); } + | TOK_GLOBAL '.' TOK_IDENTIFIER + { + $$ = resolve_identifier ($3->u.sval.u.string); + if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); + copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string); + free_node ($3); + } | idents '.' bad_identifier {} | idents '.' error {} ; diff --git a/src/program.c b/src/program.c index 5e41fb83730c19706d50e85295c66e90117948bb..43c0ee04c22973b75f9c1ede9fb1b25198ef6cb2 100644 --- a/src/program.c +++ b/src/program.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: program.c,v 1.422 2002/05/01 21:25:55 mast Exp $"); +RCSID("$Id: program.c,v 1.423 2002/05/05 16:31:07 mast Exp $"); #include "program.h" #include "object.h" #include "dynamic_buffer.h" @@ -950,6 +950,8 @@ static struct node_s *index_modules(struct pike_string *ident, return 0; } +struct node_s *resolve_identifier(struct pike_string *ident); + struct node_s *find_module_identifier(struct pike_string *ident, int see_inherit) { @@ -1014,6 +1016,13 @@ struct node_s *find_module_identifier(struct pike_string *ident, return mkconstantsvaluenode(&s); } + return resolve_identifier(ident); +} + +struct node_s *resolve_identifier(struct pike_string *ident) +{ + struct node_s *ret; + if(resolve_cache) { struct svalue *tmp=low_mapping_string_lookup(resolve_cache,ident); @@ -3197,11 +3206,10 @@ PMOD_EXPORT int quick_map_variable(char *name, #ifdef PROGRAM_BUILD_DEBUG { - fprintf (stderr, "%.*sdefining variable (pass=%d): ", - compilation_depth, " ", Pike_compiler->compiler_pass); - push_string (describe_type (t)); - print_svalue (stderr, Pike_sp - 1); - pop_stack(); + struct pike_string *d = describe_type (t); + fprintf (stderr, "%.*sdefining variable (pass=%d): %s ", + compilation_depth, " ", Pike_compiler->compiler_pass, d->str); + free_string (d); push_string (n); print_svalue (stderr, --Pike_sp); putc ('\n', stderr); @@ -3228,11 +3236,10 @@ int define_variable(struct pike_string *name, #ifdef PROGRAM_BUILD_DEBUG { - fprintf (stderr, "%.*sdefining variable (pass=%d): ", - compilation_depth, " ", Pike_compiler->compiler_pass); - push_string (describe_type (type)); - print_svalue (stderr, Pike_sp - 1); - pop_stack(); + struct pike_string *d = describe_type (type); + fprintf (stderr, "%.*sdefining variable (pass=%d): %s ", + compilation_depth, " ", Pike_compiler->compiler_pass, d->str); + free_string (d); push_string (name); print_svalue (stderr, --Pike_sp); putc ('\n', stderr); diff --git a/src/program.h b/src/program.h index 57fb4cd65b2b90b5fac53dbd3580d1052aac33f9..279dcbf72fff155dbf8d8ff29ded9a2fc98c907c 100644 --- a/src/program.h +++ b/src/program.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: program.h,v 1.156 2002/04/09 10:33:56 mast Exp $ + * $Id: program.h,v 1.157 2002/05/05 16:31:07 mast Exp $ */ #ifndef PROGRAM_H #define PROGRAM_H @@ -452,6 +452,7 @@ void use_module(struct svalue *s); void unuse_modules(INT32 howmany); struct node_s *find_module_identifier(struct pike_string *ident, int see_inherit); +struct node_s *resolve_identifier(struct pike_string *ident); struct program *parent_compilation(int level); struct program *id_to_program(INT32 id); void optimize_program(struct program *p); diff --git a/src/testsuite.in b/src/testsuite.in index 42cd7201531a11d2c86275a763a476c99f13371a..200dba50673e6cb3eedff073e405004e7a8d2968 100644 --- a/src/testsuite.in +++ b/src/testsuite.in @@ -1,4 +1,4 @@ -test_true([["$Id: testsuite.in,v 1.509 2002/05/05 13:03:42 mast Exp $"]]); +test_true([["$Id: testsuite.in,v 1.510 2002/05/05 16:31:08 mast Exp $"]]); cond([[all_constants()->_verify_internals]], [[ @@ -2143,7 +2143,19 @@ test_program([[ int a() {return X()->Y()->f() == "XAYBB";} ]]) -// Testing global:: +test_program([[ + class A { + string s = "A"; + } + inherit A; + class X { + constant s = "X"; + mixed f (string s) {return s + X::s + A::s;} + } + int a() {return X()->f("L") == "LXA";} +]]) + +// Testing 'global::' test_equal([[ compile_string (#" @@ -2177,6 +2189,45 @@ test_equal([[ }")()->X()->f (33); ]], ({23, 24, 32, 33})) +// Testing 'global.' + +test_compile([[ + mixed a() {return global.Parser.HTML;} +]], 0); + +test_compile_error([[ + #pike 7.2 + mixed a() {return global.Parser.HTML;} +]], 0); + +test_any([[ + if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n"); + return compile_string (#" + class Parser {constant HTML = 1;} + mixed foo() {return programp (Parser.HTML);}")()->foo(); +]], 0); + +test_any([[ + if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n"); + return compile_string (#" + mixed foo() {return programp (Parser.HTML);} + class Parser {constant HTML = 1;}")()->foo(); +]], 0); + +test_any([[ + if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n"); + return compile_string (#" + class Parser {constant HTML = 1;} + mixed foo() {return programp (global.Parser.HTML);}")()->foo(); +]], 1); + +test_any([[ + if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n"); + return compile_string (#" + mixed foo() {return programp (global.Parser.HTML);} + class Parser {constant HTML = 1;}")()->foo(); +]], 1); + // testing virtual overloading test_any([[ class fnord