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