{"push_id":909785629,"size":72,"distinct_size":10,"ref":"refs/heads/featurex/gh16-multi","head":"ee203b345f3764a3e3e28a40458e520547189cec","before":"eeb44cc6e885287f67e29bd3dcbd9bde9b77e662","commits":[{"sha":"19c2ba179a26f3227ba7c4d7aa0e3a149e5fb4a2","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"AvSTATIC: do not free AvSTATIC arrays\n\nNeeded for the compiler to use static array buffers.\nWe don't have a seperate AvFLAGS field anymore, so we\ntry using a temp. combination of !AvREAL(av) & !AvREIFY(av).\nWIP: For !AvREAL we do not bump av refcounts.\n\nIn reality we really need to set a seperate flag in the compiler,\nmaybe re-add the AvFLAGS word in the xpvav body or at the end of\nthe array as with hv_aux.\n\nFor [cperl #62]","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/19c2ba179a26f3227ba7c4d7aa0e3a149e5fb4a2"},{"sha":"cd229dd368503a29d27ac01848136ac3e6a25015","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"HvSTATIC: protect HV from being free'd [#62]\n\nKeep the HvARRAY static, no split, no add unless room in placeholders.\nSimilar to static hek and static av, for embedders and the compiler.\nYou can delete single entries, but this will just add a placeholder.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/cd229dd368503a29d27ac01848136ac3e6a25015"},{"sha":"48916adef9281c5e68b710a484a468bd8e5425b7","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"HEK_STATIC: support static HEKs\n\nWe mainly use the internal flag HVhek_FREEKEY.\nBut for yet unknwn reasons we also set a\nHVhek_STATIC flag, which we can remove if unneeded.\n\nThis enables the perlcc and other embedders to emit\nstatic HEK structs for all compile-time known hash keys.\nSee GH #73","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/48916adef9281c5e68b710a484a468bd8e5425b7"},{"sha":"f09b230a86824b499d2d1f3968b620fe6a6468ee","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"GvSTATIC: add flag for the compiler\n\nSee GH #11","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/f09b230a86824b499d2d1f3968b620fe6a6468ee"},{"sha":"da73bbd95f2b25d335e233da0c44845f2e1cfbdf","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"cperl dev. only: cp-rb cp-lb cp-rh cp-mt scripts\n\nskip them porting/manifest.t\ndescribe our branches in cp-rb\n\nautomate the ./cp-rb rebase --skip steps with an optional argument\n\nimport issues from private stash to github (stash is way better btw)\n\nadd a new branch-point from which the branches branch off\nto keep master clean.\n\nrenamed all the branches to the github issue id\n\ncp-*: updated after 1st release","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/da73bbd95f2b25d335e233da0c44845f2e1cfbdf"},{"sha":"9d1b4452a7cac50f4a29900282b061c7b85303ab","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":".git-rr-cache fixups [EOF master]","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/9d1b4452a7cac50f4a29900282b061c7b85303ab"},{"sha":"51234667dc1ac986d2946f3beeb6ceedbacb4e12","author":{"email":"fe08d3c717adf2ae63592e4c9aec6e3e404d8e3e@iabyn.com","name":"David Mitchell"},"message":"make S_op_relocate_sv() non-static\n\nThis function will shortly need to be accessed from toke.c as well\nas op.c, so make it global but non-public. Also, stop it being an\ninlinable function - it's only used during compilation and isn't\nperformance-critical, and is not small.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/51234667dc1ac986d2946f3beeb6ceedbacb4e12"},{"sha":"ec188307b94d0b25041f1844e1ed3a85f2ee73a6","author":{"email":"fe08d3c717adf2ae63592e4c9aec6e3e404d8e3e@iabyn.com","name":"David Mitchell"},"message":"add OP_SIGNATURE\n\nIn the current (experimental) subroutine signatures implementation, the\nchecking for sufficient numbers of args, the introduction of lexical vars,\nand the assignment of @_ and/or default values to them, is done by placing\nlots of individual perl ops at the start of the function body.\n\nFor example, this:\n\n    sub f ($a, $b = 0, $c = \"foo\") {};\n\ndeparses as:\n\n    sub f {\n        die sprintf(\"Too many arguments for subroutine at %s line %d.\\n\", (calle\nr)[1, 2]) unless @_ <= 3;\n        die sprintf(\"Too few arguments for subroutine at %s line %d.\\n\", (caller\n)[1, 2]) unless @_ >= 1;\n        my $a = $_[0];\n        my $b = @_ >= 2 ? $_[1] : 0;\n        my $c = @_ >= 3 ? $_[2] : 'foo';\n        ();\n    }\n\nwhich is of course *very* slow.\n\nThis commit adds a new op, OP_SIGNATURE, of type UNOP_AUX, which handles\nmost of this work in a single op. It's inspired by my OP_MULTIDEREF work,\nwhere 'simple' indices and keys (integers, consts, simple lex and package\nvars) were handled directly by the op using values and pointers stored in\nthe op_aux array. For OP_SIGNATURE, simple default args (ints, consts, and\nsometimes lexicals and package vars) are stored in the op_aux struct,\nwhile more complex expressions are compiled as assign statements following\nthe OP_SIGNATURE op. For example:\n\n    sub f ($a, $b = 0, $c = \"foo\", $d = $c+1) {};\n\nnow gives\n\n    $ ./perl -Ilib -MO=Concise,f,-exec /tmp/signatures.t\n    main::f:\n    1  <;> nextstate(main 78 p:6) v:%,469762048\n    2  <+> signature($a, $b=0, $c=\"foo\", $d=<expr>) v\n    3  <;> nextstate(main 81 p:6) v:%,469762048\n    4  <0> padsv[$c:80,82] s\n    5  <$> const[IV 1] s\n    6  <2> add[$d:81,82] sK/TARGMY,2\n    7  <;> nextstate(main 82 p:6) :%,469762048\n    8  <1> leavesub[1 ref] K/REFC,1\n\nThe performance is impressive, with a simple\n\n    sub f($a, $b, $c) {}\n\nnow being typically faster than\n\n    sub { my ($a, $b, $c) = @_; }\n\nand signatured subs being typically twice as fast to call as they were\nbefore.\n\nAs well as benefiting from doing nearly all the work in a single op,\nthe fact that it is the first op in the function allows some fairly\naggressive optimisations. In particular we know that newly introduced\nlexicals will always be undef and non-magical, unlike for example:\n\n    f();\n    my $x; # $x not undef here!\n    sub f { $x = 1 }\n\nAlso, it is likely that subs are always called with a particular arg being\nalways the same type; for example, methods will always pass a ref as arg\n1. Given the fact that at end of scope, lexical vars with a ref count of 1\nare simply cleared in place, then in this case, by the time of the second\ncall, the lexical var $self in\n\n    sub f($self, ...) {...}\n\nis likely to be a !SvOK SV with a body of type SVt_IV (already suitable\nfor holding an int or RV). If OP_SIGNATURE sees that the passed arg is\nSvROK, it checks whether the lexical is of type SVt_IV, and if so just\ndirectly does\n\n    SvRV_set(...);\n    SvROK_on(...)\n\nrather than calling sv_setsv(). A similar short-cut is performed for\nSvIOK values.\n\nDefault values of 0 and 1 are special-cased with their own action, so\nno extra data needs storing in the op_aux array. Other integer-valued\nconstant defaults are stored as an IV in op_aux. More general constants\nare stored as an SV pointer (or pad offset for threaded builds) in op_aux.\n\nDefault values that are simple lexicals or package vars, such as\n\n    sub f ($a, $b = $a, $c = $::Foo)\n\nare usually stored as a pad index or GV pointer in the op_aux array.\nThere is a complication here in that more complex defaults are stored as\nops that get executed *after* OP_SIGNATURE, which means that default arg\nprocessing can get re-ordered. For example,\n\n    sub f ($a, $b = $a++, $c = $a) {}\n\nmight get executed as the equivalent of\n\n    # happens within OP_SIGNATURE:\n    $a = $_[0];\n    $b = $_[1];\n    $c = $_[2] // $a;\n    # delayed: happens afterwards\n    $b //= $a++;\n\nsince the '$a' default is handled directly by OP_SIGNATURE, while '$a++'\nis postponed. Clearly in this case this would be wrong, so the '$a'\ndefault is in fact handled outside the OP_SIGNATURE too in cases like\nthis, leading to correct execution roughly like:\n\n    # happens within OP_SIGNATURE:\n    $a = $_[0];\n    $b = $_[1];\n    $c = $_[2];\n    # happens afterwards\n    $b //= $a++;\n    $c //= $a\n\nThis commit also makes signatured subs deparse correctly for the first\ntime, and also makes t/op/signature.t pass under TEST -deparse.\n\nNote that this commit introduces a hard limit of 32767 parameters for any\nsignature sub, but I can't conceive of that being an issue.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/ec188307b94d0b25041f1844e1ed3a85f2ee73a6"},{"sha":"f91405b669e1aa2c48c4a2025acac22bed2ef143","author":{"email":"fe08d3c717adf2ae63592e4c9aec6e3e404d8e3e@iabyn.com","name":"David Mitchell"},"message":"add S_postprocess_optree() to op.c\n\nCollect several of the common steps in finishing off an optree\ninto a single sub (e.g. setting refcount on the root op, calling peep,\netc).","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/f91405b669e1aa2c48c4a2025acac22bed2ef143"},{"sha":"c28f5acb823b1592ca5c15ebb023fea90f6a5a0c","author":{"email":"fe08d3c717adf2ae63592e4c9aec6e3e404d8e3e@iabyn.com","name":"David Mitchell"},"message":"add Perl_prefinalize_optree()\n\nthis is a top-down optree function like Perl_finalize_optree,\nbut is called before peep(), so allows you to do stuff to the\noptree before its been optimised.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/c28f5acb823b1592ca5c15ebb023fea90f6a5a0c"},{"sha":"07c6d9a3d81e93d43179672b1330beed0e0b3948","author":{"email":"fe08d3c717adf2ae63592e4c9aec6e3e404d8e3e@iabyn.com","name":"David Mitchell"},"message":"make my(...)=@_ use OP_SIGNATURE\n\nThis isn't yet enabled by default: it requires perl to be built with\nPERL_FAKE_SIGNATURE defined.\n\nWhere the first statement in a function is a simple\n\n    my (....) = @_;\n\nwith the my elements being any mixture of scalars or undefs, with an\noptional final array or hash, then convert that subtree of ops into\na single OP_SIGNATURE op, which will be faster.\n\nThe op will have the OPpSIGNATURE_FAKE private flag set, to distinguish\nit from real signatured subs.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/07c6d9a3d81e93d43179672b1330beed0e0b3948"},{"sha":"d710623dab12a90a4e9666f290e33aab56d11c6c","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"start with extended signatures\n\nenabling both, old-style prototypes and new full signatures, without\nthe mandatary feature signature.\nplanned: by reference via \\ sub name (\\$a) { $a++ }\nreturn type as attribute: sub name () :int {}\nparameter types as with lexicals (int $a), but also support attributes ($a:int)\n\nplan, to fix these issues:\n- missing support for optional types as provided for lexical variable\n  declarations, in leading position as with my int $a; and as attribute, as with\n  ($i :int :const)\n\n- missing syntax for return types (: or =>). for the start and easier implementation\n  we support subattributes, :<type> only,\n\n- missing syntax and support for references, all arguments are copied only,\n  as with my $arg1 = shift; but syntax for fast $_[0] access is nor provided.\n  cperl will use \\$ to denote references to scalar lvalues.\n  e.g. sub myfunc(int \\$i) : int {\n          return $i+1;\n       }\n  for now scalar lvalue references only,\n  \\@a or \\%h would be nice with type checks for arrayref or hashref.\n  maybe \\[$] also\n\n- wrong treatment of @_: all arguments are copied twice, first to the declared\n  argument as lexical variable, and also to the old @_ array. With cperl @_ will\n  only hold the &rest args, the undeclared rest.\n  i.e. @_ will be empty with a slurpy ending @ or % arg.\n\n- parse signatures with the parser, not an undocumented function.\n\nproper signature types are performance critical, see coffescript,\ndart, microsoft typescript, facebook hack.  the type inferencer will\nnot be able to infer many types without explicit types.  but with\ntyped signatures we can even inline most small methods, and improve most\nloops and array accesses. it is also critical to implement multi methods.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/d710623dab12a90a4e9666f290e33aab56d11c6c"},{"sha":"4f3b7cc625fae3968002c52b3fcc46c53658f7f7","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"regen_perly.pl: add bison-2.5.1 instructions","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/4f3b7cc625fae3968002c52b3fcc46c53658f7f7"},{"sha":"341d7f228bc7dd1819bf6002121cda7fa6f91e74","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"regen_perly: new generated files","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/341d7f228bc7dd1819bf6002121cda7fa6f91e74"},{"sha":"6cdf674c710ddd0deb021bdf49b9c296f6ebfdb4","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"signatures: validate_proto only for warnings\n\nvalidate_proto in yylex is only used for warnings, so skip it\nwhen warnings are off.\nthe return value is ignored and there are no side effects","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/6cdf674c710ddd0deb021bdf49b9c296f6ebfdb4"},{"sha":"5af5edbc8efc5deaa532715036b6a2a224d063e3","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"signatures: parse references","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/5af5edbc8efc5deaa532715036b6a2a224d063e3"},{"sha":"8fc5a5e4a8ceb1358e9ae83d1eb4f1b15625572e","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"signatures: parse type before the variable\n\nmax length of type name (i.e. classname): 1024","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/8fc5a5e4a8ceb1358e9ae83d1eb4f1b15625572e"},{"sha":"eb2d02a4330cbcae8359c3009db3ea5164412a54","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"Enable cperl specific features, regen-perly\n\nperly.y: ifndef USE_CPERL on signatures feature for backwards compat.\nexperimental warning, assert and feature.\ntoke.c: parse old-style prototypes even with signatures enabled.\n        new-style sigs are backcompat.\nfeature.pm: document signatures changes, experimental not needed.\nmake regen-perly","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/eb2d02a4330cbcae8359c3009db3ea5164412a54"},{"sha":"8b1e9919c804fc33758307fc848e868f653e1818","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"signatures: restore PL_lex_stuff in yylex protoypes\n\nwhen checking old-style prototype, reset the SV buffer of\nPL_lex_stuff, which is too side-effecting, when the prototype\nvalidation failed.","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/8b1e9919c804fc33758307fc848e868f653e1818"},{"sha":"924641cf0581f7c2d3b64c10c2fe91344afaef46","author":{"email":"b3538261d0c0bffcce3d04dcc48be08a7393a14f@cpanel.net","name":"Reini Urban"},"message":"t/op/protowarn.t: comment","distinct":false,"url":"https://api.github.com/repos/perl11/cperl/commits/924641cf0581f7c2d3b64c10c2fe91344afaef46"}]}