Skip to content

Commit dd6c140

Browse files
committed
[GR-20329] Define rb_encoding as const OnigEncodingType like MRI.
PullRequest: truffleruby/1758
2 parents c4a418b + 7b881c7 commit dd6c140

File tree

5 files changed

+51
-48
lines changed

5 files changed

+51
-48
lines changed

lib/cext/include/ruby/encoding.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,7 @@ void RB_ENC_CODERANGE_SET(VALUE obj, int cr);
108108
#define ENC_CODERANGE_AND(a, b) RB_ENC_CODERANGE_AND(a, b)
109109
#define ENCODING_CODERANGE_SET(obj, encindex, cr) RB_ENCODING_CODERANGE_SET(obj, encindex, cr)
110110

111-
typedef struct rb_encoding {
112-
char *name;
113-
} rb_encoding;
111+
typedef const OnigEncodingType rb_encoding;
114112

115113
int rb_char_to_option_kcode(int c, int *option, int *kcode);
116114

lib/truffle/truffle/cext.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ module Truffle::CExt
7272
RUBY_ECONV_PARTIAL_INPUT = Encoding::Converter::PARTIAL_INPUT
7373
RUBY_ECONV_AFTER_OUTPUT = Encoding::Converter::AFTER_OUTPUT
7474

75+
SET_LIBTRUFFLERUBY = -> libtruffleruby do
76+
LIBTRUFFLERUBY = libtruffleruby
77+
end
78+
79+
def self.register_libtruffleruby(libtruffleruby)
80+
SET_LIBTRUFFLERUBY.call(libtruffleruby)
81+
end
82+
7583
def supported?
7684
Interop.mime_type_supported?('application/x-sulong-library')
7785
end

lib/truffle/truffle/cext_structs.rb

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,6 @@ def type
131131

132132
# ruby.h: `struct RBasic`
133133
class Truffle::CExt::RBasic
134-
135-
def initialize(object)
136-
@object = object
137-
end
138-
139134
USER_FLAGS = Primitive.object_hidden_var_create :user_flags
140135

141136
# RUBY_FL* values are from ruby.h
@@ -146,6 +141,10 @@ def initialize(object)
146141
USER_FLAGS_MASK = (1 << (RUBY_FL_USHIFT + 19)) - (1 << (RUBY_FL_USHIFT))
147142
private_constant :RUBY_FL_USHIFT, :USER_FLAGS_MASK
148143

144+
def initialize(object)
145+
@object = object
146+
end
147+
149148
private
150149

151150
def user_flags
@@ -431,7 +430,7 @@ def self.get_encoding_from_native(rbencoding_ptr)
431430
def initialize(encoding)
432431
@encoding = encoding
433432
@pointer = nil
434-
@name = nil
433+
@name = Truffle::CExt::LIBTRUFFLERUBY.RSTRING_PTR_IMPL(Primitive.cext_wrap(encoding.name))
435434
end
436435

437436
private
@@ -446,12 +445,11 @@ def polyglot_members(internal)
446445

447446
def polyglot_read_member(name)
448447
raise Truffle::Interop::UnknownIdentifierException unless name == 'name'
449-
@name or raise '@name not set'
448+
@name
450449
end
451450

452451
def polyglot_write_member(name, value)
453-
raise Truffle::Interop::UnknownIdentifierException unless name == 'name'
454-
@name = value
452+
raise Truffle::Interop::UnsupportedMessageException
455453
end
456454

457455
def polyglot_remove_member(name)
@@ -467,7 +465,7 @@ def polyglot_member_readable?(name)
467465
end
468466

469467
def polyglot_member_modifiable?(name)
470-
name == 'name'
468+
false
471469
end
472470

473471
def polyglot_member_removable?(name)
@@ -499,24 +497,17 @@ def polyglot_pointer?
499497
end
500498

501499
def polyglot_to_native
502-
name = @name or raise '@name not set'
503-
unless Truffle::Interop.pointer?(name)
504-
Truffle::Interop.to_native(name)
505-
raise "#{name.inspect} could not be converted to native" unless Truffle::Interop.pointer?(name)
506-
end
507-
name_address = Truffle::Interop.as_pointer(name)
508-
509-
ENCODING_CACHE_MUTEX.synchronize do
510-
unless @pointer
511-
@pointer = Truffle::FFI::MemoryPointer.new(:pointer, 1)
512-
@pointer.write_pointer name_address
513-
514-
NATIVE_CACHE[@pointer.address] = self
500+
unless @pointer
501+
ENCODING_CACHE_MUTEX.synchronize do
502+
unless @pointer
503+
@pointer = Truffle::CExt::LIBTRUFFLERUBY.rb_encoding_to_native(@name)
504+
NATIVE_CACHE[Truffle::Interop.as_pointer(@pointer)] = self
505+
end
515506
end
516507
end
517508
end
518509

519510
def polyglot_as_pointer
520-
@pointer.address
511+
Truffle::Interop.as_pointer(@pointer)
521512
end
522513
end

src/main/c/cext/encoding.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,37 @@
33

44
// Encoding, rb_enc_*
55

6-
POLYGLOT_DECLARE_STRUCT(rb_encoding)
6+
POLYGLOT_DECLARE_TYPE(rb_encoding)
77

88
// returns Truffle::CExt::RbEncoding, takes Encoding or String
9-
rb_encoding *rb_to_encoding(VALUE encoding) {
9+
rb_encoding* rb_to_encoding(VALUE encoding) {
1010
encoding = RUBY_CEXT_INVOKE("rb_convert_to_encoding", encoding); // Convert to Encoding
11-
rb_encoding *enc = polyglot_as_rb_encoding(RUBY_CEXT_INVOKE_NO_WRAP("rb_to_encoding", encoding));
12-
enc->name = RSTRING_PTR(RUBY_INVOKE(encoding, "name"));
13-
return enc;
11+
return polyglot_as_rb_encoding(RUBY_CEXT_INVOKE_NO_WRAP("rb_to_encoding", encoding));
1412
}
1513

16-
rb_encoding *rb_default_external_encoding(void) {
14+
rb_encoding* rb_encoding_to_native(char* name) {
15+
OnigEncodingType* native = calloc(1, sizeof(rb_encoding)); // calloc() to zero-fill
16+
native->name = name;
17+
return native;
18+
}
19+
20+
rb_encoding* rb_default_external_encoding(void) {
1721
VALUE result = RUBY_CEXT_INVOKE("rb_default_external_encoding");
1822
if (NIL_P(result)) {
1923
return NULL;
2024
}
2125
return rb_to_encoding(result);
2226
}
2327

24-
rb_encoding *rb_default_internal_encoding(void) {
28+
rb_encoding* rb_default_internal_encoding(void) {
2529
VALUE result = RUBY_CEXT_INVOKE("rb_default_internal_encoding");
2630
if (NIL_P(result)) {
2731
return NULL;
2832
}
2933
return rb_to_encoding(result);
3034
}
3135

32-
rb_encoding *rb_locale_encoding(void) {
36+
rb_encoding* rb_locale_encoding(void) {
3337
VALUE result = RUBY_CEXT_INVOKE("rb_locale_encoding");
3438
if (NIL_P(result)) {
3539
return NULL;
@@ -41,7 +45,7 @@ int rb_locale_encindex(void) {
4145
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_locale_encindex"));
4246
}
4347

44-
rb_encoding *rb_filesystem_encoding(void) {
48+
rb_encoding* rb_filesystem_encoding(void) {
4549
VALUE result = RUBY_CEXT_INVOKE("rb_filesystem_encoding");
4650
if (NIL_P(result)) {
4751
return NULL;
@@ -53,7 +57,7 @@ int rb_filesystem_encindex(void) {
5357
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_filesystem_encindex"));
5458
}
5559

56-
rb_encoding *get_encoding(VALUE string) {
60+
rb_encoding* get_encoding(VALUE string) {
5761
return rb_to_encoding(RUBY_INVOKE(string, "encoding"));
5862
}
5963

@@ -75,23 +79,23 @@ int rb_enc_mbc_to_codepoint(char *p, char *e, rb_encoding *enc) {
7579
length));
7680
}
7781

78-
rb_encoding *rb_enc_get(VALUE object) {
82+
rb_encoding* rb_enc_get(VALUE object) {
7983
return rb_to_encoding(RUBY_CEXT_INVOKE("rb_enc_get", object));
8084
}
8185

8286
void rb_enc_set_index(VALUE obj, int idx) {
8387
polyglot_invoke(RUBY_CEXT, "rb_enc_set_index", rb_tr_unwrap(obj), idx);
8488
}
8589

86-
rb_encoding *rb_ascii8bit_encoding(void) {
90+
rb_encoding* rb_ascii8bit_encoding(void) {
8791
return rb_to_encoding(RUBY_CEXT_INVOKE("ascii8bit_encoding"));
8892
}
8993

9094
int rb_ascii8bit_encindex(void) {
9195
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_ascii8bit_encindex"));
9296
}
9397

94-
rb_encoding *rb_usascii_encoding(void) {
98+
rb_encoding* rb_usascii_encoding(void) {
9599
return rb_to_encoding(RUBY_CEXT_INVOKE("usascii_encoding"));
96100
}
97101

@@ -110,7 +114,7 @@ int rb_usascii_encindex(void) {
110114
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_usascii_encindex"));
111115
}
112116

113-
rb_encoding *rb_utf8_encoding(void) {
117+
rb_encoding* rb_utf8_encoding(void) {
114118
return rb_to_encoding(RUBY_CEXT_INVOKE("utf8_encoding"));
115119
}
116120

@@ -150,7 +154,7 @@ int rb_enc_find_index(const char *name) {
150154
return polyglot_as_i32(RUBY_CEXT_INVOKE_NO_WRAP("rb_enc_find_index", rb_str_new_cstr(name)));
151155
}
152156

153-
rb_encoding *rb_enc_find(const char *name) {
157+
rb_encoding* rb_enc_find(const char *name) {
154158
int idx = rb_enc_find_index(name);
155159
if (idx < 0) idx = 0;
156160
return rb_enc_from_index(idx);
@@ -173,7 +177,7 @@ VALUE rb_enc_from_encoding(rb_encoding *encoding) {
173177
}
174178
}
175179

176-
rb_encoding *rb_enc_from_index(int index) {
180+
rb_encoding* rb_enc_from_index(int index) {
177181
return rb_to_encoding(rb_tr_wrap(polyglot_invoke(RUBY_CEXT, "rb_enc_from_index", index)));
178182
}
179183

src/main/java/org/truffleruby/language/loader/FeatureLoader.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@
4242

4343
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4444
import com.oracle.truffle.api.TruffleFile;
45-
import com.oracle.truffle.api.interop.ArityException;
45+
import com.oracle.truffle.api.interop.InteropException;
4646
import com.oracle.truffle.api.interop.InteropLibrary;
47-
import com.oracle.truffle.api.interop.UnsupportedMessageException;
48-
import com.oracle.truffle.api.interop.UnsupportedTypeException;
4947
import com.oracle.truffle.api.object.DynamicObject;
5048
import com.oracle.truffle.api.profiles.ConditionProfile;
5149
import com.oracle.truffle.api.source.Source;
@@ -423,9 +421,13 @@ public void ensureCExtImplementationLoaded(String feature, RequireNode requireNo
423421
final Object initFunction = requireNode
424422
.findFunctionInLibrary(library, "rb_tr_init", rubyLibPath);
425423

424+
final InteropLibrary interop = InteropLibrary.getFactory().getUncached();
426425
try {
427-
InteropLibrary.getFactory().getUncached(initFunction).execute(initFunction, truffleCExt);
428-
} catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) {
426+
// rb_tr_init(Truffle::CExt)
427+
interop.execute(initFunction, truffleCExt);
428+
// Truffle::CExt.register_libtruffleruby(libtruffleruby)
429+
interop.invokeMember(truffleCExt, "register_libtruffleruby", library);
430+
} catch (InteropException e) {
429431
throw new JavaException(e);
430432
}
431433
} finally {

0 commit comments

Comments
 (0)