checkin jpl under //depot/perlext/jpl/...
[p5sagit/p5-mst-13.2.git] / PerlInterpreter / PerlInterpreter.c
CommitLineData
d50cb536 1/*
2 * "The Road goes ever on and on, down from the door where it began."
3 */
4
5#include "PerlInterpreter.h"
6#include <dlfcn.h>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#include "EXTERN.h"
13#include "perl.h"
14
15#ifdef __cplusplus
16}
17# define EXTERN_C extern "C"
18#else
19# define EXTERN_C extern
20#endif
21
22static void xs_init _((void));
23static PerlInterpreter *my_perl;
24
25int jpldebug = 0;
26JNIEnv *jplcurenv;
27
28JNIEXPORT void JNICALL
29Java_PerlInterpreter_init(JNIEnv *env, jobject obj, jstring js)
30{
31 int exitstatus;
32 int argc = 3;
33 SV* envsv;
34 SV* objsv;
35
36 static char *argv[] = {"perl", "-e", "1", 0};
37
38 if (getenv("JPLDEBUG"))
39 jpldebug = atoi(getenv("JPLDEBUG"));
40
41 if (jpldebug)
42 fprintf(stderr, "init\n");
43
44 if (!dlopen("libperl.so", RTLD_LAZY|RTLD_GLOBAL)) {
45 fprintf(stderr, "%s\n", dlerror());
46 exit(1);
47 }
48
49 if (curinterp)
50 return;
51
52 perl_init_i18nl10n(1);
53
54 if (!do_undump) {
55 my_perl = perl_alloc();
56 if (!my_perl)
57 exit(1);
58 perl_construct( my_perl );
59 perl_destruct_level = 0;
60 }
61
62 exitstatus = perl_parse( my_perl, xs_init, argc, argv, (char **) NULL );
63
64 if (!exitstatus)
65 Java_PerlInterpreter_eval(env, obj, js);
66
67}
68
69JNIEXPORT void JNICALL
70Java_PerlInterpreter_eval(JNIEnv *env, jobject obj, jstring js)
71{
72 SV* envsv;
73 SV* objsv;
74 dSP;
75 jbyte* jb;
76
77 ENTER;
78 SAVETMPS;
79
80 jplcurenv = env;
81 envsv = perl_get_sv("JPL::_env_", 1);
82 sv_setiv(envsv, (IV)(void*)env);
83 objsv = perl_get_sv("JPL::_obj_", 1);
84 sv_setiv(objsv, (IV)(void*)obj);
85
86 jb = (jbyte*)(*env)->GetStringUTFChars(env,js,0);
87
88 if (jpldebug)
89 fprintf(stderr, "eval %s\n", (char*)jb);
90
91 perl_eval_pv( (char*)jb, 0 );
92
93 if (SvTRUE(GvSV(errgv))) {
94 jthrowable newExcCls;
95
96 (*env)->ExceptionDescribe(env);
97 (*env)->ExceptionClear(env);
98
99 newExcCls = (*env)->FindClass(env, "java/lang/RuntimeException");
100 if (newExcCls)
101 (*env)->ThrowNew(env, newExcCls, SvPV(GvSV(errgv),na));
102 }
103
104 (*env)->ReleaseStringUTFChars(env,js,jb);
105 FREETMPS;
106 LEAVE;
107
108}
109
110/*
111JNIEXPORT jint JNICALL
112Java_PerlInterpreter_eval(JNIEnv *env, jobject obj, jint ji)
113{
114 op = (OP*)(void*)ji;
115 op = (*op->op_ppaddr)();
116 return (jint)(void*)op;
117}
118*/
119
120/* Register any extra external extensions */
121
122/* Do not delete this line--writemain depends on it */
123EXTERN_C void boot_DynaLoader _((CV* cv));
124EXTERN_C void boot_JNI _((CV* cv));
125
126static void
127xs_init()
128{
129 char *file = __FILE__;
130 dXSUB_SYS;
131 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
132}