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.
Files changed (3) hide show
  1. data/ext/php_vm/php_vm.c +156 -3
  2. data/ext/php_vm/php_vm.h +9 -1
  3. 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 rb_php_vm_getClass(VALUE cls, VALUE v_class_name)
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, "getClass", rb_php_vm_getClass, 1);
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
- rb_define_const(rb_mPHPVM, "VERSION", rb_str_new2("1.1.2"));
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 rb_php_vm_getClass(VALUE cls, VALUE rbv_class_name);
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);
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.1.2
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: