Add minimal abstract machine module
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
add_library(imp
|
add_library(imp
|
||||||
|
am.c
|
||||||
memory_stream.c
|
memory_stream.c
|
||||||
store.c
|
store.c
|
||||||
token.c
|
token.c
|
||||||
|
|||||||
22
lib/am.c
Normal file
22
lib/am.c
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include "am.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void am_init(am_t *am)
|
||||||
|
{
|
||||||
|
memset(am, 0, sizeof(am_t));
|
||||||
|
am->sp = am->stack + AM_STACK_SIZE - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am_push(am_t *am)
|
||||||
|
{
|
||||||
|
assert(am->sp >= am->stack);
|
||||||
|
*am->sp-- = am->expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am_pop(am_t *am)
|
||||||
|
{
|
||||||
|
assert(am->sp < am->stack + AM_STACK_SIZE - 1);
|
||||||
|
am->expr = *++am->sp;
|
||||||
|
}
|
||||||
17
lib/include/am.h
Normal file
17
lib/include/am.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef AM_H
|
||||||
|
#define AM_H
|
||||||
|
|
||||||
|
#include "expr.h"
|
||||||
|
|
||||||
|
#define AM_STACK_SIZE 128U
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
expr_t *expr;
|
||||||
|
expr_t **sp, *stack[AM_STACK_SIZE];
|
||||||
|
} am_t;
|
||||||
|
|
||||||
|
void am_init(am_t *am);
|
||||||
|
void am_push(am_t *am);
|
||||||
|
void am_pop(am_t *am);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -9,6 +9,7 @@ function(add_test_suites)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
add_test_suites(
|
add_test_suites(
|
||||||
|
am_tests.c
|
||||||
store_tests.c
|
store_tests.c
|
||||||
token_tests.c
|
token_tests.c
|
||||||
)
|
)
|
||||||
|
|||||||
30
tests/am_tests.c
Normal file
30
tests/am_tests.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#include "am.h"
|
||||||
|
#include "unity.h"
|
||||||
|
|
||||||
|
static am_t am;
|
||||||
|
|
||||||
|
void setUp(void)
|
||||||
|
{
|
||||||
|
am_init(&am);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tearDown(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_expr_value_restored_after_push_modify_pop(void)
|
||||||
|
{
|
||||||
|
expr_t a, b;
|
||||||
|
am.expr = &a;
|
||||||
|
am_push(&am);
|
||||||
|
am.expr = &b;
|
||||||
|
am_pop(&am);
|
||||||
|
TEST_ASSERT_EQUAL(&a, am.expr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
UNITY_BEGIN();
|
||||||
|
RUN_TEST(test_expr_value_restored_after_push_modify_pop);
|
||||||
|
return UNITY_END();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user