Actually just three programming languages in a trenchcoat

Compare changes

Choose any two refs to compare.

Changed files
+86 -23
trilogy-llvm
+49 -16
trilogy-llvm/core/trilogy_callable.c
··· 8 #include <stdint.h> 9 #include <stdlib.h> 10 11 trilogy_value* prepare_closure(uint32_t closure_size) { 12 return calloc_safe(closure_size, sizeof(trilogy_value)); 13 } ··· 37 trilogy_value* return_to, trilogy_value* yield_to, trilogy_value* cancel_to, 38 trilogy_value* resume_to, trilogy_value* break_to, 39 trilogy_value* continue_to, trilogy_value* next_to, trilogy_value* done_to, 40 - trilogy_value* closure, void* p 41 ) { 42 assert(closure == NO_CLOSURE || closure->tag == TAG_ARRAY); 43 callable->rc = 1; ··· 89 *closure = trilogy_undefined; 90 } 91 callable->function = p; 92 TRACE("Initialized callable (%d): %p\n", callable->tag, callable); 93 return callable; 94 } ··· 99 malloc_safe(sizeof(trilogy_callable_value)); 100 trilogy_callable_value_init( 101 callable, CALLABLE_FUNCTION, 1, NULL, NULL, NULL, NULL, NULL, NULL, 102 - NULL, NULL, closure, p 103 ); 104 return trilogy_callable_init(t, callable); 105 } ··· 111 malloc_safe(sizeof(trilogy_callable_value)); 112 trilogy_callable_value_init( 113 callable, CALLABLE_PROCEDURE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 114 - NULL, NULL, closure, p 115 ); 116 return trilogy_callable_init(t, callable); 117 } ··· 123 malloc_safe(sizeof(trilogy_callable_value)); 124 trilogy_callable_value_init( 125 callable, CALLABLE_RULE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 126 - NULL, NULL, closure, p 127 ); 128 return trilogy_callable_init(t, callable); 129 } 130 131 - trilogy_callable_value* 132 - trilogy_callable_init_proc(trilogy_value* t, uint32_t arity, void* p) { 133 - return trilogy_callable_init_do(t, arity, NO_CLOSURE, p); 134 } 135 136 - trilogy_callable_value* trilogy_callable_init_func(trilogy_value* t, void* p) { 137 - return trilogy_callable_init_fn(t, NO_CLOSURE, p); 138 } 139 140 - trilogy_callable_value* 141 - trilogy_callable_init_rule(trilogy_value* t, uint32_t arity, void* p) { 142 - return trilogy_callable_init_qy(t, arity, NO_CLOSURE, p); 143 } 144 145 trilogy_callable_value* trilogy_callable_init_cont( 146 trilogy_value* t, trilogy_value* return_to, trilogy_value* yield_to, 147 trilogy_value* cancel_to, trilogy_value* resume_to, trilogy_value* break_to, 148 trilogy_value* continue_to, trilogy_value* next_to, trilogy_value* done_to, 149 - trilogy_value* closure, void* p 150 ) { 151 assert(closure != NO_CLOSURE); 152 assert(closure->tag == TAG_ARRAY); ··· 154 malloc_safe(sizeof(trilogy_callable_value)); 155 trilogy_callable_value_init( 156 callable, CALLABLE_CONTINUATION, 1, return_to, yield_to, cancel_to, 157 - resume_to, break_to, continue_to, next_to, done_to, closure, p 158 ); 159 return trilogy_callable_init(t, callable); 160 } ··· 171 malloc_safe(sizeof(trilogy_callable_value)); 172 trilogy_callable_value_init( 173 callable, CALLABLE_RESUME, 1, return_to, yield_to, cancel_to, resume_to, 174 - break_to, continue_to, next_to, done_to, closure, p 175 ); 176 return trilogy_callable_init(t, callable); 177 } ··· 188 malloc_safe(sizeof(trilogy_callable_value)); 189 trilogy_callable_value_init( 190 callable, CALLABLE_CONTINUE, 1, return_to, yield_to, cancel_to, 191 - resume_to, break_to, continue_to, next_to, done_to, closure, p 192 ); 193 return trilogy_callable_init(t, callable); 194 }
··· 8 #include <stdint.h> 9 #include <stdlib.h> 10 11 + static const char* CALLABLE_NAME_FN = "<fn>"; 12 + static const char* CALLABLE_NAME_DO = "<do>"; 13 + static const char* CALLABLE_NAME_QY = "<qy>"; 14 + static const char* CALLABLE_NAME_RETURN = "<return>"; 15 + static const char* CALLABLE_NAME_CANCEL = "<cancel>"; 16 + static const char* CALLABLE_NAME_RESUME = "<resume>"; 17 + static const char* CALLABLE_NAME_BREAK = "<break>"; 18 + static const char* CALLABLE_NAME_CONTINUE = "<continue>"; 19 + 20 trilogy_value* prepare_closure(uint32_t closure_size) { 21 return calloc_safe(closure_size, sizeof(trilogy_value)); 22 } ··· 46 trilogy_value* return_to, trilogy_value* yield_to, trilogy_value* cancel_to, 47 trilogy_value* resume_to, trilogy_value* break_to, 48 trilogy_value* continue_to, trilogy_value* next_to, trilogy_value* done_to, 49 + trilogy_value* closure, void* p, const char* name 50 ) { 51 assert(closure == NO_CLOSURE || closure->tag == TAG_ARRAY); 52 callable->rc = 1; ··· 98 *closure = trilogy_undefined; 99 } 100 callable->function = p; 101 + callable->name = name; 102 TRACE("Initialized callable (%d): %p\n", callable->tag, callable); 103 return callable; 104 } ··· 109 malloc_safe(sizeof(trilogy_callable_value)); 110 trilogy_callable_value_init( 111 callable, CALLABLE_FUNCTION, 1, NULL, NULL, NULL, NULL, NULL, NULL, 112 + NULL, NULL, closure, p, CALLABLE_NAME_FN 113 ); 114 return trilogy_callable_init(t, callable); 115 } ··· 121 malloc_safe(sizeof(trilogy_callable_value)); 122 trilogy_callable_value_init( 123 callable, CALLABLE_PROCEDURE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 124 + NULL, NULL, closure, p, CALLABLE_NAME_DO 125 ); 126 return trilogy_callable_init(t, callable); 127 } ··· 133 malloc_safe(sizeof(trilogy_callable_value)); 134 trilogy_callable_value_init( 135 callable, CALLABLE_RULE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 136 + NULL, NULL, closure, p, CALLABLE_NAME_QY 137 ); 138 return trilogy_callable_init(t, callable); 139 } 140 141 + trilogy_callable_value* trilogy_callable_init_proc( 142 + trilogy_value* t, uint32_t arity, void* p, const char* name 143 + ) { 144 + trilogy_callable_value* callable = 145 + malloc_safe(sizeof(trilogy_callable_value)); 146 + trilogy_callable_value_init( 147 + callable, CALLABLE_PROCEDURE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 148 + NULL, NULL, NO_CLOSURE, p, name 149 + ); 150 + return trilogy_callable_init(t, callable); 151 } 152 153 + trilogy_callable_value* 154 + trilogy_callable_init_func(trilogy_value* t, void* p, const char* name) { 155 + trilogy_callable_value* callable = 156 + malloc_safe(sizeof(trilogy_callable_value)); 157 + trilogy_callable_value_init( 158 + callable, CALLABLE_FUNCTION, 1, NULL, NULL, NULL, NULL, NULL, NULL, 159 + NULL, NULL, NO_CLOSURE, p, name 160 + ); 161 + return trilogy_callable_init(t, callable); 162 } 163 164 + trilogy_callable_value* trilogy_callable_init_rule( 165 + trilogy_value* t, uint32_t arity, void* p, const char* name 166 + ) { 167 + trilogy_callable_value* callable = 168 + malloc_safe(sizeof(trilogy_callable_value)); 169 + trilogy_callable_value_init( 170 + callable, CALLABLE_RULE, arity, NULL, NULL, NULL, NULL, NULL, NULL, 171 + NULL, NULL, NO_CLOSURE, p, name 172 + ); 173 + return trilogy_callable_init(t, callable); 174 } 175 176 trilogy_callable_value* trilogy_callable_init_cont( 177 trilogy_value* t, trilogy_value* return_to, trilogy_value* yield_to, 178 trilogy_value* cancel_to, trilogy_value* resume_to, trilogy_value* break_to, 179 trilogy_value* continue_to, trilogy_value* next_to, trilogy_value* done_to, 180 + trilogy_value* closure, void* p, const char* name 181 ) { 182 assert(closure != NO_CLOSURE); 183 assert(closure->tag == TAG_ARRAY); ··· 185 malloc_safe(sizeof(trilogy_callable_value)); 186 trilogy_callable_value_init( 187 callable, CALLABLE_CONTINUATION, 1, return_to, yield_to, cancel_to, 188 + resume_to, break_to, continue_to, next_to, done_to, closure, p, name 189 ); 190 return trilogy_callable_init(t, callable); 191 } ··· 202 malloc_safe(sizeof(trilogy_callable_value)); 203 trilogy_callable_value_init( 204 callable, CALLABLE_RESUME, 1, return_to, yield_to, cancel_to, resume_to, 205 + break_to, continue_to, next_to, done_to, closure, p, 206 + CALLABLE_NAME_RESUME 207 ); 208 return trilogy_callable_init(t, callable); 209 } ··· 220 malloc_safe(sizeof(trilogy_callable_value)); 221 trilogy_callable_value_init( 222 callable, CALLABLE_CONTINUE, 1, return_to, yield_to, cancel_to, 223 + resume_to, break_to, continue_to, next_to, done_to, closure, p, 224 + CALLABLE_NAME_CONTINUE 225 ); 226 return trilogy_callable_init(t, callable); 227 }
+8 -5
trilogy-llvm/core/trilogy_callable.h
··· 15 trilogy_value* t, uint32_t arity, trilogy_value* closure, void* p 16 ); 17 18 - trilogy_callable_value* trilogy_callable_init_func(trilogy_value* t, void* p); 19 trilogy_callable_value* 20 - trilogy_callable_init_proc(trilogy_value* t, uint32_t arity, void* p); 21 - trilogy_callable_value* 22 - trilogy_callable_init_rule(trilogy_value* t, uint32_t arity, void* p); 23 trilogy_callable_value* trilogy_callable_init_cont( 24 trilogy_value* t, trilogy_value* return_to /* moved */, 25 trilogy_value* yield_to /* moved */, trilogy_value* cancel_to /* moved */, 26 trilogy_value* resume_to /* moved */, trilogy_value* break_to /* moved */, 27 trilogy_value* continue_to /* moved */, trilogy_value* next_to /* moved */, 28 trilogy_value* done_to /* moved */, trilogy_value* closure /* moved */, 29 - void* p 30 ); 31 trilogy_callable_value* trilogy_callable_init_resume( 32 trilogy_value* t, trilogy_value* return_to /* moved */,
··· 15 trilogy_value* t, uint32_t arity, trilogy_value* closure, void* p 16 ); 17 18 trilogy_callable_value* 19 + trilogy_callable_init_func(trilogy_value* t, void* p, const char* name); 20 + trilogy_callable_value* trilogy_callable_init_proc( 21 + trilogy_value* t, uint32_t arity, void* p, const char* name 22 + ); 23 + trilogy_callable_value* trilogy_callable_init_rule( 24 + trilogy_value* t, uint32_t arity, void* p, const char* name 25 + ); 26 trilogy_callable_value* trilogy_callable_init_cont( 27 trilogy_value* t, trilogy_value* return_to /* moved */, 28 trilogy_value* yield_to /* moved */, trilogy_value* cancel_to /* moved */, 29 trilogy_value* resume_to /* moved */, trilogy_value* break_to /* moved */, 30 trilogy_value* continue_to /* moved */, trilogy_value* next_to /* moved */, 31 trilogy_value* done_to /* moved */, trilogy_value* closure /* moved */, 32 + void* p, const char* name 33 ); 34 trilogy_callable_value* trilogy_callable_init_resume( 35 trilogy_value* t, trilogy_value* return_to /* moved */,
+5
trilogy-llvm/core/types.h
··· 214 * Pointer to the function itself. 215 */ 216 void* function; 217 } trilogy_callable_value; 218 219 /**
··· 214 * Pointer to the function itself. 215 */ 216 void* function; 217 + /** 218 + * The defined name or builtin symbol of the callable. This string is a 219 + * static C-string. 220 + */ 221 + const char* name; 222 } trilogy_callable_value; 223 224 /**
+16
trilogy-llvm/src/bare.rs
··· 1425 t: PointerValue<'ctx>, 1426 arity: usize, 1427 function: FunctionValue<'ctx>, 1428 ) { 1429 let f = self.declare_bare( 1430 "trilogy_callable_init_proc", 1431 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1433 self.context.ptr_type(AddressSpace::default()).into(), 1434 self.context.i64_type().into(), 1435 self.context.ptr_type(AddressSpace::default()).into(), 1436 ], 1437 false, 1438 ), ··· 1447 .const_int(arity as u64, false) 1448 .into(), 1449 function.as_global_value().as_pointer_value().into(), 1450 ], 1451 "", 1452 ) ··· 1457 &self, 1458 t: PointerValue<'ctx>, 1459 function: FunctionValue<'ctx>, 1460 ) { 1461 let f = self.declare_bare( 1462 "trilogy_callable_init_func", 1463 self.context.ptr_type(AddressSpace::default()).fn_type( 1464 &[ 1465 self.context.ptr_type(AddressSpace::default()).into(), 1466 self.context.ptr_type(AddressSpace::default()).into(), 1467 ], 1468 false, 1469 ), ··· 1474 &[ 1475 t.into(), 1476 function.as_global_value().as_pointer_value().into(), 1477 ], 1478 "", 1479 ) ··· 1515 t: PointerValue<'ctx>, 1516 arity: usize, 1517 function: FunctionValue<'ctx>, 1518 ) { 1519 let f = self.declare_bare( 1520 "trilogy_callable_init_rule", 1521 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1523 self.context.ptr_type(AddressSpace::default()).into(), 1524 self.context.i64_type().into(), 1525 self.context.ptr_type(AddressSpace::default()).into(), 1526 ], 1527 false, 1528 ), ··· 1537 .const_int(arity as u64, false) 1538 .into(), 1539 function.as_global_value().as_pointer_value().into(), 1540 ], 1541 "", 1542 ) ··· 1746 done_to: PointerValue<'ctx>, 1747 closure: PointerValue<'ctx>, 1748 function: FunctionValue<'ctx>, 1749 ) { 1750 let f = self.declare_bare( 1751 "trilogy_callable_init_cont", 1752 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1762 self.context.ptr_type(AddressSpace::default()).into(), 1763 self.context.ptr_type(AddressSpace::default()).into(), 1764 self.context.ptr_type(AddressSpace::default()).into(), 1765 ], 1766 false, 1767 ), ··· 1781 done_to.into(), 1782 closure.into(), 1783 function.as_global_value().as_pointer_value().into(), 1784 ], 1785 "", 1786 )
··· 1425 t: PointerValue<'ctx>, 1426 arity: usize, 1427 function: FunctionValue<'ctx>, 1428 + name: &str, 1429 ) { 1430 + let name_const = self.c_str(name); 1431 let f = self.declare_bare( 1432 "trilogy_callable_init_proc", 1433 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1435 self.context.ptr_type(AddressSpace::default()).into(), 1436 self.context.i64_type().into(), 1437 self.context.ptr_type(AddressSpace::default()).into(), 1438 + self.context.ptr_type(AddressSpace::default()).into(), 1439 ], 1440 false, 1441 ), ··· 1450 .const_int(arity as u64, false) 1451 .into(), 1452 function.as_global_value().as_pointer_value().into(), 1453 + name_const.into(), 1454 ], 1455 "", 1456 ) ··· 1461 &self, 1462 t: PointerValue<'ctx>, 1463 function: FunctionValue<'ctx>, 1464 + name: &str, 1465 ) { 1466 + let name_const = self.c_str(name); 1467 let f = self.declare_bare( 1468 "trilogy_callable_init_func", 1469 self.context.ptr_type(AddressSpace::default()).fn_type( 1470 &[ 1471 self.context.ptr_type(AddressSpace::default()).into(), 1472 self.context.ptr_type(AddressSpace::default()).into(), 1473 + self.context.ptr_type(AddressSpace::default()).into(), 1474 ], 1475 false, 1476 ), ··· 1481 &[ 1482 t.into(), 1483 function.as_global_value().as_pointer_value().into(), 1484 + name_const.into(), 1485 ], 1486 "", 1487 ) ··· 1523 t: PointerValue<'ctx>, 1524 arity: usize, 1525 function: FunctionValue<'ctx>, 1526 + name: &str, 1527 ) { 1528 + let name_const = self.c_str(name); 1529 let f = self.declare_bare( 1530 "trilogy_callable_init_rule", 1531 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1533 self.context.ptr_type(AddressSpace::default()).into(), 1534 self.context.i64_type().into(), 1535 self.context.ptr_type(AddressSpace::default()).into(), 1536 + self.context.ptr_type(AddressSpace::default()).into(), 1537 ], 1538 false, 1539 ), ··· 1548 .const_int(arity as u64, false) 1549 .into(), 1550 function.as_global_value().as_pointer_value().into(), 1551 + name_const.into(), 1552 ], 1553 "", 1554 ) ··· 1758 done_to: PointerValue<'ctx>, 1759 closure: PointerValue<'ctx>, 1760 function: FunctionValue<'ctx>, 1761 + name: &str, 1762 ) { 1763 + let name_const = self.c_str(name); 1764 let f = self.declare_bare( 1765 "trilogy_callable_init_cont", 1766 self.context.ptr_type(AddressSpace::default()).fn_type( ··· 1776 self.context.ptr_type(AddressSpace::default()).into(), 1777 self.context.ptr_type(AddressSpace::default()).into(), 1778 self.context.ptr_type(AddressSpace::default()).into(), 1779 + self.context.ptr_type(AddressSpace::default()).into(), 1780 ], 1781 false, 1782 ), ··· 1796 done_to.into(), 1797 closure.into(), 1798 function.as_global_value().as_pointer_value().into(), 1799 + name_const.into(), 1800 ], 1801 "", 1802 )
+1 -1
trilogy-llvm/src/rule.rs
··· 19 let ctx = accessor.get_nth_param(1).unwrap().into_pointer_value(); 20 self.trilogy_callable_init_qy(sret, arity, ctx, accessing); 21 } else { 22 - self.trilogy_callable_init_rule(sret, arity, accessing); 23 } 24 self.builder.build_return(None).unwrap(); 25 }
··· 19 let ctx = accessor.get_nth_param(1).unwrap().into_pointer_value(); 20 self.trilogy_callable_init_qy(sret, arity, ctx, accessing); 21 } else { 22 + self.trilogy_callable_init_rule(sret, arity, accessing, name); 23 } 24 self.builder.build_return(None).unwrap(); 25 }
+7 -1
trilogy-llvm/src/types.rs
··· 1 use crate::codegen::Codegen; 2 use bitvec::field::BitField; 3 use inkwell::basic_block::BasicBlock; ··· 239 } 240 241 pub(crate) fn string_const(&self, into: PointerValue<'ctx>, value: &str) { 242 let bytes = value.as_bytes(); 243 let string = self.module.add_global( 244 self.context.i8_type().array_type(bytes.len() as u32), ··· 247 ); 248 string.set_initializer(&self.context.const_string(bytes, false)); 249 string.set_constant(true); 250 - self.trilogy_string_init_new(into, value.len(), string.as_pointer_value()); 251 } 252 253 pub(crate) fn bits_const(&self, into: PointerValue<'ctx>, value: &Bits) {
··· 1 + use std::fmt::Pointer; 2 + 3 use crate::codegen::Codegen; 4 use bitvec::field::BitField; 5 use inkwell::basic_block::BasicBlock; ··· 241 } 242 243 pub(crate) fn string_const(&self, into: PointerValue<'ctx>, value: &str) { 244 + self.trilogy_string_init_new(into, value.len(), self.c_str(value)); 245 + } 246 + 247 + pub(crate) fn c_str(&self, value: &str) -> PointerValue<'ctx> { 248 let bytes = value.as_bytes(); 249 let string = self.module.add_global( 250 self.context.i8_type().array_type(bytes.len() as u32), ··· 253 ); 254 string.set_initializer(&self.context.const_string(bytes, false)); 255 string.set_constant(true); 256 + string.as_pointer_value() 257 } 258 259 pub(crate) fn bits_const(&self, into: PointerValue<'ctx>, value: &Bits) {