[perl #61286] [PATCH][PROPOSAL] box complements

[email protected] (Fran??ois PERRAD)
Newsgroups perl.perl6.internals
Message-ID <[email protected]>
# New Ticket Created by  François PERRAD 
# Please include the string:  [perl #61286]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=61286 >


The new opcode 'box' is limited by its 3 signatures that target Float,
Integer & String.
I propose the 3 following new opcodes :
 - true
 - false
 - undef or nil (less Perlish)

After some experiments with bytecode translation,
in WMLScript (r33655) and in Lua (r33760),
it seems obvious that we need them.

François.
box-literal.patch (text/x-diff, 3.3 KB)
Index: src/ops/pmc.ops
===================================================================
--- src/ops/pmc.ops	(revision 33750)
+++ src/ops/pmc.ops	(working copy)
@@ -607,6 +607,29 @@
     VTABLE_set_string_native(interp, $1, $2);
 }
 
+=item B<true>(out PMC)
+
+=item B<false>(out PMC)
+
+=item B<undef>(out PMC)
+
+Create a literal HLL-mapped PMC.
+
+=cut
+
+op true(out PMC) {
+    $1 = pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_Boolean));
+    VTABLE_set_bool(interp, $1, 1);
+}
+
+op false(out PMC) {
+    $1 = pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_Boolean));
+}
+
+op undef(out PMC) {
+    $1 = pmc_new(interp, Parrot_get_ctx_HLL_type(interp, enum_class_Undef));
+}
+
 =back
 
 =head1 COPYRIGHT
Index: t/op/box.t
===================================================================
--- t/op/box.t	(revision 33750)
+++ t/op/box.t	(working copy)
@@ -16,13 +16,15 @@
 
 =cut
 
-.const int TESTS = 24
+.const int TESTS = 34
 
 # must set these up before the .HLL_map statements later
 .sub '__setup' :immediate
     $P0 = subclass 'Integer', 'MyInt'
     $P0 = subclass 'String',  'MyString'
     $P0 = subclass 'Float',   'MyFloat'
+    $P0 = subclass 'Boolean', 'MyBoolean'
+    $P0 = subclass 'Undef',   'MyUndef'
 .end
 
 .sub 'main' :main
@@ -33,6 +35,9 @@
     'box_int'()
     'box_num'()
     'box_string'()
+    'true_'()
+    'false_'()
+    'undef_'()
 
     .local pmc box_int_hll
     box_int_hll = get_root_global [ 'for_test' ], 'box_int'
@@ -43,9 +48,21 @@
     .local pmc box_string_hll
     box_string_hll = get_root_global [ 'for_test' ], 'box_string'
 
+    .local pmc true_hll
+    true_hll = get_root_global [ 'for_test' ], 'true_'
+
+    .local pmc false_hll
+    false_hll = get_root_global [ 'for_test' ], 'false_'
+
+    .local pmc undef_hll
+    undef_hll = get_root_global [ 'for_test' ], 'undef_'
+
     box_int_hll()
     box_num_hll()
     box_string_hll()
+    true_hll()
+    false_hll()
+    undef_hll()
 .end
 
 .sub 'box_int'
@@ -92,14 +109,37 @@
     isa_ok( $P0, 'String', 'string boxed to appropriate base type from reg' )
 .end
 
+.sub 'true_'
+    $P0 = true
+    $I0 = $P0
+    is( $I0, 1, 'good value' )
+
+    isa_ok( $P0, 'Boolean', 'good base type' )
+.end
+
+.sub 'false_'
+    $P0 = false
+    $I0 = $P0
+    is( $I0, 0, 'good value' )
+
+    isa_ok( $P0, 'Boolean', 'good base type' )
+.end
+
+.sub 'undef_'
+    $P0 = undef
+    $I0 = $P0
+    isa_ok( $P0, 'Undef', 'good base type' )
+.end
+
 .HLL 'for_test'
 
 .HLL_map 'Integer' = 'MyInt'
 .HLL_map 'String'  = 'MyString'
 .HLL_map 'Float'   = 'MyFloat'
+.HLL_map 'Boolean' = 'MyBoolean'
+.HLL_map 'Undef'   = 'MyUndef'
 
 .sub 'box_int'
-    .include 'include/test_more.pir'
     $P0 = box -100
     $I0 = $P0
     is( $I0, -100, 'value preserved when boxing int in HLL' )
@@ -144,6 +184,27 @@
     isa_ok($P0, 'MyString', 'string boxed to appropriate type for HLL from reg')
 .end
 
+.sub 'true_'
+    $P0 = true
+    $I0 = $P0
+    is( $I0, 1, 'good value in HLL' )
+
+    isa_ok( $P0, 'MyBoolean', 'good base type for HLL' )
+.end
+
+.sub 'true_'
+    $P0 = true
+    $I0 = $P0
+    is( $I0, 1, 'good value in HLL' )
+
+    isa_ok( $P0, 'MyBoolean', 'good base type for HLL' )
+.end
+
+.sub 'undef_'
+    $P0 = undef
+    isa_ok( $P0, 'MyUndef', 'good base type for HLL' )
+.end
+
 # Local Variables:
 #   mode: cperl
 #   cperl-indent-level: 4
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.