Module: Carbon::Compiler::Visitor::Generation::Expressions

Includes:
Assignment, Calls
Included in:
Carbon::Compiler::Visitor::Generation
Defined in:
lib/carbon/compiler/visitor/generation/expressions.rb,
lib/carbon/compiler/visitor/generation/expressions/calls.rb,
lib/carbon/compiler/visitor/generation/expressions/assignment.rb

Defined Under Namespace

Modules: Assignment, Calls

Instance Method Summary collapse

Methods included from Calls

#visit_expression_call_access, #visit_expression_call_attribute, #visit_expression_call_enum, #visit_expression_call_module, #visit_expression_call_self, #visit_expression_call_unified

Methods included from Assignment

#visit_expression_assignment

Instance Method Details

#visit_expression_literal(node, context) ⇒ Object



16
17
18
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 16

def visit_expression_literal(node, context)
  Tacky::Typed.new(node.value, node.type)
end

#visit_expression_operation_and(node, context) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 23

def visit_expression_operation_and(node, context)
  context.build do |b|
    left = accept(node.left, context)
    assert_type_boolean(left.type, location: node.left.location)
    lchk = b.icmp(:ne, left, 0).as(Carbon::Boolean)
    right = accept(node.right, context)
    assert_type_boolean(right.type, location: node.right.location)
    rchk = b.icmp(:ne, right, 0).as(Carbon::Boolean)
    b.and(lchk, rchk).as(Carbon::Boolean)
  end
end

#visit_expression_operation_neq(node, context) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 51

def visit_expression_operation_neq(node, context)
  context.build do |b|
    left = accept(node.left, context)
    right = accept(node.right, context)
    name = left.type.call(:==, [left.type, right.type])
    result = b.call(name, left, right).as(Carbon::Boolean)
    context.type(b.xor(result, 1), Carbon::Boolean)
  end
end

#visit_expression_operation_normal(node, context) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 63

def visit_expression_operation_normal(node, context)
  context.build do |b|
    left = accept(node.left, context)
    right = accept(node.right, context)
    name = left.type.call(node.op.value, [left.type, right.type])
    type = context.find(name).return
    b.call(name, left, right).as(type)
  end
end

#visit_expression_operation_or(node, context) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 37

def visit_expression_operation_or(node, context)
  context.build do |b|
    left = accept(node.left, context)
    assert_type_boolean(left.type, location: node.left.location)
    lchk = b.icmp(:ne, left, 0).as(Carbon::Boolean)
    right = accept(node.right, context)
    assert_type_boolean(left.right, location: node.right.location)
    rchk = b.icmp(:ne, right, 0).as(Carbon::Boolean)
    b.or(lchk, rchk).as(Carbon::Boolean)
  end
end

#visit_name(node, context) ⇒ Object



74
75
76
77
# File 'lib/carbon/compiler/visitor/generation/expressions.rb', line 74

def visit_name(node, context)
  value = context.current.fetch(node.value)
  context.build.load(value).as(value.type)
end