php_vm 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/php_vm/php_vm.c +156 -3
- data/ext/php_vm/php_vm.h +9 -1
- metadata +1 -1
data/ext/php_vm/php_vm.c
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
// global
|
8
8
|
|
9
9
|
VALUE rb_mPHPVM;
|
10
|
+
VALUE rb_mPHPGlobal;
|
10
11
|
VALUE rb_cPHPClass;
|
11
12
|
VALUE rb_cPHPObject;
|
12
13
|
VALUE rb_ePHPError;
|
@@ -456,11 +457,155 @@ VALUE rb_php_vm_exec(VALUE cls, VALUE code)
|
|
456
457
|
return Qnil;
|
457
458
|
}
|
458
459
|
|
459
|
-
VALUE
|
460
|
+
VALUE rb_php_vm_get_class(VALUE cls, VALUE v_class_name)
|
460
461
|
{
|
461
462
|
return rb_php_class_get(rb_cPHPClass, v_class_name);
|
462
463
|
}
|
463
464
|
|
465
|
+
VALUE rb_php_vm_define_global_constants(VALUE cls)
|
466
|
+
{
|
467
|
+
TSRMLS_FETCH();
|
468
|
+
|
469
|
+
// method
|
470
|
+
zend_function *mptr;
|
471
|
+
find_zend_function(NULL, "get_defined_constants", strlen("get_defined_constants"), &mptr);
|
472
|
+
if (!mptr) {
|
473
|
+
return Qfalse;
|
474
|
+
}
|
475
|
+
|
476
|
+
// call method
|
477
|
+
zval *z_val;
|
478
|
+
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
479
|
+
if (result==FAILURE) {
|
480
|
+
return Qfalse;
|
481
|
+
}
|
482
|
+
|
483
|
+
HashTable* ht = Z_ARRVAL_P(z_val);
|
484
|
+
HashPosition pos;
|
485
|
+
zval** data;
|
486
|
+
|
487
|
+
zend_hash_internal_pointer_reset_ex(ht, &pos);
|
488
|
+
while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
|
489
|
+
char *string_key;
|
490
|
+
ulong num_index;
|
491
|
+
|
492
|
+
switch(zend_hash_get_current_key_ex(ht, &string_key, NULL, &num_index, 0, &pos)) {
|
493
|
+
case HASH_KEY_IS_STRING:{
|
494
|
+
if (0x61<=string_key[0] && string_key[0]<=0x7a) {
|
495
|
+
// lower case
|
496
|
+
char *string_key2 = malloc(strlen(string_key));
|
497
|
+
string_key2[0] = string_key2[0]-32;
|
498
|
+
if (!rb_const_defined(rb_mPHPGlobal, rb_intern(string_key2))) {
|
499
|
+
rb_define_const(rb_mPHPGlobal, string_key2, zval_to_value(*data));
|
500
|
+
}
|
501
|
+
free(string_key2);
|
502
|
+
} else {
|
503
|
+
// upper case
|
504
|
+
if (!rb_const_defined(rb_mPHPGlobal, rb_intern(string_key))) {
|
505
|
+
rb_define_const(rb_mPHPGlobal, string_key, zval_to_value(*data));
|
506
|
+
}
|
507
|
+
}
|
508
|
+
break;
|
509
|
+
}
|
510
|
+
}
|
511
|
+
|
512
|
+
zend_hash_move_forward_ex(ht, &pos);
|
513
|
+
}
|
514
|
+
return Qtrue;
|
515
|
+
}
|
516
|
+
|
517
|
+
VALUE rb_php_vm_define_global_functions(VALUE cls)
|
518
|
+
{
|
519
|
+
TSRMLS_FETCH();
|
520
|
+
|
521
|
+
// method
|
522
|
+
zend_function *mptr;
|
523
|
+
find_zend_function(NULL, "get_defined_functions", strlen("get_defined_functions"), &mptr);
|
524
|
+
if (!mptr) {
|
525
|
+
return Qfalse;
|
526
|
+
}
|
527
|
+
|
528
|
+
// call method
|
529
|
+
zval *z_val;
|
530
|
+
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
531
|
+
if (result==FAILURE) {
|
532
|
+
return Qfalse;
|
533
|
+
}
|
534
|
+
|
535
|
+
HashTable* ht = Z_ARRVAL_P(z_val);
|
536
|
+
HashPosition pos;
|
537
|
+
zval** data;
|
538
|
+
|
539
|
+
zend_hash_internal_pointer_reset_ex(ht, &pos);
|
540
|
+
while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
|
541
|
+
HashTable* ht2 = Z_ARRVAL_P(*data);
|
542
|
+
HashPosition pos2;
|
543
|
+
zval** data2;
|
544
|
+
|
545
|
+
zend_hash_internal_pointer_reset_ex(ht2, &pos2);
|
546
|
+
while (SUCCESS == zend_hash_get_current_data_ex(ht2, (void **)&data2, &pos2)) {
|
547
|
+
rb_define_module_function(rb_mPHPGlobal, Z_STRVAL_P(*data2), rb_php_global_function_call, -1);
|
548
|
+
zend_hash_move_forward_ex(ht2, &pos2);
|
549
|
+
}
|
550
|
+
|
551
|
+
zend_hash_move_forward_ex(ht, &pos);
|
552
|
+
}
|
553
|
+
return Qtrue;
|
554
|
+
}
|
555
|
+
|
556
|
+
VALUE rb_php_vm_define_global_classes(VALUE cls)
|
557
|
+
{
|
558
|
+
TSRMLS_FETCH();
|
559
|
+
|
560
|
+
// method
|
561
|
+
zend_function *mptr;
|
562
|
+
find_zend_function(NULL, "get_declared_classes", strlen("get_declared_classes"), &mptr);
|
563
|
+
if (!mptr) {
|
564
|
+
return Qfalse;
|
565
|
+
}
|
566
|
+
|
567
|
+
// call method
|
568
|
+
zval *z_val;
|
569
|
+
int result = call_php_method(NULL, NULL, mptr, 0, NULL, &z_val TSRMLS_CC);
|
570
|
+
if (result==FAILURE) {
|
571
|
+
return Qfalse;
|
572
|
+
}
|
573
|
+
|
574
|
+
HashTable* ht = Z_ARRVAL_P(z_val);
|
575
|
+
HashPosition pos;
|
576
|
+
zval** data;
|
577
|
+
|
578
|
+
zend_hash_internal_pointer_reset_ex(ht, &pos);
|
579
|
+
while (SUCCESS == zend_hash_get_current_data_ex(ht, (void **)&data, &pos)) {
|
580
|
+
rb_define_module_function(rb_mPHPGlobal, Z_STRVAL_P(*data), rb_php_global_class_call, 0);
|
581
|
+
zend_hash_move_forward_ex(ht, &pos);
|
582
|
+
}
|
583
|
+
return Qtrue;
|
584
|
+
}
|
585
|
+
|
586
|
+
VALUE rb_php_vm_define_global(VALUE cls)
|
587
|
+
{
|
588
|
+
VALUE res1 = rb_php_vm_define_global_constants(cls);
|
589
|
+
VALUE res2 = rb_php_vm_define_global_functions(cls);
|
590
|
+
VALUE res3 = rb_php_vm_define_global_classes(cls);
|
591
|
+
return res1==Qtrue && res2==Qtrue && res3==Qtrue;
|
592
|
+
}
|
593
|
+
|
594
|
+
|
595
|
+
// module PHPVM::PHPGlobal
|
596
|
+
|
597
|
+
VALUE rb_php_global_function_call(int argc, VALUE *argv, VALUE self)
|
598
|
+
{
|
599
|
+
VALUE callee = get_callee_name();
|
600
|
+
return call_php_method_bridge(NULL, NULL, callee, argc, argv);
|
601
|
+
}
|
602
|
+
|
603
|
+
VALUE rb_php_global_class_call(VALUE self)
|
604
|
+
{
|
605
|
+
VALUE callee = get_callee_name();
|
606
|
+
return rb_php_class_get(rb_cPHPClass, callee);
|
607
|
+
}
|
608
|
+
|
464
609
|
|
465
610
|
// class PHPVM::PHPClass
|
466
611
|
|
@@ -654,9 +799,17 @@ void Init_php_vm()
|
|
654
799
|
rb_define_singleton_method(rb_mPHPVM, "require", rb_php_vm_require, 1);
|
655
800
|
rb_define_singleton_method(rb_mPHPVM, "require_once", rb_php_vm_require_once, 1);
|
656
801
|
rb_define_singleton_method(rb_mPHPVM, "exec", rb_php_vm_exec, 1);
|
657
|
-
rb_define_singleton_method(rb_mPHPVM, "
|
802
|
+
rb_define_singleton_method(rb_mPHPVM, "get_class", rb_php_vm_get_class, 1);
|
803
|
+
rb_define_singleton_method(rb_mPHPVM, "define_global_constants", rb_php_vm_define_global_constants, 0);
|
804
|
+
rb_define_singleton_method(rb_mPHPVM, "define_global_functions", rb_php_vm_define_global_functions, 0);
|
805
|
+
rb_define_singleton_method(rb_mPHPVM, "define_global_classes", rb_php_vm_define_global_classes, 0);
|
806
|
+
rb_define_singleton_method(rb_mPHPVM, "define_global", rb_php_vm_define_global, 0);
|
807
|
+
|
808
|
+
rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.2.0"));
|
658
809
|
|
659
|
-
|
810
|
+
// module PHPVM::PHPGlobal
|
811
|
+
rb_mPHPGlobal = rb_define_module_under(rb_mPHPVM, "PHPGlobal");
|
812
|
+
rb_php_vm_define_global(rb_mPHPVM);
|
660
813
|
|
661
814
|
// class PHPVM::PHPClass
|
662
815
|
rb_cPHPClass = rb_define_class_under(rb_mPHPVM, "PHPClass", rb_cObject);
|
data/ext/php_vm/php_vm.h
CHANGED
@@ -43,7 +43,15 @@ extern zval* get_zval(VALUE self);
|
|
43
43
|
// module PHPVM
|
44
44
|
extern VALUE rb_php_vm_require(VALUE cls, VALUE rbv_filepath);
|
45
45
|
extern VALUE rb_php_vm_exec(VALUE cls, VALUE rbv_code);
|
46
|
-
extern VALUE
|
46
|
+
extern VALUE rb_php_vm_get_class(VALUE cls, VALUE rbv_class_name);
|
47
|
+
extern VALUE rb_php_vm_define_global_constants(VALUE cls);
|
48
|
+
extern VALUE rb_php_vm_define_global_functions(VALUE cls);
|
49
|
+
extern VALUE rb_php_vm_define_global_classes(VALUE cls);
|
50
|
+
extern VALUE rb_php_vm_define_global(VALUE cls);
|
51
|
+
|
52
|
+
// module PHPVM::PHPGlobal
|
53
|
+
extern VALUE rb_php_global_function_call(int argc, VALUE *argv, VALUE self);
|
54
|
+
extern VALUE rb_php_global_class_call(VALUE self);
|
47
55
|
|
48
56
|
// class PHPVM::PHPClass
|
49
57
|
extern VALUE rb_php_class_get(VALUE cls, VALUE rbv_name);
|