|
@@ -148,6 +148,12 @@ sol_object_t *sol_f_try(sol_state_t *state, sol_object_t *args) {
|
148
|
148
|
|
149
|
149
|
sol_object_t *sol_f_apply(sol_state_t *state, sol_object_t *args) {
|
150
|
150
|
sol_object_t *func = sol_list_get_index(state, args, 0), *arglist = sol_list_get_index(state, args, 1), *rest = sol_list_sublist(state, args, 2);
|
|
151
|
+ if(!sol_is_list(arglist)) {
|
|
152
|
+ sol_obj_free(func);
|
|
153
|
+ sol_obj_free(arglist);
|
|
154
|
+ sol_obj_free(rest);
|
|
155
|
+ return sol_set_error_string(state, "apply with non-list");
|
|
156
|
+ }
|
151
|
157
|
sol_list_append(state, rest, arglist);
|
152
|
158
|
sol_obj_free(arglist);
|
153
|
159
|
sol_list_insert(state, rest, 0, func);
|
|
@@ -354,15 +360,23 @@ sol_object_t *sol_f_rawset(sol_state_t *state, sol_object_t *args) {
|
354
|
360
|
}
|
355
|
361
|
|
356
|
362
|
sol_object_t *sol_f_range(sol_state_t *state, sol_object_t *args) {
|
357
|
|
- sol_object_t *res = sol_new_list(state), *bound = sol_cast_int(state, sol_list_get_index(state, args, 0));
|
|
363
|
+ sol_object_t *res = sol_new_list(state), *bound = sol_list_get_index(state, args, 0);
|
|
364
|
+ sol_object_t *boundi = sol_cast_int(state, bound);
|
358
|
365
|
int i;
|
359
|
|
- for(i = 0; i < bound->ival; i++) {
|
|
366
|
+ sol_obj_free(bound);
|
|
367
|
+ if(sol_has_error(state)) {
|
|
368
|
+ sol_obj_free(boundi);
|
|
369
|
+ sol_obj_free(res);
|
|
370
|
+ return sol_incref(state->None);
|
|
371
|
+ }
|
|
372
|
+ for(i = 0; i < boundi->ival; i++) {
|
360
|
373
|
sol_list_insert(state, res, sol_list_len(state, res), sol_new_int(state, i));
|
361
|
374
|
}
|
362
|
|
- sol_obj_free(bound);
|
|
375
|
+ sol_obj_free(boundi);
|
363
|
376
|
return res;
|
364
|
377
|
}
|
365
|
378
|
|
|
379
|
+/*
|
366
|
380
|
sol_object_t *sol_f_exec(sol_state_t *state, sol_object_t *args) {
|
367
|
381
|
sol_object_t *prg = sol_list_get_index(state, args, 0), *prgstr = sol_cast_string(state, prg);
|
368
|
382
|
stmt_node *program;
|
|
@@ -392,6 +406,7 @@ sol_object_t *sol_f_eval(sol_state_t *state, sol_object_t *args) {
|
392
|
406
|
|
393
|
407
|
return sol_eval(state, program->stmtlist->stmt->expr);
|
394
|
408
|
}
|
|
409
|
+*/
|
395
|
410
|
|
396
|
411
|
sol_object_t *sol_f_execfile(sol_state_t *state, sol_object_t *args) {
|
397
|
412
|
sol_object_t *prg = sol_list_get_index(state, args, 0), *prgstr = sol_cast_string(state, prg);
|
|
@@ -421,17 +436,28 @@ sol_object_t *sol_f_execfile(sol_state_t *state, sol_object_t *args) {
|
421
|
436
|
if(!program) {
|
422
|
437
|
return sol_set_error_string(state, "Compilation failure");
|
423
|
438
|
}
|
424
|
|
- // XXX should st_free(program);
|
425
|
439
|
|
426
|
440
|
sol_exec(state, program);
|
|
441
|
+ st_free(program);
|
427
|
442
|
return sol_incref(state->None);
|
428
|
443
|
}
|
429
|
444
|
|
430
|
445
|
sol_object_t *sol_f_parse(sol_state_t *state, sol_object_t *args) {
|
431
|
|
- sol_object_t *prg = sol_list_get_index(state, args, 0), *prgstr = sol_cast_string(state, prg);
|
432
|
|
- stmt_node *program = sol_compile(prgstr->str);
|
|
446
|
+ sol_object_t *prg = sol_list_get_index(state, args, 0), *prgstr;
|
|
447
|
+ stmt_node *program;
|
|
448
|
+ if(sol_is_buffer(prg)) {
|
|
449
|
+ if(prg->sz >= 0) {
|
|
450
|
+ program = sol_compile_buffer(prg->buffer, prg->sz);
|
|
451
|
+ } else {
|
|
452
|
+ sol_obj_free(prg);
|
|
453
|
+ return sol_set_error_string(state, "parse unsized buffer");
|
|
454
|
+ }
|
|
455
|
+ } else {
|
|
456
|
+ prgstr = sol_cast_string(state, prg);
|
|
457
|
+ program = sol_compile(prgstr->str);
|
|
458
|
+ sol_obj_free(prgstr);
|
|
459
|
+ }
|
433
|
460
|
sol_obj_free(prg);
|
434
|
|
- sol_obj_free(prgstr);
|
435
|
461
|
if(!program) {
|
436
|
462
|
return sol_set_error_string(state, "Compilation failure");
|
437
|
463
|
}
|
|
@@ -698,6 +724,7 @@ sol_object_t *sol_f_int_add(sol_state_t *state, sol_object_t *args) {
|
698
|
724
|
sol_object_t *res = sol_new_int(state, a->ival + bint->ival);
|
699
|
725
|
sol_obj_free(a);
|
700
|
726
|
sol_obj_free(b);
|
|
727
|
+ sol_obj_free(bint);
|
701
|
728
|
if(sol_has_error(state)) {
|
702
|
729
|
sol_obj_free(res);
|
703
|
730
|
return sol_incref(state->None);
|
|
@@ -710,6 +737,7 @@ sol_object_t *sol_f_int_sub(sol_state_t *state, sol_object_t *args) {
|
710
|
737
|
sol_object_t *res = sol_new_int(state, a->ival - bint->ival);
|
711
|
738
|
sol_obj_free(a);
|
712
|
739
|
sol_obj_free(b);
|
|
740
|
+ sol_obj_free(bint);
|
713
|
741
|
if(sol_has_error(state)) {
|
714
|
742
|
sol_obj_free(res);
|
715
|
743
|
return sol_incref(state->None);
|
|
@@ -722,6 +750,7 @@ sol_object_t *sol_f_int_mul(sol_state_t *state, sol_object_t *args) {
|
722
|
750
|
sol_object_t *res = sol_new_int(state, a->ival * bint->ival);
|
723
|
751
|
sol_obj_free(a);
|
724
|
752
|
sol_obj_free(b);
|
|
753
|
+ sol_obj_free(bint);
|
725
|
754
|
if(sol_has_error(state)) {
|
726
|
755
|
sol_obj_free(res);
|
727
|
756
|
return sol_incref(state->None);
|
|
@@ -731,9 +760,16 @@ sol_object_t *sol_f_int_mul(sol_state_t *state, sol_object_t *args) {
|
731
|
760
|
|
732
|
761
|
sol_object_t *sol_f_int_div(sol_state_t *state, sol_object_t *args) {
|
733
|
762
|
sol_object_t *a = sol_list_get_index(state, args, 0), *b = sol_list_get_index(state, args, 1), *bint = sol_cast_int(state, b);
|
734
|
|
- sol_object_t *res = sol_new_int(state, a->ival / bint->ival);
|
735
|
|
- sol_obj_free(a);
|
|
763
|
+ sol_object_t *res;
|
736
|
764
|
sol_obj_free(b);
|
|
765
|
+ if(bint->ival == 0) {
|
|
766
|
+ sol_obj_free(a);
|
|
767
|
+ sol_obj_free(bint);
|
|
768
|
+ return sol_set_error_string(state, "integer divide by zero");
|
|
769
|
+ }
|
|
770
|
+ res = sol_new_int(state, a->ival / bint->ival);
|
|
771
|
+ sol_obj_free(a);
|
|
772
|
+ sol_obj_free(bint);
|
737
|
773
|
if(sol_has_error(state)) {
|
738
|
774
|
sol_obj_free(res);
|
739
|
775
|
return sol_incref(state->None);
|
|
@@ -743,9 +779,16 @@ sol_object_t *sol_f_int_div(sol_state_t *state, sol_object_t *args) {
|
743
|
779
|
|
744
|
780
|
sol_object_t *sol_f_int_mod(sol_state_t *state, sol_object_t *args) {
|
745
|
781
|
sol_object_t *a = sol_list_get_index(state, args, 0), *b = sol_list_get_index(state, args, 1), *bint = sol_cast_int(state, b);
|
746
|
|
- sol_object_t *res = sol_new_int(state, a->ival % bint->ival);
|
747
|
|
- sol_obj_free(a);
|
|
782
|
+ sol_object_t *res;
|
748
|
783
|
sol_obj_free(b);
|
|
784
|
+ if(bint->ival == 0) {
|
|
785
|
+ sol_obj_free(a);
|
|
786
|
+ sol_obj_free(bint);
|
|
787
|
+ return sol_set_error_string(state, "integer modulus by zero");
|
|
788
|
+ }
|
|
789
|
+ res = sol_new_int(state, a->ival % bint->ival);
|
|
790
|
+ sol_obj_free(a);
|
|
791
|
+ sol_obj_free(bint);
|
749
|
792
|
if(sol_has_error(state)) {
|
750
|
793
|
sol_obj_free(res);
|
751
|
794
|
return sol_incref(state->None);
|
|
@@ -758,6 +801,7 @@ sol_object_t *sol_f_int_pow(sol_state_t *state, sol_object_t *args) {
|
758
|
801
|
sol_object_t *res = sol_new_int(state, (long) pow((double) a->ival, bint->ival));
|
759
|
802
|
sol_obj_free(a);
|
760
|
803
|
sol_obj_free(b);
|
|
804
|
+ sol_obj_free(bint);
|
761
|
805
|
if(sol_has_error(state)) {
|
762
|
806
|
sol_obj_free(res);
|
763
|
807
|
return sol_incref(state->None);
|
|
@@ -770,6 +814,7 @@ sol_object_t *sol_f_int_band(sol_state_t *state, sol_object_t *args) {
|
770
|
814
|
sol_object_t *res = sol_new_int(state, a->ival & bint->ival);
|
771
|
815
|
sol_obj_free(a);
|
772
|
816
|
sol_obj_free(b);
|
|
817
|
+ sol_obj_free(bint);
|
773
|
818
|
if(sol_has_error(state)) {
|
774
|
819
|
sol_obj_free(res);
|
775
|
820
|
return sol_incref(state->None);
|
|
@@ -782,6 +827,7 @@ sol_object_t *sol_f_int_bor(sol_state_t *state, sol_object_t *args) {
|
782
|
827
|
sol_object_t *res = sol_new_int(state, a->ival | bint->ival);
|
783
|
828
|
sol_obj_free(a);
|
784
|
829
|
sol_obj_free(b);
|
|
830
|
+ sol_obj_free(bint);
|
785
|
831
|
if(sol_has_error(state)) {
|
786
|
832
|
sol_obj_free(res);
|
787
|
833
|
return sol_incref(state->None);
|
|
@@ -794,6 +840,7 @@ sol_object_t *sol_f_int_bxor(sol_state_t *state, sol_object_t *args) {
|
794
|
840
|
sol_object_t *res = sol_new_int(state, a->ival ^ bint->ival);
|
795
|
841
|
sol_obj_free(a);
|
796
|
842
|
sol_obj_free(b);
|
|
843
|
+ sol_obj_free(bint);
|
797
|
844
|
if(sol_has_error(state)) {
|
798
|
845
|
sol_obj_free(res);
|
799
|
846
|
return sol_incref(state->None);
|
|
@@ -806,6 +853,7 @@ sol_object_t *sol_f_int_blsh(sol_state_t *state, sol_object_t *args) {
|
806
|
853
|
sol_object_t *res = sol_new_int(state, a->ival << bint->ival);
|
807
|
854
|
sol_obj_free(a);
|
808
|
855
|
sol_obj_free(b);
|
|
856
|
+ sol_obj_free(bint);
|
809
|
857
|
if(sol_has_error(state)) {
|
810
|
858
|
sol_obj_free(res);
|
811
|
859
|
return sol_incref(state->None);
|
|
@@ -818,6 +866,7 @@ sol_object_t *sol_f_int_brsh(sol_state_t *state, sol_object_t *args) {
|
818
|
866
|
sol_object_t *res = sol_new_int(state, a->ival >> bint->ival);
|
819
|
867
|
sol_obj_free(a);
|
820
|
868
|
sol_obj_free(b);
|
|
869
|
+ sol_obj_free(bint);
|
821
|
870
|
if(sol_has_error(state)) {
|
822
|
871
|
sol_obj_free(res);
|
823
|
872
|
return sol_incref(state->None);
|
|
@@ -870,6 +919,7 @@ sol_object_t *sol_f_float_add(sol_state_t *state, sol_object_t *args) {
|
870
|
919
|
sol_object_t *res = sol_new_float(state, a->fval + bflt->fval);
|
871
|
920
|
sol_obj_free(a);
|
872
|
921
|
sol_obj_free(b);
|
|
922
|
+ sol_obj_free(bflt);
|
873
|
923
|
if(sol_has_error(state)) {
|
874
|
924
|
sol_obj_free(res);
|
875
|
925
|
return sol_incref(state->None);
|
|
@@ -882,6 +932,7 @@ sol_object_t *sol_f_float_sub(sol_state_t *state, sol_object_t *args) {
|
882
|
932
|
sol_object_t *res = sol_new_float(state, a->fval - bflt->fval);
|
883
|
933
|
sol_obj_free(a);
|
884
|
934
|
sol_obj_free(b);
|
|
935
|
+ sol_obj_free(bflt);
|
885
|
936
|
if(sol_has_error(state)) {
|
886
|
937
|
sol_obj_free(res);
|
887
|
938
|
return sol_incref(state->None);
|
|
@@ -894,6 +945,7 @@ sol_object_t *sol_f_float_mul(sol_state_t *state, sol_object_t *args) {
|
894
|
945
|
sol_object_t *res = sol_new_float(state, a->fval * bflt->fval);
|
895
|
946
|
sol_obj_free(a);
|
896
|
947
|
sol_obj_free(b);
|
|
948
|
+ sol_obj_free(bflt);
|
897
|
949
|
if(sol_has_error(state)) {
|
898
|
950
|
sol_obj_free(res);
|
899
|
951
|
return sol_incref(state->None);
|
|
@@ -903,9 +955,16 @@ sol_object_t *sol_f_float_mul(sol_state_t *state, sol_object_t *args) {
|
903
|
955
|
|
904
|
956
|
sol_object_t *sol_f_float_div(sol_state_t *state, sol_object_t *args) {
|
905
|
957
|
sol_object_t *a = sol_list_get_index(state, args, 0), *b = sol_list_get_index(state, args, 1), *bflt = sol_cast_float(state, b);
|
906
|
|
- sol_object_t *res = sol_new_float(state, a->fval / bflt->fval);
|
907
|
|
- sol_obj_free(a);
|
|
958
|
+ sol_object_t *res;
|
908
|
959
|
sol_obj_free(b);
|
|
960
|
+ if(bflt->fval == 0.0) {
|
|
961
|
+ sol_obj_free(a);
|
|
962
|
+ sol_obj_free(bflt);
|
|
963
|
+ return sol_set_error_string(state, "floating division by zero");
|
|
964
|
+ }
|
|
965
|
+ res = sol_new_float(state, a->fval / bflt->fval);
|
|
966
|
+ sol_obj_free(a);
|
|
967
|
+ sol_obj_free(bflt);
|
909
|
968
|
if(sol_has_error(state)) {
|
910
|
969
|
sol_obj_free(res);
|
911
|
970
|
return sol_incref(state->None);
|
|
@@ -916,8 +975,9 @@ sol_object_t *sol_f_float_div(sol_state_t *state, sol_object_t *args) {
|
916
|
975
|
sol_object_t *sol_f_float_pow(sol_state_t *state, sol_object_t *args) {
|
917
|
976
|
sol_object_t *a = sol_list_get_index(state, args, 0), *b = sol_list_get_index(state, args, 1), *bflt = sol_cast_float(state, b);
|
918
|
977
|
sol_object_t *res = sol_new_float(state, pow(a->fval, bflt->fval));
|
919
|
|
- sol_obj_free(a);
|
920
|
978
|
sol_obj_free(b);
|
|
979
|
+ sol_obj_free(a);
|
|
980
|
+ sol_obj_free(bflt);
|
921
|
981
|
if(sol_has_error(state)) {
|
922
|
982
|
sol_obj_free(res);
|
923
|
983
|
return sol_incref(state->None);
|
|
@@ -963,6 +1023,7 @@ sol_object_t *sol_f_str_add(sol_state_t *state, sol_object_t *args) {
|
963
|
1023
|
sol_object_t *res = sol_string_concat(state, a, bstr);
|
964
|
1024
|
sol_obj_free(a);
|
965
|
1025
|
sol_obj_free(b);
|
|
1026
|
+ sol_obj_free(bstr);
|
966
|
1027
|
if(sol_has_error(state)) {
|
967
|
1028
|
sol_obj_free(res);
|
968
|
1029
|
return sol_incref(state->None);
|
|
@@ -2415,7 +2476,7 @@ sol_object_t *sol_f_buffer_index(sol_state_t *state, sol_object_t *args) {
|
2415
|
2476
|
if(sol_is_name(key)) {
|
2416
|
2477
|
res = sol_map_get(state, funcs, key);
|
2417
|
2478
|
} else if(sol_is_int(key)) {
|
2418
|
|
- res = sol_new_buffer(state, a->buffer, (a->sz < 0) ? a->sz : (a->sz - key->ival), OWN_NONE, NULL, NULL);
|
|
2479
|
+ res = sol_new_buffer(state, ((char *) a->buffer) + key->ival, (a->sz < 0) ? a->sz : (a->sz - key->ival), OWN_NONE, NULL, NULL);
|
2419
|
2480
|
} else {
|
2420
|
2481
|
res = sol_f_not_impl(state, args);
|
2421
|
2482
|
}
|
|
@@ -2545,14 +2606,14 @@ sol_object_t *sol_f_buffer_repr(sol_state_t *state, sol_object_t *args) {
|
2545
|
2606
|
|
2546
|
2607
|
sol_object_t *sol_f_buffer_toint(sol_state_t *state, sol_object_t *args) {
|
2547
|
2608
|
sol_object_t *a = sol_list_get_index(state, args, 0);
|
2548
|
|
- sol_object_t *res = sol_new_int(state, atoi(a->buffer));
|
|
2609
|
+ sol_object_t *res = sol_new_int(state, a->buffer ? atoi(a->buffer) : 0);
|
2549
|
2610
|
sol_obj_free(a);
|
2550
|
2611
|
return res;
|
2551
|
2612
|
}
|
2552
|
2613
|
|
2553
|
2614
|
sol_object_t *sol_f_buffer_tofloat(sol_state_t *state, sol_object_t *args) {
|
2554
|
2615
|
sol_object_t *a = sol_list_get_index(state, args, 0);
|
2555
|
|
- sol_object_t *res = sol_new_float(state, atof(a->buffer));
|
|
2616
|
+ sol_object_t *res = sol_new_float(state, a->buffer ? atof(a->buffer) : 0.0);
|
2556
|
2617
|
sol_obj_free(a);
|
2557
|
2618
|
return res;
|
2558
|
2619
|
}
|
|
@@ -2864,7 +2925,7 @@ sol_object_t *sol_f_buffer_sub(sol_state_t *state, sol_object_t *args) {
|
2864
|
2925
|
return sol_new_buffer(state, NULL, 0, OWN_NONE, NULL, NULL);
|
2865
|
2926
|
}
|
2866
|
2927
|
b = malloc(sizeof(char) * (h - l));
|
2867
|
|
- memcpy(b, buf->buffer, h - l);
|
|
2928
|
+ memcpy(b, ((char *) buf->buffer) + l, h - l);
|
2868
|
2929
|
sol_obj_free(buf);
|
2869
|
2930
|
return sol_new_buffer(state, b, h - l, OWN_FREE, NULL, NULL);
|
2870
|
2931
|
}
|