Mercurial > emacs
comparison src/data.c @ 10605:bc37b55fcbb9
(do_symval_forwarding): Handle display-local vars.
(store_symval_forwarding, find_symbol_value): Likewise.
(Fmake_variable_buffer_local): Disallow display-local vars here.
(Fmake_local_variable): Likewise.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Tue, 31 Jan 1995 00:52:50 +0000 |
parents | 2ab3bd0288a9 |
children | 4eeb2d49d841 |
comparison
equal
deleted
inserted
replaced
10604:c954d143db84 | 10605:bc37b55fcbb9 |
---|---|
640 return *XOBJFWD (valcontents)->objvar; | 640 return *XOBJFWD (valcontents)->objvar; |
641 | 641 |
642 case Lisp_Misc_Buffer_Objfwd: | 642 case Lisp_Misc_Buffer_Objfwd: |
643 offset = XBUFFER_OBJFWD (valcontents)->offset; | 643 offset = XBUFFER_OBJFWD (valcontents)->offset; |
644 return *(Lisp_Object *)(offset + (char *)current_buffer); | 644 return *(Lisp_Object *)(offset + (char *)current_buffer); |
645 | |
646 case Lisp_Misc_Display_Objfwd: | |
647 offset = XDISPLAY_OBJFWD (valcontents)->offset; | |
648 return *(Lisp_Object *)(offset | |
649 + (char *)get_perdisplay (selected_frame)); | |
645 } | 650 } |
646 return valcontents; | 651 return valcontents; |
647 } | 652 } |
648 | 653 |
649 /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell | 654 /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell |
683 if (! NILP (type) && ! NILP (newval) | 688 if (! NILP (type) && ! NILP (newval) |
684 && XTYPE (newval) != XINT (type)) | 689 && XTYPE (newval) != XINT (type)) |
685 buffer_slot_type_mismatch (offset); | 690 buffer_slot_type_mismatch (offset); |
686 | 691 |
687 *(Lisp_Object *)(offset + (char *)current_buffer) = newval; | 692 *(Lisp_Object *)(offset + (char *)current_buffer) = newval; |
688 break; | |
689 } | 693 } |
694 break; | |
695 | |
696 case Lisp_Misc_Display_Objfwd: | |
697 (*(Lisp_Object *)((char *)get_perdisplay (selected_frame) | |
698 + XDISPLAY_OBJFWD (valcontents)->offset)) | |
699 = newval; | |
700 break; | |
701 | |
690 default: | 702 default: |
691 goto def; | 703 goto def; |
692 } | 704 } |
693 break; | 705 break; |
694 | 706 |
709 | 721 |
710 static Lisp_Object | 722 static Lisp_Object |
711 swap_in_symval_forwarding (sym, valcontents) | 723 swap_in_symval_forwarding (sym, valcontents) |
712 Lisp_Object sym, valcontents; | 724 Lisp_Object sym, valcontents; |
713 { | 725 { |
714 /* valcontents is a list | 726 /* valcontents is a pointer to a struct resembling the cons |
715 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)). | 727 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)). |
716 | 728 |
717 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's | 729 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's |
718 local_var_alist, that being the element whose car is this | 730 local_var_alist, that being the element whose car is this |
719 variable. Or it can be a pointer to the | 731 variable. Or it can be a pointer to the |
720 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have | 732 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have |
721 an element in its alist for this variable. | 733 an element in its alist for this variable. |
782 return *XOBJFWD (valcontents)->objvar; | 794 return *XOBJFWD (valcontents)->objvar; |
783 | 795 |
784 case Lisp_Misc_Buffer_Objfwd: | 796 case Lisp_Misc_Buffer_Objfwd: |
785 return *(Lisp_Object *)(XBUFFER_OBJFWD (valcontents)->offset | 797 return *(Lisp_Object *)(XBUFFER_OBJFWD (valcontents)->offset |
786 + (char *)current_buffer); | 798 + (char *)current_buffer); |
799 | |
800 case Lisp_Misc_Display_Objfwd: | |
801 return *(Lisp_Object *)(XDISPLAY_OBJFWD (valcontents)->offset | |
802 + (char *)get_perdisplay (selected_frame)); | |
787 } | 803 } |
788 } | 804 } |
789 | 805 |
790 return valcontents; | 806 return valcontents; |
791 } | 807 } |
1099 { | 1115 { |
1100 register Lisp_Object tem, valcontents, newval; | 1116 register Lisp_Object tem, valcontents, newval; |
1101 | 1117 |
1102 CHECK_SYMBOL (sym, 0); | 1118 CHECK_SYMBOL (sym, 0); |
1103 | 1119 |
1104 if (EQ (sym, Qnil) || EQ (sym, Qt)) | 1120 valcontents = XSYMBOL (sym)->value; |
1121 if (EQ (sym, Qnil) || EQ (sym, Qt) || DISPLAY_OBJFWDP (valcontents)) | |
1105 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); | 1122 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); |
1106 | 1123 |
1107 valcontents = XSYMBOL (sym)->value; | |
1108 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents)) | 1124 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents)) |
1109 return sym; | 1125 return sym; |
1110 if (SOME_BUFFER_LOCAL_VALUEP (valcontents)) | 1126 if (SOME_BUFFER_LOCAL_VALUEP (valcontents)) |
1111 { | 1127 { |
1112 XMISC (XSYMBOL (sym)->value)->type = Lisp_Misc_Buffer_Local_Value; | 1128 XMISC (XSYMBOL (sym)->value)->type = Lisp_Misc_Buffer_Local_Value; |
1142 { | 1158 { |
1143 register Lisp_Object tem, valcontents; | 1159 register Lisp_Object tem, valcontents; |
1144 | 1160 |
1145 CHECK_SYMBOL (sym, 0); | 1161 CHECK_SYMBOL (sym, 0); |
1146 | 1162 |
1147 if (EQ (sym, Qnil) || EQ (sym, Qt)) | 1163 valcontents = XSYMBOL (sym)->value; |
1164 if (EQ (sym, Qnil) || EQ (sym, Qt) || DISPLAY_OBJFWDP (valcontents)) | |
1148 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); | 1165 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data); |
1149 | 1166 |
1150 valcontents = XSYMBOL (sym)->value; | |
1151 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents)) | 1167 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents)) |
1152 { | 1168 { |
1153 tem = Fboundp (sym); | 1169 tem = Fboundp (sym); |
1154 | 1170 |
1155 /* Make sure the symbol has a local value in this particular buffer, | 1171 /* Make sure the symbol has a local value in this particular buffer, |
1156 by setting it to the same value it already has. */ | 1172 by setting it to the same value it already has. */ |
1157 Fset (sym, (EQ (tem, Qt) ? Fsymbol_value (sym) : Qunbound)); | 1173 Fset (sym, (EQ (tem, Qt) ? Fsymbol_value (sym) : Qunbound)); |
1158 return sym; | 1174 return sym; |
1159 } | 1175 } |
1574 if (FLOATP (num)) | 1590 if (FLOATP (num)) |
1575 { | 1591 { |
1576 char pigbuf[350]; /* see comments in float_to_string */ | 1592 char pigbuf[350]; /* see comments in float_to_string */ |
1577 | 1593 |
1578 float_to_string (pigbuf, XFLOAT(num)->data); | 1594 float_to_string (pigbuf, XFLOAT(num)->data); |
1579 return build_string (pigbuf); | 1595 return build_string (pigbuf); |
1580 } | 1596 } |
1581 #endif /* LISP_FLOAT_TYPE */ | 1597 #endif /* LISP_FLOAT_TYPE */ |
1582 | 1598 |
1583 sprintf (buffer, "%d", XINT (num)); | 1599 sprintf (buffer, "%d", XINT (num)); |
1584 return build_string (buffer); | 1600 return build_string (buffer); |
1607 return make_float (atof (p)); | 1623 return make_float (atof (p)); |
1608 #endif /* LISP_FLOAT_TYPE */ | 1624 #endif /* LISP_FLOAT_TYPE */ |
1609 | 1625 |
1610 return make_number (atoi (p)); | 1626 return make_number (atoi (p)); |
1611 } | 1627 } |
1612 | 1628 |
1613 enum arithop | 1629 enum arithop |
1614 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin }; | 1630 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin }; |
1615 | 1631 |
1616 extern Lisp_Object float_arith_driver (); | 1632 extern Lisp_Object float_arith_driver (); |
1617 | 1633 |
1696 int nargs; | 1712 int nargs; |
1697 register Lisp_Object *args; | 1713 register Lisp_Object *args; |
1698 { | 1714 { |
1699 register Lisp_Object val; | 1715 register Lisp_Object val; |
1700 double next; | 1716 double next; |
1701 | 1717 |
1702 for (; argnum < nargs; argnum++) | 1718 for (; argnum < nargs; argnum++) |
1703 { | 1719 { |
1704 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */ | 1720 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */ |
1705 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum); | 1721 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum); |
1706 | 1722 |
1862 i1 = XINT (num1); | 1878 i1 = XINT (num1); |
1863 i2 = XINT (num2); | 1879 i2 = XINT (num2); |
1864 | 1880 |
1865 if (i2 == 0) | 1881 if (i2 == 0) |
1866 Fsignal (Qarith_error, Qnil); | 1882 Fsignal (Qarith_error, Qnil); |
1867 | 1883 |
1868 i1 %= i2; | 1884 i1 %= i2; |
1869 | 1885 |
1870 /* If the "remainder" comes out with the wrong sign, fix it. */ | 1886 /* If the "remainder" comes out with the wrong sign, fix it. */ |
1871 if ((i1 < 0) != (i2 < 0)) | 1887 if ((i1 < 0) != (i2 < 0)) |
1872 i1 += i2; | 1888 i1 += i2; |
2372 #ifndef CANNOT_DUMP | 2388 #ifndef CANNOT_DUMP |
2373 if (!initialized) | 2389 if (!initialized) |
2374 return; | 2390 return; |
2375 #endif /* CANNOT_DUMP */ | 2391 #endif /* CANNOT_DUMP */ |
2376 signal (SIGFPE, arith_error); | 2392 signal (SIGFPE, arith_error); |
2377 | 2393 |
2378 #ifdef uts | 2394 #ifdef uts |
2379 signal (SIGEMT, arith_error); | 2395 signal (SIGEMT, arith_error); |
2380 #endif /* uts */ | 2396 #endif /* uts */ |
2381 } | 2397 } |