Skip to content

Commit 91c589f

Browse files
author
Nicolas Laurent
committed
move the check for singleton class allocation to ClassNodes
1 parent f0bcfa6 commit 91c589f

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/main/java/org/truffleruby/core/klass/ClassNodes.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,17 @@ public abstract static class AllocateInstanceNode extends CoreMethodArrayArgumen
271271

272272
@Child private DispatchNode allocateNode = DispatchNode.create();
273273

274-
@Specialization
275-
protected Object newInstance(VirtualFrame frame, RubyClass rubyClass) {
274+
@Specialization(guards = "!rubyClass.isSingleton")
275+
protected Object newInstance(RubyClass rubyClass) {
276276
return allocateNode.call(rubyClass, "__allocate__");
277277
}
278+
279+
@Specialization(guards = "rubyClass.isSingleton")
280+
protected RubyClass newSingletonInstance(RubyClass rubyClass) {
281+
throw new RaiseException(
282+
getContext(),
283+
getContext().getCoreExceptions().typeErrorCantCreateInstanceOfSingletonClass(this));
284+
}
278285
}
279286

280287
@CoreMethod(names = "new", needsBlock = true, rest = true)
@@ -289,16 +296,23 @@ public static NewNode create() {
289296

290297
public abstract Object execute(VirtualFrame frame, Object rubyClass, Object[] args, Object block);
291298

292-
@Specialization
299+
@Specialization(guards = "!rubyClass.isSingleton")
293300
protected Object newInstance(VirtualFrame frame, RubyClass rubyClass, Object[] args, NotProvided block) {
294301
return doNewInstance(frame, rubyClass, args, null);
295302
}
296303

297-
@Specialization
304+
@Specialization(guards = "!rubyClass.isSingleton")
298305
protected Object newInstance(VirtualFrame frame, RubyClass rubyClass, Object[] args, RubyProc block) {
299306
return doNewInstance(frame, rubyClass, args, block);
300307
}
301308

309+
@Specialization(guards = "rubyClass.isSingleton")
310+
protected RubyClass newSingletonInstance(RubyClass rubyClass, Object[] args, Object maybeBlock) {
311+
throw new RaiseException(
312+
getContext(),
313+
getContext().getCoreExceptions().typeErrorCantCreateInstanceOfSingletonClass(this));
314+
}
315+
302316
@Override
303317
public Object inlineExecute(VirtualFrame frame, Object self, Object[] args, Object proc) {
304318
return execute(frame, self, args, proc);
@@ -409,6 +423,5 @@ protected RubyClass allocate(RubyClass classClass) {
409423
getEncapsulatingSourceSection(),
410424
classClass);
411425
}
412-
413426
}
414427
}

0 commit comments

Comments
 (0)