pike.git
/
src
/
pike_types.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/pike_types.c:2240:
break; } if (s->flags) { fprintf(stderr, "[%06x]", s->flags); } } else { fprintf(stderr, "NULL"); } }
-
static
void low_describe_type(struct pike_type *t)
+
void low_describe_type(struct
string_builder *s, struct
pike_type *t)
{
-
char buffer[100];
-
+
check_c_stack(1024);
-
/**** FIXME: ****/
+
switch(t->type) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
-
my
_putchar(t->type);
+
string
_
builder_
putchar(
s,
t->type);
break; case T_ASSIGN:
-
my
_
putchar
(
'
(
'
)
;
-
my_putchar(
'0' + CAR_TO_INT(t)
);
-
my_putchar('=');
-
my_describe_type(
t->cdr);
-
my_putchar(')');
+
string
_
builder_sprintf
(
s, "
(
%c=%T
)
",
'0' + CAR_TO_INT(t)
,
t->cdr);
break; case T_SCOPE:
-
my
_
strcat
("scope(
"
)
;
-
my_putchar(
'0' + CAR_TO_INT(t)
);
-
my_putchar('
,
');
-
my_describe_type(
t->cdr);
-
my_putchar(')');
+
string
_
builder_sprintf
(
s,
"scope(
%c,%T)
"
,
'0' + CAR_TO_INT(t), t->cdr);
break; case T_TUPLE:
-
my
_
putchar
(
'
[
');
-
my_describe_type(
t->car
);
-
my_putchar('
,
');
-
my_describe_type(
t->cdr);
-
my_putchar(']');
+
string
_
builder_sprintf
(
s, "
[
%T,%T]",
t->car, t->cdr);
break;
-
case T_VOID:
my
_strcat("void"); break;
-
case T_ZERO:
my
_strcat("zero"); break;
-
case T_MIXED:
my
_strcat("mixed"); break;
-
case PIKE_T_UNKNOWN:
my
_strcat("unknown"); break;
+
case T_VOID:
string
_
builder_
strcat(
s,
"void"); break;
+
case T_ZERO:
string
_
builder_
strcat(
s,
"zero"); break;
+
case T_MIXED:
string
_
builder_
strcat(
s,
"mixed"); break;
+
case PIKE_T_UNKNOWN:
string
_
builder_
strcat(
s,
"unknown"); break;
case T_INT: { INT32 min=CAR_TO_INT(t); INT32 max=CDR_TO_INT(t);
-
my_strcat("int");
+
if (!min && max && max != MAX_INT32 && !(max & (max+1))) { int j = 0; while (max) { max >>= 1; j++; }
-
sprintf(
buffer
, "(%dbit)", j);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "
int
(%dbit)", j);
} else if(min!=MIN_INT32 || max!=MAX_INT32) {
-
sprintf(
buffer
,"(%ld..%ld)",(long)min,(long)max);
-
my
_strcat(
buffer
);
+
string_builder_
sprintf(
s
,
"
int
(%ld..%ld)",
(long)min,
(long)max);
+
}
else
{
+
string
_
builder_
strcat(
s, "int"
);
} break; }
-
case T_FLOAT:
my
_strcat("float"); break;
+
case T_FLOAT:
string
_
builder_
strcat(
s,
"float"); break;
case T_PROGRAM: if ((t->car->type == T_OBJECT) && (!t->car->cdr)) {
-
my
_strcat("program");
+
string
_
builder_
strcat(
s,
"program");
} else {
-
my
_
strcat
("program(
"
)
;
-
my_describe_type(
t->car);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"program(
%T)
"
,
t->car);
} break; case T_OBJECT: if (t->cdr) {
-
dynamic_buffer save_buf;
-
ONERROR err;
-
struct svalue
s
;
+
struct svalue
sval
;
if (t->car) {
-
my
_strcat("object(is ");
+
string
_
builder_
strcat(
s,
"object(is ");
} else {
-
my
_strcat("object(implements ");
+
string
_
builder_
strcat(
s,
"object(implements ");
} /* We need to save the global buffer, in case id_to_program() * starts running Pike code. */
-
save_buffer(&save_buf);
-
SET_ONERROR(err, restore_buffer, &save_buf);
-
s
.u.program = id_to_program(CDR_TO_INT(t));
-
CALL_AND_UNSET_ONERROR(err);
-
if (
s
.u.program) {
-
SET_SVAL_TYPE(
s
, T_PROGRAM);
-
SET_SVAL_SUBTYPE(
s
, 0);
-
describe
_
svalue
(
&
s,
0, NULL);
-
my_strcat(
")");
+
sval
.u.program = id_to_program(CDR_TO_INT(t));
+
if (
sval
.u.program) {
+
SET_SVAL_TYPE(
sval
, T_PROGRAM);
+
SET_SVAL_SUBTYPE(
sval
, 0);
+
string
_
builder_sprintf
(s, "
%O
)"
, &sval
);
} else {
-
char buffer[100];
-
sprintf(
buffer
,"%"PRINTPTRDIFFT"d)",
-
CDR_TO_INT(t));
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
,
"%"PRINTPTRDIFFT"d)", CDR_TO_INT(t));
} }else{
-
my
_strcat("object");
+
string
_
builder_
strcat(
s,
"object");
} break; case T_STRING: { INT32 min; INT32 max; t = t->car;
-
my_strcat("string");
+
if (t->type == T_ZERO) {
-
my
_strcat("(zero)");
+
string
_
builder_
strcat(
s,
"
string
(zero)");
} else if (t != int_type_string) {
-
my
_strcat("(");
+
string
_
builder_
strcat(
s,
"
string
(");
while (t->type == T_OR) { struct pike_type *char_type = t->car; while(char_type->type == T_ASSIGN) { char_type = char_type->cdr; } if (char_type->type != T_INT) {
-
low_describe_type(char_type);
+
low_describe_type(
s,
char_type);
} else { min = CAR_TO_INT(char_type); max = CDR_TO_INT(char_type); if (!min && max && max != MAX_INT32 && !(max & (max+1))) { int j = 0; while (max) { max >>= 1; j++; }
-
sprintf(
buffer
, "%dbit", j);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%dbit", j);
} else { if (min != MIN_INT32) {
-
sprintf(
buffer
, "%d", min);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%d", min);
}
-
my
_strcat("..");
+
string
_
builder_
strcat(
s,
"..");
if (max != MAX_INT32) {
-
sprintf(
buffer
, "%d", max);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%d", max);
} } }
-
my
_strcat(" | ");
+
string
_
builder_
strcat(
s,
" | ");
t = t->cdr; } while(t->type == T_ASSIGN) { t = t->cdr; } if (t->type != T_INT) {
-
low_describe_type(t);
+
low_describe_type(
s,
t);
} else { min = CAR_TO_INT(t); max = CDR_TO_INT(t); if (!min && max && max != MAX_INT32 && !(max & (max+1))) { int j = 0; while (max) { max >>= 1; j++; }
-
sprintf(
buffer
, "%dbit", j);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%dbit", j);
} else { if (min != MIN_INT32) {
-
sprintf(
buffer
, "%d", min);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%d", min);
}
-
my
_strcat("..");
+
string
_
builder_
strcat(
s,
"..");
if (max != MAX_INT32) {
-
sprintf(
buffer
, "%d", max);
-
my_strcat(buffer);
+
string_builder_
sprintf(
s
, "%d", max);
} } }
-
my
_strcat("
)
");
+
string
_
builder_putchar(s, ')');
+
} else {
+
string_builder_
strcat(
s,
"
string
");
} break; } case T_TYPE:
-
my
_
strcat
("type(
"
)
;
-
my_describe_type(
t->car);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"type(
%T)
"
,
t->car);
break; case PIKE_T_NAME:
-
if (!((struct pike_
string
*)t->car)->size
_
shift)
{
-
my_strcat(
"
{ ");
-
my_binary_strcat(((struct
pike_string
*)t->car)->str,
-
(
(
struct pike_string *)t->car
)->len);
-
my_strcat(" = ");
-
my_describe_type(
t->cdr);
-
my_strcat(" }");
-
} else {
-
my_describe_type(t->cdr);
-
}
+
string_
builder_sprintf(s,
"
{
%S
=
%T
}
"
,
+
(struct pike_string *)t->car
,
t->cdr);
break; case PIKE_T_ATTRIBUTE:
-
if (!((struct pike_string *)t->car)->size_shift)
{
+
{
struct pike_string *deprecated; MAKE_CONST_STRING(deprecated, "deprecated"); if (((struct pike_string *)t->car) == deprecated) {
-
my
_
strcat
("__deprecated__(");
+
string
_
builder_sprintf
(
s,
"__deprecated__(
%T)
"
, t->cdr
);
} else {
-
my_strcat("__attribute__(\"")
;
-
my
_
binary_strcat
(
((struct
pike
_
string
*)t->car)->str
,
-
(
(
struct pike_string *)t->car)
->len)
;
-
my
_
strcat
("
\"
, ");
+
struct svalue sval
;
+
SET
_
SVAL
(
sval,
PIKE
_
T_STRING,
0
,
string,
+
(struct pike_string *)t->car);
+
string
_
builder_sprintf
(
s,
"
__attribute__(%O, %T)
",
&sval, t->cdr
);
}
-
my_describe_type(t->cdr);
-
my_strcat(")");
-
} else {
-
my_describe_type(t->cdr);
+
} break; case T_FUNCTION: case T_MANY: {
-
int s;
-
my_strcat("function");
+
if(t->type == T_MANY && t->cdr->type == T_OR && ((t->cdr->car->type == T_MIXED && t->cdr->cdr->type == T_VOID) || (t->cdr->cdr->type == T_MIXED && t->cdr->car->type == T_VOID)) && (t->car->type == T_ZERO || (t->car->type == T_OR && ((t->car->car->type == T_ZERO && t->car->cdr->type == T_VOID) || (t->car->cdr->type == T_ZERO && t->car->car->type == T_VOID))))) { /* function == function(zero...:mixed|void) or * function(zero|void...:mixed|void) */
-
+
string_builder_strcat(s, "function");
/* done */
-
+
break;
} else {
-
my_strcat("(")
;
-
s
=0
;
+
int arg = 0
;
+
string_builder_strcat(
s
, "function(")
;
while(t->type != T_MANY) {
-
if(
s++
)
my
_strcat(", ");
-
my
_describe_type(t->car);
+
if(
arg++
)
string
_
builder_
strcat(
s,
", ");
+
low
_describe_type(
s,
t->car);
t = t->cdr; while(t->type == T_ASSIGN) {
-
my
_
putchar
('0' + CAR_TO_INT(t));
-
my_putchar('=');
+
string
_
builder_sprintf
(
s, "%c=",
'0' + CAR_TO_INT(t));
t = t->cdr; } } if(t->car->type != T_VOID) {
-
if(
s++
)
my
_strcat(", ");
-
my
_describe_type(t->car);
-
my
_strcat(" ...");
+
if(
arg++
)
string
_
builder_
strcat(
s,
", ");
+
low
_describe_type(
s,
t->car);
+
string
_
builder_
strcat(
s,
" ...");
}
-
my
_
strcat
(" :
"
)
;
-
my_describe_type(
t->cdr);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
" :
%T)
"
,
t->cdr);
} break; } case T_ARRAY:
-
my_strcat("array");
+
if(t->car->type != T_MIXED) {
-
my
_
strcat
("(");
-
my_describe_type(t->car);
-
my
_strcat("
)
");
+
string
_
builder_sprintf
(
s,
"
array
(
%T)
"
, t->car
);
+
}
else
{
+
string
_
builder_
strcat(
s,
"
array
");
} break; case T_MULTISET:
-
my_strcat("multiset");
+
if(t->car->type != T_MIXED) {
-
my
_
strcat
("(");
-
my_describe_type(t->car);
-
my
_strcat("
)
");
+
string
_
builder_sprintf
(
s,
"
multiset
(
%T)
"
, t->car
);
+
}
else
{
+
string
_
builder_
strcat(
s,
"
multiset
");
} break; case T_NOT:
-
my_strcat("!");
+
if (t->car->type > T_NOT) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->car);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"
!
(
%T)
"
,
t->car);
} else {
-
my
_
describe
_
type
(t->car);
+
string
_
builder
_
sprintf
(
s, "!%T",
t->car);
} break; case PIKE_T_RING: /* FIXME: Should be renumbered for correct parenthesing. */
-
my
_
strcat
("(
"
)
;
-
my_describe_type
(t->car
);
-
my_strcat(")\260(");
-
my_describe_type(
t->cdr);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"(
%T)\260(%T)
"
,
t->car
,
t->cdr);
break; case T_OR: if (t->car->type > T_OR) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->car);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"(
%T)
"
,
t->car);
} else {
-
my
_describe_type(t->car);
+
low
_describe_type(
s,
t->car);
}
-
my
_strcat(" | ");
+
string
_
builder_
strcat(
s,
" | ");
if (t->cdr->type > T_OR) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->cdr);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"(
%T)
"
,
t->cdr);
} else {
-
my
_describe_type(t->cdr);
+
low
_describe_type(
s,
t->cdr);
} break; case T_AND: if (t->car->type > T_AND) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->car);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"(
%T)
"
,
t->car);
} else {
-
my
_describe_type(t->car);
+
low
_describe_type(
s,
t->car);
}
-
my
_strcat(" & ");
+
string
_
builder_
strcat(
s,
" & ");
if (t->cdr->type > T_AND) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->cdr);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"(
%T)
"
,
t->cdr);
} else {
-
my
_describe_type(t->cdr);
+
low
_describe_type(
s,
t->cdr);
} break; case T_MAPPING:
-
my_strcat("mapping");
+
if(t->car->type != T_MIXED || t->cdr->type != T_MIXED) {
-
my
_
strcat
("(
"
)
;
-
my_describe_type(
t->car
);
-
my_strcat(":"
);
-
my_describe_type(t->cdr);
-
my
_strcat("
)
");
+
string
_
builder_sprintf
(
s,
"
mapping
(
%T:%T)
"
,
t->car,
t->
cdr
);
+
}
else
{
+
string
_
builder
_
strcat
(
s,
"
mapping
");
} break; default: {
-
char buf[20];
-
my
_
strcat
("unknown code(
");
-
sprintf(buf, "
%d", t->type);
-
my_strcat(buf);
-
my_strcat(")");
+
string
_
builder_sprintf
(
s,
"unknown code(%d
)
", t->type);
break; } } }
-
+
/* Legacy: Do not use. */
void my_describe_type(struct pike_type *type) {
-
low_describe_type(type);
+
struct string_builder s;
+
ONERROR err;
+
init_string_builder(&s, 0);
+
SET_ONERROR(err, free_string_builder, &s);
+
low_describe_type(
&s,
type);
+
my_binary_strcat(s.s->str, s.s->len);
+
CALL_AND_UNSET_ONERROR(err);
} struct pike_string *describe_type(struct pike_type *type) {
-
dynamic_buffer
save
_
buf
;
+
struct string
_
builder
s
;
+
ONERROR err;
if(!type) return make_shared_string("mixed");
-
init_
buf
(&
save
_
buf
);
-
low_describe_type(type);
-
return
free
_
buf
(&
save_buf
);
+
init_
string_builder
(&
s, 0);
+
SET
_
ONERROR(err, free_string_builder, &s
);
+
low_describe_type(
&s,
type);
+
UNSET_ONERROR(err);
+
return
finish
_
string_builder
(&
s
);
} /******/ TYPE_T compile_type_to_runtime_type(struct pike_type *t) { switch(t->type) { case PIKE_T_RING: