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
|