Skip to content

Commit c477a66

Browse files
committed
[GR-27681] Time objects are also interop OBJECT
PullRequest: truffleruby/2213
2 parents 34a1701 + 76fc547 commit c477a66

File tree

2 files changed

+60
-16
lines changed

2 files changed

+60
-16
lines changed

mx.truffleruby/suite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@
257257
"buildDependencies": [
258258
"TRUFFLERUBY", # We need this jar to run extconf.rb
259259
"TRUFFLERUBY-LAUNCHER", # We need this jar to run extconf.rb
260-
"sulong:SULONG", # We need this jar to find the toolchain with Toolchain#getToolPath
260+
"sulong:SULONG_NATIVE", # We need this jar to find the toolchain with Toolchain#getToolPath
261261
],
262262
"license": ["EPL-2.0"],
263263
},

src/tck/java/org/truffleruby/tck/RubyTCKLanguageProvider.java

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,10 @@
1212
import static org.graalvm.polyglot.tck.TypeDescriptor.ANY;
1313
import static org.graalvm.polyglot.tck.TypeDescriptor.ARRAY;
1414
import static org.graalvm.polyglot.tck.TypeDescriptor.BOOLEAN;
15-
import static org.graalvm.polyglot.tck.TypeDescriptor.DATE;
1615
import static org.graalvm.polyglot.tck.TypeDescriptor.NULL;
1716
import static org.graalvm.polyglot.tck.TypeDescriptor.NUMBER;
1817
import static org.graalvm.polyglot.tck.TypeDescriptor.OBJECT;
1918
import static org.graalvm.polyglot.tck.TypeDescriptor.STRING;
20-
import static org.graalvm.polyglot.tck.TypeDescriptor.TIME;
21-
import static org.graalvm.polyglot.tck.TypeDescriptor.TIME_ZONE;
2219
import static org.graalvm.polyglot.tck.TypeDescriptor.array;
2320
import static org.graalvm.polyglot.tck.TypeDescriptor.executable;
2421
import static org.graalvm.polyglot.tck.TypeDescriptor.intersection;
@@ -70,17 +67,21 @@ public Value createIdentityFunction(Context context) {
7067
@Override
7168
public Collection<? extends Snippet> createValueConstructors(Context context) {
7269
final List<Snippet> vals = new ArrayList<>();
73-
vals.add(createValueConstructor(context, "nil", NULL));
70+
// Interop Primitives
71+
vals.add(createValueConstructor(context, "nil", NULL)); // should also be OBJECT?
7472
vals.add(createValueConstructor(context, "false", BOOLEAN));
75-
vals.add(createValueConstructor(context, "7", NUMBER));
76-
vals.add(createValueConstructor(context, "1 << 42", NUMBER));
73+
// NOTE: NUMBER is only for primitives and types which are instanceof java.lang.Number.
74+
vals.add(createValueConstructor(context, "7", NUMBER)); // int
75+
vals.add(createValueConstructor(context, "1 << 42", NUMBER)); // long
76+
// vals.add(createValueConstructor(context, "1 << 84", NUMBER)); // Bignum
7777
vals.add(createValueConstructor(context, "3.14", NUMBER));
78-
vals.add(createValueConstructor(context, "Rational(1, 3)", OBJECT));
79-
vals.add(createValueConstructor(context, "Complex(1, 2)", OBJECT));
8078
vals.add(createValueConstructor(context, "'test'", STRING));
8179
vals.add(createValueConstructor(context, "'0123456789' + '0123456789'", STRING));
82-
vals.add(createValueConstructor(context, "Time.now", DATE_TIME_ZONE));
8380

81+
// Everything but interop primitives have members in Ruby, so they are also OBJECT
82+
vals.add(createValueConstructor(context, "Rational(1, 3)", OBJECT));
83+
vals.add(createValueConstructor(context, "Complex(1, 2)", OBJECT));
84+
// vals.add(createValueConstructor(context, "Time.now", DATE_TIME_ZONE_OBJECT)); // GR-27681
8485
vals.add(createValueConstructor(context, "[1, 2]", NUMBER_ARRAY_OBJECT));
8586
vals.add(createValueConstructor(context, "[1.2, 3.4]", NUMBER_ARRAY_OBJECT));
8687
vals.add(createValueConstructor(context, "[1<<33, 1<<34]", NUMBER_ARRAY_OBJECT));
@@ -90,23 +91,58 @@ public Collection<? extends Snippet> createValueConstructors(Context context) {
9091
vals.add(createValueConstructor(context, "[Object.new, 65]", ARRAY_OBJECT));
9192
vals.add(createValueConstructor(context, "{ name: 'test' }", OBJECT));
9293
vals.add(createValueConstructor(context, "Struct.new(:foo, :bar).new(1, 'two')", OBJECT));
93-
vals.add(
94-
createValueConstructor(
95-
context,
96-
"Object.new.tap { |obj| obj.instance_variable_set(:@name, 'test') }",
97-
OBJECT));
94+
String objectWithIVar = "Object.new.tap { |obj| obj.instance_variable_set(:@name, 'test') }";
95+
vals.add(createValueConstructor(context, objectWithIVar, OBJECT));
9896
vals.add(createValueConstructor(context, "proc { }", intersection(OBJECT, executable(ANY, true))));
9997
vals.add(createValueConstructor(context, "lambda { }", intersection(OBJECT, executable(ANY, false))));
98+
// vals.add(createValueConstructor(context, ":itself.to_proc", alsoRegularObject(executable(ANY, false, ANY))));
99+
// vals.add(createValueConstructor(context, "1.method(:itself)", alsoRegularObject(executable(NUMBER, false))));
100100
return Collections.unmodifiableList(vals);
101101
}
102102

103103
@Override
104104
public Collection<? extends Snippet> createExpressions(Context context) {
105105
final List<Snippet> ops = new ArrayList<>();
106+
107+
// arithmetic
106108
ops.add(createBinaryOperator(context, "a + b", NUMBER, NUMBER, NUMBER));
107109
ops.add(createBinaryOperator(context, "a + b", STRING, STRING, STRING));
110+
// ops.add(createBinaryOperator(context, "a + b", ARRAY, ARRAY, ARRAY));
108111
ops.add(createBinaryOperator(context, "a - b", NUMBER, NUMBER, NUMBER));
112+
// ops.add(createBinaryOperator(context, "a - b", ARRAY, ARRAY, ARRAY));
113+
// ops.add(createBinaryOperator(context, "a * b", NUMBER, NUMBER, NUMBER));
114+
// ops.add(createBinaryOperator(context, "a * b", STRING, NUMBER, STRING));
115+
// ops.add(createBinaryOperator(context, "a * b", ARRAY, NUMBER, ARRAY));
109116
ops.add(createBinaryOperator(context, "a / b", NUMBER, NUMBER, NUMBER));
117+
// ops.add(createBinaryOperator(context, "a % b", NUMBER, NUMBER, NUMBER));
118+
// ops.add(createBinaryOperator(context, "a ** b", NUMBER, NUMBER, NUMBER));
119+
120+
// comparison
121+
// ops.add(createBinaryOperator(context, "a.equal?(b)", ANY, ANY, BOOLEAN));
122+
// ops.add(createBinaryOperator(context, "a == b", ANY, ANY, BOOLEAN));
123+
// ops.add(createBinaryOperator(context, "a != b", ANY, ANY, BOOLEAN));
124+
// ops.add(createBinaryOperator(context, "a < b", NUMBER, NUMBER, BOOLEAN));
125+
// ops.add(createBinaryOperator(context, "a > b", NUMBER, NUMBER, BOOLEAN));
126+
// ops.add(createBinaryOperator(context, "a <= b", NUMBER, NUMBER, BOOLEAN));
127+
// ops.add(createBinaryOperator(context, "a >= b", NUMBER, NUMBER, BOOLEAN));
128+
129+
// bitwise
130+
// ops.add(createBinaryOperator(context, "a << b", NUMBER, NUMBER, NUMBER));
131+
// ops.add(createBinaryOperator(context, "a >> b", NUMBER, NUMBER, NUMBER));
132+
// ops.add(createBinaryOperator(context, "a & b", NUMBER, NUMBER, NUMBER));
133+
// ops.add(createBinaryOperator(context, "a | b", NUMBER, NUMBER, NUMBER));
134+
// ops.add(createBinaryOperator(context, "a ^ b", NUMBER, NUMBER, NUMBER));
135+
136+
// logical
137+
// ops.add(createBinaryOperator(context, "a && b", ANY, ANY, ANY));
138+
// ops.add(createBinaryOperator(context, "a || b", ANY, ANY, ANY));
139+
140+
// unary operators
141+
// ops.add(createUnaryOperator(context, "+a", NUMBER, NUMBER));
142+
// ops.add(createUnaryOperator(context, "-a", NUMBER, NUMBER));
143+
// ops.add(createUnaryOperator(context, "~a", NUMBER, NUMBER));
144+
// ops.add(createUnaryOperator(context, "!a", ANY, BOOLEAN));
145+
110146
return Collections.unmodifiableList(ops);
111147
}
112148

@@ -121,7 +157,9 @@ public Collection<? extends Snippet> createStatements(Context context) {
121157
res.add(createStatement(context, "until", "-> c { until c; break; end }", ANY, NULL));
122158
res.add(createStatement(context, "do while", "-> c { begin; break; end while c }", ANY, NULL));
123159
res.add(createStatement(context, "do until", "-> c { begin; break; end until c }", ANY, NULL));
160+
// res.add(createStatement(context, "for", "-> array { for e in array do; end }", ARRAY, ARRAY));
124161
res.add(createStatement(context, "case", "-> e { case e; when Integer; 1; else 2; end }", ANY, NUMBER));
162+
// res.add(createStatement(context, "raise", "-> msg { begin; raise msg; rescue => e; e; end}", STRING, OBJECT));
125163
return Collections.unmodifiableList(res);
126164
}
127165

@@ -197,6 +235,12 @@ private Snippet createValueConstructor(Context context, String value, TypeDescri
197235
return Snippet.newBuilder(value, context.eval(getId(), String.format("-> { %s }", value)), type).build();
198236
}
199237

238+
// private Snippet createUnaryOperator(Context context, String operator, TypeDescriptor operandType,
239+
// TypeDescriptor returnType) {
240+
// final Value function = context.eval(getId(), String.format("-> a { %s }", operator));
241+
// return Snippet.newBuilder(operator, function, returnType).parameterTypes(operandType).build();
242+
// }
243+
200244
private Snippet createBinaryOperator(Context context, String operator, TypeDescriptor lhsType,
201245
TypeDescriptor rhsType, TypeDescriptor returnType) {
202246
final Value function = context.eval(getId(), String.format("-> a, b { %s }", operator));
@@ -242,7 +286,7 @@ private Source getSource(String path) {
242286
}
243287
}
244288

245-
private static final TypeDescriptor DATE_TIME_ZONE = intersection(DATE, TIME, TIME_ZONE);
289+
// private static final TypeDescriptor DATE_TIME_ZONE_OBJECT = intersection(OBJECT, DATE, TIME, TIME_ZONE);
246290
private static final TypeDescriptor ARRAY_OBJECT = intersection(OBJECT, ARRAY);
247291
private static final TypeDescriptor NUMBER_ARRAY_OBJECT = intersection(OBJECT, array(NUMBER));
248292

0 commit comments

Comments
 (0)