| Age | Commit message (Collapse) | Author |
|
No need to write the same assertion in each case (except the default
one). Instead we can assert after the switch statement.
|
|
gettimeofday() is an obsolescent POSIX function which may be removed in
a future version. POSIX recommends using clock_gettime() (also POSIX)
instead, but it isn't available on OS X or Windows (at least with MSVC
and older MinGW versions).
Whereas timespec_get() is part of ISO C11 and mruby uses some small
other C11 features too. It isn't universally available yet either, but
it might be in the future. And Visual C++ 2015 implements it! Since
mruby strives for ISO C and not POSIX compatibility, I think it's a
reasonable choice.
TIME_UTC is used instead of __STDC_VERSION__, because if TIME_UTC is
defined, then most likely timespec_get() is too. This isn't true in case
of __STDC_VERSION__ (see MSVC).
|
|
|
|
|
|
Fix exceptions for visualcpp
|
|
|
|
I modified the undefined frexpl in cygwin of make
|
|
|
|
|
|
Fix #2739 stack_extend in mrb_f_send
|
|
mrb_f_send needs stack_extend like OP_SEND
Signed-off-by: Go Saito <[email protected]>
|
|
Use ptrdiff_t to suppress signedness warning
|
|
3df32161797aa9c6e9df259e8d8571b454cb2333 says so but there is no warning
with GCC 4.9 on my Debian GNU/Linux environment.
|
|
delete prototypes of undefined functions
|
|
|
|
|
|
|
|
Fix a crash bug on raising after realloc
|
|
The following program reproduces this problem:
#include <mruby.h>
static mrb_value
recursive(mrb_state *mrb, mrb_value self)
{
mrb_int n;
mrb_get_args(mrb, "i", &n);
if (n == 0) {
mrb_raise(mrb, E_RUNTIME_ERROR, "XXX");
} else {
mrb_funcall(mrb, self, "recursive", 1, mrb_fixnum_value(n - 1));
}
return self;
}
int
main(void)
{
mrb_state *mrb;
mrb = mrb_open();
mrb_define_method(mrb, mrb->kernel_module, "recursive", recursive,
MRB_ARGS_REQ(1));
mrb_funcall(mrb, mrb_top_self(mrb), "recursive", 1, mrb_fixnum_value(30));
mrb_close(mrb);
}
Recursive method call isn't required. It's just for expanding call info
stack.
If mrb_realloc() is called in cipush(), cibase address is changed. So,
we shouldn't compare ci before mrb_realloc() and cibase after
mrb_realloc(). It accesses unknown address and causes crash.
|
|
Fix a bug that no expression case doesn't return valid value
|
|
Here is a script that reproduces this problem:
x = case
when true; 1
end
p x # => main # 1 is expected
|
|
Fix a bug that if and no return value case can't return true clause value
|
|
fix pointer dereference after realloc
|
|
Here is a script that reproduce this problem:
x = if true
1
else
case 2
when 3
end
4
end
p x # => nil # 1 is expected
|
|
In src/vm.c: mrb_funcall_with_block
stack_extend may realloc mrb->c->stbase, if argv points on mruby's stack,
then it points invalid address after stack_extend.
e.g. src/class.c: mrb_instance_new
This code:
```ruby
class A
def initialize(a0,a1,a2,a3,a4)
a0.is_a? Array
end
end
def f(a0,a1,a2,a3,a4)
A.new(a0,a1,a2,a3,a4)
f(a0,a1,a2,a3,a4)
end
f(0,1,2,3,4)
```
is expected to get exception
```
stack level too deep. (limit=(0x40000 - 128)) (SystemStackError)
```
but get segfault.
Signed-off-by: Go Saito <[email protected]>
|
|
|
|
|
|
|
|
|
|
re-implement mrb_float_to_str()
|
|
The new implementation is backwards incompatible, but I couldn't find
any usage outside mruby and I also couldn't think of a different and
good name.
All ISO C99 printf conversion specifiers for floating point numbers and
an optional precision are supported.
It is largely based on code from the MIT licensed musl libc
(http://www.musl-libc.org/) and its floating point printing is exact
(unlike the current code behind Float#to_s).
|
|
Make backtraces work again under DISABLE_STDIO
|
|
Add more debug flags for GCC based compilers
|
|
|
|
|
|
We can use `#define`-ed macros in GDB with `-g3` flag.
We can run code step by step in GDB with `-O0` flag.
|
|
Delete temp variable
|
|
|
|
|
|
mruby-config supports MRUBY_LDFLAGS_BEFORE_LIBS in libmruby.flags.mak
|
|
Fix possible segfault when accessing backtrace with MRB_WORD_BOXING.
|
|
|
|
Fix ensure with yield context on break and return
|
|
|
|
How to reproduce:
class A
def x
yield
ensure
y
end
def y
end
end
# Work
A.new.x do
end
# Not work
# trace:
# [2] /tmp/a.rb:5:in A.x
# [0] /tmp/a.rb:15
# /tmp/a.rb:5: undefined method 'y' for main (NoMethodError)
A.new.x do
break
end
# trace:
# [2] /tmp/a.rb:5:in A.call
# [0] /tmp/a.rb:19
# /tmp/a.rb:5: undefined method 'y' for main (NoMethodError)
lambda do
A.new.x do
return
end
end.call
`self` in ensure is broken when yield and break/return are used.
|
|
Replace int with mrb_bool in dump_bigendian_p func
|
|
|
|
`mruby -b` now accepts both big/little endian mrb (compiled binary) files.
`mrbc` generates mrb files in big endian for .mrb files and in native endian
for C files (with -B option specified) by default. If you are cross compiling,
you need to specify target endian by -e/-E options if it is different from
host endian.
|
|
|
|
|