summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
AgeCommit message (Collapse)Author
2017-11-04Merge branch 'master' of github.com:mruby/mrubyYAMAMOTO Masaya
2017-10-28Heavily refactored how lexical scope links are implemented; fix #3821Yukihiro "Matz" Matsumoto
Instead of `irep` links, we added a `upper` link to `struct RProc`. To make a space for the `upper` link, we moved `target_class` reference. If a `Proc` does not have `env`, `target_class` is saved in an `union` shared with `env` (if a `Proc` has env, you can tell it by `MRB_PROC_ENV_P()). Otherwise `target_class` is referenced from `env->c`. We removed links in `env` as well. This change removes 2 members from `mrb_irep` struct, thus saving 2 words per method/proc/block. This also fixes potential memory leaks due to the circular references caused by a link from `mrb_irep`.
2017-10-28Add some peephole optimizationsYukihiro "Matz" Matsumoto
2017-10-11Add MRB_WITHOUT_FLOATYAMAMOTO Masaya
2017-09-12Remove temporary limitation of `OP_EPOP`.Yukihiro "Matz" Matsumoto
After f68f5f6, the operand of `OP_EPOP` should have been `1`. Now we have removed the limitation.
2017-09-05Restrict `OP_EPOP` operand to `1`; ref #3789Yukihiro "Matz" Matsumoto
2017-08-23Fixed register windows of OP_SENDs generated by NODE_{DREGX,REGX}; ref #3783Christopher Aue
2017-08-23Fixed register windows of OP_SENDs generated by NODE_OP_ASGN; ref #3783Christopher Aue
2017-08-23Refactored code around generation of OP_SEND in NODE_OP_ASGNChristopher Aue
2017-08-23Fixed register windows of OP_SENDs generated by NODE_{FOR,SYMBOLS}; ref #3783Christopher Aue
2017-08-23Tested register windows of OP_SENDs generated by NODE_{RESCUE,HASH,ALIAS}; ↵Christopher Aue
ref #3783
2017-08-23Fixed register windows of OP_SENDs generated by ↵Christopher Aue
NODE_{SCALL,CASE,YIELD,UNDEF}; ref #3783
2017-08-19Replace stack `pop()` by `push_n(2); pop_n(3)`; fix #3783Yukihiro "Matz" Matsumoto
To calculate correct register windows size. The fix was suggested by Christopher Aue.
2017-08-12Reduce integer type mismatch warnings in VC.Yukihiro "Matz" Matsumoto
2017-08-09Support `break` within rescue clauses; fix #3767 ref #3721Yukihiro "Matz" Matsumoto
2017-07-12`while`|`until` should have the value from `break`; fix #3735Yukihiro "Matz" Matsumoto
2017-06-23Should raise an exception if `break` called in ensure; fix #3721Yukihiro "Matz" Matsumoto
2017-06-07Handles exceptions from code generation phase; fix #3695Yukihiro "Matz" Matsumoto
2017-06-05Limit recursion level of `codegen()`; fix #3690Yukihiro "Matz" Matsumoto
2017-06-01Check for super using OP_ARGARY; fix #3678Yukihiro "Matz" Matsumoto
It generates a wasted empty array for each `super` call though. It should be fixed in the future, if possible.
2017-05-29Mark the proc object representing top-level as an internal object; #3621Yukihiro "Matz" Matsumoto
2017-05-25Make `gen_assignment()` to support `NODE_SCALL`; ref #3658Yukihiro "Matz" Matsumoto
2017-05-12Change return back to break in the default case.Clayton Smith
2017-04-25Avoid use of `snprintf()` when DISABLE_STDIO is set; fix #3632Yukihiro "Matz" Matsumoto
ref #3492 #3515 #3517
2017-04-22Alias should `push()` extra stack space for blocks.Yukihiro "Matz" Matsumoto
2017-04-18Changed evaluation order of `yield`; ref #3613Yukihiro "Matz" Matsumoto
So that `yield expr_with_error` will cause the error from the argument rather than `LocalJumpError` when no block is given.
2017-04-13Fixed a bug in NODE_XSTR code generation; fix #3605Yukihiro "Matz" Matsumoto
2017-04-11OP_LAMBDA generation should honor VAL/NOVAL; fix #3580Yukihiro "Matz" Matsumoto
2017-04-03Unify `else` clause styleYukihiro "Matz" Matsumoto
2017-04-03Adjust exit point in `loop_pop()`; fix #3541Yukihiro "Matz" Matsumoto
2017-04-03NODE_SPLAT to pass VAL/NOVAL; fix #3532Yukihiro "Matz" Matsumoto
2017-04-03Remove unnecessary indirection; ref #3557Yukihiro "Matz" Matsumoto
2017-04-03Check before generating special operators (e.g. OP_ADD); fix #3557Yukihiro "Matz" Matsumoto
2017-04-01NODE_ASGN arguments may be 127 (CALL_MAXARGS) accidentally; fix #3559Yukihiro "Matz" Matsumoto
2017-04-01Argument order of __case_eqq was wrong; fix #3567Yukihiro "Matz" Matsumoto
2017-03-23Cast to mrb_int to silence a warning; fix #3530Yukihiro "Matz" Matsumoto
2017-03-20Use `snprintf()` to stringify fixnum numbers; ref #3492Yukihiro "Matz" Matsumoto
2017-03-19Fixed OP_RESCUE code generation bug; fix #3519Yukihiro "Matz" Matsumoto
916b8e let code executed with mrb->exc set, and may cause a crash like #3519. Instead modified OP_RESCUE again. To retrieve the exception object, we use `OP_RESCUE R(A), 0, 0` (old behavior). To compare the exception object and the class, we use `OP_RESCUE R(A), R(B), 1`. The reason we use OP_RESCUE for two instruction switched by operand C is to save the instruction space. As a result, the following code: ```ruby begin raise "a" rescue TypeError p 1 rescue RuntimeError p 2 end ``` will be compiled as: ``` irep 0x55cd1f565cb0 nregs=4 nlocals=1 pools=1 syms=4 reps=0 file: - 2 000 OP_ONERR 005 2 001 OP_LOADSELF R1 2 002 OP_STRING R2 L(0) ; "a" 2 003 OP_SEND R1 :raise 1 2 004 OP_JMP 023 2 005 OP_RESCUE R1 3 006 OP_GETCONST R2 :TypeError 3 007 OP_RESCUE R1 R2 cont 3 008 OP_JMPIF R2 010 3 009 OP_JMP 014 4 010 OP_LOADSELF R1 4 011 OP_LOADI R2 1 4 012 OP_SEND R1 :p 1 4 013 OP_JMP 024 5 014 OP_GETCONST R2 :RuntimeError 5 015 OP_RESCUE R1 R2 cont 5 016 OP_JMPIF R2 018 5 017 OP_JMP 022 6 018 OP_LOADSELF R1 6 019 OP_LOADI R2 2 6 020 OP_SEND R1 :p 1 6 021 OP_JMP 024 6 022 OP_RAISE R1 6 023 OP_POPERR 1 6 024 OP_STOP ```
2017-03-12Generate new OP_RESCUE; fix #3487Yukihiro "Matz" Matsumoto
The old OP_RESCUE took one operand A, which specifies a class to match with the exception. The new OP_RESCUE takes tree operands: A: the register to hold exception B: the matching exception; the match result will be stored here. C: the continuation; if C is zero, the exception will be stored to R(A) otherwise, the value from R(A) is used as a exception. Thus, ```ruby begin raise "a" rescue TypeError p 1 rescue RuntimeError p 2 end ``` will be compiled as ``` irep 0x557a06667aa0 nregs=4 nlocals=1 pools=1 syms=4 reps=0 file: /tmp/e.rb 2 000 OP_ONERR 005 2 001 OP_LOADSELF R1 2 002 OP_STRING R2 L(0) ; "a" 2 003 OP_SEND R1 :raise 1 2 004 OP_JMP 022 3 005 OP_GETCONST R2 :TypeError 3 006 OP_RESCUE R1 R2 3 007 OP_JMPIF R2 009 3 008 OP_JMP 013 4 009 OP_LOADSELF R1 4 010 OP_LOADI R2 1 4 011 OP_SEND R1 :p 1 4 012 OP_JMP 023 5 013 OP_GETCONST R2 :RuntimeError 5 014 OP_RESCUE R1 R2 cont 5 015 OP_JMPIF R2 017 5 016 OP_JMP 021 6 017 OP_LOADSELF R1 6 018 OP_LOADI R2 2 6 019 OP_SEND R1 :p 1 6 020 OP_JMP 023 6 021 OP_RAISE R1 6 022 OP_POPERR 1 6 023 OP_STOP ``` The new VM can accept old OP_RESCUE. The mruby compatible VM (namely mruby/c) should be updated to support the new OP_RESCUE behavior.
2017-03-12Enhance OP_RESCUE to take B operand fas matching exception; ref #3487Yukihiro "Matz" Matsumoto
2017-03-11OP_RETRUN to take B as matching exception; ref #3487Yukihiro "Matz" Matsumoto
2017-03-02Fixed a bug in register size calculation; fix #3479Yukihiro "Matz" Matsumoto
2017-03-01Keep space for safe navigation operator; fix #3475Yukihiro "Matz" Matsumoto
2017-02-28Ignore empty ensure clause.Yukihiro "Matz" Matsumoto
2017-02-28`return` (and `break`) should handle splat correctly; fix #3472Yukihiro "Matz" Matsumoto
2017-02-28Fixed a bug in dregex option generation; fix #3471Yukihiro "Matz" Matsumoto
2017-02-13Fixed codegen error of redo in rescue; fix #3422Yukihiro "Matz" Matsumoto
The issue (and the fix) was reported by https://hackerone.com/dgaletic
2017-02-06Check maximum number of formal arguments.Yukihiro "Matz" Matsumoto
http://hkdnet.hatenablog.com/entry/2017/02/06/080000 (Japanese)
2017-02-04Jump address should fit in 16 bits range; fix #3426Yukihiro "Matz" Matsumoto
2017-01-23Fix a double free problem in codegen.c; fix #3378Yukihiro "Matz" Matsumoto
This issue was first reported by https://hackerone.com/geeknik The fix was proposed by @titanous