Module: MilkTea::LowererStrBuffer

Included in:
Lowerer
Defined in:
lib/milk_tea/core/lowering/str_buffer.rb

Instance Method Summary collapse

Instance Method Details

#lower_char_array_data_pointer(expression, env:) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 56

def lower_char_array_data_pointer(expression, env:)
  lowered_receiver = lower_expression(expression, env:)
  IR::AddressOf.new(
    expression: IR::Index.new(
      receiver: lowered_receiver,
      index: IR::IntegerLiteral.new(value: 0, type: @ctx.types.fetch("ptr_uint")),
      type: @ctx.types.fetch("char"),
    ),
    type: pointer_to(@ctx.types.fetch("char")),
  )
end

#lower_str_buffer_data_pointer(expression, env:) ⇒ Object



68
69
70
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 68

def lower_str_buffer_data_pointer(expression, env:)
  lower_str_buffer_data_pointer_from_lowered(lower_expression(expression, env:))
end

#lower_str_buffer_data_pointer_from_lowered(lowered_receiver) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 72

def lower_str_buffer_data_pointer_from_lowered(lowered_receiver)
  IR::AddressOf.new(
    expression: IR::Index.new(
      receiver: IR::Member.new(
        receiver: lowered_receiver,
        member: "data",
        type: Types::Registry.generic_instance(
          "array",
          [@ctx.types.fetch("char"), Types::LiteralTypeArg.new(str_buffer_storage_capacity(lowered_receiver.type))],
        ),
      ),
      index: IR::IntegerLiteral.new(value: 0, type: @ctx.types.fetch("ptr_uint")),
      type: @ctx.types.fetch("char"),
    ),
    type: pointer_to(@ctx.types.fetch("char")),
  )
end

#lower_str_buffer_dirty_pointer(expression, env:) ⇒ Object



101
102
103
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 101

def lower_str_buffer_dirty_pointer(expression, env:)
  lower_str_buffer_dirty_pointer_from_lowered(lower_expression(expression, env:))
end

#lower_str_buffer_dirty_pointer_from_lowered(lowered_receiver) ⇒ Object



105
106
107
108
109
110
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 105

def lower_str_buffer_dirty_pointer_from_lowered(lowered_receiver)
  IR::AddressOf.new(
    expression: IR::Member.new(receiver: lowered_receiver, member: "dirty", type: @ctx.types.fetch("bool")),
    type: pointer_to(@ctx.types.fetch("bool")),
  )
end

#lower_str_buffer_len_pointer(expression, env:) ⇒ Object



90
91
92
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 90

def lower_str_buffer_len_pointer(expression, env:)
  lower_str_buffer_len_pointer_from_lowered(lower_expression(expression, env:))
end

#lower_str_buffer_len_pointer_from_lowered(lowered_receiver) ⇒ Object



94
95
96
97
98
99
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 94

def lower_str_buffer_len_pointer_from_lowered(lowered_receiver)
  IR::AddressOf.new(
    expression: IR::Member.new(receiver: lowered_receiver, member: "len", type: @ctx.types.fetch("ptr_uint")),
    type: pointer_to(@ctx.types.fetch("ptr_uint")),
  )
end

#str_buffer_args(receiver, env:) ⇒ Object



112
113
114
115
116
117
118
119
120
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 112

def str_buffer_args(receiver, env:)
  receiver_type = infer_expression_type(receiver, env:)
  [
    lower_str_buffer_data_pointer(receiver, env:),
    IR::IntegerLiteral.new(value: str_buffer_capacity(receiver_type), type: @ctx.types.fetch("ptr_uint")),
    lower_str_buffer_len_pointer(receiver, env:),
    lower_str_buffer_dirty_pointer(receiver, env:),
  ]
end

#str_buffer_method_kind(receiver_type, name) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 5

def str_buffer_method_kind(receiver_type, name)
  return unless str_buffer_type?(receiver_type)

  case name
  when "clear"
    :str_buffer_clear
  when "assign"
    :str_buffer_assign
  when "append"
    :str_buffer_append
  when "assign_format"
    :str_buffer_assign_format
  when "append_format"
    :str_buffer_append_format
  when "len"
    :str_buffer_len
  when "capacity"
    :str_buffer_capacity
  when "as_str"
    :str_buffer_as_str
  when "as_cstr"
    :str_buffer_as_cstr
  end
end

#str_buffer_method_type(kind, receiver_type) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/milk_tea/core/lowering/str_buffer.rb', line 30

def str_buffer_method_type(kind, receiver_type)
  return_type, params = case kind
                        when :str_buffer_clear
                          [@ctx.types.fetch("void"), []]
                        when :str_buffer_assign, :str_buffer_append, :str_buffer_assign_format, :str_buffer_append_format
                          [@ctx.types.fetch("void"), [Types::Registry.parameter("value", @ctx.types.fetch("str"))]]
                        when :str_buffer_len, :str_buffer_capacity
                          [@ctx.types.fetch("ptr_uint"), []]
                        when :str_buffer_as_str
                          [@ctx.types.fetch("str"), []]
                        when :str_buffer_as_cstr
                          [@ctx.types.fetch("cstr"), []]
                        else
                          raise LoweringError.new("unsupported str_buffer method #{kind}", line: 0, column: 0, path: @ctx.current_analysis_path)
                        end

  Types::Registry.function(
    kind.to_s,
    params:,
    return_type:,
    receiver_type:,
    receiver_editable: %i[str_buffer_clear str_buffer_assign str_buffer_append str_buffer_assign_format str_buffer_append_format].include?(kind),
    external: false,
  )
end