NewtFns.c

説明を見る。
00001 /*------------------------------------------------------------------------*/
00013 /* ヘッダファイル */
00014 #include <string.h>
00015 
00016 #include "NewtErrs.h"
00017 #include "NewtFns.h"
00018 #include "NewtEnv.h"
00019 #include "NewtObj.h"
00020 #include "NewtVM.h"
00021 #include "NewtBC.h"
00022 #include "NewtPrint.h"
00023 
00024 
00025 /* 関数プロトタイプ */
00026 static newtRef      NewtRefTypeToClass(uint16_t type);
00027 static newtRef      NewtObjClassOf(newtRefArg r);
00028 static newtRef      NewtObjSetClass(newtRefArg r, newtRefArg c);
00029 static bool         NewtArgsIsNumber(newtRefArg r1, newtRefArg r2, bool * real);
00030 
00031 
00032 #pragma mark -
00033 /*------------------------------------------------------------------------*/
00042 newtRef NcProtoLookupFrame(newtRefArg start, newtRefArg name)
00043 {
00044     newtRefVar  current = start;
00045 
00046     while (NewtRefIsNotNIL(current))
00047     {
00048         current = NcResolveMagicPointer(current);
00049 
00050         if (NewtRefIsMagicPointer(current))
00051             return kNewtRefUnbind;
00052 
00053         if (NewtHasSlot(current, name))
00054             return current;
00055 
00056         current = NcGetSlot(current, NSSYM0(_proto));
00057     }
00058 
00059     return kNewtRefUnbind;
00060 }
00061 
00062 
00063 /*------------------------------------------------------------------------*/
00072 newtRef NcProtoLookup(newtRefArg start, newtRefArg name)
00073 {
00074     newtRefVar  current;
00075 
00076     current = NcProtoLookupFrame(start, name);
00077 
00078     if (current != kNewtRefUnbind)
00079         return NcGetSlot(current, name);
00080     else
00081         return kNewtRefUnbind;
00082 }
00083 
00084 
00085 /*------------------------------------------------------------------------*/
00094 newtRef NcLexicalLookup(newtRefArg start, newtRef name)
00095 {
00096     newtRefVar  current = start;
00097 
00098     while (NewtRefIsNotNIL(current))
00099     {
00100         current = NcResolveMagicPointer(current);
00101 
00102         if (NewtRefIsMagicPointer(current))
00103             return kNewtRefUnbind;
00104 
00105         if (NewtHasSlot(current, name))
00106             return NcGetSlot(current, name);
00107 
00108         current = NcGetSlot(current, NSSYM0(_nextArgFrame));
00109     }
00110 
00111     return kNewtRefUnbind;
00112 }
00113 
00114 
00115 /*------------------------------------------------------------------------*/
00124 newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name)
00125 {
00126     newtRefVar  current;
00127     newtRefVar  left = start;
00128 
00129     if (! NewtRefIsFrame(start))
00130         return kNewtRefUnbind;
00131 
00132     while (NewtRefIsNotNIL(left))
00133     {
00134         current = left;
00135 
00136         while (NewtRefIsNotNIL(current))
00137         {
00138             current = NcResolveMagicPointer(current);
00139 
00140             if (NewtRefIsMagicPointer(current))
00141                 return kNewtRefUnbind;
00142 
00143             if (NewtHasSlot(current, name))
00144                 return current;
00145     
00146             current = NcGetSlot(current, NSSYM0(_proto));
00147         }
00148 
00149         left = NcGetSlot(left, NSSYM0(_parent));
00150     }
00151 
00152     return kNewtRefUnbind;
00153 }
00154 
00155 
00156 /*------------------------------------------------------------------------*/
00165 newtRef NcFullLookup(newtRefArg start, newtRefArg name)
00166 {
00167     newtRefVar  current;
00168 
00169     current = NcFullLookupFrame(start, name);
00170 
00171     if (current != kNewtRefUnbind)
00172         return NcGetSlot(current, name);
00173     else
00174         return kNewtRefUnbind;
00175 }
00176 
00177 
00178 #pragma mark -
00179 /*------------------------------------------------------------------------*/
00188 newtRef NcLookupSymbol(newtRefArg r, newtRefArg name)
00189 {
00190     return NewtLookupSymbolArray(r, name, 0);
00191 }
00192 
00193 
00194 /*------------------------------------------------------------------------*/
00206 newtRef NsThrow(newtRefArg rcvr, newtRefArg name, newtRefArg data)
00207 {
00208     NVMThrow(name, data);
00209     return kNewtRefNIL;
00210 }
00211 
00212 
00213 /*------------------------------------------------------------------------*/
00223 newtRef NsRethrow(newtRefArg rcvr)
00224 {
00225     NVMRethrow();
00226     return kNewtRefNIL;
00227 }
00228 
00229 
00230 /*------------------------------------------------------------------------*/
00238 newtRef NcClone(newtRefArg r)
00239 {
00240     if (NewtRefIsPointer(r))
00241         return NewtObjClone(r);
00242     else
00243         return (newtRef)r;
00244 }
00245 
00246 
00247 /*------------------------------------------------------------------------*/
00256 newtRef NsTotalClone(newtRefArg rcvr, newtRefArg r)
00257 {
00258     newtRefVar  result;
00259 
00260     result = NcClone(r);
00261 
00262     if (NewtRefIsFrameOrArray(result))
00263     {
00264         newtRef *   slots;
00265         uint32_t    n;
00266         uint32_t    i;
00267     
00268         slots = NewtRefToSlots(result);
00269         n = NewtLength(result);
00270     
00271         for (i = 0; i < n; i++)
00272         {
00273             slots[i] = NsTotalClone(rcvr, slots[i]);
00274         }
00275     }
00276 
00277     return result;
00278 }
00279 
00280 
00281 /*------------------------------------------------------------------------*/
00291 newtRef NcLength(newtRefArg r)
00292 {
00293     return NewtMakeInteger(NewtLength(r));
00294 }
00295 
00296 
00297 /*------------------------------------------------------------------------*/
00309 newtRef NsDeeplyLength(newtRefArg rcvr, newtRefArg r)
00310 {
00311     return NewtMakeInteger(NewtDeeplyLength(r));
00312 }
00313 
00314 
00315 /*------------------------------------------------------------------------*/
00328 newtRef NsSetLength(newtRefArg rcvr, newtRefArg r, newtRefArg len)
00329 {
00330     int32_t n;
00331 
00332     if (NewtRefIsReadonly(r))
00333         return NewtThrow(kNErrObjectReadOnly, r);
00334 
00335     if (! NewtRefIsInteger(len))
00336         return NewtThrow(kNErrNotAnInteger, len);
00337 
00338     n = NewtRefToInteger(len);
00339 
00340     switch (NewtGetRefType(r, true))
00341     {
00342         case kNewtBinary:
00343         case kNewtString:
00344             NewtBinarySetLength(r, n);
00345             break;
00346 
00347         case kNewtArray:
00348             NewtSlotsSetLength(r, n, kNewtRefUnbind);
00349             break;
00350 
00351         case kNewtFrame:
00352             return NewtThrow(kNErrUnexpectedFrame, r);
00353 
00354         default:
00355             return NewtThrow(kNErrNotAnArrayOrString, r);
00356     }
00357 
00358     return r;
00359 }
00360 
00361 
00362 /*------------------------------------------------------------------------*/
00375 newtRef NsHasSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
00376 {
00377     return NewtMakeBoolean(NewtHasSlot(frame, slot));
00378 }
00379 
00380 
00381 /*------------------------------------------------------------------------*/
00391 newtRef NsGetSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
00392 {
00393     newtObjRef  obj;
00394 
00395     obj = NewtRefToPointer(frame);
00396 
00397     if (obj != NULL)
00398         return NcResolveMagicPointer(NewtObjGetSlot(obj, slot));
00399     else
00400         return kNewtRefUnbind;
00401 }
00402 
00403 
00404 /*------------------------------------------------------------------------*/
00415 newtRef NsSetSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot, newtRefArg v)
00416 {
00417     newtObjRef  obj;
00418 
00419     obj = NewtRefToPointer(frame);
00420 
00421     if (obj != NULL)
00422     {
00423         if (NewtRefIsReadonly(frame))
00424             return NewtThrow(kNErrObjectReadOnly, frame);
00425 
00426         return NewtObjSetSlot(obj, slot, v);
00427     }
00428 
00429    return kNewtRefNIL;
00430 }
00431 
00432 
00433 /*------------------------------------------------------------------------*/
00443 newtRef NsRemoveSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
00444 {
00445     newtObjRef  obj;
00446 
00447     obj = NewtRefToPointer(frame);
00448     NewtObjRemoveSlot(obj, slot);
00449 
00450     return frame;
00451 }
00452 
00453 
00454 /*------------------------------------------------------------------------*/
00464 newtRef NcSetArraySlot(newtRefArg r, newtRefArg p, newtRefArg v)
00465 {
00466     if (! NewtRefIsInteger(p))
00467         return NewtThrow(kNErrNotAnInteger, p);
00468 
00469     return NewtSetArraySlot(r, NewtRefToInteger(p), v);
00470 }
00471 
00472 
00473 /*------------------------------------------------------------------------*/
00485 newtRef NcHasPath(newtRefArg r, newtRefArg p)
00486 {
00487     return NewtMakeBoolean(NewtHasPath(r, p));
00488 }
00489 
00490 
00491 /*------------------------------------------------------------------------*/
00502 newtRef NcGetPath(newtRefArg r, newtRefArg p)
00503 {
00504     return NewtGetPath(r, p, NULL);
00505 }
00506 
00507 
00508 /*------------------------------------------------------------------------*/
00518 newtRef NcSetPath(newtRefArg r, newtRefArg p, newtRefArg v)
00519 {
00520     newtRefVar  slot;
00521     newtRefVar  target;
00522 
00523     target = NewtGetPath(r, p, &slot);
00524 
00525     if (target == kNewtRefUnbind)
00526         NewtThrow(kNErrOutOfBounds, r);
00527 
00528     if (NewtRefIsArray(target))
00529         return NcSetArraySlot(target, slot, v);
00530     else
00531         return NcSetSlot(target, slot, v);
00532 }
00533 
00534 
00535 /*------------------------------------------------------------------------*/
00546 newtRef NcARef(newtRefArg r, newtRefArg p)
00547 {
00548     if (! NewtRefIsInteger(p))
00549         return NewtThrow(kNErrNotAnInteger, p);
00550 
00551     return NewtARef(r, NewtRefToInteger(p));
00552 }
00553 
00554 
00555 /*------------------------------------------------------------------------*/
00567 newtRef NcSetARef(newtRefArg r, newtRefArg p, newtRefArg v)
00568 {
00569     if (! NewtRefIsInteger(p))
00570         return NewtThrow(kNErrNotAnInteger, p);
00571 
00572     return NewtSetARef(r, NewtRefToInteger(p), v);
00573 }
00574 
00575 
00576 /*------------------------------------------------------------------------*/
00589 newtRef NsHasVariable(newtRefArg rcvr, newtRefArg r, newtRefArg name)
00590 {
00591     return NewtMakeBoolean(NewtHasVariable(r, name));
00592 }
00593 
00594 
00595 /*------------------------------------------------------------------------*/
00607 newtRef NsGetVariable(newtRefArg rcvr, newtRefArg frame, newtRefArg slot)
00608 {
00609     return NcFullLookup(frame, slot);
00610 }
00611 
00612 
00613 /*------------------------------------------------------------------------*/
00626 newtRef NsSetVariable(newtRefArg rcvr, newtRefArg frame, newtRefArg slot, newtRefArg v)
00627 {
00628     if (NewtAssignment(frame, slot, v))
00629         return v;
00630     else
00631         return kNewtRefUnbind;
00632 }
00633 
00634 
00635 /*------------------------------------------------------------------------*/
00647 newtRef NsHasVar(newtRefArg rcvr, newtRefArg name)
00648 {
00649     return NewtMakeBoolean(NewtHasVar(name));
00650 }
00651 
00652 
00653 #pragma mark -
00654 /*------------------------------------------------------------------------*/
00662 newtRef NewtRefTypeToClass(uint16_t type)
00663 {
00664     newtRefVar  klass = kNewtRefUnbind;
00665 
00666     switch (type)
00667     {
00668         case kNewtInt30:
00669         case kNewtInt32:
00670             klass = NS_INT;
00671             break;
00672 
00673         case kNewtCharacter:
00674             klass = NS_CHAR;
00675             break;
00676 
00677         case kNewtTrue:
00678             klass = NSSYM0(boolean);
00679             break;
00680 
00681         case kNewtSpecial:
00682         case kNewtNil:
00683         case kNewtUnbind:
00684             klass = NSSYM0(weird_immediate);
00685             break;
00686 
00687         case kNewtFrame:
00688             klass = NSSYM0(frame);
00689             break;
00690 
00691         case kNewtArray:
00692             klass = NSSYM0(array);
00693             break;
00694 
00695         case kNewtReal:
00696             klass = NSSYM0(real);
00697             break;
00698 
00699         case kNewtSymbol:
00700             klass = NSSYM0(symbol);
00701             break;
00702 
00703         case kNewtString:
00704             klass = NSSYM0(string);
00705             break;
00706 
00707         case kNewtBinary:
00708             klass = NSSYM0(binary);
00709             break;
00710     }
00711 
00712     return klass;
00713 }
00714 
00715 
00716 /*------------------------------------------------------------------------*/
00724 newtRef NewtObjClassOf(newtRefArg r)
00725 {
00726     newtObjRef  obj;
00727     newtRefVar  klass = kNewtRefNIL;
00728 
00729     obj = NewtRefToPointer(r);
00730 
00731     if (obj != NULL)
00732     {
00733         if (NewtObjIsFrame(obj))
00734         {
00735 //            klass = NewtObjGetSlot(obj, NS_CLASS);
00736             klass = NcProtoLookup(r, NS_CLASS);
00737 
00738             if (NewtRefIsNIL(klass))
00739                 klass = NSSYM0(frame);
00740         }
00741         else
00742         {
00743             klass = obj->as.klass;
00744 
00745             if (klass == kNewtSymbolClass)
00746                 klass = NSSYM0(symbol);
00747             else if (NewtRefIsNIL(klass))
00748                 klass = NewtRefTypeToClass(NewtGetObjectType(obj, true));
00749         }
00750     }
00751 
00752     return klass;
00753 }
00754 
00755 
00756 /*------------------------------------------------------------------------*/
00765 newtRef NewtObjSetClass(newtRefArg r, newtRefArg c)
00766 {
00767     newtObjRef  obj;
00768 
00769     obj = NewtRefToPointer(r);
00770 
00771     if (obj != NULL)
00772     {
00773         if (NewtObjIsFrame(obj))
00774         {
00775             if (NewtRefIsReadonly(r))
00776             {
00777                 NewtThrow(kNErrObjectReadOnly, r);
00778                 return r;
00779             }
00780 
00781             NewtObjSetSlot(obj, NS_CLASS, c);
00782         }
00783         else
00784         {
00785             obj->as.klass = c;
00786         }
00787     }
00788 
00789     return r;
00790 }
00791 
00792 
00793 /*------------------------------------------------------------------------*/
00802 newtRef NsPrimClassOf(newtRefArg rcvr, newtRefArg r)
00803 {
00804     newtRefVar  klass;
00805 
00806     if (NewtRefIsPointer(r))
00807     {
00808         switch (NewtGetRefType(r, true))
00809         {
00810             case kNewtFrame:
00811                 klass = NSSYM0(frame);
00812                 break;
00813 
00814             case kNewtArray:
00815                 klass = NSSYM0(array);
00816                 break;
00817 
00818             default:
00819                 klass = NSSYM0(binary);
00820                 break;
00821         }
00822     }
00823     else
00824     {
00825         klass = NSSYM(immediate);
00826     }
00827 
00828     return klass;
00829 }
00830 
00831 
00832 /*------------------------------------------------------------------------*/
00840 newtRef NcClassOf(newtRefArg r)
00841 {
00842     if (NewtRefIsPointer(r))
00843         return NewtObjClassOf(r);
00844     else
00845         return NewtRefTypeToClass(NewtGetRefType(r, false));
00846 }
00847 
00848 
00849 /*------------------------------------------------------------------------*/
00859 newtRef NcSetClass(newtRefArg r, newtRefArg c)
00860 {
00861     if (NewtRefIsPointer(r))
00862         return NewtObjSetClass(r, c);
00863     else
00864         return kNewtRefNIL;;
00865 }
00866 
00867 
00868 /*------------------------------------------------------------------------*/
00880 newtRef NcRefEqual(newtRefArg r1, newtRefArg r2)
00881 {
00882     return NewtMakeBoolean(NewtRefEqual(r1, r2));
00883 }
00884 
00885 
00886 /*------------------------------------------------------------------------*/
00899 newtRef NsObjectEqual(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
00900 {
00901     return NewtMakeBoolean(NewtObjectEqual(r1, r2));
00902 }
00903 
00904 
00905 /*------------------------------------------------------------------------*/
00919 newtRef NsSymbolCompareLex(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
00920 {
00921     if (! NewtRefIsSymbol(r1))
00922         return NewtThrow(kNErrNotASymbol, r1);
00923 
00924     if (! NewtRefIsSymbol(r2))
00925         return NewtThrow(kNErrNotASymbol, r2);
00926 
00927     return NewtMakeInteger(NewtSymbolCompareLex(r1, r2));
00928 }
00929 
00930 
00931 /*------------------------------------------------------------------------*/
00944 newtRef NsHasSubclass(newtRefArg rcvr, newtRefArg sub, newtRefArg supr)
00945 {
00946     return NewtMakeBoolean(NewtHasSubclass(sub, supr));
00947 }
00948 
00949 
00950 /*------------------------------------------------------------------------*/
00963 newtRef NsIsSubclass(newtRefArg rcvr, newtRefArg sub, newtRefArg supr)
00964 {
00965     return NewtMakeBoolean(NewtIsSubclass(sub, supr));
00966 }
00967 
00968 
00969 /*------------------------------------------------------------------------*/
00982 newtRef NsIsInstance(newtRefArg rcvr, newtRefArg obj, newtRefArg r)
00983 {
00984     return NewtMakeBoolean(NewtIsInstance(obj, r));
00985 }
00986 
00987 
00988 #pragma mark -
00989 /*------------------------------------------------------------------------*/
01001 newtRef NsIsArray(newtRefArg rcvr, newtRefArg r)
01002 {
01003     return NewtMakeBoolean(NewtRefIsArray(r));
01004 }
01005 
01006 
01007 /*------------------------------------------------------------------------*/
01019 newtRef NsIsFrame(newtRefArg rcvr, newtRefArg r)
01020 {
01021     return NewtMakeBoolean(NewtRefIsFrame(r));
01022 }
01023 
01024 
01025 /*------------------------------------------------------------------------*/
01037 newtRef NsIsBinary(newtRefArg rcvr, newtRefArg r)
01038 {
01039     return NewtMakeBoolean(NewtRefIsBinary(r));
01040 }
01041 
01042 
01043 /*------------------------------------------------------------------------*/
01055 newtRef NsIsSymbol(newtRefArg rcvr, newtRefArg r)
01056 {
01057     return NewtMakeBoolean(NewtRefIsSymbol(r));
01058 }
01059 
01060 
01061 /*------------------------------------------------------------------------*/
01073 newtRef NsIsString(newtRefArg rcvr, newtRefArg r)
01074 {
01075     return NewtMakeBoolean(NewtRefIsString(r));
01076 }
01077 
01078 
01079 /*------------------------------------------------------------------------*/
01091 newtRef NsIsCharacter(newtRefArg rcvr, newtRefArg r)
01092 {
01093     return NewtMakeBoolean(NewtRefIsCharacter(r));
01094 }
01095 
01096 
01097 /*------------------------------------------------------------------------*/
01109 newtRef NsIsInteger(newtRefArg rcvr, newtRefArg r)
01110 {
01111     return NewtMakeBoolean(NewtRefIsInteger(r));
01112 }
01113 
01114 
01115 /*------------------------------------------------------------------------*/
01127 newtRef NsIsReal(newtRefArg rcvr, newtRefArg r)
01128 {
01129     return NewtMakeBoolean(NewtRefIsReal(r));
01130 }
01131 
01132 
01133 /*------------------------------------------------------------------------*/
01143 newtRef NsIsNumber(newtRefArg rcvr, newtRefArg r)
01144 {
01145     return NewtMakeBoolean(NewtRefIsInteger(r) || NewtRefIsReal(r));
01146 }
01147 
01148 
01149 /*------------------------------------------------------------------------*/
01159 newtRef NsIsImmediate(newtRefArg rcvr, newtRefArg r)
01160 {
01161     return NewtMakeBoolean(NewtRefIsImmediate(r));
01162 }
01163 
01164 
01165 /*------------------------------------------------------------------------*/
01175 newtRef NsIsFunction(newtRefArg rcvr, newtRefArg r)
01176 {
01177     return NewtMakeBoolean(NewtRefIsFunction(r));
01178 }
01179 
01180 
01181 /*------------------------------------------------------------------------*/
01191 newtRef NsIsReadonly(newtRefArg rcvr, newtRefArg r)
01192 {
01193     return NewtMakeBoolean(NewtRefIsReadonly(r));
01194 }
01195 
01196 
01197 #pragma mark -
01198 /*------------------------------------------------------------------------*/
01207 newtRef NcAddArraySlot(newtRefArg r, newtRefArg v)
01208 {
01209     newtObjRef  obj;
01210 
01211     obj = NewtRefToPointer(r);
01212 
01213     if (obj != NULL)
01214         NewtObjAddArraySlot(obj, v);
01215 
01216     return v;
01217 }
01218 
01219 
01220 /*------------------------------------------------------------------------*/
01228 newtRef NcStringer(newtRefArg r)
01229 {
01230     newtRef *   slots;
01231     newtRefVar  str;
01232     uint32_t    len;
01233     uint32_t    i;
01234 
01235     if (! NewtRefIsArray(r))
01236         return NewtThrow(kNErrNotAnArray, r);
01237 
01238     str = NSSTR("");
01239 
01240     len = NewtArrayLength(r);
01241     slots = NewtRefToSlots(r);
01242 
01243     for (i = 0; i < len; i++)
01244     {
01245         NcStrCat(str, slots[i]);
01246     }
01247 
01248     return str;
01249 }
01250 
01251 
01252 /*------------------------------------------------------------------------*/
01262 newtRef NsStrCat(newtRefArg rcvr, newtRefArg str, newtRefArg v)
01263 {
01264     char    wk[32];
01265     char *  s = NULL;
01266 
01267     switch (NewtGetRefType(v, true))
01268     {
01269         case kNewtInt30:
01270         case kNewtInt32:
01271             {
01272                 int n;
01273 
01274                 n = (int)NewtRefToInteger(v);
01275                 sprintf(wk, "%d", n);
01276                 s = wk;
01277             }
01278             break;
01279 
01280         case kNewtReal:
01281             {
01282                 double  n;
01283 
01284                 n = NewtRefToReal(v);
01285                 sprintf(wk, "%f", n);
01286                 s = wk;
01287             }
01288             break;
01289 
01290         case kNewtCharacter:
01291             {
01292                 int     c;
01293 
01294                 c = NewtRefToCharacter(v);
01295                 sprintf(wk, "%c", c);
01296                 s = wk;
01297             }
01298             break;
01299 
01300         case kNewtSymbol:
01301             {
01302                 newtSymDataRef  sym;
01303 
01304                 sym = NewtRefToSymbol(v);
01305                 s = sym->name;
01306             }
01307             break;
01308 
01309         case kNewtString:
01310             s = NewtRefToString(v);
01311             break;
01312     }
01313 
01314     if (s != NULL)
01315         NewtStrCat(str, s);
01316 
01317     return str;
01318 }
01319 
01320 
01321 /*------------------------------------------------------------------------*/
01330 newtRef NsMakeSymbol(newtRefArg rcvr, newtRefArg r)
01331 {
01332     char *  s;
01333 
01334     if (! NewtRefIsString(r))
01335         return NewtThrow(kNErrNotAString, r);
01336 
01337     s = NewtRefToString(r);
01338 
01339     return NewtMakeSymbol(s);
01340 }
01341 
01342 
01343 /*------------------------------------------------------------------------*/
01351 newtRef NsMakeFrame(newtRefArg rcvr)
01352 {
01353     return NewtMakeFrame(kNewtRefUnbind, 0);
01354 }
01355 
01356 
01357 /*------------------------------------------------------------------------*/
01367 newtRef NsMakeBinary(newtRefArg rcvr, newtRefArg length, newtRefArg klass)
01368 {
01369     if (! NewtRefIsInteger(length))
01370         return NewtThrow(kNErrNotAnInteger, length);
01371 
01372     return NewtMakeBinary(klass, NULL, NewtRefToInteger(length), false);
01373 }
01374 
01375 
01376 #pragma mark -
01377 /*------------------------------------------------------------------------*/
01386 newtRef NcBAnd(newtRefArg r1, newtRefArg r2)
01387 {
01388     if (! NewtRefIsInteger(r1))
01389         return NewtThrow(kNErrNotAnInteger, r1);
01390 
01391     if (! NewtRefIsInteger(r2))
01392         return NewtThrow(kNErrNotAnInteger, r2);
01393 
01394     return (r1 & r2);
01395 }
01396 
01397 
01398 /*------------------------------------------------------------------------*/
01407 newtRef NcBOr(newtRefArg r1, newtRefArg r2)
01408 {
01409     if (! NewtRefIsInteger(r1))
01410         return NewtThrow(kNErrNotAnInteger, r1);
01411 
01412     if (! NewtRefIsInteger(r2))
01413         return NewtThrow(kNErrNotAnInteger, r2);
01414 
01415     return (r1 | r2);
01416 }
01417 
01418 
01419 /*------------------------------------------------------------------------*/
01427 newtRef NcBNot(newtRefArg r)
01428 {
01429     if (! NewtRefIsInteger(r))
01430         return NewtThrow(kNErrNotAnInteger, r);
01431 
01432     return NewtMakeInteger( NewtRefToInteger(r));
01433 }
01434 
01435 
01436 #pragma mark -
01437 /*------------------------------------------------------------------------*/
01448 newtRef NsAnd(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
01449 {
01450     bool    result;
01451 
01452     result = (NewtRefIsNotNIL(r1) && NewtRefIsNotNIL(r2));
01453 
01454     return NewtMakeBoolean(result);
01455 }
01456 
01457 
01458 /*------------------------------------------------------------------------*/
01469 newtRef NsOr(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
01470 {
01471     bool    result;
01472 
01473     result = (NewtRefIsNotNIL(r1) || NewtRefIsNotNIL(r2));
01474 
01475     return NewtMakeBoolean(result);
01476 }
01477 
01478 
01479 #pragma mark -
01480 /*------------------------------------------------------------------------*/
01492 bool NewtArgsIsNumber(newtRefArg r1, newtRefArg r2, bool * real)
01493 {
01494     *real = false;
01495 
01496     if (NewtRefIsReal(r1))
01497     {
01498         *real = true;
01499     }
01500     else
01501     {
01502         if (! NewtRefIsInteger(r1))
01503             return false;
01504     }
01505 
01506     if (NewtRefIsReal(r2))
01507     {
01508         *real = true;
01509     }
01510     else
01511     {
01512         if (! NewtRefIsInteger(r2))
01513             return false;
01514     }
01515 
01516     return true;
01517 }
01518 
01519 
01520 /*------------------------------------------------------------------------*/
01529 newtRef NcAdd(newtRefArg r1, newtRefArg r2)
01530 {
01531     bool    real;
01532 
01533     if (! NewtArgsIsNumber(r1, r2, &real))
01534         return NewtThrow0(kNErrNotANumber);
01535 
01536     if (real)
01537     {
01538         double real1;
01539         double real2;
01540 
01541         real1 = NewtRefToReal(r1);
01542         real2 = NewtRefToReal(r2);
01543 
01544         return NewtMakeReal(real1 + real2);
01545     }
01546     else
01547     {
01548         int32_t int1;
01549         int32_t int2;
01550 
01551         int1 = NewtRefToInteger(r1);
01552         int2 = NewtRefToInteger(r2);
01553 
01554         return NewtMakeInteger(int1 + int2);
01555     }
01556 }
01557 
01558 
01559 /*------------------------------------------------------------------------*/
01568 newtRef NcSubtract(newtRefArg r1, newtRefArg r2)
01569 {
01570     bool    real;
01571 
01572     if (! NewtArgsIsNumber(r1, r2, &real))
01573         return NewtThrow0(kNErrNotANumber);
01574 
01575     if (real)
01576     {
01577         double real1;
01578         double real2;
01579 
01580         real1 = NewtRefToReal(r1);
01581         real2 = NewtRefToReal(r2);
01582 
01583         return NewtMakeReal(real1 - real2);
01584     }
01585     else
01586     {
01587         int32_t int1;
01588         int32_t int2;
01589 
01590         int1 = NewtRefToInteger(r1);
01591         int2 = NewtRefToInteger(r2);
01592 
01593         return NewtMakeInteger(int1 - int2);
01594     }
01595 }
01596 
01597 
01598 /*------------------------------------------------------------------------*/
01607 newtRef NcMultiply(newtRefArg r1, newtRefArg r2)
01608 {
01609     bool    real;
01610 
01611     if (! NewtArgsIsNumber(r1, r2, &real))
01612         return NewtThrow0(kNErrNotANumber);
01613 
01614     if (real)
01615     {
01616         double real1;
01617         double real2;
01618 
01619         real1 = NewtRefToReal(r1);
01620         real2 = NewtRefToReal(r2);
01621 
01622         return NewtMakeReal(real1 * real2);
01623     }
01624     else
01625     {
01626         int32_t int1;
01627         int32_t int2;
01628 
01629         int1 = NewtRefToInteger(r1);
01630         int2 = NewtRefToInteger(r2);
01631 
01632         return NewtMakeInteger(int1 * int2);
01633     }
01634 }
01635 
01636 
01637 /*------------------------------------------------------------------------*/
01646 newtRef NcDivide(newtRefArg r1, newtRefArg r2)
01647 {
01648     bool    real;
01649 
01650     if (! NewtArgsIsNumber(r1, r2, &real))
01651         return NewtThrow0(kNErrNotANumber);
01652 
01653     if (real)
01654     {
01655         double real1;
01656         double real2;
01657 
01658         real1 = NewtRefToReal(r1);
01659         real2 = NewtRefToReal(r2);
01660 
01661         if (real2 == 0.0)
01662             return NewtThrow(kNErrDiv0, r2);
01663 
01664         return NewtMakeReal(real1 / real2);
01665     }
01666     else
01667     {
01668         int32_t int1;
01669         int32_t int2;
01670 
01671         int1 = NewtRefToInteger(r1);
01672         int2 = NewtRefToInteger(r2);
01673 
01674         if (int2 == 0)
01675             return NewtThrow(kNErrDiv0, r2);
01676 
01677         return NewtMakeInteger(int1 / int2);
01678     }
01679 }
01680 
01681 
01682 /*------------------------------------------------------------------------*/
01691 newtRef NcDiv(newtRefArg r1, newtRefArg r2)
01692 {
01693     if (! NewtRefIsInteger(r1))
01694         return NewtThrow(kNErrNotAnInteger, r1);
01695 
01696     if (! NewtRefIsInteger(r2))
01697         return NewtThrow(kNErrNotAnInteger, r2);
01698 
01699     return NewtMakeInteger(NewtRefToInteger(r1) / NewtRefToInteger(r2));
01700 }
01701 
01702 
01703 /*------------------------------------------------------------------------*/
01713 newtRef NsMod(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
01714 {
01715     if (! NewtRefIsInteger(r1))
01716         return NewtThrow(kNErrNotAnInteger, r1);
01717 
01718     if (! NewtRefIsInteger(r2))
01719         return NewtThrow(kNErrNotAnInteger, r2);
01720 
01721     return NewtMakeInteger(NewtRefToInteger(r1) % NewtRefToInteger(r2));
01722 }
01723 
01724 
01725 /*------------------------------------------------------------------------*/
01735 newtRef NsShiftLeft(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
01736 {
01737     if (! NewtRefIsInteger(r1))
01738         return NewtThrow(kNErrNotAnInteger, r1);
01739 
01740     if (! NewtRefIsInteger(r2))
01741         return NewtThrow(kNErrNotAnInteger, r2);
01742 
01743     return NewtMakeInteger(NewtRefToInteger(r1) << NewtRefToInteger(r2));
01744 }
01745 
01746 
01747 /*------------------------------------------------------------------------*/
01757 newtRef NsShiftRight(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
01758 {
01759     if (! NewtRefIsInteger(r1))
01760         return NewtThrow(kNErrNotAnInteger, r1);
01761 
01762     if (! NewtRefIsInteger(r2))
01763         return NewtThrow(kNErrNotAnInteger, r2);
01764 
01765     return NewtMakeInteger(NewtRefToInteger(r1) >> NewtRefToInteger(r2));
01766 }
01767 
01768 
01769 #pragma mark -
01770 /*------------------------------------------------------------------------*/
01782 newtRef NcLessThan(newtRefArg r1, newtRefArg r2)
01783 {
01784     return NewtMakeBoolean(NewtObjectCompare(r1, r2) < 0);
01785 }
01786 
01787 
01788 /*------------------------------------------------------------------------*/
01800 newtRef NcGreaterThan(newtRefArg r1, newtRefArg r2)
01801 {
01802     return NewtMakeBoolean(NewtObjectCompare(r1, r2) > 0);
01803 }
01804 
01805 
01806 /*------------------------------------------------------------------------*/
01818 newtRef NcGreaterOrEqual(newtRefArg r1, newtRefArg r2)
01819 {
01820     return NewtMakeBoolean(NewtObjectCompare(r1, r2) >= 0);
01821 }
01822 
01823 
01824 /*------------------------------------------------------------------------*/
01836 newtRef NcLessOrEqual(newtRefArg r1, newtRefArg r2)
01837 {
01838