Author: leo
Date: Thu May 5 06:59:50 2005
New Revision: 7983
Added:
trunk/t/src/compiler.t (contents, props changed)
Modified:
trunk/MANIFEST
Log:
new compiler source test
Modified: trunk/MANIFEST
==============================================================================
--- trunk/MANIFEST (original)
+++ trunk/MANIFEST Thu May 5 06:59:50 2005
@@ -1797,6 +1797,7 @@
t/library/yaml_parser_syck.t []
t/src/README []
t/src/basic.t []
+t/src/compiler.t []
t/src/cppcomments.t []
t/src/exit.t []
t/src/extend.t []
Added: trunk/t/src/compiler.t
==============================================================================
--- (empty file)
+++ trunk/t/src/compiler.t Thu May 5 06:59:50 2005
@@ -0,0 +1,105 @@
+#! perl -w
+# Copyright: 2005 The Perl Foundation. All Rights Reserved.
+# $Id$
+
+=head1 NAME
+
+t/src/compiler.t - Compile and run a PIR program from C.
+
+=head1 SYNOPSIS
+
+ % perl -Ilib t/src/compiler.t
+
+=head1 DESCRIPTION
+
+Show steps to run a program from C. Functionality should be
+gathered in some API calls..
+
+=cut
+
+use Parrot::Test tests => 1;
+
+c_output_is(<<'CODE', <<'OUTPUT', "compreg/compile");
+
+#include <stdio.h>
+#include "parrot/parrot.h"
+#include "parrot/embed.h"
+
+extern void imcc_init(Parrot_Interp interp);
+
+static opcode_t*
+run(Parrot_Interp interpreter, int argc, char *argv[])
+{
+ const char *c_src =
+ ".sub main @MAIN\n"
+ " print \"ok\\n\"\n"
+ ".end\n";
+
+ STRING *src, *pir, *smain;
+ PMC *comp, *prog, *compreg, *entry;
+ opcode_t *dest;
+ /*
+ * get PIR compiler - TODO API
+ */
+ compreg = VTABLE_get_pmc_keyed_int(interpreter,
+ interpreter->iglobals, IGLOBALS_COMPREG_HASH);
+ pir = const_string(interpreter, "PIR");
+ comp = VTABLE_get_pmc_keyed_str(interpreter, compreg, pir);
+ if (PMC_IS_NULL(comp) || !VTABLE_defined(interpreter, comp)) {
+ PIO_eprintf(interpreter, "Pir compiler not loaded");
+ exit(1);
+ }
+ /*
+ * compile source
+ */
+ src = string_from_cstring(interpreter, c_src, 0);
+ prog = VTABLE_invoke(interpreter, comp, src);
+ if (PMC_IS_NULL(prog) || !VTABLE_defined(interpreter, prog)) {
+ PIO_eprintf(interpreter, "Pir compiler returned no prog");
+ exit(1);
+ }
+ /* keep eval PMC alive */
+ dod_register_pmc(interpreter, prog);
+ /* locate function to run */
+ smain = const_string(interpreter, "main");
+ entry = Parrot_find_global(interpreter, NULL, smain);
+ /* location of the entry */
+ dest = VTABLE_invoke(interpreter, entry, NULL);
+ /* where to start */
+ interpreter->resume_offset = dest - interpreter->code->base.data;
+ /* and go */
+ Parrot_runcode(interpreter, argc, argv);
+ return NULL;
+}
+
+int main(int margc, char* margv[]) {
+ Parrot_Interp interpreter;
+ struct PackFile *pf;
+ int argc = 1;
+ char *argv[] = {"test", NULL};
+
+ struct PackFile_Segment *seg;
+
+ /* Interpreter set-up */
+ interpreter = Parrot_new(NULL);
+ if ( interpreter == NULL )
+ return 1;
+
+ Parrot_init(interpreter);
+ /* this registers the PIR compiler */
+ imcc_init(interpreter);
+ /* dummy pf and segment to get things started */
+ pf = PackFile_new(interpreter, 0);
+ seg = PackFile_Segment_new_seg(interpreter,
+ &pf->directory, PF_BYTEC_SEG, "test_code", 1);
+ pf->cur_cs = (struct PackFile_ByteCode *)seg;
+ Parrot_loadbc(interpreter, pf);
+
+ /* Parrot_set_flag(interpreter, PARROT_TRACE_FLAG); */
+ run(interpreter, argc, argv);
+ Parrot_exit(0);
+ return 0;
+}
+CODE
+ok
+OUTPUT