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;
 }
 

Reply via email to