8000 Merge pull request #41 from ruby/master · nobu/ruby@23a75e6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 23a75e6

Browse files
author
devkadirselcuk
authored
Merge pull request ruby#41 from ruby/master
[pull] master from ruby:master
2 parents f63a858 + 66b0847 commit 23a75e6

File tree

8 files changed

+220
-65
lines changed

8 files changed

+220
-65
lines changed

bootstraptest/test_yjit.rb

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2187,6 +2187,60 @@ def default_expression(value: default_value)
21872187
5.times.map { default_expression }.uniq
21882188
}
21892189

2190+
# reordered optional kwargs
2191+
assert_equal '[[100, 1]]', %q{
2192+
def foo(capacity: 100, max: nil)
2193+
[capacity, max]
2194+
end
2195+
2196+
5.times.map { foo(max: 1) }.uniq
2197+
}
2198+
2199+
# invalid lead param
2200+
assert_equal 'ok', %q{
2201+
def bar(baz: 2)
2202+
baz
2203+
end
2204+
2205+
def foo
2206+
bar(1, baz: 123)
2207+
end
2208+
2209+
begin
2210+
foo
2211+
foo
2212+
rescue ArgumentError => e
2213+
print "ok"
2214+
end
2215+
}
2216+
2217+
# reordered required kwargs
2218+
assert_equal '[[1, 2, 3, 4]]', %q{
2219+
def foo(default1: 1, required1:, default2: 3, required2:)
2220+
[default1, required1, default2, required2]
2221+
end
2222+
2223+
5.times.map { foo(required1: 2, required2: 4) }.uniq
2224+
}
2225+
2226+
# reordered default expression kwargs
2227+
assert_equal '[[:one, :two, 3]]', %q{
2228+
def foo(arg1: (1+0), arg2: (2+0), arg3: (3+0))
2229+
[arg1, arg2, arg3]
2230+
end
2231+
2232+
5.times.map { foo(arg2: :two, arg1: :one) }.uniq
2233+
}
2234+
2235+
# complex kwargs
2236+
assert_equal '[[1, 2, 3, 4]]', %q{
2237+
def foo(required:, specified: 999, simple_default: 3, complex_default: "4".to_i)
2238+
[required, specified, simple_default, complex_default]
2239+
end
2240+
2241+
5.times.map { foo(specified: 2, required: 1) }.uniq
2242+
}
2243+
21902244
# attr_reader on frozen object
21912245
assert_equal 'false', %q{
21922246
class Foo

doc/ChangeLog-2.0.0

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21271,7 +21271,7 @@ Thu Oct 6 18:46:23 2011 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
2127121271

2127221272
Thu Oct 6 16:29:30 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
2127321273

21274-
* vm_eval.c (make_no_method_execption): extract from
21274+
* vm_eval.c (make_no_method_exception): extract from
2127521275
raise_method_missing().
2127621276

2127721277
* vm_eval.c (send_internal): remove inadvertent symbol creation

lib/rubygems/ext/builder.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ def self.make(dest_path, results, make_dir = Dir.pwd)
2424

2525
# try to find make program from Ruby configure arguments first
2626
RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
27-
make_program = ENV['MAKE'] || ENV['make'] || $1
28-
unless make_program
29-
make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
27+
make_program_name = ENV['MAKE'] || ENV['make'] || $1
28+
unless make_program_name
29+
make_program_name = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
3030
end
31-
make_program = Shellwords.split(make_program)
31+
make_program = Shellwords.split(make_program_name)
3232

3333
# The installation of the bundled gems is failed when DESTDIR is empty in mswin platform.
34-
destdir = (ENV['DESTDIR'] && ENV['DESTDIR'] != "") ? 'DESTDIR=%s' % ENV['DESTDIR'] : ''
34+
destdir = (/\bnmake/i !~ make_program_name || ENV['DESTDIR'] && ENV['DESTDIR'] != "") ? 'DESTDIR=%s' % ENV['DESTDIR'] : ''
3535

3636
['clean', '', 'install'].each do |target|
3737
# Pass DESTDIR via command line to override what's in MAKEFLAGS

misc/yjit_asm_tests.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,20 @@ void run_assembler_tests(void)
182182
// mov
183183
cb_set_pos(cb, 0); mov(cb, EAX, imm_opnd(7)); check_bytes(cb, "B807000000");
184184
cb_set_pos(cb, 0); mov(cb, EAX, imm_opnd(-3)); check_bytes(cb, "B8FDFFFFFF");
185-
cb_set_pos(cb, 0); mov(cb, R15, imm_opnd(3)); check_bytes(cb, "49BF0300000000000000");
185+
cb_set_pos(cb, 0); mov(cb, R15, imm_opnd(3)); check_bytes(cb, "41BF03000000");
186186
cb_set_pos(cb, 0); mov(cb, EAX, EBX); check_bytes(cb, "89D8");
187187
cb_set_pos(cb, 0); mov(cb, EAX, ECX); check_bytes(cb, "89C8");
188188
cb_set_pos(cb, 0); mov(cb, EDX, mem_opnd(32, RBX, 128)); check_bytes(cb, "8B9380000000");
189+
190+
// Test `mov rax, 3` => `mov eax, 3` optimization
191+
cb_set_pos(cb, 0); mov(cb, R8, imm_opnd(0x34)); check_bytes(cb, "41B834000000");
192+
cb_set_pos(cb, 0); mov(cb, R8, imm_opnd(0x80000000)); check_bytes(cb, "49B80000008000000000");
193+
cb_set_pos(cb, 0); mov(cb, R8, imm_opnd(-1)); check_bytes(cb, "49B8FFFFFFFFFFFFFFFF");
194+
195+
cb_set_pos(cb, 0); mov(cb, RAX, imm_opnd(0x34)); check_bytes(cb, "B834000000");
196+
cb_set_pos(cb, 0); mov(cb, RAX, imm_opnd(0x80000000)); check_bytes(cb, "48B80000008000000000");
197+
cb_set_pos(cb, 0); mov(cb, RAX, imm_opnd(-52)); check_bytes(cb, "48B8CCFFFFFFFFFFFFFF");
198+
cb_set_pos(cb, 0); mov(cb, RAX, imm_opnd(-1)); check_bytes(cb, "48B8FFFFFFFFFFFFFFFF");
189199
/*
190200
test(
191201
delegate void (CodeBlock cb) { cb.mov(X86Opnd(AL), X86Opnd(8, RCX, 0, 1, RDX)); },

random.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,11 @@ fill_random_bytes_syscall(void *buf, size_t size, int unused)
538538
#endif
539539
}
540540
#elif defined(_WIN32)
541+
542+
#ifndef DWORD_MAX
543+
# define DWORD_MAX (~(DWORD)0UL)
544+
#endif
545+
541546
# if defined(CRYPT_VERIFYCONTEXT)
542547
STATIC_ASSERT(sizeof_HCRYPTPROV, sizeof(HCRYPTPROV) == sizeof(size_t));
543548

@@ -580,7 +585,12 @@ fill_random_bytes_crypt(void *seed, size_t size)
580585
}
581586
}
582587
if (prov == INVALID_HCRYPTPROV) return -1;
583-
CryptGenRandom(prov, size, seed);
588+
while (size > 0) {
589+
DWORD n = (size > (size_t)DWORD_MAX) ? DWORD_MAX : (DWORD)size;
590+
if (!CryptGenRandom(prov, n, seed)) return -1;
591+
seed = (char *)seed + n;
592+
size -= n;
593+
}
584594
return 0;
585595
}
586596
# else
@@ -590,9 +600,14 @@ fill_random_bytes_crypt(void *seed, size_t size)
590600
static int
591601
fill_random_bytes_bcrypt(void *seed, size_t size)
592602
{
593-
if (!BCryptGenRandom(NULL, seed, size, BCRYPT_USE_SYSTEM_PREFERRED_RNG))
594-
return 0;
595-
return -1;
603+
while (size > 0) {
604+
ULONG n = (size > (size_t)ULONG_MAX) ? LONG_MAX : (ULONG)size;
605+
if (BCryptGenRandom(NULL, seed, n, BCRYPT_USE_SYSTEM_PREFERRED_RNG))
606+
return -1;
607+
seed = (char *)seed + n;
608+
size -= n;
609+
}
610+
return 0;
596611
}
597612

598613
static int

test/ruby/test_yjit.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,16 @@ def make_str(foo, bar)
397397
RUBY
398398
end
399399

400+
def test_checkkeyword
401+
assert_compiles(<<~'RUBY', insns: %i[checkkeyword], result: [2, 5])
402+
def foo(foo: 1+1)
403+
foo
404+
end
405+
406+
[foo, foo(foo: 5)]
407+
RUBY
408+
end
409+
400410
def test_invokebuiltin
401411
assert_compiles(<<~RUBY)
402412
def foo(obj)

yjit_asm.c

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,15 @@ void lea(codeblock_t *cb, x86opnd_t dst, x86opnd_t src)
12591259
cb_write_rm(cb, false, true, dst, src, 0xFF, 1, 0x8D);
12601260
}
12611261

1262+
// Does this number fit in 32 bits and stays the same if you zero extend it to 64 bit?
1263+
// If the sign bit is clear, sign extension and zero extension yield the same
1264+
// result.
1265+
static bool
1266+
zero_extendable_32bit(uint64_t number)
1267+
{
1268+
return number <= UINT32_MAX && (number & (1ull << 31ull)) == 0;
1269+
}
1270+
12621271
/// mov - Data move operation
12631272
void mov(codeblock_t *cb, x86opnd_t dst, x86opnd_t src)
12641273
{
@@ -1275,14 +1284,27 @@ void mov(codeblock_t *cb, x86opnd_t dst, x86opnd_t src)
12751284
unsig_imm_size(src.as.imm) <= dst.num_bits
12761285
);
12771286

1278-
if (dst.num_bits == 16)
1279-
cb_write_byte(cb, 0x66);
1280-
if (rex_needed(dst) || dst.num_bits == 64)
1281-
cb_write_rex(cb, dst.num_bits == 64, 0, 0, dst.as.reg.reg_no);
1287+
// In case the source immediate could be zero extended to be 64
1288+
// bit, we can use the 32-bit operands version of the instruction.
1289+
// For example, we can turn mov(rax, 0x34) into the equivalent
1290+
// mov(eax, 0x34).
1291+
if (dst.num_bits == 64 && zero_extendable_32bit(src.as.unsig_imm)) {
1292+
if (rex_needed(dst))
1293+
cb_write_rex(cb, false, 0, 0, dst.as.reg.reg_no);
1294+
cb_write_opcode(cb, 0xB8, dst);
1295+
cb_write_int(cb, src.as.imm, 32);
1296+
}
1297+
else {
1298+
if (dst.num_bits == 16)
1299+
cb_write_byte(cb, 0x66);
1300+
1301+
if (rex_needed(dst) || dst.num_bits == 64)
1302+
cb_write_rex(cb, dst.num_bits == 64, 0, 0, dst.as.reg.reg_no);
12821303

1283-
cb_write_opcode(cb, (dst.num_bits == 8)? 0xB0:0xB8, dst);
1304+
cb_write_opcode(cb, (dst.num_bits == 8)? 0xB0:0xB8, dst);
12841305

1285-
cb_write_int(cb, src.as.imm, dst.num_bits);
1306+
cb_write_int(cb, src.as.imm, dst.num_bits);
1307+
}
12861308
}
12871309

12881310
// M + Imm

0 commit comments

Comments
 (0)
0