Skip to content

Commit

Permalink
Fix struct serialization problem
Browse files Browse the repository at this point in the history
  • Loading branch information
divoxx committed Oct 5, 2009
1 parent d874a0a commit 561f52b
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 10 deletions.
5 changes: 5 additions & 0 deletions lib/php_serialization/serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ def run(object)
"a:#{object.length}:{#{items}}"
else
klass_name = object.class.name

if klass_name =~ /^Struct::/ && php_klass = object.instance_variable_get("@_php_class")
klass_name = php_klass
end

attributes = object.instance_variables.map { |var_name| "#{run(var_name.gsub(/^@/, ''))}#{run(object.instance_variable_get(var_name))}" }
"O:#{klass_name.length}:\"#{klass_name}\":#{object.instance_variables.length}:{#{attributes}}"
end
Expand Down
18 changes: 10 additions & 8 deletions lib/php_serialization/unserializer.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions lib/php_serialization/unserializer.y
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,16 @@ rule

object : 'O' ':' NUMBER ':' STRING ':' NUMBER ':' '{' attribute_list '}'
{
if Object.const_defined?(val[4])
if eval("defined?(#{val[4]})")
result = Object.const_get(val[4]).new

val[9].each do |(attr_name, value)|
result.instance_variable_set("@#{attr_name.gsub(/(^\*)|\0/, '')}", value)
end
else
result = Struct.new(val[4], *val[9].map { |(k,v)| k.gsub(/(^\*)|\0/, '').to_sym }).new(*val[9].map { |(k,v)| v })
klass_name = val[4].gsub(/^Struct::/, '')
result = Struct.new(klass_name, *val[9].map { |(k,v)| k.gsub(/(^\*)|\0/, '').to_sym }).new(*val[9].map { |(k,v)| v })
result.instance_variable_set("@_php_class", klass_name)
end
}
;
Expand Down

0 comments on commit 561f52b

Please sign in to comment.