rubysl-soap 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +0 -1
  3. data/.travis.yml +8 -0
  4. data/README.md +2 -2
  5. data/Rakefile +0 -1
  6. data/lib/rubysl/soap.rb +1 -0
  7. data/lib/rubysl/soap/version.rb +5 -0
  8. data/lib/soap/attachment.rb +107 -0
  9. data/lib/soap/baseData.rb +942 -0
  10. data/lib/soap/element.rb +258 -0
  11. data/lib/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  12. data/lib/soap/encodingstyle/handler.rb +100 -0
  13. data/lib/soap/encodingstyle/literalHandler.rb +226 -0
  14. data/lib/soap/encodingstyle/soapHandler.rb +582 -0
  15. data/lib/soap/generator.rb +268 -0
  16. data/lib/soap/header/handler.rb +57 -0
  17. data/lib/soap/header/handlerset.rb +70 -0
  18. data/lib/soap/header/simplehandler.rb +44 -0
  19. data/lib/soap/httpconfigloader.rb +119 -0
  20. data/lib/soap/mapping.rb +10 -0
  21. data/lib/soap/mapping/factory.rb +355 -0
  22. data/lib/soap/mapping/mapping.rb +381 -0
  23. data/lib/soap/mapping/registry.rb +541 -0
  24. data/lib/soap/mapping/rubytypeFactory.rb +475 -0
  25. data/lib/soap/mapping/typeMap.rb +50 -0
  26. data/lib/soap/mapping/wsdlencodedregistry.rb +280 -0
  27. data/lib/soap/mapping/wsdlliteralregistry.rb +418 -0
  28. data/lib/soap/marshal.rb +59 -0
  29. data/lib/soap/mimemessage.rb +240 -0
  30. data/lib/soap/netHttpClient.rb +190 -0
  31. data/lib/soap/parser.rb +251 -0
  32. data/lib/soap/processor.rb +66 -0
  33. data/lib/soap/property.rb +333 -0
  34. data/lib/soap/rpc/cgistub.rb +206 -0
  35. data/lib/soap/rpc/driver.rb +254 -0
  36. data/lib/soap/rpc/element.rb +325 -0
  37. data/lib/soap/rpc/httpserver.rb +129 -0
  38. data/lib/soap/rpc/proxy.rb +497 -0
  39. data/lib/soap/rpc/router.rb +594 -0
  40. data/lib/soap/rpc/rpc.rb +25 -0
  41. data/lib/soap/rpc/soaplet.rb +162 -0
  42. data/lib/soap/rpc/standaloneServer.rb +43 -0
  43. data/lib/soap/soap.rb +140 -0
  44. data/lib/soap/streamHandler.rb +229 -0
  45. data/lib/soap/wsdlDriver.rb +575 -0
  46. data/rubysl-soap.gemspec +19 -18
  47. metadata +115 -86
  48. data/lib/rubysl-soap.rb +0 -7
  49. data/lib/rubysl-soap/version.rb +0 -5
@@ -0,0 +1,541 @@
1
+ # SOAP4R - Mapping registry.
2
+ # Copyright (C) 2000, 2001, 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'soap/baseData'
10
+ require 'soap/mapping/mapping'
11
+ require 'soap/mapping/typeMap'
12
+ require 'soap/mapping/factory'
13
+ require 'soap/mapping/rubytypeFactory'
14
+
15
+
16
+ module SOAP
17
+
18
+
19
+ module Marshallable
20
+ # @@type_ns = Mapping::RubyCustomTypeNamespace
21
+ end
22
+
23
+
24
+ module Mapping
25
+
26
+
27
+ module MappedException; end
28
+
29
+
30
+ RubyTypeName = XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType')
31
+ RubyExtendName = XSD::QName.new(RubyTypeInstanceNamespace, 'extends')
32
+ RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
33
+
34
+
35
+ # Inner class to pass an exception.
36
+ class SOAPException; include Marshallable
37
+ attr_reader :excn_type_name, :cause
38
+ def initialize(e)
39
+ @excn_type_name = Mapping.name2elename(e.class.to_s)
40
+ @cause = e
41
+ end
42
+
43
+ def to_e
44
+ if @cause.is_a?(::Exception)
45
+ @cause.extend(::SOAP::Mapping::MappedException)
46
+ return @cause
47
+ elsif @cause.respond_to?(:message) and @cause.respond_to?(:backtrace)
48
+ e = RuntimeError.new(@cause.message)
49
+ e.set_backtrace(@cause.backtrace)
50
+ return e
51
+ end
52
+ klass = Mapping.class_from_name(Mapping.elename2name(@excn_type_name.to_s))
53
+ if klass.nil? or not klass <= ::Exception
54
+ return RuntimeError.new(@cause.inspect)
55
+ end
56
+ obj = klass.new(@cause.message)
57
+ obj.extend(::SOAP::Mapping::MappedException)
58
+ obj
59
+ end
60
+ end
61
+
62
+
63
+ # For anyType object: SOAP::Mapping::Object not ::Object
64
+ class Object; include Marshallable
65
+ def initialize
66
+ @__xmlele_type = {}
67
+ @__xmlele = []
68
+ @__xmlattr = {}
69
+ end
70
+
71
+ def inspect
72
+ sprintf("#<%s:0x%x%s>", self.class.name, __id__,
73
+ @__xmlele.collect { |name, value| " #{name}=#{value.inspect}" }.join)
74
+ end
75
+
76
+ def __xmlattr
77
+ @__xmlattr
78
+ end
79
+
80
+ def __xmlele
81
+ @__xmlele
82
+ end
83
+
84
+ def [](qname)
85
+ unless qname.is_a?(XSD::QName)
86
+ qname = XSD::QName.new(nil, qname)
87
+ end
88
+ @__xmlele.each do |k, v|
89
+ return v if k == qname
90
+ end
91
+ # fallback
92
+ @__xmlele.each do |k, v|
93
+ return v if k.name == qname.name
94
+ end
95
+ nil
96
+ end
97
+
98
+ def []=(qname, value)
99
+ unless qname.is_a?(XSD::QName)
100
+ qname = XSD::QName.new(nil, qname)
101
+ end
102
+ found = false
103
+ @__xmlele.each do |pair|
104
+ if pair[0] == qname
105
+ found = true
106
+ pair[1] = value
107
+ end
108
+ end
109
+ unless found
110
+ __define_attr_accessor(qname)
111
+ @__xmlele << [qname, value]
112
+ end
113
+ @__xmlele_type[qname] = :single
114
+ end
115
+
116
+ def __add_xmlele_value(qname, value)
117
+ found = false
118
+ @__xmlele.map! do |k, v|
119
+ if k == qname
120
+ found = true
121
+ [k, __set_xmlele_value(k, v, value)]
122
+ else
123
+ [k, v]
124
+ end
125
+ end
126
+ unless found
127
+ __define_attr_accessor(qname)
128
+ @__xmlele << [qname, value]
129
+ @__xmlele_type[qname] = :single
130
+ end
131
+ value
132
+ end
133
+
134
+ private
135
+
136
+ if RUBY_VERSION > "1.7.0"
137
+ def __define_attr_accessor(qname)
138
+ name = XSD::CodeGen::GenSupport.safemethodname(qname.name)
139
+ Mapping.define_attr_accessor(self, name,
140
+ proc { self[qname] },
141
+ proc { |value| self[qname] = value })
142
+ end
143
+ else
144
+ def __define_attr_accessor(qname)
145
+ name = XSD::CodeGen::GenSupport.safemethodname(qname.name)
146
+ instance_eval <<-EOS
147
+ def #{name}
148
+ self[#{qname.dump}]
149
+ end
150
+
151
+ def #{name}=(value)
152
+ self[#{qname.dump}] = value
153
+ end
154
+ EOS
155
+ end
156
+ end
157
+
158
+ def __set_xmlele_value(key, org, value)
159
+ case @__xmlele_type[key]
160
+ when :multi
161
+ org << value
162
+ org
163
+ when :single
164
+ @__xmlele_type[key] = :multi
165
+ [org, value]
166
+ else
167
+ raise RuntimeError.new("unknown type")
168
+ end
169
+ end
170
+ end
171
+
172
+
173
+ class MappingError < Error; end
174
+
175
+
176
+ class Registry
177
+ class Map
178
+ def initialize(registry)
179
+ @obj2soap = {}
180
+ @soap2obj = {}
181
+ @registry = registry
182
+ end
183
+
184
+ def obj2soap(obj)
185
+ klass = obj.class
186
+ if map = @obj2soap[klass]
187
+ map.each do |soap_class, factory, info|
188
+ ret = factory.obj2soap(soap_class, obj, info, @registry)
189
+ return ret if ret
190
+ end
191
+ end
192
+ ancestors = klass.ancestors
193
+ ancestors.delete(klass)
194
+ ancestors.delete(::Object)
195
+ ancestors.delete(::Kernel)
196
+ ancestors.each do |klass|
197
+ if map = @obj2soap[klass]
198
+ map.each do |soap_class, factory, info|
199
+ if info[:derived_class]
200
+ ret = factory.obj2soap(soap_class, obj, info, @registry)
201
+ return ret if ret
202
+ end
203
+ end
204
+ end
205
+ end
206
+ nil
207
+ end
208
+
209
+ def soap2obj(node, klass = nil)
210
+ if map = @soap2obj[node.class]
211
+ map.each do |obj_class, factory, info|
212
+ next if klass and obj_class != klass
213
+ conv, obj = factory.soap2obj(obj_class, node, info, @registry)
214
+ return true, obj if conv
215
+ end
216
+ end
217
+ return false, nil
218
+ end
219
+
220
+ # Give priority to former entry.
221
+ def init(init_map = [])
222
+ clear
223
+ init_map.reverse_each do |obj_class, soap_class, factory, info|
224
+ add(obj_class, soap_class, factory, info)
225
+ end
226
+ end
227
+
228
+ # Give priority to latter entry.
229
+ def add(obj_class, soap_class, factory, info)
230
+ info ||= {}
231
+ (@obj2soap[obj_class] ||= []).unshift([soap_class, factory, info])
232
+ (@soap2obj[soap_class] ||= []).unshift([obj_class, factory, info])
233
+ end
234
+
235
+ def clear
236
+ @obj2soap.clear
237
+ @soap2obj.clear
238
+ end
239
+
240
+ def find_mapped_soap_class(target_obj_class)
241
+ map = @obj2soap[target_obj_class]
242
+ map.empty? ? nil : map[0][1]
243
+ end
244
+
245
+ def find_mapped_obj_class(target_soap_class)
246
+ map = @soap2obj[target_soap_class]
247
+ map.empty? ? nil : map[0][0]
248
+ end
249
+ end
250
+
251
+ StringFactory = StringFactory_.new
252
+ BasetypeFactory = BasetypeFactory_.new
253
+ DateTimeFactory = DateTimeFactory_.new
254
+ ArrayFactory = ArrayFactory_.new
255
+ Base64Factory = Base64Factory_.new
256
+ URIFactory = URIFactory_.new
257
+ TypedArrayFactory = TypedArrayFactory_.new
258
+ TypedStructFactory = TypedStructFactory_.new
259
+
260
+ HashFactory = HashFactory_.new
261
+
262
+ SOAPBaseMap = [
263
+ [::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
264
+ [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
265
+ [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
266
+ [::String, ::SOAP::SOAPString, StringFactory],
267
+ [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
268
+ [::Date, ::SOAP::SOAPDate, DateTimeFactory],
269
+ [::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
270
+ [::Time, ::SOAP::SOAPTime, DateTimeFactory],
271
+ [::Float, ::SOAP::SOAPDouble, BasetypeFactory,
272
+ {:derived_class => true}],
273
+ [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
274
+ {:derived_class => true}],
275
+ [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
276
+ {:derived_class => true}],
277
+ [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
278
+ {:derived_class => true}],
279
+ [::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
280
+ {:derived_class => true}],
281
+ [::Integer, ::SOAP::SOAPShort, BasetypeFactory,
282
+ {:derived_class => true}],
283
+ [::Integer, ::SOAP::SOAPByte, BasetypeFactory,
284
+ {:derived_class => true}],
285
+ [::Integer, ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,
286
+ {:derived_class => true}],
287
+ [::Integer, ::SOAP::SOAPNegativeInteger, BasetypeFactory,
288
+ {:derived_class => true}],
289
+ [::Integer, ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,
290
+ {:derived_class => true}],
291
+ [::Integer, ::SOAP::SOAPPositiveInteger, BasetypeFactory,
292
+ {:derived_class => true}],
293
+ [::Integer, ::SOAP::SOAPUnsignedLong, BasetypeFactory,
294
+ {:derived_class => true}],
295
+ [::Integer, ::SOAP::SOAPUnsignedInt, BasetypeFactory,
296
+ {:derived_class => true}],
297
+ [::Integer, ::SOAP::SOAPUnsignedShort, BasetypeFactory,
298
+ {:derived_class => true}],
299
+ [::Integer, ::SOAP::SOAPUnsignedByte, BasetypeFactory,
300
+ {:derived_class => true}],
301
+ [::URI::Generic, ::SOAP::SOAPAnyURI, URIFactory,
302
+ {:derived_class => true}],
303
+ [::String, ::SOAP::SOAPBase64, Base64Factory],
304
+ [::String, ::SOAP::SOAPHexBinary, Base64Factory],
305
+ [::String, ::SOAP::SOAPDecimal, BasetypeFactory],
306
+ [::String, ::SOAP::SOAPDuration, BasetypeFactory],
307
+ [::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
308
+ [::String, ::SOAP::SOAPGYear, BasetypeFactory],
309
+ [::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
310
+ [::String, ::SOAP::SOAPGDay, BasetypeFactory],
311
+ [::String, ::SOAP::SOAPGMonth, BasetypeFactory],
312
+ [::String, ::SOAP::SOAPQName, BasetypeFactory],
313
+
314
+ [::Hash, ::SOAP::SOAPArray, HashFactory],
315
+ [::Hash, ::SOAP::SOAPStruct, HashFactory],
316
+
317
+ [::Array, ::SOAP::SOAPArray, ArrayFactory,
318
+ {:derived_class => true}],
319
+
320
+ [::SOAP::Mapping::SOAPException,
321
+ ::SOAP::SOAPStruct, TypedStructFactory,
322
+ {:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
323
+ ]
324
+
325
+ RubyOriginalMap = [
326
+ [::NilClass, ::SOAP::SOAPNil, BasetypeFactory],
327
+ [::TrueClass, ::SOAP::SOAPBoolean, BasetypeFactory],
328
+ [::FalseClass, ::SOAP::SOAPBoolean, BasetypeFactory],
329
+ [::String, ::SOAP::SOAPString, StringFactory],
330
+ [::DateTime, ::SOAP::SOAPDateTime, DateTimeFactory],
331
+ [::Date, ::SOAP::SOAPDate, DateTimeFactory],
332
+ [::Time, ::SOAP::SOAPDateTime, DateTimeFactory],
333
+ [::Time, ::SOAP::SOAPTime, DateTimeFactory],
334
+ [::Float, ::SOAP::SOAPDouble, BasetypeFactory,
335
+ {:derived_class => true}],
336
+ [::Float, ::SOAP::SOAPFloat, BasetypeFactory,
337
+ {:derived_class => true}],
338
+ [::Integer, ::SOAP::SOAPInt, BasetypeFactory,
339
+ {:derived_class => true}],
340
+ [::Integer, ::SOAP::SOAPLong, BasetypeFactory,
341
+ {:derived_class => true}],
342
+ [::Integer, ::SOAP::SOAPInteger, BasetypeFactory,
343
+ {:derived_class => true}],
344
+ [::Integer, ::SOAP::SOAPShort, BasetypeFactory,
345
+ {:derived_class => true}],
346
+ [::Integer, ::SOAP::SOAPByte, BasetypeFactory,
347
+ {:derived_class => true}],
348
+ [::Integer, ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,
349
+ {:derived_class => true}],
350
+ [::Integer, ::SOAP::SOAPNegativeInteger, BasetypeFactory,
351
+ {:derived_class => true}],
352
+ [::Integer, ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,
353
+ {:derived_class => true}],
354
+ [::Integer, ::SOAP::SOAPPositiveInteger, BasetypeFactory,
355
+ {:derived_class => true}],
356
+ [::Integer, ::SOAP::SOAPUnsignedLong, BasetypeFactory,
357
+ {:derived_class => true}],
358
+ [::Integer, ::SOAP::SOAPUnsignedInt, BasetypeFactory,
359
+ {:derived_class => true}],
360
+ [::Integer, ::SOAP::SOAPUnsignedShort, BasetypeFactory,
361
+ {:derived_class => true}],
362
+ [::Integer, ::SOAP::SOAPUnsignedByte, BasetypeFactory,
363
+ {:derived_class => true}],
364
+ [::URI::Generic, ::SOAP::SOAPAnyURI, URIFactory,
365
+ {:derived_class => true}],
366
+ [::String, ::SOAP::SOAPBase64, Base64Factory],
367
+ [::String, ::SOAP::SOAPHexBinary, Base64Factory],
368
+ [::String, ::SOAP::SOAPDecimal, BasetypeFactory],
369
+ [::String, ::SOAP::SOAPDuration, BasetypeFactory],
370
+ [::String, ::SOAP::SOAPGYearMonth, BasetypeFactory],
371
+ [::String, ::SOAP::SOAPGYear, BasetypeFactory],
372
+ [::String, ::SOAP::SOAPGMonthDay, BasetypeFactory],
373
+ [::String, ::SOAP::SOAPGDay, BasetypeFactory],
374
+ [::String, ::SOAP::SOAPGMonth, BasetypeFactory],
375
+ [::String, ::SOAP::SOAPQName, BasetypeFactory],
376
+
377
+ [::Hash, ::SOAP::SOAPArray, HashFactory],
378
+ [::Hash, ::SOAP::SOAPStruct, HashFactory],
379
+
380
+ # Does not allow Array's subclass here.
381
+ [::Array, ::SOAP::SOAPArray, ArrayFactory],
382
+
383
+ [::SOAP::Mapping::SOAPException,
384
+ ::SOAP::SOAPStruct, TypedStructFactory,
385
+ {:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
386
+ ]
387
+
388
+ attr_accessor :default_factory
389
+ attr_accessor :excn_handler_obj2soap
390
+ attr_accessor :excn_handler_soap2obj
391
+
392
+ def initialize(config = {})
393
+ @config = config
394
+ @map = Map.new(self)
395
+ if @config[:allow_original_mapping]
396
+ @allow_original_mapping = true
397
+ @map.init(RubyOriginalMap)
398
+ else
399
+ @allow_original_mapping = false
400
+ @map.init(SOAPBaseMap)
401
+ end
402
+ @allow_untyped_struct = @config.key?(:allow_untyped_struct) ?
403
+ @config[:allow_untyped_struct] : true
404
+ @rubytype_factory = RubytypeFactory.new(
405
+ :allow_untyped_struct => @allow_untyped_struct,
406
+ :allow_original_mapping => @allow_original_mapping
407
+ )
408
+ @default_factory = @rubytype_factory
409
+ @excn_handler_obj2soap = nil
410
+ @excn_handler_soap2obj = nil
411
+ end
412
+
413
+ def add(obj_class, soap_class, factory, info = nil)
414
+ @map.add(obj_class, soap_class, factory, info)
415
+ end
416
+ alias set add
417
+
418
+ # general Registry ignores type_qname
419
+ def obj2soap(obj, type_qname = nil)
420
+ soap = _obj2soap(obj)
421
+ if @allow_original_mapping
422
+ addextend2soap(soap, obj)
423
+ end
424
+ soap
425
+ end
426
+
427
+ def soap2obj(node, klass = nil)
428
+ obj = _soap2obj(node, klass)
429
+ if @allow_original_mapping
430
+ addextend2obj(obj, node.extraattr[RubyExtendName])
431
+ addiv2obj(obj, node.extraattr[RubyIVarName])
432
+ end
433
+ obj
434
+ end
435
+
436
+ def find_mapped_soap_class(obj_class)
437
+ @map.find_mapped_soap_class(obj_class)
438
+ end
439
+
440
+ def find_mapped_obj_class(soap_class)
441
+ @map.find_mapped_obj_class(soap_class)
442
+ end
443
+
444
+ private
445
+
446
+ def _obj2soap(obj)
447
+ ret = nil
448
+ if obj.is_a?(SOAPStruct) or obj.is_a?(SOAPArray)
449
+ obj.replace do |ele|
450
+ Mapping._obj2soap(ele, self)
451
+ end
452
+ return obj
453
+ elsif obj.is_a?(SOAPBasetype)
454
+ return obj
455
+ end
456
+ begin
457
+ ret = @map.obj2soap(obj) ||
458
+ @default_factory.obj2soap(nil, obj, nil, self)
459
+ return ret if ret
460
+ rescue MappingError
461
+ end
462
+ if @excn_handler_obj2soap
463
+ ret = @excn_handler_obj2soap.call(obj) { |yield_obj|
464
+ Mapping._obj2soap(yield_obj, self)
465
+ }
466
+ return ret if ret
467
+ end
468
+ raise MappingError.new("Cannot map #{ obj.class.name } to SOAP/OM.")
469
+ end
470
+
471
+ # Might return nil as a mapping result.
472
+ def _soap2obj(node, klass = nil)
473
+ if node.extraattr.key?(RubyTypeName)
474
+ conv, obj = @rubytype_factory.soap2obj(nil, node, nil, self)
475
+ return obj if conv
476
+ else
477
+ conv, obj = @map.soap2obj(node, klass)
478
+ return obj if conv
479
+ conv, obj = @default_factory.soap2obj(nil, node, nil, self)
480
+ return obj if conv
481
+ end
482
+ if @excn_handler_soap2obj
483
+ begin
484
+ return @excn_handler_soap2obj.call(node) { |yield_node|
485
+ Mapping._soap2obj(yield_node, self)
486
+ }
487
+ rescue Exception
488
+ end
489
+ end
490
+ raise MappingError.new("Cannot map #{ node.type.name } to Ruby object.")
491
+ end
492
+
493
+ def addiv2obj(obj, attr)
494
+ return unless attr
495
+ vars = {}
496
+ attr.__getobj__.each do |name, value|
497
+ vars[name] = Mapping._soap2obj(value, self)
498
+ end
499
+ Mapping.set_attributes(obj, vars)
500
+ end
501
+
502
+ if RUBY_VERSION >= '1.8.0'
503
+ def addextend2obj(obj, attr)
504
+ return unless attr
505
+ attr.split(/ /).reverse_each do |mstr|
506
+ obj.extend(Mapping.module_from_name(mstr))
507
+ end
508
+ end
509
+ else
510
+ # (class < false; self; end).ancestors includes "TrueClass" under 1.6...
511
+ def addextend2obj(obj, attr)
512
+ return unless attr
513
+ attr.split(/ /).reverse_each do |mstr|
514
+ m = Mapping.module_from_name(mstr)
515
+ obj.extend(m)
516
+ end
517
+ end
518
+ end
519
+
520
+ def addextend2soap(node, obj)
521
+ return if obj.is_a?(Symbol) or obj.is_a?(Fixnum)
522
+ list = (class << obj; self; end).ancestors - obj.class.ancestors
523
+ unless list.empty?
524
+ node.extraattr[RubyExtendName] = list.collect { |c|
525
+ if c.name.empty?
526
+ raise TypeError.new("singleton can't be dumped #{ obj }")
527
+ end
528
+ c.name
529
+ }.join(" ")
530
+ end
531
+ end
532
+
533
+ end
534
+
535
+
536
+ DefaultRegistry = Registry.new
537
+ RubyOriginalRegistry = Registry.new(:allow_original_mapping => true)
538
+
539
+
540
+ end
541
+ end