php_vm 1.3.6 → 1.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/php_vm/php_vm.c +126 -81
- data/ext/php_vm/php_vm.h +25 -9
- data/ext/php_vm/php_vm_z2v.c +10 -6
- metadata +2 -2
data/ext/php_vm/php_vm.c
CHANGED
@@ -17,6 +17,7 @@ VALUE rb_ePHPErrorReporting;
|
|
17
17
|
|
18
18
|
|
19
19
|
// PHP Embed
|
20
|
+
|
20
21
|
static int php_embed_output_handler(const char *str, unsigned int str_length TSRMLS_DC)
|
21
22
|
{
|
22
23
|
VALUE proc = rb_cv_get(rb_mPHPVM, "@@output_handler");
|
@@ -48,10 +49,14 @@ static void php_embed_error_handler(char *message)
|
|
48
49
|
}
|
49
50
|
}
|
50
51
|
|
52
|
+
static zval *global_exception = NULL;
|
51
53
|
static void php_vm_exception_hook(zval *ex TSRMLS_DC)
|
52
54
|
{
|
53
|
-
|
54
|
-
|
55
|
+
// TODO: no use global variable
|
56
|
+
//VALUE exception = zval_to_value(ex);
|
57
|
+
//rb_exc_raise(exception);
|
58
|
+
global_exception = ex;
|
59
|
+
EG(exception) = NULL;
|
55
60
|
}
|
56
61
|
|
57
62
|
|
@@ -70,8 +75,7 @@ void php_eval_string(char *code, int code_len TSRMLS_DC)
|
|
70
75
|
|
71
76
|
// syntax error
|
72
77
|
if (syntax_error) {
|
73
|
-
|
74
|
-
rb_exc_raise(exception);
|
78
|
+
rb_raise(rb_ePHPSyntaxError, "Syntax error");
|
75
79
|
}
|
76
80
|
|
77
81
|
// exception
|
@@ -86,11 +90,7 @@ void php_eval_string(char *code, int code_len TSRMLS_DC)
|
|
86
90
|
int exit_status = EG(exit_status);
|
87
91
|
EG(exit_status) = 0;
|
88
92
|
|
89
|
-
|
90
|
-
sprintf(message, "exit status error: %d", exit_status);
|
91
|
-
|
92
|
-
VALUE exception = rb_exc_new2(rb_ePHPError, message);
|
93
|
-
rb_exc_raise(exception);
|
93
|
+
rb_raise(rb_ePHPError, "exit status error: %d", exit_status);
|
94
94
|
}
|
95
95
|
}
|
96
96
|
|
@@ -171,27 +171,19 @@ int new_php_object(zend_class_entry *ce, VALUE v_args, zval *retval)
|
|
171
171
|
// defined constructor
|
172
172
|
/*
|
173
173
|
if (!(ce->constructor->common.fn_flags & ZEND_ACC_PUBLIC)) {
|
174
|
-
|
175
|
-
sprintf(message, "Access to non-public constructor of class %s", ce->name);
|
176
|
-
VALUE v_exception = rb_exc_new2(rb_ePHPError, message);
|
177
|
-
free(message);
|
178
|
-
rb_exc_raise(v_exception);
|
174
|
+
rb_raise(rb_ePHPError, "Access to non-public constructor of class %s", ce->name);
|
179
175
|
}
|
180
176
|
*/
|
181
177
|
|
182
178
|
// alloc
|
183
179
|
object_init_ex(retval, ce);
|
184
180
|
|
185
|
-
// call
|
181
|
+
// call constructor
|
186
182
|
int result = call_php_method(ce, retval, ce->constructor, RARRAY_LEN(v_args), RARRAY_PTR(v_args), &retval TSRMLS_CC);
|
187
183
|
|
188
184
|
// error
|
189
185
|
if (result==FAILURE) {
|
190
|
-
|
191
|
-
sprintf(message, "Invocation of %s's constructor failed", ce->name);
|
192
|
-
VALUE v_exception = rb_exc_new2(rb_ePHPError, message);
|
193
|
-
free(message);
|
194
|
-
rb_exc_raise(v_exception);
|
186
|
+
rb_raise(rb_ePHPError, "Invocation of %s's constructor failed", ce->name);
|
195
187
|
}
|
196
188
|
|
197
189
|
} else if (!RARRAY_LEN(v_args)) {
|
@@ -201,11 +193,7 @@ int new_php_object(zend_class_entry *ce, VALUE v_args, zval *retval)
|
|
201
193
|
|
202
194
|
} else {
|
203
195
|
// undefine constructor, has args
|
204
|
-
|
205
|
-
sprintf(message, "Class %s does not have a constructor, so you cannot pass any constructor arguments", ce->name);
|
206
|
-
VALUE v_exception = rb_exc_new2(rb_ePHPError, message);
|
207
|
-
free(message);
|
208
|
-
rb_exc_raise(v_exception);
|
196
|
+
rb_raise(rb_ePHPError, "Class %s does not have a constructor, so you cannot pass any constructor arguments", ce->name);
|
209
197
|
}
|
210
198
|
return result;
|
211
199
|
}
|
@@ -292,9 +280,9 @@ void define_php_methods(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
292
280
|
}
|
293
281
|
}
|
294
282
|
|
295
|
-
void define_php_magic_method(VALUE v_obj, zend_class_entry *ce,
|
283
|
+
void define_php_magic_method(VALUE v_obj, zend_class_entry *ce, zval *zobj)
|
296
284
|
{
|
297
|
-
if (
|
285
|
+
if (!zobj) {
|
298
286
|
// static method
|
299
287
|
if (ce->__callstatic) {
|
300
288
|
rb_define_singleton_method(v_obj, "__callStatic", rb_php_class_call_magic___callstatic, 2);
|
@@ -302,21 +290,27 @@ void define_php_magic_method(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
302
290
|
}
|
303
291
|
} else {
|
304
292
|
// instance method
|
293
|
+
const zend_object_handlers *h = Z_OBJ_HT_P(zobj);
|
294
|
+
int has_get = h->read_property!=std_object_handlers.read_property || (h->read_property && ce->__get);
|
295
|
+
int has_set = h->write_property!=std_object_handlers.write_property || (h->write_property &&ce->__set);
|
296
|
+
int has_unset = h->unset_property!=std_object_handlers.unset_property || (h->unset_property && ce->__unset);
|
297
|
+
int has_isset = h->has_property!=std_object_handlers.has_property || (h->has_property && ce->__isset);
|
298
|
+
|
305
299
|
if (ce->clone) {
|
306
300
|
rb_define_singleton_method(v_obj, "__clone", rb_php_object_call_magic_clone, 0);
|
307
301
|
rb_define_singleton_method(v_obj, "dup", rb_php_object_call_magic_clone, 0);
|
308
302
|
rb_define_singleton_method(v_obj, "clone", rb_php_object_call_magic_clone, 0);
|
309
303
|
}
|
310
|
-
if (
|
304
|
+
if (has_get) {
|
311
305
|
rb_define_singleton_method(v_obj, "__get", rb_php_object_call_magic___get, 1);
|
312
306
|
}
|
313
|
-
if (
|
307
|
+
if (has_set) {
|
314
308
|
rb_define_singleton_method(v_obj, "__set", rb_php_object_call_magic___set, 2);
|
315
309
|
}
|
316
|
-
if (
|
310
|
+
if (has_unset) {
|
317
311
|
rb_define_singleton_method(v_obj, "__unset", rb_php_object_call_magic___unset, 1);
|
318
312
|
}
|
319
|
-
if (
|
313
|
+
if (has_isset) {
|
320
314
|
rb_define_singleton_method(v_obj, "__isset", rb_php_object_call_magic___isset, 1);
|
321
315
|
}
|
322
316
|
if (ce->__call) {
|
@@ -324,8 +318,10 @@ void define_php_magic_method(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
324
318
|
}
|
325
319
|
if (ce->__tostring) {
|
326
320
|
rb_define_singleton_method(v_obj, "__toString", rb_php_object_call_magic___tostring, 0);
|
321
|
+
rb_define_singleton_method(v_obj, "to_s", rb_php_object_call_magic___tostring, 0);
|
327
322
|
}
|
328
|
-
|
323
|
+
|
324
|
+
if (has_get || has_set || ce->__call) {
|
329
325
|
rb_define_singleton_method(v_obj, "method_missing", rb_php_object_call_method_missing, -1);
|
330
326
|
}
|
331
327
|
}
|
@@ -370,7 +366,7 @@ int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int ar
|
|
370
366
|
|
371
367
|
zend_fcall_info_args(&fci, z_args);
|
372
368
|
|
373
|
-
// call
|
369
|
+
// call method
|
374
370
|
zend_try {
|
375
371
|
result = zend_call_function(&fci, &fcc TSRMLS_CC);
|
376
372
|
} zend_catch {
|
@@ -424,13 +420,12 @@ VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj, zend_function *mpt
|
|
424
420
|
int result = call_php_method(ce, obj, mptr, argc, argv, &z_val TSRMLS_CC);
|
425
421
|
|
426
422
|
// exception
|
427
|
-
if (
|
428
|
-
|
429
|
-
|
430
|
-
sprintf(message, "raise exception: %s", mname);
|
431
|
-
VALUE exception = rb_exc_new2(rb_ePHPError, message);
|
432
|
-
free(message);
|
423
|
+
if (global_exception) {
|
424
|
+
VALUE exception = zval_to_value(global_exception);
|
425
|
+
global_exception = NULL;
|
433
426
|
rb_exc_raise(exception);
|
427
|
+
} else if (result==FAILURE) {
|
428
|
+
rb_raise(rb_ePHPError, "raise exception: %s", mptr->common.function_name);
|
434
429
|
}
|
435
430
|
|
436
431
|
return zval_to_value(z_val);
|
@@ -442,8 +437,7 @@ VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee,
|
|
442
437
|
|
443
438
|
// callee
|
444
439
|
if (callee==Qnil) {
|
445
|
-
|
446
|
-
rb_exc_raise(exception);
|
440
|
+
rb_raise(rb_ePHPError, "callee is nil");
|
447
441
|
}
|
448
442
|
|
449
443
|
// method
|
@@ -457,12 +451,12 @@ VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee,
|
|
457
451
|
int result = call_php_method(ce, obj, mptr, argc, argv, &z_val TSRMLS_CC);
|
458
452
|
|
459
453
|
// exception
|
460
|
-
if (
|
461
|
-
|
462
|
-
|
463
|
-
VALUE exception = rb_exc_new2(rb_ePHPError, message);
|
464
|
-
free(message);
|
454
|
+
if (global_exception) {
|
455
|
+
VALUE exception = zval_to_value(global_exception);
|
456
|
+
global_exception = NULL;
|
465
457
|
rb_exc_raise(exception);
|
458
|
+
} else if (result==FAILURE) {
|
459
|
+
rb_raise(rb_ePHPError, "raise exception: %s", RSTRING_PTR(callee));
|
466
460
|
}
|
467
461
|
} else {
|
468
462
|
// accessor
|
@@ -849,8 +843,7 @@ VALUE rb_php_global_echo(int argc, VALUE *argv, VALUE cls)
|
|
849
843
|
int i;
|
850
844
|
|
851
845
|
if (argc==0) {
|
852
|
-
|
853
|
-
rb_exc_raise(exception);
|
846
|
+
rb_raise(rb_eArgError, "Too few arguments");
|
854
847
|
}
|
855
848
|
|
856
849
|
// format
|
@@ -924,11 +917,7 @@ VALUE rb_php_class_initialize(VALUE self, VALUE v_name)
|
|
924
917
|
|
925
918
|
// class not found
|
926
919
|
if (!ce) {
|
927
|
-
|
928
|
-
sprintf(message, "Class is not found: %s", RSTRING_PTR(v_name));
|
929
|
-
VALUE exception = rb_exc_new2(rb_ePHPError, message);
|
930
|
-
free(message);
|
931
|
-
rb_exc_raise(exception);
|
920
|
+
rb_raise(rb_ePHPError, "Class is not found: %s", RSTRING_PTR(v_name));
|
932
921
|
}
|
933
922
|
|
934
923
|
// set resource
|
@@ -941,7 +930,7 @@ VALUE rb_php_class_initialize(VALUE self, VALUE v_name)
|
|
941
930
|
// define php static properties and methods
|
942
931
|
define_php_properties(self, *ce, 1);
|
943
932
|
define_php_methods(self, *ce, 1);
|
944
|
-
define_php_magic_method(self, *ce,
|
933
|
+
define_php_magic_method(self, *ce, NULL);
|
945
934
|
|
946
935
|
return self;
|
947
936
|
}
|
@@ -966,11 +955,6 @@ VALUE rb_php_class_new(int argc, VALUE *argv, VALUE self)
|
|
966
955
|
}
|
967
956
|
rb_php_object_initialize(obj, self, args);
|
968
957
|
|
969
|
-
// define php instance properties and methods
|
970
|
-
define_php_properties(obj, ce, 0);
|
971
|
-
define_php_methods(obj, ce, 0);
|
972
|
-
define_php_magic_method(obj, ce, 0);
|
973
|
-
|
974
958
|
return obj;
|
975
959
|
}
|
976
960
|
|
@@ -1036,6 +1020,11 @@ VALUE rb_php_object_initialize(VALUE self, VALUE class, VALUE args)
|
|
1036
1020
|
VALUE resource = Data_Wrap_Struct(CLASS_OF(self), 0, php_native_resource_delete, p);
|
1037
1021
|
rb_iv_set(self, "php_native_resource", resource);
|
1038
1022
|
|
1023
|
+
// define php instance properties and methods
|
1024
|
+
define_php_properties(self, ce, 0);
|
1025
|
+
define_php_methods(self, ce, 0);
|
1026
|
+
define_php_magic_method(self, ce, z_obj);
|
1027
|
+
|
1039
1028
|
return self;
|
1040
1029
|
}
|
1041
1030
|
|
@@ -1070,15 +1059,19 @@ VALUE rb_php_object_call(int argc, VALUE *argv, VALUE self)
|
|
1070
1059
|
|
1071
1060
|
VALUE rb_php_object_call_magic_clone(VALUE self)
|
1072
1061
|
{
|
1062
|
+
TSRMLS_FETCH();
|
1063
|
+
|
1073
1064
|
zval *zobj = get_zval(self);
|
1065
|
+
zend_object_clone_obj_t handler = Z_OBJ_HT_P(zobj)->clone_obj;
|
1066
|
+
if (!handler) {
|
1067
|
+
rb_raise(rb_ePHPError, "clone_obj handler is not defined");
|
1068
|
+
}
|
1074
1069
|
|
1075
|
-
zend_object_clone_obj_t clone_call = Z_OBJ_HT_P(zobj)->clone_obj;
|
1076
1070
|
zval *retval;
|
1077
|
-
|
1078
1071
|
ALLOC_ZVAL(retval);
|
1079
|
-
Z_OBJVAL_P(retval) =
|
1072
|
+
Z_OBJVAL_P(retval) = handler(zobj TSRMLS_CC);
|
1080
1073
|
Z_TYPE_P(retval) = IS_OBJECT;
|
1081
|
-
Z_SET_REFCOUNT_P(retval,
|
1074
|
+
Z_SET_REFCOUNT_P(retval, 0);
|
1082
1075
|
Z_SET_ISREF_P(retval);
|
1083
1076
|
|
1084
1077
|
return zval_to_value(retval);
|
@@ -1086,35 +1079,88 @@ VALUE rb_php_object_call_magic_clone(VALUE self)
|
|
1086
1079
|
|
1087
1080
|
VALUE rb_php_object_call_magic___get(VALUE self, VALUE name)
|
1088
1081
|
{
|
1089
|
-
|
1082
|
+
TSRMLS_FETCH();
|
1083
|
+
|
1090
1084
|
zval *zobj = get_zval(self);
|
1085
|
+
zend_object_read_property_t handler = Z_OBJ_HT_P(zobj)->read_property;
|
1086
|
+
if (!handler) {
|
1087
|
+
rb_raise(rb_ePHPError, "read_property handler is not defined");
|
1088
|
+
}
|
1089
|
+
|
1090
|
+
zval *member;
|
1091
|
+
MAKE_STD_ZVAL(member);
|
1092
|
+
ZVAL_STRING(member, RSTRING_PTR(name), 1);
|
1093
|
+
|
1094
|
+
zval *retval;
|
1095
|
+
retval = handler(zobj, member, BP_VAR_IS, NULL TSRMLS_CC);
|
1091
1096
|
|
1092
|
-
|
1097
|
+
zval_ptr_dtor(&member);
|
1098
|
+
return zval_to_value(retval);
|
1093
1099
|
}
|
1094
1100
|
|
1095
1101
|
VALUE rb_php_object_call_magic___set(VALUE self, VALUE name, VALUE arg)
|
1096
1102
|
{
|
1097
|
-
|
1103
|
+
TSRMLS_FETCH();
|
1104
|
+
|
1098
1105
|
zval *zobj = get_zval(self);
|
1099
|
-
|
1106
|
+
zend_object_write_property_t handler = Z_OBJ_HT_P(zobj)->write_property;
|
1107
|
+
if (!handler) {
|
1108
|
+
rb_raise(rb_ePHPError, "write_property handler is not defined");
|
1109
|
+
}
|
1110
|
+
|
1111
|
+
zval *member;
|
1112
|
+
MAKE_STD_ZVAL(member);
|
1113
|
+
ZVAL_STRING(member, RSTRING_PTR(name), 1);
|
1100
1114
|
|
1101
|
-
|
1115
|
+
zval *z_arg;
|
1116
|
+
value_to_zval(arg, &z_arg);
|
1117
|
+
|
1118
|
+
handler(zobj, member, z_arg, NULL TSRMLS_CC);
|
1119
|
+
|
1120
|
+
zval_ptr_dtor(&member);
|
1121
|
+
zval_ptr_dtor(&z_arg);
|
1122
|
+
return Qnil;
|
1102
1123
|
}
|
1103
1124
|
|
1104
1125
|
VALUE rb_php_object_call_magic___unset(VALUE self, VALUE name)
|
1105
1126
|
{
|
1106
|
-
|
1127
|
+
TSRMLS_FETCH();
|
1128
|
+
|
1107
1129
|
zval *zobj = get_zval(self);
|
1130
|
+
zend_object_unset_property_t handler = Z_OBJ_HT_P(zobj)->unset_property;
|
1131
|
+
if (!handler) {
|
1132
|
+
rb_raise(rb_ePHPError, "unset_property handler is not defined");
|
1133
|
+
}
|
1108
1134
|
|
1109
|
-
|
1135
|
+
zval *member;
|
1136
|
+
MAKE_STD_ZVAL(member);
|
1137
|
+
ZVAL_STRING(member, RSTRING_PTR(name), 1);
|
1138
|
+
|
1139
|
+
handler(zobj, member, NULL TSRMLS_CC);
|
1140
|
+
|
1141
|
+
zval_ptr_dtor(&member);
|
1142
|
+
return Qnil;
|
1110
1143
|
}
|
1111
1144
|
|
1112
1145
|
VALUE rb_php_object_call_magic___isset(VALUE self, VALUE name)
|
1113
1146
|
{
|
1114
|
-
|
1147
|
+
TSRMLS_FETCH();
|
1148
|
+
|
1115
1149
|
zval *zobj = get_zval(self);
|
1150
|
+
zend_object_has_property_t handler = Z_OBJ_HT_P(zobj)->has_property;
|
1151
|
+
if (!handler) {
|
1152
|
+
rb_raise(rb_ePHPError, "has_property handler is not defined");
|
1153
|
+
}
|
1116
1154
|
|
1117
|
-
|
1155
|
+
zval *member;
|
1156
|
+
MAKE_STD_ZVAL(member);
|
1157
|
+
ZVAL_STRING(member, RSTRING_PTR(name), 1);
|
1158
|
+
|
1159
|
+
int has;
|
1160
|
+
has = handler(zobj, member, 0, NULL TSRMLS_CC);
|
1161
|
+
|
1162
|
+
zval_ptr_dtor(&member);
|
1163
|
+
return has ? Qtrue : Qfalse;
|
1118
1164
|
}
|
1119
1165
|
|
1120
1166
|
VALUE rb_php_object_call_magic___call(VALUE self, VALUE name, VALUE args)
|
@@ -1123,6 +1169,10 @@ VALUE rb_php_object_call_magic___call(VALUE self, VALUE name, VALUE args)
|
|
1123
1169
|
zval *zobj = get_zval(self);
|
1124
1170
|
VALUE argv[2] = {name, args};
|
1125
1171
|
|
1172
|
+
if (args==Qnil || TYPE(args)!=T_ARRAY) {
|
1173
|
+
rb_raise(rb_eArgError, "args is not array");
|
1174
|
+
}
|
1175
|
+
|
1126
1176
|
return call_php_method_bridge(ce, zobj, ce->__call, 2, argv);
|
1127
1177
|
}
|
1128
1178
|
|
@@ -1152,20 +1202,15 @@ VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self)
|
|
1152
1202
|
VALUE name, val;
|
1153
1203
|
rb_scan_args(argc, argv, "11", &name, &val);
|
1154
1204
|
name = rb_str_new2(rb_id2name(SYM2ID(name)));
|
1155
|
-
VALUE argv2[2] = {name, val};
|
1156
1205
|
|
1157
1206
|
VALUE is_setter = rb_funcall(name, rb_intern("end_with?"), 1, rb_str_new2("="));
|
1158
1207
|
if (is_setter) {
|
1159
1208
|
// __set
|
1160
|
-
|
1161
|
-
|
1162
|
-
return call_php_method_bridge(ce, zobj, ce->__set, 2, argv2);
|
1163
|
-
}
|
1209
|
+
rb_funcall(name, rb_intern("gsub!"), 2, rb_str_new2("="), rb_str_new2(""));
|
1210
|
+
return rb_php_object_call_magic___set(self, name, val);
|
1164
1211
|
} else {
|
1165
1212
|
// __get
|
1166
|
-
|
1167
|
-
return call_php_method_bridge(ce, zobj, ce->__get, 1, argv2);
|
1168
|
-
}
|
1213
|
+
return rb_php_object_call_magic___get(self, name);
|
1169
1214
|
}
|
1170
1215
|
}
|
1171
1216
|
return Qnil;
|
@@ -1290,7 +1335,7 @@ void Init_php_vm()
|
|
1290
1335
|
rb_define_singleton_method(rb_mPHPVM, "get_class", rb_php_vm_get_class, 1);
|
1291
1336
|
rb_define_singleton_method(rb_mPHPVM, "define_global", rb_php_vm_define_global, 0);
|
1292
1337
|
|
1293
|
-
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.
|
1338
|
+
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.7"));
|
1294
1339
|
|
1295
1340
|
rb_cv_set(rb_mPHPVM, "@@output_handler", Qnil);
|
1296
1341
|
rb_cv_set(rb_mPHPVM, "@@error_handler", Qnil);
|
data/ext/php_vm/php_vm.h
CHANGED
@@ -28,12 +28,14 @@ typedef struct {
|
|
28
28
|
// PHP
|
29
29
|
extern void php_eval_string(char *code, int code_len TSRMLS_DC);
|
30
30
|
extern void find_zend_class_entry(char *name, int name_len, zend_class_entry ***ce);
|
31
|
-
extern void find_zend_class_entry2(char *name, zend_class_entry ***ce);
|
32
31
|
extern int is_exception_zend_class_entry(zend_class_entry *ce TSRMLS_DC);
|
33
32
|
extern int is_exception_zval(zval *z TSRMLS_DC);
|
33
|
+
extern void find_zend_function(zend_class_entry *ce, char *name, int name_len, zend_function **mptr);
|
34
|
+
extern int has_zend_function(zend_class_entry *ce, VALUE method_name);
|
34
35
|
extern int new_php_object(zend_class_entry *ce, VALUE v_args, zval *retval);
|
35
36
|
extern void define_php_properties(VALUE v_obj, zend_class_entry *ce, int is_static);
|
36
37
|
extern void define_php_methods(VALUE v_obj, zend_class_entry *ce, int is_static);
|
38
|
+
extern void define_php_magic_method(VALUE v_obj, zend_class_entry *ce, zval *zobj);
|
37
39
|
extern int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int argc, VALUE *v_argv, zval **retval_ptr TSRMLS_DC);
|
38
40
|
|
39
41
|
// Ruby
|
@@ -48,13 +50,17 @@ extern zend_class_entry* get_zend_class_entry(VALUE self);
|
|
48
50
|
extern zval* get_zval(VALUE self);
|
49
51
|
|
50
52
|
// module PHPVM
|
51
|
-
extern
|
53
|
+
extern VALUE rb_php_vm_get_output_handler(VALUE cls);
|
54
|
+
extern VALUE rb_php_vm_set_output_handler(VALUE cls, VALUE proc);
|
55
|
+
extern VALUE rb_php_vm_get_error_handler(VALUE cls);
|
56
|
+
extern VALUE rb_php_vm_set_error_handler(VALUE cls, VALUE proc);
|
57
|
+
extern void php_vm_require(char *token, VALUE filepath);
|
52
58
|
extern VALUE rb_php_vm_require(VALUE cls, VALUE filepath);
|
53
59
|
extern VALUE rb_php_vm_require_once(VALUE cls, VALUE filepath);
|
54
60
|
extern VALUE rb_php_vm_include(VALUE cls, VALUE filepath);
|
55
61
|
extern VALUE rb_php_vm_include_once(VALUE cls, VALUE filepath);
|
56
|
-
extern VALUE rb_php_vm_exec(VALUE cls, VALUE
|
57
|
-
extern VALUE rb_php_vm_get_class(VALUE cls, VALUE
|
62
|
+
extern VALUE rb_php_vm_exec(VALUE cls, VALUE code);
|
63
|
+
extern VALUE rb_php_vm_get_class(VALUE cls, VALUE v_class_name);
|
58
64
|
extern VALUE define_global_constants();
|
59
65
|
extern VALUE define_global_functions();
|
60
66
|
extern VALUE define_global_classes();
|
@@ -66,13 +72,13 @@ extern VALUE rb_php_global_class_call(VALUE self);
|
|
66
72
|
extern void php_global_require(char *token, VALUE filepath);
|
67
73
|
extern VALUE rb_php_global_require(VALUE cls, VALUE filepath);
|
68
74
|
extern VALUE rb_php_global_require_once(VALUE cls, VALUE filepath);
|
69
|
-
extern VALUE rb_php_global_echo(int argc, VALUE *argv, VALUE
|
70
|
-
extern VALUE rb_php_global_print(VALUE self, VALUE
|
71
|
-
extern VALUE rb_php_global_array(int argc, VALUE *argv, VALUE
|
75
|
+
extern VALUE rb_php_global_echo(int argc, VALUE *argv, VALUE cls);
|
76
|
+
extern VALUE rb_php_global_print(VALUE self, VALUE cls);
|
77
|
+
extern VALUE rb_php_global_array(int argc, VALUE *argv, VALUE cls);
|
72
78
|
|
73
79
|
// class PHPVM::PHPClass
|
74
|
-
extern VALUE rb_php_class_get(VALUE cls, VALUE
|
75
|
-
extern VALUE rb_php_class_initialize(VALUE self, VALUE
|
80
|
+
extern VALUE rb_php_class_get(VALUE cls, VALUE v_name);
|
81
|
+
extern VALUE rb_php_class_initialize(VALUE self, VALUE v_name);
|
76
82
|
extern VALUE rb_php_class_name(VALUE self);
|
77
83
|
extern VALUE rb_php_class_new(int argc, VALUE *argv, VALUE self);
|
78
84
|
extern VALUE rb_php_class_getter(VALUE self);
|
@@ -96,6 +102,16 @@ extern VALUE rb_php_object_call_magic___call(VALUE self, VALUE name, VALUE args)
|
|
96
102
|
extern VALUE rb_php_object_call_magic___tostring(VALUE self);
|
97
103
|
extern VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self);
|
98
104
|
|
105
|
+
// class PHPVM::PHPExceptionObject
|
106
|
+
extern VALUE rb_php_exception_object_initialize(int argc, VALUE *argv, VALUE self);
|
107
|
+
|
108
|
+
// class PHPVM::PHPErrorReporting
|
109
|
+
extern VALUE rb_php_error_reporting_initialize(int argc, VALUE *argv, VALUE self);
|
110
|
+
extern VALUE rb_php_error_reporting_log_message(VALUE self);
|
111
|
+
extern VALUE rb_php_error_reporting_error_level(VALUE self);
|
112
|
+
extern VALUE rb_php_error_reporting_file(VALUE self);
|
113
|
+
extern VALUE rb_php_error_reporting_line(VALUE self);
|
114
|
+
|
99
115
|
// module
|
100
116
|
extern void php_vm_module_init();
|
101
117
|
extern void php_vm_module_exit();
|
data/ext/php_vm/php_vm_z2v.c
CHANGED
@@ -87,33 +87,37 @@ static VALUE zval_to_value_object(zval *z)
|
|
87
87
|
|
88
88
|
// class
|
89
89
|
VALUE class = rb_php_class_get(rb_cPHPClass, v_name);
|
90
|
+
zend_class_entry *ce = get_zend_class_entry(class);
|
90
91
|
|
91
92
|
// object
|
92
93
|
VALUE obj = Qnil;
|
93
94
|
if (is_exception_zval(z)) {
|
94
95
|
// exception object
|
95
96
|
zval *z_message = zend_read_property(zend_exception_get_default(TSRMLS_C), z, "message", sizeof("message")-1, 0 TSRMLS_CC);
|
96
|
-
|
97
97
|
obj = rb_exc_new2(rb_ePHPExceptionObject, Z_STRVAL_P(z_message));
|
98
|
-
|
99
|
-
rb_iv_set(obj, "php_class", class);
|
100
98
|
} else {
|
101
99
|
// normal object
|
102
100
|
obj = rb_obj_alloc(rb_cPHPObject);
|
103
|
-
|
104
|
-
rb_iv_set(obj, "php_class", class);
|
105
101
|
}
|
106
102
|
|
107
103
|
// retain
|
108
104
|
Z_ADDREF_P(z);
|
109
105
|
|
106
|
+
// class
|
107
|
+
rb_iv_set(obj, "php_class", class);
|
108
|
+
|
110
109
|
// resource
|
111
110
|
PHPNativeResource *p = ALLOC(PHPNativeResource);
|
112
|
-
p->ce =
|
111
|
+
p->ce = ce;
|
113
112
|
p->zobj = z;
|
114
113
|
VALUE resource = Data_Wrap_Struct(CLASS_OF(obj), 0, php_native_resource_delete, p);
|
115
114
|
rb_iv_set(obj, "php_native_resource", resource);
|
116
115
|
|
116
|
+
// define php instance properties and methods
|
117
|
+
define_php_properties(obj, ce, 0);
|
118
|
+
define_php_methods(obj, ce, 0);
|
119
|
+
define_php_magic_method(obj, ce, z);
|
120
|
+
|
117
121
|
return obj;
|
118
122
|
}
|
119
123
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: php_vm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: php_vm is a native bridge between Ruby and PHP.
|
15
15
|
email:
|