@@ -271,10 +271,17 @@ public abstract static class AllocateInstanceNode extends CoreMethodArrayArgumen
271
271
272
272
@ Child private DispatchNode allocateNode = DispatchNode .create ();
273
273
274
- @ Specialization
275
- protected Object newInstance (VirtualFrame frame , RubyClass rubyClass ) {
274
+ @ Specialization ( guards = "!rubyClass.isSingleton" )
275
+ protected Object newInstance (RubyClass rubyClass ) {
276
276
return allocateNode .call (rubyClass , "__allocate__" );
277
277
}
278
+
279
+ @ Specialization (guards = "rubyClass.isSingleton" )
280
+ protected RubyClass newSingletonInstance (RubyClass rubyClass ) {
281
+ throw new RaiseException (
282
+ getContext (),
283
+ getContext ().getCoreExceptions ().typeErrorCantCreateInstanceOfSingletonClass (this ));
284
+ }
278
285
}
279
286
280
287
@ CoreMethod (names = "new" , needsBlock = true , rest = true )
@@ -289,16 +296,23 @@ public static NewNode create() {
289
296
290
297
public abstract Object execute (VirtualFrame frame , Object rubyClass , Object [] args , Object block );
291
298
292
- @ Specialization
299
+ @ Specialization ( guards = "!rubyClass.isSingleton" )
293
300
protected Object newInstance (VirtualFrame frame , RubyClass rubyClass , Object [] args , NotProvided block ) {
294
301
return doNewInstance (frame , rubyClass , args , null );
295
302
}
296
303
297
- @ Specialization
304
+ @ Specialization ( guards = "!rubyClass.isSingleton" )
298
305
protected Object newInstance (VirtualFrame frame , RubyClass rubyClass , Object [] args , RubyProc block ) {
299
306
return doNewInstance (frame , rubyClass , args , block );
300
307
}
301
308
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
+
302
316
@ Override
303
317
public Object inlineExecute (VirtualFrame frame , Object self , Object [] args , Object proc ) {
304
318
return execute (frame , self , args , proc );
@@ -409,6 +423,5 @@ protected RubyClass allocate(RubyClass classClass) {
409
423
getEncapsulatingSourceSection (),
410
424
classClass );
411
425
}
412
-
413
426
}
414
427
}
0 commit comments