Class: Furnace::AVM2::ABC::File

Inherits:
Record show all
Defined in:
lib/furnace-avm2/abc/metadata/file.rb

Instance Method Summary collapse

Methods inherited from Record

abc_array_of, flag, pool_array, pool_array_of, pool_ref, subset, xlat_direct, xlat_field, xlat_inverse

Methods inherited from Binary::Record

#byte_length, codegen, codegen_each, inherited, #inspect, method_missing, register, #to_hash, trace, trace_scope, trace_value

Instance Method Details

#fix_name!(name_idx, options = {}) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/furnace-avm2/abc/metadata/file.rb', line 47

def fix_name!(name_idx, options={})
  old_name = constant_pool.strings[name_idx - 1]
  return if ["", "*"].include? old_name

  fixed_name = sanitize_name(old_name, options)

  if old_name != fixed_name
    index = 0
    indexed_name = fixed_name
    while @name_set.include? indexed_name
      indexed_name = "#{fixed_name}_i#{index}"
      index += 1
    end

    @name_set.add indexed_name

    constant_pool.strings[name_idx - 1] = indexed_name
  end
end

#fix_names!Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/furnace-avm2/abc/metadata/file.rb', line 31

def fix_names!
  @name_set = Set.new(constant_pool.strings)

  constant_pool.namespaces.each do |ns|
    fix_name!(ns.name_idx, ns: true)
  end

  constant_pool.multinames.each do |multiname|
    if [:QName, :QNameA,
        :Multiname, :MultinameA,
        :RTQName, :RTQMameA].include? multiname.kind
      fix_name!(multiname.data.name_idx)
    end
  end
end

#method_body_at(index) ⇒ Object



27
28
29
# File 'lib/furnace-avm2/abc/metadata/file.rb', line 27

def method_body_at(index)
  @method_body_indexes[index]
end

#rootObject



23
24
25
# File 'lib/furnace-avm2/abc/metadata/file.rb', line 23

def root
  self
end

#sanitize_name(name, options = {}) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/furnace-avm2/abc/metadata/file.rb', line 67

def sanitize_name(name, options={})
  if options[:ns]
    return name if name.start_with? "http://"

    name.split('.').map do |part|
      part.gsub(/^[^a-zA-Z_$]+/, '').
        gsub(/[^a-zA-Z_$0-9:]+/, '')
    end.reject do |part|
      part.empty?
    end.join('.')
  else
    name.gsub(/^[^a-zA-Z_$]+/, '').
      gsub(/[^a-zA-Z_$0-9:]+/, '')
  end
end