# New Ticket Created by Bernhard Specht # Please include the string: [perl #127847] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=127847 >
disallow dimensions smaller or equal 0 in shapes
From 93c5f8a96d7f8f31040d22e3e4e1ad989d52cdd9 Mon Sep 17 00:00:00 2001 From: bspecht <bernh...@specht.net> Date: Wed, 6 Apr 2016 22:36:24 +0200 Subject: [PATCH] disallow dimensions smaller or equal 0 in shapes --- src/core/Exception.pm | 9 ++++++++- src/core/Rakudo/Internals.pm | 14 ++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/core/Exception.pm b/src/core/Exception.pm index cb90544..2d8b4c8 100644 --- a/src/core/Exception.pm +++ b/src/core/Exception.pm @@ -2252,7 +2252,7 @@ my class X::PhaserExceptions is Exception { } nqp::bindcurhllsym('P6EX', nqp::hash( - 'X::TypeCheck::Binding', + 'X::TypeCheck::Binding', sub (Mu $got, Mu $expected, $symbol?) { X::TypeCheck::Binding.new(:$got, :$expected, :$symbol).throw; }, @@ -2444,6 +2444,13 @@ my class X::TooManyDimensions is Exception { } } +my class X::IllegalDimensionInShape is Exception { + has $.dim; + method message() { + "Illegal dimension in shape: $.dim. All dimensions must be integers bigger than 0" + } +} + my class X::Assignment::ArrayShapeMismatch is Exception { has $.target-shape; has $.source-shape; diff --git a/src/core/Rakudo/Internals.pm b/src/core/Rakudo/Internals.pm index c66bbe3..76605f4 100644 --- a/src/core/Rakudo/Internals.pm +++ b/src/core/Rakudo/Internals.pm @@ -6,6 +6,7 @@ my class X::Assignment::ToShaped { ... }; my class X::Str::Sprintf::Directives::BadType { ... }; my class X::Str::Sprintf::Directives::Count { ... }; my class X::Str::Sprintf::Directives::Unsupported { ... }; +my class X::IllegalDimensionInShape { ... }; my class Rakudo::Internals { @@ -399,11 +400,12 @@ my class Rakudo::Internals { my $key := nqp::list(meta-obj); my $dims := nqp::list_i(); for @dims { - if nqp::istype($_, Whatever) { - X::NYI.new(feature => 'Jagged array shapes'); + my $dim = $_.Int; + if $dim <= 0 { + X::IllegalDimensionInShape.new(dim => $dim).throw; } nqp::push($key, type-key); - nqp::push_i($dims, $_.Int); + nqp::push_i($dims, $dim); } my $storage := nqp::create(nqp::parameterizetype(SHAPE-STORAGE-ROOT, $key)); nqp::setdimensions($storage, $dims); @@ -780,7 +782,7 @@ my class Rakudo::Internals { method get-local-timezone-offset() { my $utc = time; my Mu $fia := nqp::p6decodelocaltime(nqp::unbox_i($utc)); - + DateTime.new( :year(nqp::atpos_i($fia,5)), :month(nqp::atpos_i($fia,4)), @@ -1209,7 +1211,7 @@ my class Rakudo::Internals { # normal increment magic chars & incremented char at same index my $succ-nlook = '012345678ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨαβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏ××××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮабвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑ٠١٢٣٤٥٦٧٨०१२३४५६à¥à¥®à§¦à§§à§¨à§©à§ªà§«à§¬à§à§®à©¦à©§à©¨à©©à©ªà©«à©¬à©à©®à«¦à«§à«¨à«©à«ªà««à«¬à«à«®à¦à§à¨à©àªà«à¬àà®â°â±â²â³â´âµâ¶â·â¸ââââââ ââââ ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺â â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â´âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âââââ ââââââââ¶â·â¸â¹âºâ»â¼â½â¾ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ðºðª'; - my $succ-nchrs = '123456789BCDEFGHIJKLMNOPQRSTUVWXYZbcdefghijklmnopqrstuvwxyzÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨΩβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏÏ×××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©×ªÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮЯбвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑÑ١٢٣٤٥٦٧٨٩१२३४५६à¥à¥®à¥¯à§§à§¨à§©à§ªà§«à§¬à§à§®à§¯à©§à©¨à©©à©ªà©«à©¬à©à©®à©¯à«§à«¨à«©à«ªà««à«¬à«à«®à«¯à§à¨à©àªà«à¬àà®à¯â±â²â³â´âµâ¶â·â¸â¹âââââ ââââ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âµââââ ââââââââ â·â¸â¹âºâ»â¼â½â¾â¿ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ð»ð«'; + my $succ-nchrs = '123456789BCDEFGHIJKLMNOPQRSTUVWXYZbcdefghijklmnopqrstuvwxyzÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨΩβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏÏ×××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©×ªÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮЯбвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑÑ١٢٣٤٥٦٧٨٩१२३४५६à¥à¥®à¥¯à§§à§¨à§©à§ªà§«à§¬à§à§®à§¯à©§à©¨à©©à©ªà©«à©¬à©à©®à©¯à«§à«¨à«©à«ªà««à«¬à«à«®à«¯à§à¨à©àªà«à¬àà®à¯â±â²â³â´âµâ¶â·â¸â¹âââââ ââââ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âµââââ ââââââââ â·â¸â¹âºâ»â¼â½â¾â¿ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ð»ð«'; # magic increment chars at boundary & incremented char at same index my $succ-blook = '9ZzΩÏתЯÑ٩९৯੯૯à¯â¹ââ «â »â³ââµââ â¿ï¼ð»ð«'; @@ -1217,7 +1219,7 @@ my class Rakudo::Internals { # normal decrement magic chars & incremented char at same index my $pred-nlook = '123456789BCDEFGHIJKLMNOPQRSTUVWXYZbcdefghijklmnopqrstuvwxyzÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨΩβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏÏ×××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©×ªÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮЯбвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑÑ١٢٣٤٥٦٧٨٩१२३४५६à¥à¥®à¥¯à§§à§¨à§©à§ªà§«à§¬à§à§®à§¯à©§à©¨à©©à©ªà©«à©¬à©à©®à©¯à«§à«¨à«©à«ªà««à«¬à«à«®à«¯à§à¨à©àªà«à¬àà®à¯â±â²â³â´âµâ¶â·â¸â¹âââââ ââââ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âµââââ ââââââââ â·â¸â¹âºâ»â¼â½â¾â¿ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ð»ð«'; - my $pred-nchrs = '012345678ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨαβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏ××××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮабвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑ٠١٢٣٤٥٦٧٨०१२३४५६à¥à¥®à§¦à§§à§¨à§©à§ªà§«à§¬à§à§®à©¦à©§à©¨à©©à©ªà©«à©¬à©à©®à«¦à«§à«¨à«©à«ªà««à«¬à«à«®à¦à§à¨à©àªà«à¬àà®â°â±â²â³â´âµâ¶â·â¸ââââââ ââââ ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺â â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â´âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âââââ ââââââââ¶â·â¸â¹âºâ»â¼â½â¾ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ðºðª'; + my $pred-nchrs = '012345678ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΡΣΤΥΦΧΨαβγδεζηθικλμνξοÏÏÏÏÏ ÏÏÏ××××××××××××××××× ×¡×¢×£×¤×¥×¦×§×¨×©ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐРСТУФХЦЧШЩЪЫЬÐЮабвгдежзийклмнопÑÑÑÑÑÑ ÑÑÑÑÑÑÑÑÑ٠١٢٣٤٥٦٧٨०१२३४५६à¥à¥®à§¦à§§à§¨à§©à§ªà§«à§¬à§à§®à©¦à©§à©¨à©©à©ªà©«à©¬à©à©®à«¦à«§à«¨à«©à«ªà««à«¬à«à«®à¦à§à¨à©àªà«à¬àà®â°â±â²â³â´âµâ¶â·â¸ââââââ ââââ ⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺â â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â´âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿ââââââ ââââââ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬ââ®â¯â°â±â²â³â´âââââ ââââââââ¶â·â¸â¹âºâ»â¼â½â¾ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ðºðª'; # magic decrement chars at boundary & incremented char at same index my $pred-blook = '0AaÎα×Ðа٠०০੦૦à¦â°ââ â °â â´ââââ¶ï¼ðºðª'; -- 2.8.0