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