diff --git a/lang/compile.py b/lang/compile.py index eea4cca..f878f2a 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -27,6 +27,13 @@ def __repr__(self): return 'ASTBoolean(value=%s)' % (self.value) +class ASTNone(): + def __init__(self): + pass + + def __repr__(self): + return 'ASTNone()' + class ASTReference(): def __init__(self, name): self.name = name @@ -95,6 +102,8 @@ return ASTBoolean(True) elif val == "False": return ASTBoolean(False) + elif val == "None": + return ASTNone() else: return ASTReference(val) @@ -208,6 +217,13 @@ def __repr__(self): return 'IRBoolean(value=%s)' % (self.value) +class IRNone(): + def __init__(self): + pass + + def __repr__(self): + return 'IRNone()' + class IRAllocate(): def __init__(self, size): self.size = size @@ -275,6 +291,8 @@ return [IRNumber(value.number)] elif isinstance(value, ASTBoolean): return [IRBoolean(value.value)] + elif isinstance(value, ASTNone): + return [IRNone()] elif isinstance(value, ASTReference): if value.name == "Self": return [IRSelf()] @@ -441,6 +459,8 @@ bool_value = int(node.value == 1) bytes += b"\x0B" # OP_BOOLEAN bytes += bool_value.to_bytes(1, 'little') + elif isinstance(node, IRNone): + bytes += b"\x05" # OP_NONE elif isinstance(node, IRAllocate): for i in range(0, node.size): bytes += b"\x05" # OP_NONE diff --git a/lang/main.c b/lang/main.c index d6c06d0..2e13c68 100644 --- a/lang/main.c +++ b/lang/main.c @@ -36,6 +36,11 @@ abort_if( boolean_value(boolA) != false, "code return bool is not false"); object_drop(&boolA); + vm_stack_push(state, object_none()); + vm_call(state, module, "NoneTest", 1); + Object noneA = vm_stack_pop(state); + abort_if(noneA != object_none(), "code return none is not none"); + object_drop(&noneA); object_drop(&numA); object_drop(&module); } diff --git a/lang/modules/main.txt b/lang/modules/main.txt index 710a389..f7a9f77 100644 --- a/lang/modules/main.txt +++ b/lang/modules/main.txt @@ -3,6 +3,10 @@ Set B To A Not Return B EndFunction +Function NoneTest +Set A To None +Return A +EndFunction Function GetHalfish Args Num Set FinalNum To Num Minus 2 Return FinalNum