Author: kjs
Date: Sat Jan 3 09:06:49 2009
New Revision: 34893
Modified:
trunk/compilers/pirc/new/pircompunit.c
Log:
[pirc] same auto-box trick for .const "String" and .const "Float" as previous.
Modified: trunk/compilers/pirc/new/pircompunit.c
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.c (original)
+++ trunk/compilers/pirc/new/pircompunit.c Sat Jan 3 09:06:49 2009
@@ -1376,14 +1376,62 @@
}
else if (value->type == NUM_VAL) {
+ STRING *numclassname = string_from_cstring(lexer->interp, "Float", 5);
+ INTVAL is_a_num = VTABLE_isa(lexer->interp, constclass,
numclassname);
+ if (is_a_num) {
+ symbol *constsym = new_symbol(lexer, name, PMC_TYPE);
+ target *consttarg = target_from_symbol(lexer, constsym);
+
+ PMC *numconst = pmc_new(lexer->interp,
+ Parrot_get_ctx_HLL_type(lexer->interp,
enum_class_Float));
+ int index = add_pmc_const(lexer->bc, numconst);
+ VTABLE_set_number_native(lexer->interp, numconst, value->val.nval);
+
+ declare_local(lexer, PMC_TYPE, constsym);
+
+ value->name = name;
+
+ new_sub_instr(lexer, PARROT_OP_set_p_pc, "set_p_pc", 0);
+ push_operand(lexer, expr_from_target(lexer, consttarg));
+ push_operand(lexer, expr_from_int(lexer, index));
+
+ }
+ else {
+ yypirerror(lexer->yyscanner, lexer,
+ "cannot assign number value to constant of type %s",
type);
+ }
}
else if (value->type == STRING_VAL) {
+ STRING *strclassname = string_from_cstring(lexer->interp, "String", 6);
+ INTVAL is_a_string = VTABLE_isa(lexer->interp, constclass,
strclassname);
- }
+ if (is_a_string) {
+ symbol *constsym = new_symbol(lexer, name, PMC_TYPE);
+ target *consttarg = target_from_symbol(lexer, constsym);
+
+ PMC *strconst = pmc_new(lexer->interp,
+ Parrot_get_ctx_HLL_type(lexer->interp,
enum_class_String));
+ int index = add_pmc_const(lexer->bc, strconst);
+ VTABLE_set_string_native(lexer->interp, strconst,
+ string_from_cstring(lexer->interp,
value->val.sval,
+
strlen(value->val.sval)));
+
+ declare_local(lexer, PMC_TYPE, constsym);
+
+ value->name = name;
+
+ new_sub_instr(lexer, PARROT_OP_set_p_pc, "set_p_pc", 0);
+ push_operand(lexer, expr_from_target(lexer, consttarg));
+ push_operand(lexer, expr_from_int(lexer, index));
+ }
+ else {
+ yypirerror(lexer->yyscanner, lexer,
+ "cannot assign string value to constant of type %s",
type);
+ }
+ }
- fprintf(stderr, "done with new pmc const()\n");
return value;
}