parrotcode: Parrot embedding system | |
Contents | Documentation |
embed.pod - Parrot embedding system
#include "parrot/embed.h"
int main(int argc, char *argv[]) {
Parrot_Interp interp;
Parrot_PackFile pf;
char * bcfile = "program.pbc";
argc--; argv++; /* skip the program name */
interp=Parrot_new(NULL);
if(PARROT_JIT_CAPABLE) {
Parrot_set_run_core(interp, PARROT_JIT_CORE); /* activate JIT */
}
pf = Parrot_readbc(interp, bcfile);
Parrot_loadbc(interp, pf);
Parrot_runcode(interp, argc, argv); /* argc and argv as seen by the bytecode file */
Parrot_destroy(interp);
return 0;
}
Parrot's embedding system is designed with one guiding principle in mind: encapsulation. Users of Parrot shouldn't have to know what the insides of a Parrot_Interp
structure look like or how to load a packfile. They should just know a few functions and constants. The embedding system is designed to do just that.
Parrot_Interp
Parrot_PackFile
Parrot_Interp_flag
Parrot_Interp_flag_val
NULL
.Parrot_Int
Parrot_UInt
Parrot_Float
Parrot_Opcode
interpreter core setting is done by a call of Parrot_set_run_core()
like:
Parrot_set_run_core(interp, PARROT_JIT_CORE);
See /include/parrot/interpreter.h for a list of available cores beside PARROT_PREDEREF_CORE, PARROT_JIT_CORE.
PARROT_PREDEREF_CORE
PARROT_JIT_CORE
Interpreter flags setting is done by a call of Parrot_set_flag()
like>:
Parrot_set_flag(interp, PARROT_TRACE_FLAG, NULL);
See /include/parrot/interpreter.h for an up to date list.
PARROT_DEBUG_FLAG
PARROT_TRACE_FLAG
PARROT_BOUNDS_FLAG
PARROT_PROFILE_FLAG
PARROT_THR_TYPE_1
, PARROT_THR_TYPE_2
, PARROT_THR_TYPE_3
PARROT_THR_TYPE_1
, threads runs without sharing variables and do not communicate, With PARROT_THR_TYPE_2
, threads shares no variables and communicate by sending messages. With PARROT_THR_TYPE_3
, threads share variables. See t/pmc/threads.t for examples.Other constants:
PARROT_VERSION
PARROT_MAJOR_VERSION
PARROT_MINOR_VERSION
PARROT_PATCH_VERSION
PARROT_CONFIG_DATE
PARROT_JIT_CAPABLE
PARROT_ARCHNAME
PARROT_CPU_ARCH
PARROT_OS_NAME
Parrot_Interp Parrot_new(Parrot_Interp parent)
parent
is NULL for the main interpreter that will be destroyed last.void Parrot_setflags(Parrot_Interp, Parrot_Interp_flag, Parrot_Interp_flag_val)
Parrot_PackFile Parrot_readbc(Parrot_Interp, char *filename)
void Parrot_loadbc(Parrot_Interp, Parrot_PackFile)
void Parrot_runcode(Parrot_Interp, int argc, char *argv[])
argc
and argv
are the parameters the bytecode should receive.void Parrot_destroy(Parrot_Interp)
Note: This section is aimed at you if you are writing an application external to parrot which links against an installed parrot library.
Your application will need to include the appropriate header files and link against parrot and its dependencies.
Since the location of these files can vary from platform to platform, and build to build, a general method is provided to find out the necessary flags to use.
pkg-config is a helper tool, now common on many platforms, which many packages have adopted to provide the necessary compiler and linker flags required to build against a library. parrot will install a file called parrot.pc which can be queried using pkg-config.
To start with, let's find out what version of parrot is installed by running pkg-config with the --modversion flag. If this command fails with an error, skip to the bottom of this section.
pkg-config --modversion parrot
To find out the necessary -I flags, use --cflags
pkg-config --cflags parrot
and to find the necessary -L and -l flags, use --libs
pkg-config --libs parrot
Where both compiling and linking are performed in one step, both sets of flags can be queries with
pkg-config --cflags --libs parrot
The pkg-config command can be incorporated with a compile as shown here.
cc src/disassemble.c `pkg-config --cflags --libs parrot`
Most applications will probably choose to run pkg-config as part of a configure script, so if you are using autoconf you could use a test such as this.
PARROT_REQUIRED_VERSION=0.4.1
AC_SUBST(PARROT_REQUIRED_VERSION)
PKG_CHECK_MODULES(PARROT, parrot >= $PARROT_REQUIRED_VERSION,
[AC_DEFINE([HAVE_PARROT], 1, [define if have parrot])])
AC_SUBST(PARROT_LIBS)
AC_SUBST(PARROT_CFLAGS)
If parrot has been installed system-wide, then any of the previous lines should have returned the relevant flags. If it is not installed in one of the standard places that pkg-config looks, then you will get an error message.
pkg-config --libs parrot
Package parrot was not found in the pkg-config search path.
Perhaps you should add the directory containing `parrot.pc'
to the PKG_CONFIG_PATH environment variable
No package 'parrot' found
As stated in the error message, an environment variable can be used to make pkg-config look in more locations.
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
The last part of the variable will almost certainly be .../lib/pkgconfig. This variable will have to be set in your login scripts if you need it to be available in future.
embed.c and embed.h for the implementation.
src/test_main.c for Parrot's use of the embedding system.
http://pkgconfig.freedesktop.org/wiki/ A pkg-config page
|