mirror of https://github.com/tbklang/tlang.git
Pointer support (#2)
* Make branches not identical * Removed temporary file * Typecheck - Added `attemptPointerAriehmeticCoercion(Value, Value)` * Typechecker - Moved `attemptPointerAriehmeticCoercion(Value, Value)` to class-level and made privately accessible * Test cases - Added pointer arithmetic in the form of `*(ptr+0)` to `simple_pointer.t` to start testing it out * Typechecker - When handling `BinaryOperatorExpression` call `attemptPointerAriehmeticCoercion(Value, Value)` with both `(vLhsInstr, vRhsInstr)` before we call `vLhsInstr.getInstrType()` and `vRhsInstr.getInstrType()` before `isSameType(vLhsType, vRhsType)`. By doing so we attempt to coerce the types of both instructions if one is a pointer and another is an integer, else do nothing * DGen - When emitting for `PointerDereferenceAssignmentInstruction` we didn't wrap `<expr>` with `()`. So instead of `*(<expre>)` we got `*<expr>` which doesn't work if you're doing pointer arithmetic * Test cases - Added `simple_pointer_cast.t` to test casting (currently broken parsing-wise) DGen - Added a todo for semantic tests for the `simple_pointer_cast.t` test case * Parser - Added a TODO - we need a `parseType()` * Test cases - Removed `simple_cast_complex_type.t` as it is wrong, syntax wise * Test cases - Removed coercion usage, I am only testing the casting here (explicit) * Test cases - Removed `simple_pointer_cast.t` and replace it with `simple_pointer_cast_le.t` which casts the integer pointer to a byte pointer and sets the lowest significant byte (little endian hence at base of integer) to `2+2` DGen - Added semantic test for `simple_pointer_cast_le.t` * Test cases - Update `simple_pointer_cast_le.t` to do some pointer airthmetic at the byte-level of the 32-bit integer DGen - Updated the semantic test code generation for `simple_pointer_cast_le.t` to check for new values * Added 'simple_pointer_cast_le.t' to Emit tests * TypeChecker - Update `isSameType(Type t1, Type t2)` to now handle pointers explicitly and in a recursive manner based on their referred types - This check occurs before the `Integer` type check therefore following the rule of most specific types to least * Test cases - Added new test case `simple_pointer_malloc.t` - Added semantic code test generation for `simple_pointer_malloc.t` - Added `malloc_test.sh` to compile and generate `mem.o` from `mem.c` to link it then with `simple_pointer_malloc.t` - Added `mem.c` external C file to generate the required `mem.o` for linking against `simple_pointer_malloc.t` * Test cases - Updated `malloc_test.sh` to look for any `brk()` system calls and fixed its interpreter pathfeature/parser_interface
parent
fca2bac20e
commit
493da1a4e7
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Compile C to object file as library to link in
|
||||
gcc source/tlang/testing/mem.c -c -o mem.o
|
||||
|
||||
# Compile T to C, then compile C and link with other object file into a final object file
|
||||
./tlang compile source/tlang/testing/simple_pointer_malloc.t -sm HASHMAPPER -et true -pg true -ll mem.o
|
||||
|
||||
# Run the tlang file
|
||||
./tlang.out
|
||||
|
||||
# Run (with strace) to see it
|
||||
strace -e brk ./tlang.out
|
@ -0,0 +1,13 @@
|
||||
#include<stdlib.h>
|
||||
|
||||
int ctr = 2;
|
||||
|
||||
unsigned long* memAlloc(unsigned long sizeAlloc)
|
||||
{
|
||||
return malloc(sizeAlloc);
|
||||
}
|
||||
|
||||
void memFree(unsigned long* memory)
|
||||
{
|
||||
free(memory);
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
module simple_pointer_cast_le;
|
||||
|
||||
int j;
|
||||
|
||||
int ret()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int function(int* ptr)
|
||||
{
|
||||
byte* bytePtr = cast(byte*)ptr;
|
||||
*bytePtr = 2+2;
|
||||
*(bytePtr+1) = 1;
|
||||
|
||||
return (*ptr)+1*2;
|
||||
}
|
||||
|
||||
int thing()
|
||||
{
|
||||
int discardExpr = function(&j);
|
||||
int** l;
|
||||
|
||||
return discardExpr;
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
module simple_pointer_malloc;
|
||||
|
||||
extern efunc ubyte* memAlloc(ulong size);
|
||||
extern efunc void memFree(ubyte* ptr);
|
||||
|
||||
void test()
|
||||
{
|
||||
ubyte* memory = memAlloc(10UL);
|
||||
|
||||
for(int i = 0; i < 10; i = i + 1)
|
||||
{
|
||||
*(memory+i) = 65+i;
|
||||
}
|
||||
|
||||
discard memFree(memory);
|
||||
}
|
Loading…
Reference in new issue