aboutsummaryrefslogtreecommitdiffstats
path: root/lib/soap
diff options
context:
space:
mode:
Diffstat (limited to 'lib/soap')
-rw-r--r--lib/soap/mapping/factory.rb23
-rw-r--r--lib/soap/mapping/registry.rb19
-rw-r--r--lib/soap/soap.rb2
3 files changed, 37 insertions, 7 deletions
diff --git a/lib/soap/mapping/factory.rb b/lib/soap/mapping/factory.rb
index 92ed194a42..631c161134 100644
--- a/lib/soap/mapping/factory.rb
+++ b/lib/soap/mapping/factory.rb
@@ -44,10 +44,29 @@ class Factory
klass.allocate
end
else
+ MARSHAL_TAG = {
+ String => ['"', 1],
+ Regexp => ['/', 2],
+ Array => ['[', 1],
+ Hash => ['{', 1]
+ }
def create_empty_object(klass)
+ if klass <= Struct
+ name = klass.name
+ return ::Marshal.load(sprintf("\004\006S:%c%s\000", name.length + 5, name))
+ end
+ if MARSHAL_TAG.has_key?(klass)
+ tag, terminate = MARSHAL_TAG[klass]
+ return ::Marshal.load(sprintf("\004\006%s%s", tag, "\000" * terminate))
+ end
+ MARSHAL_TAG.each do |k, v|
+ if klass < k
+ name = klass.name
+ tag, terminate = v
+ return ::Marshal.load(sprintf("\004\006C:%c%s%s%s", name.length + 5, name, tag, "\000" * terminate))
+ end
+ end
name = klass.name
- # Below line is from TANAKA, Akira's amarshal.rb.
- # See http://cvs.m17n.org/cgi-bin/viewcvs/amarshal/?cvsroot=ruby
::Marshal.load(sprintf("\004\006o:%c%s\000", name.length + 5, name))
end
end
diff --git a/lib/soap/mapping/registry.rb b/lib/soap/mapping/registry.rb
index bdf14d4fc6..e98c98a6d4 100644
--- a/lib/soap/mapping/registry.rb
+++ b/lib/soap/mapping/registry.rb
@@ -426,10 +426,21 @@ private
Mapping.set_instance_vars(obj, vars)
end
- def addextend2obj(obj, attr)
- return unless attr
- attr.split(/ /).reverse_each do |mstr|
- obj.extend(Mapping.class_from_name(mstr))
+ if RUBY_VERSION >= '1.8.0'
+ def addextend2obj(obj, attr)
+ return unless attr
+ attr.split(/ /).reverse_each do |mstr|
+ obj.extend(Mapping.class_from_name(mstr))
+ end
+ end
+ else
+ # (class < false; self; end).ancestors includes "TrueClass" under 1.6...
+ def addextend2obj(obj, attr)
+ return unless attr
+ attr.split(/ /).reverse_each do |mstr|
+ m = Mapping.class_from_name(mstr)
+ obj.extend(m) if m.class == Module
+ end
end
end
diff --git a/lib/soap/soap.rb b/lib/soap/soap.rb
index 313af3a059..2543ec3612 100644
--- a/lib/soap/soap.rb
+++ b/lib/soap/soap.rb
@@ -24,7 +24,7 @@ require 'xsd/charset'
module SOAP
-Version = '1.5.0'
+Version = '1.5.1'
EnvelopeNamespace = 'http://schemas.xmlsoap.org/soap/envelope/'
EncodingNamespace = 'http://schemas.xmlsoap.org/soap/encoding/'