Skip to content

Commit bcd46dd

Browse files
committed
Completed and passed 20 test cases!
1 parent a770c0a commit bcd46dd

File tree

9 files changed

+714
-22
lines changed

9 files changed

+714
-22
lines changed

JawaScriptExecutive-iOS/JawaArray.m

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@
1313

1414
NSMutableDictionary* arrayPrototype;
1515

16+
NSInteger compare(JawaObjectRef* o1, JawaObjectRef* o2, void* context) {
17+
NSArray* ctxt = (__bridge NSArray*)context;
18+
JawaExecutor* ex = [ctxt objectAtIndex:0];
19+
JawaObjectRef* comparator = [ctxt objectAtIndex:1];
20+
return [ex compare:o1 and:o2 with:comparator];
21+
}
22+
1623
@implementation JawaArray
1724

1825
-(id)initIn:(JawaExecutor *)ex {
@@ -25,6 +32,7 @@ -(id)initIn:(JawaExecutor *)ex {
2532
return self;
2633
}
2734

35+
2836
-(NSString*)description {
2937
BOOL first = true;
3038
NSMutableString* ret = [NSMutableString stringWithString:@"["];
@@ -47,7 +55,7 @@ -(NSMutableString*) toJSON:(NSMutableString*)ret {
4755
if (!first)
4856
[ret appendString:@","];
4957
first = false;
50-
if ([obj.object isMemberOfClass:[NSMutableString class]]) {
58+
if ([obj.object isKindOfClass:[NSString class]]) {
5159
[ret appendString:@"\""];
5260
NSString* r = [[obj description] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
5361
[ret appendString:r];
@@ -85,15 +93,15 @@ -(JawaObjectRef*)invokeBuiltin:(NSString*)funcName {
8593
JawaObjectRef* start = [[self.executor.currentActivation lastObject]objectForKey:@"start"];
8694
if (![start.object isMemberOfClass:[JawaNumber class]])
8795
[NSException raise:@"JawaScript Runtime Exception" format:@"start of slice() must be a number"];
88-
NSUInteger startInt = ((NSNumber*)start.object).unsignedIntValue;
96+
NSUInteger startInt = ((JawaNumber*)start.object).unsignedIntValue;
8997
if (startInt >= self.elements.count)
9098
[NSException raise:@"JawaScript Runtime Exception" format:@"start of slice() out of bound"];
9199
NSUInteger endInt = self.elements.count;
92100
JawaObjectRef* end = [[self.executor.currentActivation lastObject]objectForKey:@"end"];
93101
if (end != nil) {
94-
if (![end.object isKindOfClass:[NSNumber class]])
102+
if (![end.object isMemberOfClass:[JawaNumber class]])
95103
[NSException raise:@"JawaScript Runtime Exception" format:@"end of slice() must be a number"];
96-
endInt = ((NSNumber*)end.object).unsignedIntValue;
104+
endInt = ((JawaNumber*)end.object).unsignedIntValue;
97105
if (endInt > self.elements.count)
98106
[NSException raise:@"JawaScript Runtime Exception" format:@"end of slice() out of bound"];
99107
}
@@ -119,6 +127,56 @@ -(JawaObjectRef*)invokeBuiltin:(NSString*)funcName {
119127
}
120128
return [JawaObjectRef RefWithString:ret in:self.executor];
121129
}
130+
// Array.pop()
131+
case 3: {
132+
if (self.elements.count <= 0)
133+
return nil;
134+
JawaObjectRef* ret = [self.elements pointerAtIndex:self.elements.count - 1];
135+
[self.elements removePointerAtIndex:self.elements.count - 1];
136+
return ret;
137+
}
138+
// Array.push(item)
139+
case 4: {
140+
JawaObjectRef* item = [[self.executor.currentActivation lastObject]objectForKey:@"item"];
141+
[self.elements addPointer:(__bridge void*)item];
142+
return [JawaObjectRef RefWithNumber:self.elements.count in:self.executor];
143+
}
144+
// Array.reverse()
145+
case 5: {
146+
NSUInteger n = self.elements.count;
147+
for (NSUInteger i = 0 ; i < n / 2 ; i++) {
148+
void *t = [self.elements pointerAtIndex:i];
149+
[self.elements replacePointerAtIndex:i withPointer:[self.elements pointerAtIndex:n - i - 1]];
150+
[self.elements replacePointerAtIndex:n - i - 1 withPointer:t];
151+
}
152+
return [JawaObjectRef RefWithJawaArray:self];
153+
}
154+
// Array.shift()
155+
case 6: {
156+
if (self.elements.count <= 0)
157+
return nil;
158+
JawaObjectRef* item = [self.elements pointerAtIndex:0];
159+
[self.elements removePointerAtIndex:0];
160+
return item;
161+
}
162+
// Array.sort(compareFunction)
163+
case 7: {
164+
JawaObjectRef* compareFunction = [[self.executor.currentActivation lastObject]objectForKey:@"compareFunction"];
165+
if (compareFunction == nil)
166+
compareFunction = [JawaObjectRef RefIn:self.executor];
167+
NSArray* tempArray = self.elements.allObjects;
168+
NSArray* sorted = [tempArray sortedArrayUsingFunction:compare context:(__bridge void * _Nullable)(@[self.executor, compareFunction])];
169+
for (NSUInteger i = 0 ; i < sorted.count ; i++) {
170+
[self.elements replacePointerAtIndex:i withPointer:(__bridge void * _Nullable)([sorted objectAtIndex:i])];
171+
}
172+
return [JawaObjectRef RefWithJawaArray:self];
173+
}
174+
// Array.unshift()
175+
case 8: {
176+
JawaObjectRef* item = [[self.executor.currentActivation lastObject]objectForKey:@"item"];
177+
[self.elements insertPointer:(__bridge void*)item atIndex:0];
178+
return [JawaObjectRef RefWithNumber:self.elements.count in:self.executor];
179+
}
122180
default:
123181
[NSException raise:@"JavaScript Runtime Exception" format:@"%@ not implemented yet", funcName];
124182
}

JawaScriptExecutive-iOS/JawaExecutor.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#ifndef JawaExecutor_h
1010
#define JawaExecutor_h
1111

12+
#import "JawaExternalCallback.h"
13+
1214
extern NSMutableDictionary* builtinFunctions;
1315

1416
@class JawaObjectRef;
@@ -17,24 +19,26 @@ extern NSMutableDictionary* builtinFunctions;
1719
@interface JawaExecutor : NSObject
1820
{
1921
JawaObjectRef* NULL_CONSTANT;
20-
}
22+
}
2123

2224
@property (weak) NSMutableDictionary* env;
2325
@property NSMutableDictionary* global;
2426
@property NSMutableArray* activations;
2527
@property NSMutableArray* currentActivation;
2628
@property NSMutableDictionary* currentIterationScope;
2729
@property BOOL isFromCallExpression;
28-
30+
@property id<JawaExternalCallback> externalCallback;
2931

3032
-(id)init;
3133
-(JawaObjectRef*)evaluate:(NSDictionary*)tree;
3234
-(void)execute:(NSDictionary*)ast;
3335
-(NSMutableDictionary*) invoke:(NSString*)funcName with:(NSMutableDictionary*)asInput;
3436
-(JawaObjectRef*)dispatchBuiltin:(NSString*)funcName;
37+
-(void)registerExternalCallback:(id<JawaExternalCallback>)cb;
38+
-(NSInteger)compare:(JawaObjectRef*)o1 and:(JawaObjectRef*)o2 with:(JawaObjectRef*)comparator;
3539
@end
3640

37-
#define QUANTUM 0.00001
41+
#define QUANTUM 0.000000000000001
3842

3943
typedef NS_ENUM(NSInteger, ASTType) {
4044
SCRIPT_BODY = 0,

0 commit comments

Comments
 (0)