Skip to content

Commit 2632127

Browse files
committed
md5 worked!
1 parent 9089e8c commit 2632127

File tree

10 files changed

+347
-119
lines changed

10 files changed

+347
-119
lines changed

JawaScriptExecutive-iOS/JawaArray.m

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import <Foundation/Foundation.h>
1010
#import "JawaArray.h"
1111
#import "JawaObjectProtected.h"
12+
#import "JawaNumber.h"
1213

1314
NSMutableDictionary* arrayPrototype;
1415

@@ -79,6 +80,45 @@ -(JawaObjectRef*)invokeBuiltin:(NSString*)funcName {
7980
case 0: {
8081
return [JawaObjectRef RefWithNumber:self.elements.count in:self.executor];
8182
}
83+
// Array.slice(start, end)
84+
case 1: {
85+
JawaObjectRef* start = [[self.executor.currentActivation lastObject]objectForKey:@"start"];
86+
if (![start.object isMemberOfClass:[JawaNumber class]])
87+
[NSException raise:@"JawaScript Runtime Exception" format:@"start of slice() must be a number"];
88+
NSUInteger startInt = ((NSNumber*)start.object).unsignedIntValue;
89+
if (startInt >= self.elements.count)
90+
[NSException raise:@"JawaScript Runtime Exception" format:@"start of slice() out of bound"];
91+
NSUInteger endInt = self.elements.count;
92+
JawaObjectRef* end = [[self.executor.currentActivation lastObject]objectForKey:@"end"];
93+
if (end != nil) {
94+
if (![end.object isKindOfClass:[NSNumber class]])
95+
[NSException raise:@"JawaScript Runtime Exception" format:@"end of slice() must be a number"];
96+
endInt = ((NSNumber*)end.object).unsignedIntValue;
97+
if (endInt > self.elements.count)
98+
[NSException raise:@"JawaScript Runtime Exception" format:@"end of slice() out of bound"];
99+
}
100+
JawaArray* slice = [[JawaArray alloc]initIn:self.executor];
101+
for (NSUInteger i = startInt ; i < endInt ; i++) {
102+
[slice.elements addPointer:[self.elements pointerAtIndex:i]];
103+
}
104+
return [JawaObjectRef RefWithJawaArray:slice];
105+
}
106+
// Array.join(sep)
107+
case 2: {
108+
JawaObjectRef* sep = [[self.executor.currentActivation lastObject]objectForKey:@"sep"];
109+
if (![sep.object isKindOfClass:[NSString class]])
110+
[NSException raise:@"JawaScript Runtime Exception" format:@"separator of join() must be a string"];
111+
NSString* sepStr = [sep description];
112+
NSMutableString* ret = [NSMutableString stringWithString:@""];
113+
bool first = true;
114+
for (JawaObjectRef* o in self.elements) {
115+
if (!first)
116+
[ret appendString:sepStr];
117+
first = false;
118+
[ret appendString:[o description]];
119+
}
120+
return [JawaObjectRef RefWithString:ret in:self.executor];
121+
}
82122
default:
83123
[NSException raise:@"JavaScript Runtime Exception" format:@"%@ not implemented yet", funcName];
84124
}

JawaScriptExecutive-iOS/JawaExecutor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ extern NSMutableDictionary* builtinFunctions;
3434
-(JawaObjectRef*)dispatchBuiltin:(NSString*)funcName;
3535
@end
3636

37-
#define QUANTUM 0.0000000000000001
37+
#define QUANTUM 0.00001
3838

3939
typedef NS_ENUM(NSInteger, ASTType) {
4040
SCRIPT_BODY = 0,

JawaScriptExecutive-iOS/JawaExecutor.m

Lines changed: 141 additions & 106 deletions
Large diffs are not rendered by default.

JawaScriptExecutive-iOS/JawaFunc.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ -(id)initWithName:(NSString*)name in:(JawaExecutor*)ex taking:(NSArray*)params i
2828
-(JawaObjectRef*)apply:(JawaObjectRef*)on {
2929
if (!self.isBuiltIn)
3030
return nil;
31-
if ([on.object isMemberOfClass:[NSMutableString class]])
32-
return dispatchStringBuiltin((NSMutableString*)on.object, self.name);
31+
if ([on.object isKindOfClass:[NSString class]])
32+
return dispatchStringBuiltin((NSString*)on.object, self.name, self.executor);
3333
if ([on.object isKindOfClass:[JawaObject class]])
3434
return [(JawaObject*)on.object invokeBuiltin:self.name];
3535
return nil;

JawaScriptExecutive-iOS/JawaNumber.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// JawaNumber.h
3+
// JawaScriptExecutive-iOS
4+
//
5+
// Created by Chi-Wei Wang on 2016/3/10.
6+
//
7+
//
8+
9+
#ifndef JawaNumber_h
10+
#define JawaNumber_h
11+
12+
@interface JawaNumber : NSObject
13+
{
14+
15+
}
16+
@property double value;
17+
18+
-(id) init:(double)value;
19+
-(NSString*) description;
20+
-(double) doubleValue;
21+
-(int) intValue;
22+
-(long) longValue;
23+
-(long long) longlongValue;
24+
-(unsigned int) unsignedIntValue;
25+
-(unsigned long) unsignedLongValue;
26+
-(unsigned long long) unsignedLongLongValue;
27+
28+
+(id)numberWithDouble:(double)number;
29+
@end
30+
31+
#endif /* JawaNumber_h */

JawaScriptExecutive-iOS/JawaNumber.m

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// JawaNumber.m
3+
// JawaScriptExecutive-iOS
4+
//
5+
// Created by Chi-Wei Wang on 2016/3/10.
6+
//
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "JawaNumber.h"
11+
#import "JawaExecutor.h"
12+
13+
@implementation JawaNumber
14+
15+
-(id) init:(double)value {
16+
self = [super init];
17+
if (self) {
18+
_value = value;
19+
}
20+
return self;
21+
}
22+
23+
-(NSString*) description {
24+
if (fabs(self.value-round(self.value)) < QUANTUM) {
25+
return [NSString stringWithFormat:@"%ld", (long)self.value];
26+
}
27+
return [NSString stringWithFormat:@"%lf", self.value];
28+
}
29+
30+
-(double) doubleValue {
31+
return self.value;
32+
}
33+
34+
-(int) intValue {
35+
return (int)self.value;
36+
}
37+
38+
-(long) longValue {
39+
return (long)self.value;
40+
}
41+
42+
-(long long) longlongValue {
43+
return (long long)self.value;
44+
}
45+
46+
-(unsigned int) unsignedIntValue {
47+
return (unsigned int)self.value;
48+
}
49+
50+
-(unsigned long) unsignedLongValue {
51+
return (unsigned long)self.value;
52+
}
53+
54+
-(unsigned long long) unsignedLongLongValue {
55+
return (unsigned long long)self.value;
56+
}
57+
58+
+(id)numberWithDouble:(double)number {
59+
return [[self alloc] init:number];
60+
}
61+
@end

JawaScriptExecutive-iOS/JawaObjectRef.m

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#import "JawaExecutor.h"
1111
#import "JawaArray.h"
1212
#import "JawaFunc.h"
13+
#import "JawaNumber.h"
1314
#import "JawaObjectRef.h"
1415

1516
NSMutableArray* jawaObjectPool;
@@ -29,7 +30,7 @@ -(id)initIn:(JawaExecutor*)ex {
2930
-(id)initWithNumber:(double)number in:(JawaExecutor*)ex {
3031
self = [super init];
3132
if (self) {
32-
_object = [NSDecimalNumber numberWithDouble:number];
33+
_object = [[JawaNumber alloc]init:number];
3334
_executor = ex;
3435
[jawaObjectPool addObject:self];
3536
}
@@ -99,12 +100,8 @@ -(id)initWithJawaObject:(JawaObject*)obj {
99100
}
100101

101102
-(NSString*)description {
102-
if ([self.object isMemberOfClass: [NSDecimalNumber class]]) {
103-
double n = ((NSDecimalNumber*)self.object).doubleValue;
104-
if (fabs(n-round(n)) < QUANTUM) {
105-
return [NSString stringWithFormat:@"%ld", (long)n];
106-
}
107-
return [NSString stringWithFormat:@"%f", n];
103+
if ([self.object isMemberOfClass: [JawaNumber class]]) {
104+
return [((JawaNumber*)self.object) description];
108105
} else if ([self.object isKindOfClass: [NSNumber class]]) {
109106
bool b = ((NSNumber*)self.object).boolValue;
110107
return b ? @"true" : @"false";
@@ -116,7 +113,10 @@ -(NSString*)description {
116113
return nil;
117114
}
118115
-(id)transfer {
119-
if ([self.object isKindOfClass:[NSNumber class]]) {
116+
if ([self.object isMemberOfClass:[JawaNumber class]]) {
117+
double d = ((JawaNumber*)self.object).value;
118+
return [JawaNumber numberWithDouble:d];
119+
} else if ([self.object isKindOfClass:[NSNumber class]]) {
120120
return [((NSNumber*)self.object) copy];
121121
} else if ([self.object isMemberOfClass: [NSMutableString class]]) {
122122
return [((NSMutableString*)self.object) mutableCopy];

JawaScriptExecutive-iOS/JawaString.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
#include "JawaObjectRef.h"
1313

1414
extern NSDictionary* stringPrototype;
15-
extern JawaObjectRef* dispatchStringBuiltin(NSMutableString *str, NSString* funcName);
15+
extern JawaObjectRef* dispatchStringBuiltin(NSString *str, NSString* funcName, JawaExecutor* ex);
1616

1717
#endif /* JawaString_h */

JawaScriptExecutive-iOS/JawaString.m

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,39 @@
88

99
#import <Foundation/Foundation.h>
1010
#import "JawaString.h"
11+
#import "JawaArray.h"
12+
#import "JawaFunc.h"
1113

14+
@class JawaExecutor;
1215
// TODO: Initialize stringPrototype in Executor initialize()
1316
NSDictionary* stringPrototype;
1417

15-
JawaObjectRef* dispatchStringBuiltin(NSMutableString* str, NSString* funcName) {
18+
JawaObjectRef* dispatchStringBuiltin(NSString* str, NSString* funcName, JawaExecutor *ex) {
19+
if ([stringPrototype objectForKey:funcName] == nil)
20+
[NSException raise:@"JawaScript Runtime Exception" format:@"string has no method %@()", funcName];
21+
NSUInteger funcId = ((JawaFunc*)[stringPrototype objectForKey:funcName]).switchId;
22+
switch (funcId) {
23+
// String.split(delim)
24+
case 0: {
25+
JawaArray *result = [[JawaArray alloc]initIn:ex];
26+
NSString* delim = [[[ex.currentActivation lastObject]objectForKey:@"delim"]description];
27+
if (delim.length == 0) {
28+
for (NSUInteger i = 0; i < str.length; i++) {
29+
NSString* slice = [str substringWithRange:NSMakeRange(i, 1)];
30+
JawaObjectRef *s = [JawaObjectRef RefWithString:slice in:ex];
31+
[result append:s];
32+
}
33+
} else {
34+
NSArray* slices = [str componentsSeparatedByString:delim];
35+
for (NSString* slice in slices) {
36+
JawaObjectRef *s = [JawaObjectRef RefWithString:slice in:ex];
37+
[result append:s];
38+
}
39+
}
40+
return [JawaObjectRef RefWithJawaArray:result];
41+
}
42+
default:
43+
[NSException raise:@"JawaScript Runtime Exception" format:@"Not yet implemented"];
44+
}
1645
return nil;
1746
}

JawaScriptExecutive-iOS/test.m

Lines changed: 32 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)