b229d130b3ad27cae4262b0ba44e9a83f525a6d4
[p5sagit/p5-mst-13.2.git] / jpl / PerlInterpreter / PerlInterpreter.c
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 #include "EXTERN.h"
9 #include "perl.h"
10
11 #ifndef EXTERN_C
12 #  ifdef __cplusplus
13 #    define EXTERN_C extern "C"
14 #  else
15 #    define EXTERN_C extern
16 #  endif
17 #endif
18
19 static void xs_init (pTHX);
20 static PerlInterpreter *my_perl;
21
22 int jpldebug = 0;
23 JNIEnv *jplcurenv;
24
25 JNIEXPORT void JNICALL
26 Java_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
46     if (PL_curinterp)
47         return;
48
49     if (!PL_do_undump) {
50         my_perl = perl_alloc();
51         if (!my_perl)
52             exit(1);
53         perl_construct( my_perl );
54         PL_perl_destruct_level = 0;
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
64 JNIEXPORT void JNICALL
65 Java_PerlInterpreter_eval(void *perl, JNIEnv *env, jobject obj, jstring js)
66 {
67     SV* envsv;
68     SV* objsv;
69     dSP;
70     jbyte* jb;
71     dTHXa(perl);
72
73     ENTER;
74     SAVETMPS;
75
76     jplcurenv = env;
77     envsv = get_sv("JPL::_env_", 1);
78     sv_setiv(envsv, (IV)(void*)env);
79     objsv = get_sv("JPL::_obj_", 1);
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
87     eval_pv( (char*)jb, 0 );
88
89     if (SvTRUE(ERRSV)) {
90         jthrowable newExcCls;
91
92         (*env)->ExceptionDescribe(env);
93         (*env)->ExceptionClear(env);
94
95         newExcCls = (*env)->FindClass(env, "java/lang/RuntimeException");
96         if (newExcCls)
97             (*env)->ThrowNew(env, newExcCls, SvPV(ERRSV,PL_na));
98     }
99
100     (*env)->ReleaseStringUTFChars(env,js,jb);
101     FREETMPS;
102     LEAVE;
103
104 }
105
106 /*
107 JNIEXPORT jint JNICALL
108 Java_PerlInterpreter_eval(void *perl, JNIEnv *env, jobject obj, jint ji)
109 {
110     dTHXa(perl);
111     op = (OP*)(void*)ji;
112     op = (*op->op_ppaddr)(pTHX);
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 */
120 EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
121 EXTERN_C void boot_JNI (pTHX_ CV* cv);
122
123 static void
124 xs_init(pTHX)
125 {
126     char *file = __FILE__;
127     dXSUB_SYS;
128         newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
129 }