aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/compiler.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-26 08:40:59 +0200
committerBad Diode <bd@badd10de.dev>2021-10-26 08:40:59 +0200
commit46356365270b71be94097b3c408d5f35a9ebd6ed (patch)
tree59ae01f6108a94e818670de1bda37ae12a5fa2fe /src/bytecode/compiler.h
parentd54e595644fcaf6756d53d368213ad3129c49327 (diff)
downloadbdl-46356365270b71be94097b3c408d5f35a9ebd6ed.tar.gz
bdl-46356365270b71be94097b3c408d5f35a9ebd6ed.zip
Add initial function call procedure
Diffstat (limited to 'src/bytecode/compiler.h')
-rwxr-xr-xsrc/bytecode/compiler.h46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h
index 2c7827f..6dab1fe 100755
--- a/src/bytecode/compiler.h
+++ b/src/bytecode/compiler.h
@@ -291,6 +291,43 @@ compile_fun_op(Chunk *chunk, Compiler *compiler, Token start) {
291} 291}
292 292
293void 293void
294compile_call_op(Chunk *chunk, Compiler *compiler, Token start, Token name) {
295 if (name.type != TOKEN_SYMBOL) {
296 error_push((Error){
297 .type = ERR_TYPE_COMPILER,
298 .value = ERR_WRONG_ARG_TYPE,
299 .line = start.line,
300 .col = start.column,
301 });
302 return;
303 }
304
305 // FIXME: skipping arguments for now. Assuming nil.
306
307 // Compile body.
308 while (has_next_token(compiler)) {
309 Token tok = peek_token(compiler);
310 if (tok.type == TOKEN_EOF) {
311 error_push((Error){
312 .type = ERR_TYPE_COMPILER,
313 .value = ERR_UNBALANCED_PAREN,
314 .line = start.line,
315 .col = start.column,
316 });
317 return;
318 }
319 if (tok.type == TOKEN_RPAREN) {
320 next_token(compiler);
321 break;
322 }
323 }
324 Object obj = make_symbol(name.value);
325 emit_constant(chunk, start, obj);
326 add_code(chunk, OP_GET, start.line, start.column);
327 add_code(chunk, OP_CALL, start.line, start.column);
328}
329
330void
294compile_if_op(Chunk *chunk, Compiler *compiler, Token start) { 331compile_if_op(Chunk *chunk, Compiler *compiler, Token start) {
295 Token tok = peek_token(compiler); 332 Token tok = peek_token(compiler);
296 if (tok.type == TOKEN_EOF) { 333 if (tok.type == TOKEN_EOF) {
@@ -378,12 +415,9 @@ parse_list(Chunk *chunk, Compiler *compiler, Token start) {
378 case TOKEN_FUN: { compile_fun_op(chunk, compiler, start); } break; 415 case TOKEN_FUN: { compile_fun_op(chunk, compiler, start); } break;
379 case TOKEN_IF: { compile_if_op(chunk, compiler, start); } break; 416 case TOKEN_IF: { compile_if_op(chunk, compiler, start); } break;
380 default: { 417 default: {
381 error_push((Error){ 418 // TODO: Emit error if compiler knows there hasn't been
382 .type = ERR_TYPE_COMPILER, 419 // a function delcared with that name.
383 .value = ERR_OBJ_NOT_CALLABLE, 420 compile_call_op(chunk, compiler, start, tok);
384 .line = tok.line,
385 .col = tok.column,
386 });
387 } break; 421 } break;
388 } 422 }
389} 423}