php_vm 1.3.5 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/php_vm/php_vm.c +160 -41
- data/ext/php_vm/php_vm.h +10 -1
- data/ext/php_vm/php_vm_v2z.c +21 -16
- data/ext/php_vm/php_vm_v2z.h +1 -1
- metadata +2 -2
data/ext/php_vm/php_vm.c
CHANGED
@@ -245,9 +245,6 @@ void define_php_properties(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
245
245
|
void define_php_methods(VALUE v_obj, zend_class_entry *ce, int is_static)
|
246
246
|
{
|
247
247
|
// TODO: access scope
|
248
|
-
// TODO: __toString
|
249
|
-
// TODO: __clone
|
250
|
-
// TODO: __isset
|
251
248
|
|
252
249
|
HashPosition pos;
|
253
250
|
zend_function *mptr;
|
@@ -282,18 +279,6 @@ void define_php_methods(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
282
279
|
if (strcmp("__construct", fname)==0 || strcmp(ce->name, fname)==0) {
|
283
280
|
// __construct => no define
|
284
281
|
is_pass_define = 1;
|
285
|
-
|
286
|
-
} else if (strcmp("__call", fname)==0) {
|
287
|
-
// __call => method_missing
|
288
|
-
rb_define_singleton_method(v_obj, "method_missing", rb_php_object_call_method_missing, -1);
|
289
|
-
|
290
|
-
} else if (strcmp("__get", fname)==0) {
|
291
|
-
// __get => method_missing
|
292
|
-
rb_define_singleton_method(v_obj, "method_missing", rb_php_object_call_method_missing, -1);
|
293
|
-
|
294
|
-
} else if (strcmp("__set", fname)==0) {
|
295
|
-
// __set => method_missing
|
296
|
-
rb_define_singleton_method(v_obj, "method_missing", rb_php_object_call_method_missing, -1);
|
297
282
|
}
|
298
283
|
|
299
284
|
// other method
|
@@ -307,6 +292,45 @@ void define_php_methods(VALUE v_obj, zend_class_entry *ce, int is_static)
|
|
307
292
|
}
|
308
293
|
}
|
309
294
|
|
295
|
+
void define_php_magic_method(VALUE v_obj, zend_class_entry *ce, int is_static)
|
296
|
+
{
|
297
|
+
if (is_static) {
|
298
|
+
// static method
|
299
|
+
if (ce->__callstatic) {
|
300
|
+
rb_define_singleton_method(v_obj, "__callStatic", rb_php_class_call_magic___callstatic, 2);
|
301
|
+
rb_define_singleton_method(v_obj, "method_missing", rb_php_class_call_method_missing, -1);
|
302
|
+
}
|
303
|
+
} else {
|
304
|
+
// instance method
|
305
|
+
if (ce->clone) {
|
306
|
+
rb_define_singleton_method(v_obj, "__clone", rb_php_object_call_magic_clone, 0);
|
307
|
+
rb_define_singleton_method(v_obj, "dup", rb_php_object_call_magic_clone, 0);
|
308
|
+
rb_define_singleton_method(v_obj, "clone", rb_php_object_call_magic_clone, 0);
|
309
|
+
}
|
310
|
+
if (ce->__get) {
|
311
|
+
rb_define_singleton_method(v_obj, "__get", rb_php_object_call_magic___get, 1);
|
312
|
+
}
|
313
|
+
if (ce->__set) {
|
314
|
+
rb_define_singleton_method(v_obj, "__set", rb_php_object_call_magic___set, 2);
|
315
|
+
}
|
316
|
+
if (ce->__unset) {
|
317
|
+
rb_define_singleton_method(v_obj, "__unset", rb_php_object_call_magic___unset, 1);
|
318
|
+
}
|
319
|
+
if (ce->__isset) {
|
320
|
+
rb_define_singleton_method(v_obj, "__isset", rb_php_object_call_magic___isset, 1);
|
321
|
+
}
|
322
|
+
if (ce->__call) {
|
323
|
+
rb_define_singleton_method(v_obj, "__call", rb_php_object_call_magic___call, 2);
|
324
|
+
}
|
325
|
+
if (ce->__tostring) {
|
326
|
+
rb_define_singleton_method(v_obj, "__toString", rb_php_object_call_magic___tostring, 0);
|
327
|
+
}
|
328
|
+
if (ce->__call || ce->__get || ce->__set) {
|
329
|
+
rb_define_singleton_method(v_obj, "method_missing", rb_php_object_call_method_missing, -1);
|
330
|
+
}
|
331
|
+
}
|
332
|
+
}
|
333
|
+
|
310
334
|
int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int argc, VALUE *v_argv, zval **retval_ptr TSRMLS_DC)
|
311
335
|
{
|
312
336
|
int result = FAILURE;
|
@@ -339,8 +363,7 @@ int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int ar
|
|
339
363
|
long i;
|
340
364
|
for (i=0; i<argc; i++) {
|
341
365
|
zval *new_var;
|
342
|
-
|
343
|
-
value_to_zval(v_argv[i], new_var);
|
366
|
+
value_to_zval(v_argv[i], &new_var);
|
344
367
|
|
345
368
|
zend_hash_next_index_insert(Z_ARRVAL_P(z_args), &new_var, sizeof(zval *), NULL);
|
346
369
|
}
|
@@ -351,8 +374,6 @@ int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr, int ar
|
|
351
374
|
zend_try {
|
352
375
|
result = zend_call_function(&fci, &fcc TSRMLS_CC);
|
353
376
|
} zend_catch {
|
354
|
-
// EG(exception) is NULL... Why??
|
355
|
-
//printf("call_php_method exception: %p\n", EG(exception));
|
356
377
|
} zend_end_try();
|
357
378
|
|
358
379
|
// reference variable
|
@@ -396,7 +417,26 @@ VALUE get_callee_name()
|
|
396
417
|
return Qnil;
|
397
418
|
}
|
398
419
|
|
399
|
-
VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj,
|
420
|
+
VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj, zend_function *mptr, int argc, VALUE *argv)
|
421
|
+
{
|
422
|
+
// call
|
423
|
+
zval *z_val;
|
424
|
+
int result = call_php_method(ce, obj, mptr, argc, argv, &z_val TSRMLS_CC);
|
425
|
+
|
426
|
+
// exception
|
427
|
+
if (result==FAILURE) {
|
428
|
+
const char *mname = mptr->common.function_name;
|
429
|
+
char *message = malloc(32+strlen(mname));
|
430
|
+
sprintf(message, "raise exception: %s", mname);
|
431
|
+
VALUE exception = rb_exc_new2(rb_ePHPError, message);
|
432
|
+
free(message);
|
433
|
+
rb_exc_raise(exception);
|
434
|
+
}
|
435
|
+
|
436
|
+
return zval_to_value(z_val);
|
437
|
+
}
|
438
|
+
|
439
|
+
VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee, int argc, VALUE *argv)
|
400
440
|
{
|
401
441
|
TSRMLS_FETCH();
|
402
442
|
|
@@ -431,8 +471,7 @@ VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj, VALUE callee, int
|
|
431
471
|
if (is_setter) {
|
432
472
|
// setter
|
433
473
|
rb_funcall(callee, rb_intern("gsub!"), 2, rb_str_new2("="), rb_str_new2(""));
|
434
|
-
|
435
|
-
value_to_zval(argv[0], z_val);
|
474
|
+
value_to_zval(argv[0], &z_val);
|
436
475
|
|
437
476
|
if (obj) {
|
438
477
|
// instance
|
@@ -545,7 +584,7 @@ VALUE rb_php_vm_get_output_handler(VALUE cls)
|
|
545
584
|
|
546
585
|
VALUE rb_php_vm_set_output_handler(VALUE cls, VALUE proc)
|
547
586
|
{
|
548
|
-
if (proc!=Qnil && !
|
587
|
+
if (proc!=Qnil && !rb_obj_is_kind_of(proc, rb_cProc)) {
|
549
588
|
rb_raise(rb_eArgError, "proc is not proc object");
|
550
589
|
}
|
551
590
|
rb_cv_set(rb_mPHPVM, "@@output_handler", proc);
|
@@ -559,7 +598,7 @@ VALUE rb_php_vm_get_error_handler(VALUE cls)
|
|
559
598
|
|
560
599
|
VALUE rb_php_vm_set_error_handler(VALUE cls, VALUE proc)
|
561
600
|
{
|
562
|
-
if (proc!=Qnil && !
|
601
|
+
if (proc!=Qnil && !rb_obj_is_kind_of(proc, rb_cProc)) {
|
563
602
|
rb_raise(rb_eArgError, "proc is not proc object");
|
564
603
|
}
|
565
604
|
rb_cv_set(rb_mPHPVM, "@@error_handler", proc);
|
@@ -763,7 +802,7 @@ VALUE rb_php_vm_define_global(VALUE cls)
|
|
763
802
|
VALUE rb_php_global_function_call(int argc, VALUE *argv, VALUE self)
|
764
803
|
{
|
765
804
|
VALUE callee = get_callee_name();
|
766
|
-
return
|
805
|
+
return call_php_method_name_bridge(NULL, NULL, callee, argc, argv);
|
767
806
|
}
|
768
807
|
|
769
808
|
VALUE rb_php_global_class_call(VALUE self)
|
@@ -828,7 +867,7 @@ VALUE rb_php_global_echo(int argc, VALUE *argv, VALUE cls)
|
|
828
867
|
for (i=0; i<argc; i++) {
|
829
868
|
argv2[i+1] = argv[i];
|
830
869
|
}
|
831
|
-
|
870
|
+
call_php_method_name_bridge(NULL, NULL, rb_str_new2("printf"), argc+1, argv2);
|
832
871
|
|
833
872
|
// release
|
834
873
|
free(format);
|
@@ -902,6 +941,7 @@ VALUE rb_php_class_initialize(VALUE self, VALUE v_name)
|
|
902
941
|
// define php static properties and methods
|
903
942
|
define_php_properties(self, *ce, 1);
|
904
943
|
define_php_methods(self, *ce, 1);
|
944
|
+
define_php_magic_method(self, *ce, 1);
|
905
945
|
|
906
946
|
return self;
|
907
947
|
}
|
@@ -929,6 +969,7 @@ VALUE rb_php_class_new(int argc, VALUE *argv, VALUE self)
|
|
929
969
|
// define php instance properties and methods
|
930
970
|
define_php_properties(obj, ce, 0);
|
931
971
|
define_php_methods(obj, ce, 0);
|
972
|
+
define_php_magic_method(obj, ce, 0);
|
932
973
|
|
933
974
|
return obj;
|
934
975
|
}
|
@@ -937,21 +978,30 @@ VALUE rb_php_class_getter(VALUE self)
|
|
937
978
|
{
|
938
979
|
zend_class_entry *ce = get_zend_class_entry(self);
|
939
980
|
VALUE callee = get_callee_name();
|
940
|
-
return
|
981
|
+
return call_php_method_name_bridge(ce, NULL, callee, 0, NULL);
|
941
982
|
}
|
942
983
|
|
943
984
|
VALUE rb_php_class_setter(VALUE self, VALUE value)
|
944
985
|
{
|
945
986
|
zend_class_entry *ce = get_zend_class_entry(self);
|
946
987
|
VALUE callee = get_callee_name();
|
947
|
-
return
|
988
|
+
return call_php_method_name_bridge(ce, NULL, callee, 1, &value);
|
948
989
|
}
|
949
990
|
|
950
991
|
VALUE rb_php_class_call(int argc, VALUE *argv, VALUE self)
|
951
992
|
{
|
952
993
|
zend_class_entry *ce = get_zend_class_entry(self);
|
953
994
|
VALUE callee = get_callee_name();
|
954
|
-
return
|
995
|
+
return call_php_method_name_bridge(ce, NULL, callee, argc, argv);
|
996
|
+
}
|
997
|
+
|
998
|
+
VALUE rb_php_class_call_magic___callstatic(VALUE self, VALUE name, VALUE args)
|
999
|
+
{
|
1000
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1001
|
+
zval *zobj = get_zval(self);
|
1002
|
+
VALUE argv[2] = {name, args};
|
1003
|
+
|
1004
|
+
return call_php_method_bridge(ce, zobj, ce->__callstatic, 2, argv);
|
955
1005
|
}
|
956
1006
|
|
957
1007
|
VALUE rb_php_class_call_method_missing(int argc, VALUE *argv, VALUE self)
|
@@ -962,7 +1012,7 @@ VALUE rb_php_class_call_method_missing(int argc, VALUE *argv, VALUE self)
|
|
962
1012
|
rb_scan_args(argc, argv, "1*", &name, &args);
|
963
1013
|
VALUE argv2[2] = {name, args};
|
964
1014
|
|
965
|
-
return call_php_method_bridge(ce, NULL,
|
1015
|
+
return call_php_method_bridge(ce, NULL, ce->__callstatic, 2, argv2);
|
966
1016
|
}
|
967
1017
|
|
968
1018
|
|
@@ -999,7 +1049,7 @@ VALUE rb_php_object_getter(VALUE self)
|
|
999
1049
|
zend_class_entry *ce = get_zend_class_entry(self);
|
1000
1050
|
zval *zobj = get_zval(self);
|
1001
1051
|
VALUE callee = get_callee_name();
|
1002
|
-
return
|
1052
|
+
return call_php_method_name_bridge(ce, zobj, callee, 0, NULL);
|
1003
1053
|
}
|
1004
1054
|
|
1005
1055
|
VALUE rb_php_object_setter(VALUE self, VALUE value)
|
@@ -1007,7 +1057,7 @@ VALUE rb_php_object_setter(VALUE self, VALUE value)
|
|
1007
1057
|
zend_class_entry *ce = get_zend_class_entry(self);
|
1008
1058
|
zval *zobj = get_zval(self);
|
1009
1059
|
VALUE callee = get_callee_name();
|
1010
|
-
return
|
1060
|
+
return call_php_method_name_bridge(ce, zobj, callee, 1, &value);
|
1011
1061
|
}
|
1012
1062
|
|
1013
1063
|
VALUE rb_php_object_call(int argc, VALUE *argv, VALUE self)
|
@@ -1015,7 +1065,73 @@ VALUE rb_php_object_call(int argc, VALUE *argv, VALUE self)
|
|
1015
1065
|
zend_class_entry *ce = get_zend_class_entry(self);
|
1016
1066
|
zval *zobj = get_zval(self);
|
1017
1067
|
VALUE callee = get_callee_name();
|
1018
|
-
return
|
1068
|
+
return call_php_method_name_bridge(ce, zobj, callee, argc, argv);
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
VALUE rb_php_object_call_magic_clone(VALUE self)
|
1072
|
+
{
|
1073
|
+
zval *zobj = get_zval(self);
|
1074
|
+
|
1075
|
+
zend_object_clone_obj_t clone_call = Z_OBJ_HT_P(zobj)->clone_obj;
|
1076
|
+
zval *retval;
|
1077
|
+
|
1078
|
+
ALLOC_ZVAL(retval);
|
1079
|
+
Z_OBJVAL_P(retval) = clone_call(zobj TSRMLS_CC);
|
1080
|
+
Z_TYPE_P(retval) = IS_OBJECT;
|
1081
|
+
Z_SET_REFCOUNT_P(retval, 1);
|
1082
|
+
Z_SET_ISREF_P(retval);
|
1083
|
+
|
1084
|
+
return zval_to_value(retval);
|
1085
|
+
}
|
1086
|
+
|
1087
|
+
VALUE rb_php_object_call_magic___get(VALUE self, VALUE name)
|
1088
|
+
{
|
1089
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1090
|
+
zval *zobj = get_zval(self);
|
1091
|
+
|
1092
|
+
return call_php_method_bridge(ce, zobj, ce->__get, 1, &name);
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
VALUE rb_php_object_call_magic___set(VALUE self, VALUE name, VALUE arg)
|
1096
|
+
{
|
1097
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1098
|
+
zval *zobj = get_zval(self);
|
1099
|
+
VALUE args[2] = {name, arg};
|
1100
|
+
|
1101
|
+
return call_php_method_bridge(ce, zobj, ce->__set, 2, args);
|
1102
|
+
}
|
1103
|
+
|
1104
|
+
VALUE rb_php_object_call_magic___unset(VALUE self, VALUE name)
|
1105
|
+
{
|
1106
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1107
|
+
zval *zobj = get_zval(self);
|
1108
|
+
|
1109
|
+
return call_php_method_bridge(ce, zobj, ce->__unset, 1, &name);
|
1110
|
+
}
|
1111
|
+
|
1112
|
+
VALUE rb_php_object_call_magic___isset(VALUE self, VALUE name)
|
1113
|
+
{
|
1114
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1115
|
+
zval *zobj = get_zval(self);
|
1116
|
+
|
1117
|
+
return call_php_method_bridge(ce, zobj, ce->__isset, 1, &name);
|
1118
|
+
}
|
1119
|
+
|
1120
|
+
VALUE rb_php_object_call_magic___call(VALUE self, VALUE name, VALUE args)
|
1121
|
+
{
|
1122
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1123
|
+
zval *zobj = get_zval(self);
|
1124
|
+
VALUE argv[2] = {name, args};
|
1125
|
+
|
1126
|
+
return call_php_method_bridge(ce, zobj, ce->__call, 2, argv);
|
1127
|
+
}
|
1128
|
+
|
1129
|
+
VALUE rb_php_object_call_magic___tostring(VALUE self)
|
1130
|
+
{
|
1131
|
+
zend_class_entry *ce = get_zend_class_entry(self);
|
1132
|
+
zval *zobj = get_zval(self);
|
1133
|
+
|
1134
|
+
return call_php_method_bridge(ce, zobj, ce->__tostring, 0, NULL);
|
1019
1135
|
}
|
1020
1136
|
|
1021
1137
|
VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self)
|
@@ -1023,15 +1139,14 @@ VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self)
|
|
1023
1139
|
zend_class_entry *ce = get_zend_class_entry(self);
|
1024
1140
|
zval *zobj = get_zval(self);
|
1025
1141
|
|
1026
|
-
|
1027
|
-
if (has_zend_function(ce, call_method)) {
|
1142
|
+
if (ce->__call) {
|
1028
1143
|
// __call
|
1029
1144
|
VALUE name, args;
|
1030
1145
|
rb_scan_args(argc, argv, "1*", &name, &args);
|
1031
1146
|
name = rb_str_new2(rb_id2name(SYM2ID(name)));
|
1032
1147
|
VALUE argv2[2] = {name, args};
|
1033
1148
|
|
1034
|
-
return call_php_method_bridge(ce, zobj,
|
1149
|
+
return call_php_method_bridge(ce, zobj, ce->__call, 2, argv2);
|
1035
1150
|
} else {
|
1036
1151
|
// accessor
|
1037
1152
|
VALUE name, val;
|
@@ -1042,11 +1157,15 @@ VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self)
|
|
1042
1157
|
VALUE is_setter = rb_funcall(name, rb_intern("end_with?"), 1, rb_str_new2("="));
|
1043
1158
|
if (is_setter) {
|
1044
1159
|
// __set
|
1045
|
-
|
1046
|
-
|
1160
|
+
if (ce->__set) {
|
1161
|
+
rb_funcall(name, rb_intern("gsub!"), 2, rb_str_new2("="), rb_str_new2(""));
|
1162
|
+
return call_php_method_bridge(ce, zobj, ce->__set, 2, argv2);
|
1163
|
+
}
|
1047
1164
|
} else {
|
1048
1165
|
// __get
|
1049
|
-
|
1166
|
+
if (ce->__get) {
|
1167
|
+
return call_php_method_bridge(ce, zobj, ce->__get, 1, argv2);
|
1168
|
+
}
|
1050
1169
|
}
|
1051
1170
|
}
|
1052
1171
|
return Qnil;
|
@@ -1072,7 +1191,7 @@ VALUE rb_php_error_reporting_initialize(int argc, VALUE *argv, VALUE self)
|
|
1072
1191
|
VALUE file = Qnil;
|
1073
1192
|
VALUE line = Qnil;
|
1074
1193
|
|
1075
|
-
if (argc==1 &&TYPE(
|
1194
|
+
if (argc==1 && TYPE(argv[0])==T_STRING) {
|
1076
1195
|
log_message = argv[0];
|
1077
1196
|
VALUE re_str = rb_str_new2("^PHP ([^:]+?)(?: error)?: {0,2}(.+) in (.+) on line (\\d+)$");
|
1078
1197
|
VALUE re_option = rb_const_get(rb_cRegexp, rb_intern("MULTILINE"));
|
@@ -1171,7 +1290,7 @@ void Init_php_vm()
|
|
1171
1290
|
rb_define_singleton_method(rb_mPHPVM, "get_class", rb_php_vm_get_class, 1);
|
1172
1291
|
rb_define_singleton_method(rb_mPHPVM, "define_global", rb_php_vm_define_global, 0);
|
1173
1292
|
|
1174
|
-
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.
|
1293
|
+
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.3.6"));
|
1175
1294
|
|
1176
1295
|
rb_cv_set(rb_mPHPVM, "@@output_handler", Qnil);
|
1177
1296
|
rb_cv_set(rb_mPHPVM, "@@error_handler", Qnil);
|
data/ext/php_vm/php_vm.h
CHANGED
@@ -38,7 +38,8 @@ extern int call_php_method(zend_class_entry *ce, zval *obj, zend_function *mptr,
|
|
38
38
|
|
39
39
|
// Ruby
|
40
40
|
extern VALUE get_callee_name();
|
41
|
-
extern VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj,
|
41
|
+
extern VALUE call_php_method_bridge(zend_class_entry *ce, zval *obj, zend_function *mptr, int argc, VALUE *argv);
|
42
|
+
extern VALUE call_php_method_name_bridge(zend_class_entry *ce, zval *obj, VALUE callee, int argc, VALUE *argv);
|
42
43
|
extern void value_copy(VALUE dst, VALUE src);
|
43
44
|
|
44
45
|
// PHP Native resource
|
@@ -77,6 +78,7 @@ extern VALUE rb_php_class_new(int argc, VALUE *argv, VALUE self);
|
|
77
78
|
extern VALUE rb_php_class_getter(VALUE self);
|
78
79
|
extern VALUE rb_php_class_setter(VALUE self, VALUE value);
|
79
80
|
extern VALUE rb_php_class_call(int argc, VALUE *argv, VALUE self);
|
81
|
+
extern VALUE rb_php_class_call_magic___callstatic(VALUE self, VALUE name, VALUE args);
|
80
82
|
extern VALUE rb_php_class_call_method_missing(int argc, VALUE *argv, VALUE self);
|
81
83
|
|
82
84
|
// class PHPVM::PHPObject
|
@@ -85,6 +87,13 @@ extern VALUE rb_php_object_php_class(VALUE self);
|
|
85
87
|
extern VALUE rb_php_object_getter(VALUE self);
|
86
88
|
extern VALUE rb_php_object_setter(VALUE self, VALUE value);
|
87
89
|
extern VALUE rb_php_object_call(int argc, VALUE *argv, VALUE self);
|
90
|
+
extern VALUE rb_php_object_call_magic_clone(VALUE self);
|
91
|
+
extern VALUE rb_php_object_call_magic___get(VALUE self, VALUE name);
|
92
|
+
extern VALUE rb_php_object_call_magic___set(VALUE self, VALUE name, VALUE arg);
|
93
|
+
extern VALUE rb_php_object_call_magic___unset(VALUE self, VALUE name);
|
94
|
+
extern VALUE rb_php_object_call_magic___isset(VALUE self, VALUE name);
|
95
|
+
extern VALUE rb_php_object_call_magic___call(VALUE self, VALUE name, VALUE args);
|
96
|
+
extern VALUE rb_php_object_call_magic___tostring(VALUE self);
|
88
97
|
extern VALUE rb_php_object_call_method_missing(int argc, VALUE *argv, VALUE self);
|
89
98
|
|
90
99
|
// module
|
data/ext/php_vm/php_vm_v2z.c
CHANGED
@@ -10,8 +10,7 @@ static void value_to_zval_array(VALUE v, zval *z)
|
|
10
10
|
long i;
|
11
11
|
for (i=0; i<RARRAY_LEN(v); i++) {
|
12
12
|
zval *new_var;
|
13
|
-
|
14
|
-
value_to_zval(RARRAY_PTR(v)[i], new_var);
|
13
|
+
value_to_zval(RARRAY_PTR(v)[i], &new_var);
|
15
14
|
|
16
15
|
zend_hash_next_index_insert(Z_ARRVAL_P(z), &new_var, sizeof(zval *), NULL);
|
17
16
|
}
|
@@ -37,55 +36,61 @@ static void value_to_zval_hash(VALUE v, zval *z)
|
|
37
36
|
v_key = rb_obj_as_string(v_key);
|
38
37
|
|
39
38
|
zval *z_value;
|
40
|
-
|
41
|
-
value_to_zval(RARRAY_PTR(v_arr)[i+1], z_value);
|
39
|
+
value_to_zval(RARRAY_PTR(v_arr)[i+1], &z_value);
|
42
40
|
|
43
41
|
add_assoc_zval_ex(z, RSTRING_PTR(v_key), RSTRING_LEN(v_key)+1, z_value);
|
44
42
|
}
|
45
43
|
}
|
46
44
|
|
47
45
|
|
48
|
-
void value_to_zval(VALUE v, zval
|
46
|
+
void value_to_zval(VALUE v, zval **z)
|
49
47
|
{
|
50
48
|
switch (TYPE(v)) {
|
51
49
|
// nil
|
52
50
|
case T_NIL:
|
53
|
-
|
51
|
+
MAKE_STD_ZVAL(*z);
|
52
|
+
ZVAL_NULL(*z);
|
54
53
|
break;
|
55
54
|
// bool
|
56
55
|
case T_TRUE:
|
57
|
-
|
56
|
+
MAKE_STD_ZVAL(*z);
|
57
|
+
ZVAL_TRUE(*z);
|
58
58
|
break;
|
59
59
|
case T_FALSE:
|
60
|
-
|
60
|
+
MAKE_STD_ZVAL(*z);
|
61
|
+
ZVAL_FALSE(*z);
|
61
62
|
break;
|
62
63
|
// number
|
63
64
|
case T_FIXNUM:
|
64
|
-
|
65
|
+
MAKE_STD_ZVAL(*z);
|
66
|
+
ZVAL_LONG(*z, NUM2LONG(v));
|
65
67
|
break;
|
66
68
|
case T_FLOAT:
|
67
|
-
|
69
|
+
MAKE_STD_ZVAL(*z);
|
70
|
+
ZVAL_DOUBLE(*z, RFLOAT_VALUE(v));
|
68
71
|
break;
|
69
72
|
// array
|
70
73
|
case T_ARRAY:
|
71
|
-
|
74
|
+
MAKE_STD_ZVAL(*z);
|
75
|
+
value_to_zval_array(v, *z);
|
72
76
|
break;
|
73
77
|
// hash
|
74
78
|
case T_HASH:
|
75
|
-
|
79
|
+
MAKE_STD_ZVAL(*z);
|
80
|
+
value_to_zval_hash(v, *z);
|
76
81
|
break;
|
77
82
|
// object string
|
78
83
|
default:{
|
79
84
|
zval *resource_zobj = get_zval(v);
|
80
85
|
if (resource_zobj) {
|
81
86
|
// php native resource
|
82
|
-
|
83
|
-
|
84
|
-
*z = *resource_zobj;
|
87
|
+
*z = resource_zobj;
|
88
|
+
Z_ADDREF_PP(z);
|
85
89
|
} else {
|
86
90
|
// other to_s
|
87
91
|
v = rb_obj_as_string(v);
|
88
|
-
|
92
|
+
MAKE_STD_ZVAL(*z);
|
93
|
+
ZVAL_STRING(*z, RSTRING_PTR(v), 1);
|
89
94
|
}
|
90
95
|
}
|
91
96
|
}
|
data/ext/php_vm/php_vm_v2z.h
CHANGED
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.6
|
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-02 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: php_vm is a native bridge between Ruby and PHP.
|
15
15
|
email:
|