diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-26 08:40:59 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-26 08:40:59 +0200 |
commit | 46356365270b71be94097b3c408d5f35a9ebd6ed (patch) | |
tree | 59ae01f6108a94e818670de1bda37ae12a5fa2fe /src/bytecode/compiler.h | |
parent | d54e595644fcaf6756d53d368213ad3129c49327 (diff) | |
download | bdl-46356365270b71be94097b3c408d5f35a9ebd6ed.tar.gz bdl-46356365270b71be94097b3c408d5f35a9ebd6ed.zip |
Add initial function call procedure
Diffstat (limited to 'src/bytecode/compiler.h')
-rwxr-xr-x | src/bytecode/compiler.h | 46 |
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 | ||
293 | void | 293 | void |
294 | compile_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 | |||
330 | void | ||
294 | compile_if_op(Chunk *chunk, Compiler *compiler, Token start) { | 331 | compile_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 | } |