Implement date attribute reading
This is very inefficient implementation. This calls strftime with correct modifier and then atoi() to turn the result into integer
This commit is contained in:
parent
1c1d721f7c
commit
5c5942629d
|
@ -305,7 +305,7 @@ class CompileData:
|
||||||
subq $16, %rsp
|
subq $16, %rsp
|
||||||
movq %rdi, 0(%rsp)
|
movq %rdi, 0(%rsp)
|
||||||
leaq 0(%rsp), %rdi
|
leaq 0(%rsp), %rdi
|
||||||
call gmtime
|
call localtime
|
||||||
movq $date_buffer, %rdi
|
movq $date_buffer, %rdi
|
||||||
movq $(date_buffer_end - date_buffer), %rsi
|
movq $(date_buffer_end - date_buffer), %rsi
|
||||||
movq $date_format, %rdx
|
movq $date_format, %rdx
|
||||||
|
@ -318,6 +318,25 @@ class CompileData:
|
||||||
ret
|
ret
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
self.callables['__builtin_get_day_attr'] = '''\
|
||||||
|
pushq %rbp
|
||||||
|
movq %rsp, %rbp
|
||||||
|
subq $16, %rsp
|
||||||
|
movq %rdi, 0(%rsp)
|
||||||
|
movq %rsi, 8(%rsp)
|
||||||
|
leaq 0(%rsp), %rdi
|
||||||
|
call localtime
|
||||||
|
movq $date_buffer, %rdi
|
||||||
|
movq $(date_buffer_end - date_buffer), %rsi
|
||||||
|
movq 8(%rsp), %rdx
|
||||||
|
movq %rax, %rcx
|
||||||
|
call strftime
|
||||||
|
movq $date_buffer, %rdi
|
||||||
|
call atoi
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
'''
|
||||||
|
|
||||||
def get_label(self) -> str:
|
def get_label(self) -> str:
|
||||||
self.label_counter += 1
|
self.label_counter += 1
|
||||||
return f'.L{self.label_counter - 1}'
|
return f'.L{self.label_counter - 1}'
|
||||||
|
@ -353,6 +372,11 @@ class CompileData:
|
||||||
prefix += 'int_format: .asciz "%lld"\n'
|
prefix += 'int_format: .asciz "%lld"\n'
|
||||||
prefix += 'str_format: .asciz "%s"\n'
|
prefix += 'str_format: .asciz "%s"\n'
|
||||||
prefix += 'date_format: .asciz "%Y-%m-%d"\n'
|
prefix += 'date_format: .asciz "%Y-%m-%d"\n'
|
||||||
|
prefix += 'day_format: .asciz "%d"\n'
|
||||||
|
prefix += 'month_format: .asciz "%m"\n'
|
||||||
|
prefix += 'year_format: .asciz "%Y"\n'
|
||||||
|
prefix += 'weekday_format: .asciz "%u"\n'
|
||||||
|
prefix += 'weeknum_format: .asciz "%W"\n'
|
||||||
for index, string in enumerate(self.string_literals):
|
for index, string in enumerate(self.string_literals):
|
||||||
prefix += f'S{index}: .asciz "{string}"\n'
|
prefix += f'S{index}: .asciz "{string}"\n'
|
||||||
prefix += '\n'
|
prefix += '\n'
|
||||||
|
@ -546,6 +570,11 @@ def compile_ast(node: ASTnode, compile_data: CompileData) -> None:
|
||||||
compile_data.code += f' movq ${label}, %rax\n'
|
compile_data.code += f' movq ${label}, %rax\n'
|
||||||
case 'date_literal':
|
case 'date_literal':
|
||||||
compile_data.code += f' movq ${timegm(node.value.timetuple())}, %rax\n'
|
compile_data.code += f' movq ${timegm(node.value.timetuple())}, %rax\n'
|
||||||
|
case 'attribute_read':
|
||||||
|
compile_ast(node.child_identifier, compile_data)
|
||||||
|
compile_data.code += f' movq %rax, %rdi\n'
|
||||||
|
compile_data.code += f' movq ${node.child_attribute.value}_format, %rsi\n'
|
||||||
|
compile_data.code += f' call __builtin_get_day_attr\n'
|
||||||
case 'do_until':
|
case 'do_until':
|
||||||
label_loop = compile_data.get_label()
|
label_loop = compile_data.get_label()
|
||||||
compile_data.insert_label(label_loop)
|
compile_data.insert_label(label_loop)
|
||||||
|
|
Loading…
Reference in New Issue