Commit graph

55 commits

Author SHA1 Message Date
Adygzhy Ondar
1911acb84f tvm_vm_create(): fix possible NULL pointer dereferencing.
if calloc() doesn't allocate memory for struct tvm_ctx,
there may be NULL pointer dereferencing, i.e. vm->mem, vm->prog.
So the vm pointer verification must be before it is used.

Also, there is the same situation with vm->mem and stack creation.
2017-10-28 14:00:01 +03:00
Adygzhy Ondar
d7d74e6999 tvm_vm_create(): filename parameter is removed. 2017-10-28 13:59:18 +03:00
Joseph Kogut
95cb5ae77a tvm_parse_args(): fix double free 2017-02-12 12:06:20 -08:00
Joseph Kogut
a6fe0cdd65 tvm_prog_destroy(): check arg buckets before free 2017-02-12 12:01:16 -08:00
Joseph Kogut
7e23e632b6 tvm_parse_program(): initialize instr_place 2017-02-12 11:56:27 -08:00
Joseph Kogut
488b88f867 tvm_preprocess: update *src after (re)allocating memory
During preprocessing, we find directives, and if they specify including
other source files, we remove the directive, allocate a new block of
memory, copy the first block, append the new source file, and append the
second block.

Previously, the value of the source pointer was passed into the
preprocessing function. When the memory would be (re)allocated, the
pointer value could change, but the original pointer would not be
updated.

Now, the pointer is passed by address, and updated when the memory it
points to changes.
2017-02-12 11:51:06 -08:00
Joseph Kogut
ca87b3c5e9 Refactor with a consistent coding style
This commit refactors the project using a single, consistent coding
style, derived from the Linux Kernel Coding Style, available here:

https://www.kernel.org/doc/Documentation/CodingStyle

This includes, but is not limited to:
* Removal of typedefs, especially for structs
* Limiting lines to a reasonable length, 80 characters, mostly
* K&R style braces
* Removal of CamelCase
2016-08-28 20:31:12 -07:00
Max Bernstein
de3a679576 no need for gotos... 2014-08-01 18:19:24 +02:00
Payton Turnage
daa02f5082 Fix bug where an outdate node is returned.
If htab_add_core added a node that happened to push the htab past its load
factor, it would return a pointer to where the added node was *before* the
rehash. Now it does not do this.
2014-01-14 20:54:31 -05:00
Payton Turnage
584217a142 Modify htab_add to have a generic core. 2014-01-14 20:03:41 -05:00
Payton Turnage
ae63e45c65 Rename htab functions; rewrite find to be generic.
The htab functions find_str and add_str have been renamed to include _ref in
the places they previously noted _str. These are intended to manage an htab
containing references to any data; string or not.

The htab_find function has been divided up. htab_find_core now handles actually
finding the correct node. htab_find and htab_find_ref are just outward facing
functions for retrieving a specific kind of data from the node, depending on
what the htab is used for.
2014-01-14 19:09:35 -05:00
Payton Turnage
27a090e704 Remove assumption that node is in the bottom of the bucket.
This is the last remaining instance of this assumption.
2014-01-14 00:51:42 -05:00
Payton Turnage
e6d9d92d8c Do not write a value for strings in htab.
The assignment is unnecessary, and was overwriting the first element in the bucket (not the added string's value) in the case of a collision.
2014-01-13 13:50:56 -05:00
Payton Turnage
d945c9a3f6 Add a new function to return strings from htab.
The htab_find_str function eliminates the assumption that the string
is in the first place in the bucket.
2014-01-13 11:31:58 -05:00
Payton Turnage
aa57b007c7 Make sure strings are moved into the rehash. 2014-01-13 11:16:00 -05:00
Payton Turnage
e99a0428f3 Implement defines using the htab structure.
The htab_structure has been modified in two ways, which should not break
compatability with any of its uses.

It includes a void pointer, which is in this commit used to point to a
string for defines, and will in the future be used to point to the address
space for words, bytes, and double words.

It now includes a function htab_add_str specifically for storing strings.
It calls htab_add so as not to be redundant, but makes the node's value
their index for the lexer to fetch using htab_find, and assigns their
void pointer.

The lexer will now use htab_find on all tokens to see if they are a define
string, and if so, substitute them with the appropriate token.

The defines htab is destroyed after lexing, because that memory is done.
2014-01-13 10:20:21 -05:00
Payton Turnage
ed12ce05db Remove all traces of the tvm_tree structure.
It is to be replaced with a htab hash table.
2014-01-13 09:45:27 -05:00
Payton Turnage
b208237960 Allow the preprocessor to abort.
If the preprocessor encounters a problem, such as failing to load a source
file or an improperly formatted define, it should be able to abort running
the program.
2014-01-12 21:56:54 -05:00
Payton Turnage
27cde3f429 Warn on redefining. 2014-01-12 21:54:21 -05:00
Payton Turnage
d152751cf8 Free the defines memory earlier.
There is no need to keep this memory for the life of the program.
2014-01-12 21:49:17 -05:00
Payton Turnage
c80d6974cb Substitute defines with their strings.
Before allocating space for a token, the lexer will first check to see
if that token is a defined name. If it is, it will allocate space for
the defined string instead.

A test file is included in programs/tinyvm/preprocessor to demonstrate
the behavior. When functioning, the program will print the fibonacci
sequence.
2014-01-12 21:43:57 -05:00
Payton Turnage
23e72a8ca7 Implement preprocessor defines.
This commit adds behavior to the preprocessor which fills a tree with
defines and their replacements. In future commits, the parser will
substitute instances of the defines with their replacements in the
source code.
2014-01-12 21:11:31 -05:00
Payton Turnage
9c9eece4d9 Fix naming conflict. 2014-01-12 21:04:56 -05:00
Payton Turnage
58f11eba57 Enable keeping track of associated values.
The tvm_tree structure should optionally be able to keep track of values
associated with the strings by which its nodes are sorted. In the case of
defines, this is the replacement string. In the case of variables, this
will be a pointer to the variable's location in memory.

Searching should return the value, or NULL.

To opt out of storing a value, pass NULL and 0 as the val and len arguments.
2014-01-12 20:30:04 -05:00
Payton Turnage
62066d614f Add a structure for searching strings.
The tvm_tree structure is a binary search tree. It will be used to hold
preprocessor defines, and variable names for when defining bytes, words,
and double words is implemented.

Each node structure and its own string are stored contiguously (in that
order) so the free's are easier to keep track of, and memory doesn't need to
be a concern when adding a string to the tree.
2014-01-12 20:00:20 -05:00
bl0ckeduser
07c32b9869 Simplify a structure copy 2013-08-12 18:43:17 -04:00
bl0ckeduser
716936a8eb Fix incorrect truncation of floating-point data
If the entire parenthesized division expression is cast to float, as it
was prior to this commit, C performs truncating integer division before
converting to float, which always leads to a result of zero.  `git-blame'
traces the bug to commit d5ed7e75d9, which
added the faulty parentheses as a matter of style. No parentheses are
necessary, since increments have higher precedence than type-casts,
type-casts have higher precedence than division, and division has
higher precedence than comparison. The operations will execute in the
desired order.
2013-08-12 18:33:08 -04:00
Joseph Kogut
f60fb720b6 Fixed filename typo 2013-03-07 14:42:53 -07:00
Joseph Kogut
d5ed7e75d9 * Replaced all instances of malloc with calloc
* Replaced magic number in tvm_htab.c with define
2013-03-07 12:19:03 -07:00
Joseph Kogut
378cc66c0d Removed a dumbass goto. 2013-02-08 20:16:12 -07:00
Joseph Kogut
21198a8282 Added preprocessor 2013-02-08 13:51:01 -07:00
Joseph Kogut
eac3bc4291 *Split parsing functions into their own source files
*Removed unused Makefile variables
2013-02-07 10:54:22 -07:00
Joseph Kogut
cc39eadc9e Fixed typo in tvm_program.c 2013-02-07 10:13:15 -07:00
Joseph Kogut
25cc724b33 *Updated variable declarations and definitions to C99 standard
*Removed some excessive conditional nesting
2013-02-06 11:47:13 -07:00
Joseph Kogut
3d895e0948 Made hash table naming conventions more consistent 2013-01-24 10:42:40 -07:00
Joseph Kogut
ed3acfd515 Made naming conventions more consistent. 2013-01-23 11:15:07 -07:00
Joseph Kogut
d270cc5706 Made pointer syntax consistent 2013-01-23 11:06:19 -07:00
Joseph Kogut
caf4767696 Inlined tvm_step() and htab_hash(). 2013-01-23 10:41:17 -07:00
Bl0ckeduser
bc882e4db3 Hash table: implement load factor / rehash
Based on suggestion from bitbckt:

I  saw  this  in  my feed, and feel it merits comment. I hope you
don't mind the input.

You'll want to monitor the load factor of the hash table and  re-
hash  the  table  on  insert  when it is exceeded. Otherwise, key
lookup will degrade toward linear time for sets of  keys  with  a
high number of collisions.

The  easiest  way  to  implement the load factor is to maintain a
count of allocated nodes in tvm_htab_t and  divide  that  by  the
bucket count to obtain the load factor. Of course, you'd need the
bucket count (HTAB_SIZE) to be dynamic, too.
2012-01-19 17:22:41 -05:00
Bl0ckeduser
e0a387d7de Fix hash collisions (separate chaining) 2012-01-18 12:54:23 -05:00
Kyle K
279bdc61c1 changed lexer tab characters to use an escaped tab (\t) 2012-01-16 02:05:04 +00:00
Bl0ckeduser
313a440342 Implement buffer size limit in tvm_fcopy 2011-11-20 21:36:36 -05:00
bl0ckeduser
c1d5d35c27 Shorten tvm_flength, tvm_fcopy 2011-11-20 21:10:50 -05:00
Joseph Kogut
19ec55c301 Fixed comment mix up 2011-10-07 13:14:47 -07:00
bl0ckeduser
fcd0a1f7e2 Fix bug in "ret" opcode 2011-10-07 14:38:18 -04:00
Joseph Kogut
19a48f04ee Moved memory allocation for new instructions into tvm_program.c, parse_instructions() 2011-09-26 03:09:15 -07:00
Bl0ckeduser
d9e3f942f5 Safety-check free()s in destroy_program 2011-09-25 15:35:03 -04:00
Joseph Kogut
72193566b9 Moved program interpretation to explicitly called function 2011-09-25 05:47:31 -07:00
Joseph Kogut
6fb039da4a Refactored parsing of register tokens 2011-09-08 09:43:45 -07:00
Joseph Kogut
75edb60116 * Fixed a style issue
* Inlined tvm_step()
2011-09-04 18:45:56 -07:00