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
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