pike.git/
src/
language.yacc
Branch:
Tag:
Non-build tags
All tags
No tags
2000-07-13
2000-07-13 22:32:15 by Henrik Grubbström (Grubba) <grubba@grubba.org>
be57ead53e15fc8a0887985ee4e49d3cfabbf724 (
84
lines) (+
75
/-
9
)
[
Show
|
Annotate
]
Branch:
7.9
Begun support for ID_VARIANT.
Rev: src/language.yacc:1.204
110:
/* This is the grammar definition of Pike. */ #include "global.h"
-
RCSID("$Id: language.yacc,v 1.
203
2000/07/13
06
:
28
:
05
hubbe
Exp $");
+
RCSID("$Id: language.yacc,v 1.
204
2000/07/13
22
:
32
:
15
grubba
Exp $");
#ifdef HAVE_MEMORY_H #include <memory.h> #endif
630:
} push_type(T_FUNCTION);
+
{
+
struct pike_string *s=compiler_pop_type();
+
int i = isidentifier($4->u.sval.u.string);
+
+
if (Pike_compiler->compiler_pass == 1) {
if ($1 & ID_VARIANT) { /* FIXME: Lookup the type of any existing variant */ /* Or the types. */
-
+
fprintf(stderr, "Pass %d: Identifier %s:\n",
+
Pike_compiler->compiler_pass, $4->u.sval.u.string->str);
+
+
if (i >= 0) {
+
struct identifier *id = ID_FROM_INT(Pike_compiler->new_program, i);
+
if (id) {
+
struct pike_string *new_type;
+
fprintf(stderr, "Defined, type:\n");
+
simple_describe_type(id->type);
+
+
new_type = or_pike_types(s, id->type, 1);
+
free_string(s);
+
s = new_type;
+
+
fprintf(stderr, "Resulting type:\n");
+
simple_describe_type(s);
+
} else {
+
my_yyerror("Lost identifier %s (%d).",
+
$4->u.sval.u.string->str, i);
}
-
+
} else {
+
fprintf(stderr, "Not defined.\n");
+
}
+
fprintf(stderr, "New type:\n");
+
simple_describe_type(s);
+
}
+
} else {
+
/* FIXME: Second pass reuses the type from the end of
+
* the first pass if this is a variant function.
+
*/
+
if (i >= 0) {
+
if (Pike_compiler->new_program->identifier_references[i].id_flags &
+
ID_VARIANT) {
+
struct identifier *id = ID_FROM_INT(Pike_compiler->new_program, i);
+
fprintf(stderr, "Pass %d: Identifier %s:\n",
+
Pike_compiler->compiler_pass, $4->u.sval.u.string->str);
-
{
-
struct
pike
_string
*
s
=compiler
_
pop
_type();
+
free_string(s);
+
copy
_
shared_
string
(s,
id->type);
+
+
fprintf(stderr, "Resulting type:\n");
+
simple
_
describe
_type(
s
);
+
}
+
} else {
+
my_yyerror("Identifier %s lost after first pass.",
+
$4->u.sval.u.string->str);
+
}
+
}
+
$<n>$=mkstrnode(s); free_string(s); }
-
+
/* if(Pike_compiler->compiler_pass==1) */ { /* FIXME:
652:
$1 & (~ID_EXTERN), IDENTIFIER_PIKE_FUNCTION, 0);
+
+
if ($1 & ID_VARIANT) {
+
fprintf(stderr, "Function number: %d\n",
+
Pike_compiler->compiler_frame->current_function_number);
} }
-
+
}
block_or_semi { int e;
722:
check_node_hash($10), check_node_hash($<n>9)->u.sval.u.string, $1);
+
+
if ($1 & ID_VARIANT) {
+
fprintf(stderr, "Function number: %d\n", f);
+
}
+
#ifdef PIKE_DEBUG
-
if(Pike_interpreter.recoveries && Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
+
if(Pike_interpreter.recoveries &&
+
((
Pike_sp
-
Pike_interpreter.evaluator_stack
)
<
+
Pike_interpreter.recoveries->stack_pointer)
)
fatal("Stack error (underflow)\n");
-
if(Pike_compiler->compiler_pass == 1 && f!=Pike_compiler->compiler_frame->current_function_number)
-
fatal("define_function screwed up! %d != %d\n",f,Pike_compiler->compiler_frame->current_function_number);
+
if(
(
Pike_compiler->compiler_pass == 1
)
&&
+
(
f
!=
Pike_compiler->compiler_frame->current_function_number)
)
+
fatal("define_function screwed up! %d != %d\n",
+
f,
Pike_compiler->compiler_frame->current_function_number);
#endif } pop_compiler_frame();